- {collection.description}
+
+
+
+
+ Home
+
+ /
+ {collection.title}
- )}
-
{collection.title}
+
+ {
+ if (v > 2) {
+ setGridSizeDesktop(v);
+ } else {
+ setGridSizeMobile(v);
+ }
+ }}
+ {...props}
/>
-
- {({
- nodes,
- isLoading,
- PreviousLink,
- NextLink,
- nextPageUrl,
- hasNextPage,
- state,
- }) => (
- <>
-
-
-
-
-
-
-
- >
+
+ {filtersPosition === "sidebar" && (
+
)}
-
+
+ {({
+ nodes,
+ isLoading,
+ nextPageUrl,
+ previousPageUrl,
+ hasNextPage,
+ hasPreviousPage,
+ state,
+ }) => (
+
+ {hasPreviousPage && (
+
+ {isLoading ? "Loading..." : loadPrevText}
+
+ )}
+
+ {hasNextPage && (
+
+ {isLoading ? "Loading..." : loadMoreText}
+
+ )}
+
+ )}
+
+
);
}
@@ -107,16 +152,90 @@ export let schema: HydrogenComponentSchema = {
pages: ["COLLECTION"],
},
inspector: [
- { group: "Layout", inputs: layoutInputs },
{
- group: "Collection filters",
+ group: "Layout",
+ inputs: layoutInputs.filter((inp) => {
+ return inp.name !== "borderRadius" && inp.name !== "gap";
+ }),
+ },
+ {
+ group: "Filtering and sorting",
inputs: [
{
type: "switch",
- name: "showCollectionDescription",
- label: "Show collection description",
+ name: "enableSort",
+ label: "Enable sorting",
defaultValue: true,
},
+ {
+ type: "switch",
+ name: "showProductsCount",
+ label: "Show products count",
+ defaultValue: true,
+ },
+ {
+ type: "switch",
+ name: "enableFilter",
+ label: "Enable filtering",
+ defaultValue: true,
+ },
+ {
+ type: "select",
+ name: "filtersPosition",
+ label: "Filters position",
+ configs: {
+ options: [
+ { value: "sidebar", label: "Sidebar" },
+ { value: "drawer", label: "Drawer" },
+ ],
+ },
+ defaultValue: "sidebar",
+ condition: "enableFilter.eq.true",
+ },
+ {
+ type: "switch",
+ name: "expandFilters",
+ label: "Expand filters",
+ defaultValue: true,
+ condition: "enableFilter.eq.true",
+ },
+ {
+ type: "switch",
+ name: "showFiltersCount",
+ label: "Show filters count",
+ defaultValue: true,
+ condition: "enableFilter.eq.true",
+ },
+ ],
+ },
+ {
+ group: "Products",
+ inputs: [
+ {
+ type: "select",
+ name: "productsPerRowDesktop",
+ label: "Default products per row (desktop)",
+ configs: {
+ options: [
+ { value: "3", label: "3" },
+ { value: "4", label: "4" },
+ { value: "5", label: "5" },
+ ],
+ },
+ defaultValue: "3",
+ },
+ {
+ type: "select",
+ name: "productsPerRowMobile",
+ label: "Default products per row (mobile)",
+ configs: {
+ options: [
+ { value: "1", label: "1" },
+ { value: "2", label: "2" },
+ ],
+ },
+ defaultValue: "1",
+ },
{
type: "text",
name: "loadPrevText",
diff --git a/app/sections/collection-filters/layout-switcher.tsx b/app/sections/collection-filters/layout-switcher.tsx
new file mode 100644
index 00000000..1c00c7bb
--- /dev/null
+++ b/app/sections/collection-filters/layout-switcher.tsx
@@ -0,0 +1,141 @@
+import type { IconProps } from "@phosphor-icons/react";
+import clsx from "clsx";
+import { cn } from "~/lib/cn";
+
+const LAYOUT_ICONS = {
+ 1: LayoutList,
+ 2: TwoColumns,
+ 3: ThreeColumns,
+ 4: FourColumns,
+ 5: FiveColumns,
+};
+
+export type LayoutSwitcherProps = {
+ gridSizeDesktop: number;
+ gridSizeMobile: number;
+ onGridSizeChange: (number: number) => void;
+};
+
+export function LayoutSwitcher({
+ gridSizeDesktop,
+ gridSizeMobile,
+ onGridSizeChange,
+ className,
+}: LayoutSwitcherProps & { className?: string }) {
+ return (
+
button]:text-[#b7b7b7] [&>button]:border-[#b7b7b7]",
+ '[&>button[data-active="true"]]:text-[#696662]',
+ '[&>button[data-active="true"]]:border-[#696662]',
+ className,
+ )}
+ >
+ {[1, 2, 3, 4, 5].map((col) => {
+ let Icon = LAYOUT_ICONS[col];
+ return (
+
+ );
+ })}
+
+ );
+}
+
+function LayoutList(props: IconProps) {
+ return (
+
+ );
+}
+
+function TwoColumns(props: IconProps) {
+ return (
+
+ );
+}
+
+function ThreeColumns(props: IconProps) {
+ return (
+
+ );
+}
+
+function FourColumns(props: IconProps) {
+ return (
+
+ );
+}
+
+function FiveColumns(props: IconProps) {
+ return (
+
+ );
+}
diff --git a/app/sections/collection-filters/products-loaded-on-scroll.tsx b/app/sections/collection-filters/products-loaded-on-scroll.tsx
index e23df346..ad7adf02 100644
--- a/app/sections/collection-filters/products-loaded-on-scroll.tsx
+++ b/app/sections/collection-filters/products-loaded-on-scroll.tsx
@@ -1,26 +1,27 @@
import { useNavigate } from "@remix-run/react";
import { useEffect } from "react";
import { getImageLoadingPriority } from "~/lib/const";
-import { Grid } from "~/modules/grid";
import { ProductCard } from "~/modules/product-card";
-type ProductsLoadedOnScrollProps = {
+interface ProductsLoadedOnScrollProps {
+ gridSizeDesktop: number;
+ gridSizeMobile: number;
nodes: any;
- numberInRow: number;
inView: boolean;
nextPageUrl: string;
hasNextPage: boolean;
state: any;
-};
+}
export function ProductsLoadedOnScroll(props: ProductsLoadedOnScrollProps) {
let {
+ gridSizeMobile,
+ gridSizeDesktop,
nodes,
inView,
nextPageUrl,
hasNextPage,
state,
- numberInRow = 4,
} = props;
let navigate = useNavigate();
@@ -35,7 +36,15 @@ export function ProductsLoadedOnScroll(props: ProductsLoadedOnScrollProps) {
}, [inView, navigate, state, nextPageUrl, hasNextPage]);
return (
-
+
{nodes.map((product: any, i: number) => (
))}
-
+
);
}
diff --git a/app/sections/collection-filters/sort.tsx b/app/sections/collection-filters/sort.tsx
new file mode 100644
index 00000000..34455287
--- /dev/null
+++ b/app/sections/collection-filters/sort.tsx
@@ -0,0 +1,83 @@
+import { CaretDown } from "@phosphor-icons/react";
+import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
+import { Link, useLocation, useSearchParams } from "@remix-run/react";
+import { cn } from "~/lib/cn";
+import type { SortParam } from "~/lib/filter";
+
+const PRODUCT_SORT: { label: string; key: SortParam }[] = [
+ { label: "Featured", key: "featured" },
+ {
+ label: "Price: Low - High",
+ key: "price-low-high",
+ },
+ {
+ label: "Price: High - Low",
+ key: "price-high-low",
+ },
+ {
+ label: "Best Selling",
+ key: "best-selling",
+ },
+ {
+ label: "Newest",
+ key: "newest",
+ },
+];
+
+const SEARCH_SORT: { label: string; key: SortParam }[] = [
+ {
+ label: "Price: Low - High",
+ key: "price-low-high",
+ },
+ {
+ label: "Price: High - Low",
+ key: "price-high-low",
+ },
+ {
+ label: "Relevance",
+ key: "relevance",
+ },
+];
+
+export function Sort() {
+ let [params] = useSearchParams();
+ let location = useLocation();
+ let sortList = PRODUCT_SORT;
+ let { key: currentSortValue } =
+ sortList.find(({ key }) => key === params.get("sort")) || sortList[0];
+
+ return (
+
+
+ Sort by
+
+
+
+
+ {sortList.map(({ key, label }) => {
+ let pr = new URLSearchParams(params);
+ pr.set("sort", key);
+ let sortUrl = `${location.pathname}?${pr.toString()}`;
+ return (
+
+
+ {label}
+
+
+ );
+ })}
+
+
+
+ );
+}
diff --git a/app/sections/collection-filters/tools-bar.tsx b/app/sections/collection-filters/tools-bar.tsx
new file mode 100644
index 00000000..880b6946
--- /dev/null
+++ b/app/sections/collection-filters/tools-bar.tsx
@@ -0,0 +1,118 @@
+import { useLoaderData } from "@remix-run/react";
+import { type VariantProps, cva } from "class-variance-authority";
+import type { CollectionDetailsQuery } from "storefrontapi.generated";
+import { cn } from "~/lib/cn";
+import { Filters } from "./filters";
+import { LayoutSwitcher, type LayoutSwitcherProps } from "./layout-switcher";
+import { Sort } from "./sort";
+import * as Dialog from "@radix-ui/react-dialog";
+import { Button } from "~/components/button";
+import { Sliders, X } from "@phosphor-icons/react";
+import clsx from "clsx";
+
+let variants = cva("", {
+ variants: {
+ width: {
+ full: "",
+ stretch: "-mx-3 px-3 md:-mx-10 md:px-10 lg:-mx-16 lg:px-16",
+ fixed: [
+ "-mx-3 px-3 md:-mx-10 md:px-10",
+ "lg:-mx-[max(calc((100vw-var(--page-width))/2),1.5rem)]",
+ "lg:px-[max(calc((100vw-var(--page-width))/2),1.5rem)]",
+ ],
+ },
+ },
+});
+
+interface ToolsBarProps
+ extends VariantProps,
+ LayoutSwitcherProps {
+ enableSort: boolean;
+ showProductsCount: boolean;
+ enableFilter: boolean;
+ filtersPosition: "sidebar" | "drawer";
+ expandFilters: boolean;
+ showFiltersCount: boolean;
+}
+
+export function ToolsBar({
+ enableSort,
+ enableFilter,
+ filtersPosition,
+ showProductsCount,
+ width,
+ gridSizeDesktop,
+ gridSizeMobile,
+ onGridSizeChange,
+}: ToolsBarProps) {
+ let { collection } = useLoaderData();
+ return (
+
+
+
+ {showProductsCount && (
+
+ {collection?.products.nodes.length} Products
+
+ )}
+
+ {enableSort && }
+ {enableFilter && }
+
+
+
+ );
+}
+
+function FiltersDrawer({
+ filtersPosition,
+}: { filtersPosition: ToolsBarProps["filtersPosition"] }) {
+ return (
+
+
+
+
+
+
+
+
+
+ Filters
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/app/weaverse/components.ts b/app/weaverse/components.ts
index 80b4a89c..537c0d98 100644
--- a/app/weaverse/components.ts
+++ b/app/weaverse/components.ts
@@ -1,6 +1,6 @@
import type { HydrogenComponent } from "@weaverse/hydrogen";
-import * as Link from "~/components/link";
import * as Heading from "~/components/heading";
+import * as Link from "~/components/link";
import * as Paragraph from "~/components/paragraph";
import * as SubHeading from "~/components/subheading";
import * as Judgeme from "~/modules/product-form/judgeme-review";
@@ -30,6 +30,8 @@ import * as ImageGalleryItems from "~/sections/image-gallery/items";
import * as ImageWithText from "~/sections/image-with-text";
import * as ImageWithTextContent from "~/sections/image-with-text/content";
import * as ImageWithTextImage from "~/sections/image-with-text/image";
+import * as JudgemeReview from "~/sections/judgeme-reviews";
+import * as ReviewIndex from "~/sections/judgeme-reviews/review-index";
import * as MapSection from "~/sections/map";
import * as NewsLetter from "~/sections/newsletter";
import * as NewsLetterForm from "~/sections/newsletter/newsletter-form";
@@ -52,16 +54,14 @@ import * as TestimonialItem from "~/sections/testimonials/item";
import * as TestimonialItems from "~/sections/testimonials/items";
import * as VideoEmbed from "~/sections/video-embed";
import * as VideoEmbedItem from "~/sections/video-embed/video";
-import * as JudgemeReview from "~/sections/judgeme-reviews";
-import * as ReviewIndex from "~/sections/judgeme-reviews/review-index";
export let components: HydrogenComponent[] = [
SubHeading,
Heading,
Paragraph,
Link,
- AliReview,
- AliReviewList,
+ // AliReview,
+ // AliReviewList,
AllProducts,
FeaturedCollections,
FeaturedCollectionItems,
diff --git a/app/weaverse/schema.server.ts b/app/weaverse/schema.server.ts
index 349648d4..aabeb9ed 100644
--- a/app/weaverse/schema.server.ts
+++ b/app/weaverse/schema.server.ts
@@ -1,4 +1,5 @@
import type { HydrogenThemeSchema, SwatchesConfigs } from "@weaverse/hydrogen";
+import { countries } from "~/data/countries";
import pkg from "../../package.json";
let swatchesConfigs: SwatchesConfigs = {
@@ -84,6 +85,13 @@ export let themeSchema: HydrogenThemeSchema = {
documentationUrl: "https://weaverse.io/docs",
supportUrl: "https://weaverse.io/contact",
},
+ i18n: Object.values(countries).map((i) => {
+ return {
+ language: i.language,
+ country: i.country,
+ label: i.label,
+ };
+ }),
inspector: [
{
group: "Layout",
@@ -296,9 +304,15 @@ export let themeSchema: HydrogenThemeSchema = {
},
{
type: "color",
- label: "Lines and borders",
+ label: "Borders",
name: "colorLine",
- defaultValue: "#a8a29e",
+ defaultValue: "#3B352C",
+ },
+ {
+ type: "color",
+ label: "Borders (subtle)",
+ name: "colorLineSubtle",
+ defaultValue: "#A19B91",
},
{
type: "heading",
@@ -534,7 +548,7 @@ export let themeSchema: HydrogenThemeSchema = {
step: 1,
unit: "px",
},
- defaultValue: 16,
+ defaultValue: 14,
},
{
type: "range",
diff --git a/app/weaverse/style.tsx b/app/weaverse/style.tsx
index 0a157cab..e438f10a 100644
--- a/app/weaverse/style.tsx
+++ b/app/weaverse/style.tsx
@@ -1,5 +1,4 @@
import { useThemeSettings } from "@weaverse/hydrogen";
-import { colord } from "colord";
export function GlobalStyle() {
let settings = useThemeSettings();
@@ -10,6 +9,7 @@ export function GlobalStyle() {
colorTextSubtle,
colorTextInverse,
colorLine,
+ colorLineSubtle,
topbarTextColor,
topbarBgColor,
headerBgColor,
@@ -58,7 +58,7 @@ export function GlobalStyle() {
--color-text-subtle: ${colorTextSubtle};
--color-text-inverse: ${colorTextInverse};
--color-line: ${colorLine};
- --color-line-subtle: ${colord(colorLine).lighten(0.3).toHex()};
+ --color-line-subtle: ${colorLineSubtle};
/* Colors (header & footer) */
--color-topbar-text: ${topbarTextColor};
diff --git a/package-lock.json b/package-lock.json
index dd32a2ac..6abbe60a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,10 +12,15 @@
"@graphql-codegen/cli": "5.0.3",
"@headlessui/react": "2.2.0",
"@phosphor-icons/react": "2.1.7",
+ "@radix-ui/react-accordion": "^1.2.1",
"@radix-ui/react-checkbox": "1.1.2",
- "@radix-ui/react-dialog": "1.1.2",
+ "@radix-ui/react-collapsible": "^1.1.1",
+ "@radix-ui/react-dialog": "^1.1.2",
+ "@radix-ui/react-dropdown-menu": "^2.1.2",
"@radix-ui/react-menubar": "^1.1.2",
+ "@radix-ui/react-scroll-area": "^1.2.1",
"@radix-ui/react-tooltip": "1.1.4",
+ "@radix-ui/react-visually-hidden": "^1.1.0",
"@remix-run/react": "2.14.0",
"@remix-run/server-runtime": "2.14.0",
"@shopify/cli": "^3.70.0",
@@ -24,7 +29,6 @@
"@weaverse/hydrogen": "4.0.0",
"class-variance-authority": "0.7.0",
"clsx": "2.1.1",
- "colord": "^2.9.3",
"cross-env": "7.0.3",
"framer-motion": "^11.11.0",
"graphql": "16.9.0",
@@ -4351,11 +4355,63 @@
"node": ">=18"
}
},
+ "node_modules/@radix-ui/number": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz",
+ "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==",
+ "license": "MIT"
+ },
"node_modules/@radix-ui/primitive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz",
"integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA=="
},
+ "node_modules/@radix-ui/react-accordion": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.1.tgz",
+ "integrity": "sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-collapsible": "1.1.1",
+ "@radix-ui/react-collection": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-arrow": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz",
@@ -4423,6 +4479,51 @@
}
}
},
+ "node_modules/@radix-ui/react-collapsible": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz",
+ "integrity": "sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-collection": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz",
@@ -4481,6 +4582,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz",
"integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==",
+ "license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.0",
"@radix-ui/react-compose-refs": "1.1.0",
@@ -4567,6 +4669,50 @@
}
}
},
+ "node_modules/@radix-ui/react-dropdown-menu": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz",
+ "integrity": "sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-menu": "2.1.2",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-focus-guards": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
@@ -4855,6 +5001,52 @@
}
}
},
+ "node_modules/@radix-ui/react-scroll-area": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.1.tgz",
+ "integrity": "sha512-FnM1fHfCtEZ1JkyfH/1oMiTcFBQvHKl4vD9WnpwkLgtF+UmnXMCad6ECPTaAjcDjam+ndOEJWgHyKDGNteWSHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/number": "1.1.0",
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-slot": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz",
@@ -5034,6 +5226,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz",
"integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==",
+ "license": "MIT",
"dependencies": {
"@radix-ui/react-primitive": "2.0.0"
},
@@ -7567,12 +7760,6 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
- "node_modules/colord": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
- "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
- "license": "MIT"
- },
"node_modules/colorette": {
"version": "2.0.20",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
diff --git a/package.json b/package.json
index dea82ba4..cc847d7c 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "@weaverse/pilot",
"private": true,
"sideEffects": false,
- "version": "3.1.0",
+ "version": "3.2.0",
"type": "module",
"author": "Weaverse",
"scripts": {
@@ -25,19 +25,23 @@
"@graphql-codegen/cli": "5.0.3",
"@headlessui/react": "2.2.0",
"@phosphor-icons/react": "2.1.7",
+ "@radix-ui/react-accordion": "^1.2.1",
"@radix-ui/react-checkbox": "1.1.2",
- "@radix-ui/react-dialog": "1.1.2",
+ "@radix-ui/react-collapsible": "^1.1.1",
+ "@radix-ui/react-dialog": "^1.1.2",
+ "@radix-ui/react-dropdown-menu": "^2.1.2",
"@radix-ui/react-menubar": "^1.1.2",
+ "@radix-ui/react-scroll-area": "^1.2.1",
"@radix-ui/react-tooltip": "1.1.4",
+ "@radix-ui/react-visually-hidden": "^1.1.0",
"@remix-run/react": "2.14.0",
"@remix-run/server-runtime": "2.14.0",
"@shopify/cli": "^3.70.0",
"@shopify/hydrogen": "2024.10.0",
"@shopify/remix-oxygen": "2.0.9",
- "@weaverse/hydrogen": "4.0.0",
+ "@weaverse/hydrogen": "4.0.1",
"class-variance-authority": "0.7.0",
"clsx": "2.1.1",
- "colord": "^2.9.3",
"cross-env": "7.0.3",
"framer-motion": "^11.11.0",
"graphql": "16.9.0",
diff --git a/tailwind.config.js b/tailwind.config.js
index f962d2eb..e5340e24 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -13,9 +13,17 @@ export default {
extend: {
keyframes: {
"fade-in": {
- from: { opacity: "0.5" },
+ from: { opacity: "0" },
to: { opacity: "1" },
},
+ "slide-down": {
+ from: { height: 0 },
+ to: { height: "var(--slide-down-to)" },
+ },
+ "slide-up": {
+ from: { height: "var(--slide-up-from)" },
+ to: { height: 0 },
+ },
"slide-left-and-fade": {
from: {
opacity: 0,
@@ -23,6 +31,18 @@ export default {
},
to: { opacity: 1, transform: "translateX(0)" },
},
+ "enter-from-left": {
+ from: { transform: "translateX(-100%)" },
+ to: { transform: "translateX(0)" },
+ },
+ "enter-from-right": {
+ from: { transform: "translateX(100%)" },
+ to: { transform: "translateX(0)" },
+ },
+ "enter-from-top": {
+ from: { transform: "translateY(-100%)" },
+ to: { transform: "translateY(0)" },
+ },
marquee: {
from: { transform: "translateZ(0)" },
to: { transform: "translate3d(-100%,0,0)" },
@@ -49,8 +69,18 @@ export default {
marquee: "marquee var(--marquee-duration, 15s) linear infinite",
underline: "underline 400ms linear",
"fade-in": "fade-in var(--fade-in-duration, .5s) ease-in forwards",
+ "slide-down":
+ "slide-down var(--slide-down-duration, .3s) cubic-bezier(0.87, 0, 0.13, 1) forwards",
+ "slide-up":
+ "slide-up var(--slide-up-duration, .3s) cubic-bezier(0.87, 0, 0.13, 1) forwards",
"slide-left-and-fade":
- "slide-left-and-fade var(--slide-left-and-fade-duration, .5s) cubic-bezier(0.14, 0.8, 0.6, 1) forwards",
+ "slide-left-and-fade var(--slide-left-and-fade-duration, .5s) cubic-bezier(.165,.84,.44,1) forwards",
+ "enter-from-left":
+ "enter-from-left var(--enter-from-left-duration, .3s) ease-out forwards",
+ "enter-from-right":
+ "enter-from-right var(--enter-from-right-duration, .3s) ease-out forwards",
+ "enter-from-top":
+ "enter-from-top var(--enter-from-top-duration, .3s) ease-out forwards",
},
borderWidth: {
6: "6px",