@medialane/ui 0.298.0 → 0.300.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import * as input_otp from 'input-otp';
2
2
  import * as React from 'react';
3
3
 
4
- declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "value" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
4
+ declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "value" | "onChange" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
5
5
  value?: string;
6
6
  onChange?: (newValue: string) => unknown;
7
7
  maxLength: number;
@@ -14,7 +14,7 @@ declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHT
14
14
  } & {
15
15
  render: (props: input_otp.RenderProps) => React.ReactNode;
16
16
  children?: never;
17
- } & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "value" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
17
+ } & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "value" | "onChange" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
18
18
  value?: string;
19
19
  onChange?: (newValue: string) => unknown;
20
20
  maxLength: number;
@@ -1,7 +1,7 @@
1
1
  import * as input_otp from 'input-otp';
2
2
  import * as React from 'react';
3
3
 
4
- declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "value" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
4
+ declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "value" | "onChange" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
5
5
  value?: string;
6
6
  onChange?: (newValue: string) => unknown;
7
7
  maxLength: number;
@@ -14,7 +14,7 @@ declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHT
14
14
  } & {
15
15
  render: (props: input_otp.RenderProps) => React.ReactNode;
16
16
  children?: never;
17
- } & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "value" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
17
+ } & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "value" | "onChange" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
18
18
  value?: string;
19
19
  onChange?: (newValue: string) => unknown;
20
20
  maxLength: number;
@@ -4,7 +4,7 @@ import * as React from 'react';
4
4
  import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const badgeVariants: (props?: ({
7
- variant?: "outline" | "default" | "destructive" | "secondary" | null | undefined;
7
+ variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
10
10
  }
@@ -4,7 +4,7 @@ import * as React from 'react';
4
4
  import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const badgeVariants: (props?: ({
7
- variant?: "outline" | "default" | "destructive" | "secondary" | null | undefined;
7
+ variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
10
10
  }
@@ -3,8 +3,8 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const buttonVariants: (props?: ({
6
- variant?: "outline" | "link" | "default" | "destructive" | "secondary" | "ghost" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
- size?: "default" | "icon" | "sm" | "lg" | null | undefined;
6
+ variant?: "ghost" | "link" | "default" | "destructive" | "outline" | "secondary" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
10
10
  asChild?: boolean;
@@ -3,8 +3,8 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const buttonVariants: (props?: ({
6
- variant?: "outline" | "link" | "default" | "destructive" | "secondary" | "ghost" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
- size?: "default" | "icon" | "sm" | "lg" | null | undefined;
6
+ variant?: "ghost" | "link" | "default" | "destructive" | "outline" | "secondary" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
10
10
  asChild?: boolean;
@@ -1,10 +1,10 @@
1
- import * as React from 'react';
2
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
3
  import { FastMintProps } from './types.cjs';
4
4
  import 'starknet';
5
5
  import '@medialane/sdk';
6
6
  import '@medialane/sdk/starknet';
7
7
 
8
- declare function FastMint(props: FastMintProps): string | number | bigint | boolean | react_jsx_runtime.JSX.Element | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | undefined;
8
+ declare function FastMint(props: FastMintProps): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
9
9
 
10
10
  export { FastMint };
@@ -1,10 +1,10 @@
1
- import * as React from 'react';
2
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
3
  import { FastMintProps } from './types.js';
4
4
  import 'starknet';
5
5
  import '@medialane/sdk';
6
6
  import '@medialane/sdk/starknet';
7
7
 
8
- declare function FastMint(props: FastMintProps): string | number | bigint | boolean | react_jsx_runtime.JSX.Element | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | undefined;
8
+ declare function FastMint(props: FastMintProps): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
9
9
 
10
10
  export { FastMint };
@@ -58,7 +58,7 @@ function CollectionPicker({ collections, loading, value, onChange, newCollection
58
58
  if (loading) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_skeleton.Skeleton, { className: "h-[4.25rem] rounded-xl" });
59
59
  if (collections.length === 0) {
60
60
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-xl border border-dashed border-border p-5 text-center space-y-3", children: [
61
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: "You don't have a collection yet \u2014 every work needs one to live in." }),
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: "No collection found. It may take a minute to display recently created collections." }),
62
62
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
63
63
  import_link.default,
64
64
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/launchpad/collection-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Boxes, Check, ChevronDown, Plus } from \"lucide-react\";\nimport type { ApiCollection } from \"@medialane/sdk\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Input } from \"../input.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\n\nexport interface CollectionPickerProps {\n collections: ApiCollection[];\n loading: boolean;\n value: string;\n onChange: (id: string) => void;\n newCollectionHref: string;\n}\n\nfunction label(col: ApiCollection) {\n return col.name || col.symbol || `Collection #${col.collectionId}`;\n}\n\nfunction works(col: ApiCollection) {\n return col.totalSupply != null ? `${col.totalSupply.toLocaleString()} work${col.totalSupply !== 1 ? \"s\" : \"\"}` : \"Empty\";\n}\n\nfunction Thumb({ image, size }: { image: string | null | undefined; size: \"sm\" | \"md\" }) {\n const url = useImageUrl()(image);\n return (\n <div className={cn(\"relative rounded-lg overflow-hidden bg-muted shrink-0\", size === \"md\" ? \"h-10 w-10\" : \"h-8 w-8\")}>\n {url ? (\n <Image src={url} alt=\"\" fill unoptimized className=\"object-cover\" />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-4 w-4 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n );\n}\n\nexport function CollectionPicker({ collections, loading, value, onChange, newCollectionHref }: CollectionPickerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n\n if (loading) return <Skeleton className=\"h-[4.25rem] rounded-xl\" />;\n\n if (collections.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed border-border p-5 text-center space-y-3\">\n <p className=\"text-sm text-muted-foreground\">You don&apos;t have a collection yet — every work needs one to live in.</p>\n <Link\n href={newCollectionHref}\n className=\"inline-flex items-center gap-1.5 h-9 px-4 rounded-xl text-sm font-semibold text-white bg-brand-blue hover:brightness-110 transition-all\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Create your first collection\n </Link>\n </div>\n );\n }\n\n const selected = collections.find((c) => c.collectionId === value) ?? null;\n const filtered = query.trim() ? collections.filter((c) => label(c).toLowerCase().includes(query.trim().toLowerCase())) : collections;\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) setQuery(\"\");\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-expanded={open}\n className=\"flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40\"\n >\n <Thumb image={selected?.image} size=\"md\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">{selected ? label(selected) : \"Choose a collection\"}</p>\n <p className=\"text-xs text-muted-foreground\">{selected ? works(selected) : \"Where this work will live\"}</p>\n </div>\n <span className=\"flex items-center gap-1 text-xs font-medium text-muted-foreground shrink-0\">\n Change\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n {collections.length > 5 && (\n <div className=\"border-b border-border p-2\">\n <Input value={query} onChange={(e) => setQuery(e.target.value)} placeholder=\"Search collections…\" className=\"h-8\" />\n </div>\n )}\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {filtered.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm text-muted-foreground\">No collection found.</p>\n ) : (\n filtered.map((col) => (\n <button\n key={col.collectionId!}\n type=\"button\"\n onClick={() => {\n onChange(col.collectionId!);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60\"\n >\n <Thumb image={col.image} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{label(col)}</p>\n <p className=\"text-xs text-muted-foreground\">{works(col)}</p>\n </div>\n {value === col.collectionId && <Check className=\"h-4 w-4 text-brand-blue shrink-0\" />}\n </button>\n ))\n )}\n </div>\n <div className=\"border-t border-border p-1\">\n <Link\n href={newCollectionHref}\n className=\"flex items-center gap-2 rounded-lg px-2 py-2 text-sm font-medium text-muted-foreground hover:bg-muted/60 hover:text-foreground transition-colors\"\n >\n <Plus className=\"h-4 w-4\" />\n New collection\n </Link>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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","names":["Image","Link"]}
1
+ {"version":3,"sources":["../../../src/components/launchpad/collection-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Boxes, Check, ChevronDown, Plus } from \"lucide-react\";\nimport type { ApiCollection } from \"@medialane/sdk\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Input } from \"../input.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\n\nexport interface CollectionPickerProps {\n collections: ApiCollection[];\n loading: boolean;\n value: string;\n onChange: (id: string) => void;\n newCollectionHref: string;\n}\n\nfunction label(col: ApiCollection) {\n return col.name || col.symbol || `Collection #${col.collectionId}`;\n}\n\nfunction works(col: ApiCollection) {\n return col.totalSupply != null ? `${col.totalSupply.toLocaleString()} work${col.totalSupply !== 1 ? \"s\" : \"\"}` : \"Empty\";\n}\n\nfunction Thumb({ image, size }: { image: string | null | undefined; size: \"sm\" | \"md\" }) {\n const url = useImageUrl()(image);\n return (\n <div className={cn(\"relative rounded-lg overflow-hidden bg-muted shrink-0\", size === \"md\" ? \"h-10 w-10\" : \"h-8 w-8\")}>\n {url ? (\n <Image src={url} alt=\"\" fill unoptimized className=\"object-cover\" />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-4 w-4 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n );\n}\n\nexport function CollectionPicker({ collections, loading, value, onChange, newCollectionHref }: CollectionPickerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n\n if (loading) return <Skeleton className=\"h-[4.25rem] rounded-xl\" />;\n\n if (collections.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed border-border p-5 text-center space-y-3\">\n <p className=\"text-sm text-muted-foreground\">No collection found. It may take a minute to display recently created collections.</p>\n <Link\n href={newCollectionHref}\n className=\"inline-flex items-center gap-1.5 h-9 px-4 rounded-xl text-sm font-semibold text-white bg-brand-blue hover:brightness-110 transition-all\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Create your first collection\n </Link>\n </div>\n );\n }\n\n const selected = collections.find((c) => c.collectionId === value) ?? null;\n const filtered = query.trim() ? collections.filter((c) => label(c).toLowerCase().includes(query.trim().toLowerCase())) : collections;\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) setQuery(\"\");\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-expanded={open}\n className=\"flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40\"\n >\n <Thumb image={selected?.image} size=\"md\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">{selected ? label(selected) : \"Choose a collection\"}</p>\n <p className=\"text-xs text-muted-foreground\">{selected ? works(selected) : \"Where this work will live\"}</p>\n </div>\n <span className=\"flex items-center gap-1 text-xs font-medium text-muted-foreground shrink-0\">\n Change\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n {collections.length > 5 && (\n <div className=\"border-b border-border p-2\">\n <Input value={query} onChange={(e) => setQuery(e.target.value)} placeholder=\"Search collections…\" className=\"h-8\" />\n </div>\n )}\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {filtered.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm text-muted-foreground\">No collection found.</p>\n ) : (\n filtered.map((col) => (\n <button\n key={col.collectionId!}\n type=\"button\"\n onClick={() => {\n onChange(col.collectionId!);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60\"\n >\n <Thumb image={col.image} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{label(col)}</p>\n <p className=\"text-xs text-muted-foreground\">{works(col)}</p>\n </div>\n {value === col.collectionId && <Check className=\"h-4 w-4 text-brand-blue shrink-0\" />}\n </button>\n ))\n )}\n </div>\n <div className=\"border-t border-border p-1\">\n <Link\n href={newCollectionHref}\n className=\"flex items-center gap-2 rounded-lg px-2 py-2 text-sm font-medium text-muted-foreground hover:bg-muted/60 hover:text-foreground transition-colors\"\n >\n <Plus className=\"h-4 w-4\" />\n New collection\n </Link>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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","names":["Image","Link"]}
@@ -25,7 +25,7 @@ function CollectionPicker({ collections, loading, value, onChange, newCollection
25
25
  if (loading) return /* @__PURE__ */ jsx(Skeleton, { className: "h-[4.25rem] rounded-xl" });
26
26
  if (collections.length === 0) {
27
27
  return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-dashed border-border p-5 text-center space-y-3", children: [
28
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "You don't have a collection yet \u2014 every work needs one to live in." }),
28
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "No collection found. It may take a minute to display recently created collections." }),
29
29
  /* @__PURE__ */ jsxs(
30
30
  Link,
31
31
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/launchpad/collection-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Boxes, Check, ChevronDown, Plus } from \"lucide-react\";\nimport type { ApiCollection } from \"@medialane/sdk\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Input } from \"../input.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\n\nexport interface CollectionPickerProps {\n collections: ApiCollection[];\n loading: boolean;\n value: string;\n onChange: (id: string) => void;\n newCollectionHref: string;\n}\n\nfunction label(col: ApiCollection) {\n return col.name || col.symbol || `Collection #${col.collectionId}`;\n}\n\nfunction works(col: ApiCollection) {\n return col.totalSupply != null ? `${col.totalSupply.toLocaleString()} work${col.totalSupply !== 1 ? \"s\" : \"\"}` : \"Empty\";\n}\n\nfunction Thumb({ image, size }: { image: string | null | undefined; size: \"sm\" | \"md\" }) {\n const url = useImageUrl()(image);\n return (\n <div className={cn(\"relative rounded-lg overflow-hidden bg-muted shrink-0\", size === \"md\" ? \"h-10 w-10\" : \"h-8 w-8\")}>\n {url ? (\n <Image src={url} alt=\"\" fill unoptimized className=\"object-cover\" />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-4 w-4 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n );\n}\n\nexport function CollectionPicker({ collections, loading, value, onChange, newCollectionHref }: CollectionPickerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n\n if (loading) return <Skeleton className=\"h-[4.25rem] rounded-xl\" />;\n\n if (collections.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed border-border p-5 text-center space-y-3\">\n <p className=\"text-sm text-muted-foreground\">You don&apos;t have a collection yet — every work needs one to live in.</p>\n <Link\n href={newCollectionHref}\n className=\"inline-flex items-center gap-1.5 h-9 px-4 rounded-xl text-sm font-semibold text-white bg-brand-blue hover:brightness-110 transition-all\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Create your first collection\n </Link>\n </div>\n );\n }\n\n const selected = collections.find((c) => c.collectionId === value) ?? null;\n const filtered = query.trim() ? collections.filter((c) => label(c).toLowerCase().includes(query.trim().toLowerCase())) : collections;\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) setQuery(\"\");\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-expanded={open}\n className=\"flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40\"\n >\n <Thumb image={selected?.image} size=\"md\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">{selected ? label(selected) : \"Choose a collection\"}</p>\n <p className=\"text-xs text-muted-foreground\">{selected ? works(selected) : \"Where this work will live\"}</p>\n </div>\n <span className=\"flex items-center gap-1 text-xs font-medium text-muted-foreground shrink-0\">\n Change\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n {collections.length > 5 && (\n <div className=\"border-b border-border p-2\">\n <Input value={query} onChange={(e) => setQuery(e.target.value)} placeholder=\"Search collections…\" className=\"h-8\" />\n </div>\n )}\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {filtered.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm text-muted-foreground\">No collection found.</p>\n ) : (\n filtered.map((col) => (\n <button\n key={col.collectionId!}\n type=\"button\"\n onClick={() => {\n onChange(col.collectionId!);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60\"\n >\n <Thumb image={col.image} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{label(col)}</p>\n <p className=\"text-xs text-muted-foreground\">{works(col)}</p>\n </div>\n {value === col.collectionId && <Check className=\"h-4 w-4 text-brand-blue shrink-0\" />}\n </button>\n ))\n )}\n </div>\n <div className=\"border-t border-border p-1\">\n <Link\n href={newCollectionHref}\n className=\"flex items-center gap-2 rounded-lg px-2 py-2 text-sm font-medium text-muted-foreground hover:bg-muted/60 hover:text-foreground transition-colors\"\n >\n <Plus className=\"h-4 w-4\" />\n New collection\n </Link>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/launchpad/collection-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Boxes, Check, ChevronDown, Plus } from \"lucide-react\";\nimport type { ApiCollection } from \"@medialane/sdk\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Input } from \"../input.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\n\nexport interface CollectionPickerProps {\n collections: ApiCollection[];\n loading: boolean;\n value: string;\n onChange: (id: string) => void;\n newCollectionHref: string;\n}\n\nfunction label(col: ApiCollection) {\n return col.name || col.symbol || `Collection #${col.collectionId}`;\n}\n\nfunction works(col: ApiCollection) {\n return col.totalSupply != null ? `${col.totalSupply.toLocaleString()} work${col.totalSupply !== 1 ? \"s\" : \"\"}` : \"Empty\";\n}\n\nfunction Thumb({ image, size }: { image: string | null | undefined; size: \"sm\" | \"md\" }) {\n const url = useImageUrl()(image);\n return (\n <div className={cn(\"relative rounded-lg overflow-hidden bg-muted shrink-0\", size === \"md\" ? \"h-10 w-10\" : \"h-8 w-8\")}>\n {url ? (\n <Image src={url} alt=\"\" fill unoptimized className=\"object-cover\" />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-4 w-4 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n );\n}\n\nexport function CollectionPicker({ collections, loading, value, onChange, newCollectionHref }: CollectionPickerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n\n if (loading) return <Skeleton className=\"h-[4.25rem] rounded-xl\" />;\n\n if (collections.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed border-border p-5 text-center space-y-3\">\n <p className=\"text-sm text-muted-foreground\">No collection found. It may take a minute to display recently created collections.</p>\n <Link\n href={newCollectionHref}\n className=\"inline-flex items-center gap-1.5 h-9 px-4 rounded-xl text-sm font-semibold text-white bg-brand-blue hover:brightness-110 transition-all\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Create your first collection\n </Link>\n </div>\n );\n }\n\n const selected = collections.find((c) => c.collectionId === value) ?? null;\n const filtered = query.trim() ? collections.filter((c) => label(c).toLowerCase().includes(query.trim().toLowerCase())) : collections;\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) setQuery(\"\");\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-expanded={open}\n className=\"flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40\"\n >\n <Thumb image={selected?.image} size=\"md\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">{selected ? label(selected) : \"Choose a collection\"}</p>\n <p className=\"text-xs text-muted-foreground\">{selected ? works(selected) : \"Where this work will live\"}</p>\n </div>\n <span className=\"flex items-center gap-1 text-xs font-medium text-muted-foreground shrink-0\">\n Change\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n {collections.length > 5 && (\n <div className=\"border-b border-border p-2\">\n <Input value={query} onChange={(e) => setQuery(e.target.value)} placeholder=\"Search collections…\" className=\"h-8\" />\n </div>\n )}\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {filtered.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm text-muted-foreground\">No collection found.</p>\n ) : (\n filtered.map((col) => (\n <button\n key={col.collectionId!}\n type=\"button\"\n onClick={() => {\n onChange(col.collectionId!);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60\"\n >\n <Thumb image={col.image} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{label(col)}</p>\n <p className=\"text-xs text-muted-foreground\">{works(col)}</p>\n </div>\n {value === col.collectionId && <Check className=\"h-4 w-4 text-brand-blue shrink-0\" />}\n </button>\n ))\n )}\n </div>\n <div className=\"border-t border-border p-1\">\n <Link\n href={newCollectionHref}\n className=\"flex items-center gap-2 rounded-lg px-2 py-2 text-sm font-medium text-muted-foreground hover:bg-muted/60 hover:text-foreground transition-colors\"\n >\n <Plus className=\"h-4 w-4\" />\n New collection\n </Link>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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","names":[]}
@@ -189,7 +189,14 @@ function CommandRow({ item, primary, onSelect }) {
189
189
  primary ? "px-2.5 py-2.5" : "px-2.5 py-2"
190
190
  ),
191
191
  children: [
192
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
192
+ item.iconSrc ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
193
+ "img",
194
+ {
195
+ src: item.iconSrc,
196
+ alt: "",
197
+ className: (0, import_cn.cn)("shrink-0 rounded-lg", primary ? "h-9 w-9" : "h-8 w-8")
198
+ }
199
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
193
200
  "span",
194
201
  {
195
202
  className: (0, import_cn.cn)(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/nav-command-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Command, defaultFilter } from \"cmdk\";\nimport { assetHref, collectionHref, profileHref } from \"@medialane/sdk\";\nimport { useRouter } from \"./router.js\";\nimport { Search, X, ArrowRight, Loader2 } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"../utils/cn.js\";\nimport { profileIdentity } from \"../utils/profile-identity.js\";\nimport { useSearch, SEARCH_MIN_LENGTH } from \"../utils/use-search.js\";\nimport { ResultThumbnail } from \"./result-thumbnail.js\";\n\nexport interface NavCommand {\n id: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n href?: string;\n action?: () => void;\n\n keywords?: string[];\n\n description?: string;\n}\n\nexport interface NavCommandGroup {\n\n heading?: string;\n items: NavCommand[];\n}\n\nexport interface NavCommandMenuProps {\n commands: NavCommandGroup[];\n\n trigger?: React.ReactNode;\n\n accountSlot?: React.ReactNode;\n\n footerSlot?: React.ReactNode;\n\n showKeyboardHints?: boolean;\n\n brandSlot?: React.ReactNode;\n\n search?: boolean;\n}\n\nconst ML_NAV_OPEN = \"ml:nav-open\";\nconst ML_NAV_CLOSE = \"ml:nav-close\";\n\nexport function useNavCommandMenu() {\n return {\n open: () => document.dispatchEvent(new CustomEvent(ML_NAV_OPEN)),\n close: () => document.dispatchEvent(new CustomEvent(ML_NAV_CLOSE)),\n };\n}\n\nfunction Kbd({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <kbd\n className={cn(\n \"inline-flex min-w-[18px] items-center justify-center rounded-md bg-muted/60 px-1.5 py-0.5\",\n \"font-sans text-2xs leading-none text-muted-foreground\",\n className\n )}\n >\n {children}\n </kbd>\n );\n}\n\nconst RELEVANCE_FLOOR = 0.2;\n\nexport function relevanceFilter(value: string, search: string, keywords?: string[]): number {\n const score = defaultFilter(value, search, keywords);\n return score >= RELEVANCE_FLOOR ? score : 0;\n}\n\nfunction commandValue(item: NavCommand) {\n return [item.label, ...(item.keywords ?? [])].join(\" \");\n}\n\nexport function matchCommands(commands: NavCommandGroup[], query: string): NavCommand[] {\n const q = query.trim();\n if (!q) return [];\n return commands\n .flatMap((group) => group.items)\n .map((item) => ({ item, score: relevanceFilter(commandValue(item), q) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n .map(({ item }) => item);\n}\n\nconst SEARCH_DEBOUNCE_MS = 250;\nconst SEARCH_LIMIT = 4;\n\nfunction useDebouncedQuery(query: string) {\n const [debounced, setDebounced] = React.useState(query);\n React.useEffect(() => {\n if (!query.trim()) {\n setDebounced(query);\n return;\n }\n const t = setTimeout(() => setDebounced(query), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(t);\n }, [query]);\n return debounced;\n}\n\nfunction useMenuSearch(query: string) {\n return useSearch(query, { limit: SEARCH_LIMIT, keepPrevious: true });\n}\n\nfunction SearchIcon({ query, active }: { query: string; active: boolean }) {\n const { isLoading } = useMenuSearch(query);\n return isLoading ? (\n <Loader2 className=\"h-[18px] w-[18px] shrink-0 animate-spin text-primary\" />\n ) : (\n <Search className={cn(\"h-[18px] w-[18px] shrink-0 transition-colors\", active ? \"text-primary\" : \"text-muted-foreground\")} />\n );\n}\n\nfunction ResultRow({ value, label, description, leading, onSelect }: {\n value: string;\n label: string;\n description?: string | null;\n leading: React.ReactNode;\n onSelect: () => void;\n}) {\n return (\n <Command.Item\n value={value}\n onSelect={onSelect}\n className=\"group/item flex cursor-pointer items-center gap-3 rounded-xl px-2.5 py-2 transition-colors duration-150 aria-selected:bg-primary/10\"\n >\n {leading}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm leading-tight\">{label}</span>\n {description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">{description}</span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nfunction SearchResults({ query, debouncedQuery, onNavigate }: {\n query: string;\n debouncedQuery: string;\n onNavigate: (href: string) => void;\n}) {\n const { results } = useMenuSearch(debouncedQuery);\n const creators = results?.creators ?? [];\n const collections = results?.collections ?? [];\n const tokens = results?.tokens ?? [];\n const q = query.trim();\n\n return (\n <>\n {creators.length > 0 && (\n <Command.Group heading=\"Creators\" className={GROUP_HEADING_CLASSES}>\n {creators.map((creator) => {\n const { identity, name } = profileIdentity(creator);\n return (\n <ResultRow\n key={creator.walletAddress}\n value={`creator:${creator.walletAddress}`}\n label={identity}\n description={name}\n leading={<ResultThumbnail src={creator.avatarImage} label={identity} round />}\n onSelect={() => onNavigate(profileHref({ username: creator.username, address: creator.walletAddress }))}\n />\n );\n })}\n </Command.Group>\n )}\n {collections.length > 0 && (\n <Command.Group heading=\"Collections\" className={GROUP_HEADING_CLASSES}>\n {collections.map((col) => {\n const label = col.name ?? \"Untitled\";\n return (\n <ResultRow\n key={col.contractAddress}\n value={`collection:${col.contractAddress}`}\n label={label}\n leading={<ResultThumbnail src={col.image} label={label} />}\n onSelect={() => onNavigate(collectionHref(\"STARKNET\", col.contractAddress))}\n />\n );\n })}\n </Command.Group>\n )}\n {tokens.length > 0 && (\n <Command.Group heading=\"Assets\" className={GROUP_HEADING_CLASSES}>\n {tokens.map((token) => {\n const label = token.name ?? `#${token.tokenId}`;\n return (\n <ResultRow\n key={`${token.contractAddress}-${token.tokenId}`}\n value={`asset:${token.contractAddress}:${token.tokenId}`}\n label={label}\n leading={<ResultThumbnail src={token.image} label={label} />}\n onSelect={() => onNavigate(assetHref(\"STARKNET\", token.contractAddress, token.tokenId))}\n />\n );\n })}\n </Command.Group>\n )}\n <Command.Group className={GROUP_HEADING_CLASSES}>\n <ResultRow\n value=\"search:all\"\n label={`All results for \"${q}\"`}\n leading={\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted/50 group-aria-selected/item:bg-primary/15\">\n <Search className=\"h-4 w-4 text-foreground/80 transition-colors group-aria-selected/item:text-primary\" />\n </span>\n }\n onSelect={() => onNavigate(`/search?q=${encodeURIComponent(q)}`)}\n />\n </Command.Group>\n </>\n );\n}\n\nfunction CommandRow({ item, primary, onSelect }: { item: NavCommand; primary: boolean; onSelect: () => void }) {\n return (\n <Command.Item\n value={commandValue(item)}\n onSelect={onSelect}\n className={cn(\n \"group/item flex cursor-pointer items-center gap-3 rounded-xl\",\n \"transition-colors duration-150 aria-selected:bg-primary/10\",\n primary ? \"px-2.5 py-2.5\" : \"px-2.5 py-2\"\n )}\n >\n <span\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-lg transition-colors\",\n \"bg-muted/50 group-aria-selected/item:bg-primary/15\",\n primary ? \"h-9 w-9\" : \"h-8 w-8\"\n )}\n >\n <item.icon\n className={cn(\n \"text-foreground/80 transition-colors group-aria-selected/item:text-primary\",\n primary ? \"h-[18px] w-[18px]\" : \"h-4 w-4\"\n )}\n />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\n \"block truncate leading-tight\",\n primary ? \"text-base font-medium\" : \"text-sm\"\n )}\n >\n {item.label}\n </span>\n {item.description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">\n {item.description}\n </span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nconst GROUP_HEADING_CLASSES = cn(\n \"[&_[cmdk-group-heading]]:px-2.5\",\n \"[&_[cmdk-group-heading]]:pt-2\",\n \"[&_[cmdk-group-heading]]:pb-1\",\n \"[&_[cmdk-group-heading]]:text-[10.5px]\",\n \"[&_[cmdk-group-heading]]:font-semibold\",\n \"[&_[cmdk-group-heading]]:uppercase\",\n \"[&_[cmdk-group-heading]]:tracking-[0.08em]\",\n \"[&_[cmdk-group-heading]]:text-muted-foreground/60\"\n);\n\nexport function NavCommandMenu({\n commands,\n trigger,\n accountSlot,\n footerSlot,\n showKeyboardHints = true,\n brandSlot,\n search = false,\n}: NavCommandMenuProps) {\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState(\"\");\n const debouncedQuery = useDebouncedQuery(query);\n const searching = query.trim().length > 0;\n const searchingContent = search && query.trim().length >= SEARCH_MIN_LENGTH;\n const matches = React.useMemo(() => matchCommands(commands, query), [commands, query]);\n const router = useRouter();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n if (!open) return;\n setQuery(\"\");\n const t = setTimeout(() => inputRef.current?.focus(), 60);\n return () => clearTimeout(t);\n }, [open]);\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setOpen((prev) => !prev);\n }\n if (e.key === \"Escape\") setOpen(false);\n };\n const onOpen = () => setOpen(true);\n const onClose = () => setOpen(false);\n\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(ML_NAV_OPEN, onOpen);\n document.addEventListener(ML_NAV_CLOSE, onClose);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(ML_NAV_OPEN, onOpen);\n document.removeEventListener(ML_NAV_CLOSE, onClose);\n };\n }, []);\n\n const navigate = React.useCallback(\n (href: string) => {\n setOpen(false);\n router.push(href);\n },\n [router]\n );\n\n const runCommand = React.useCallback(\n (cmd: NavCommand) => {\n if (cmd.href) return navigate(cmd.href);\n setOpen(false);\n cmd.action?.();\n },\n [navigate]\n );\n\n return (\n <>\n {trigger}\n\n <AnimatePresence>\n {open && (\n <>\n\n <motion.div\n className=\"nav-canvas-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={() => setOpen(false)}\n />\n\n <motion.div\n className=\"fixed inset-0 z-[101] flex items-end justify-center p-3 pb-[calc(1rem+env(safe-area-inset-bottom))] sm:items-center sm:p-4\"\n initial={{ opacity: 0, y: 24, scale: 1 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 24 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={() => setOpen(false)}\n >\n <div\n className={cn(\n \"flex w-full max-h-[85dvh] flex-col overflow-hidden rounded-[20px] sm:max-h-[min(680px,88dvh)] sm:max-w-[620px]\",\n \"bg-background/90 backdrop-blur-2xl backdrop-saturate-150\"\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <Command shouldFilter={false} label=\"Medialane navigation\" className=\"flex min-h-0 flex-1 flex-col\">\n\n <div className=\"flex justify-center pt-2.5 sm:hidden\" aria-hidden=\"true\">\n <span className=\"h-1 w-9 rounded-full bg-muted-foreground/30\" />\n </div>\n\n <div className=\"flex items-center gap-3 border-b border-border/40 px-4 py-3.5\">\n {search ? (\n <SearchIcon query={debouncedQuery} active={Boolean(query)} />\n ) : (\n <Search\n className={cn(\n \"h-[18px] w-[18px] shrink-0 transition-colors\",\n query ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n )}\n <Command.Input\n ref={inputRef}\n value={query}\n onValueChange={setQuery}\n placeholder=\"Search or run a command…\"\n className=\"flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground\"\n />\n <Kbd className=\"hidden sm:inline-flex\">esc</Kbd>\n <button\n onClick={() => setOpen(false)}\n className=\"rounded-md p-1 transition-colors hover:bg-muted/50 sm:hidden\"\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </div>\n\n <Command.List className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2\">\n <Command.Empty className=\"py-8 text-center text-sm text-muted-foreground\">\n No results found.\n </Command.Empty>\n\n {searching ? (\n <>\n {matches.length > 0 && (\n <Command.Group className={GROUP_HEADING_CLASSES}>\n {matches.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={false}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n )}\n {searchingContent && (\n <SearchResults query={query} debouncedQuery={debouncedQuery} onNavigate={navigate} />\n )}\n </>\n ) : (\n commands.map((group, i) => {\n const primary = !group.heading;\n return (\n <React.Fragment key={group.heading ?? `__primary-${i}`}>\n {i > 0 && (\n <Command.Separator className=\"my-1.5 h-px bg-border/40\" />\n )}\n <Command.Group heading={group.heading} className={GROUP_HEADING_CLASSES}>\n {group.items.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={primary}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n </React.Fragment>\n );\n })\n )}\n </Command.List>\n\n {accountSlot && (\n <div className=\"border-t border-border/40 bg-muted/20 px-3 py-3\">\n {accountSlot}\n </div>\n )}\n\n <div className=\"flex items-center justify-between gap-3 border-t border-border/40 bg-muted/20 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n {footerSlot}\n {showKeyboardHints && (\n <span className=\"hidden items-center gap-3 text-[10.5px] text-muted-foreground/70 sm:flex\">\n <span className=\"flex items-center gap-1\"><Kbd>↑</Kbd><Kbd>↓</Kbd> Navigate</span>\n <span className=\"flex items-center gap-1\"><Kbd>↵</Kbd> Open</span>\n </span>\n )}\n </div>\n {brandSlot ?? (\n <span className=\"flex shrink-0 items-center gap-2 text-2xs text-muted-foreground/50\">\n medialane\n <Kbd className=\"hidden sm:inline-flex\">⌘K</Kbd>\n </span>\n )}\n </div>\n </Command>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/nav-command-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Command, defaultFilter } from \"cmdk\";\nimport { assetHref, collectionHref, profileHref } from \"@medialane/sdk\";\nimport { useRouter } from \"./router.js\";\nimport { Search, X, ArrowRight, Loader2 } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"../utils/cn.js\";\nimport { profileIdentity } from \"../utils/profile-identity.js\";\nimport { useSearch, SEARCH_MIN_LENGTH } from \"../utils/use-search.js\";\nimport { ResultThumbnail } from \"./result-thumbnail.js\";\n\nexport interface NavCommand {\n id: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n iconSrc?: string;\n href?: string;\n action?: () => void;\n\n keywords?: string[];\n\n description?: string;\n}\n\nexport interface NavCommandGroup {\n\n heading?: string;\n items: NavCommand[];\n}\n\nexport interface NavCommandMenuProps {\n commands: NavCommandGroup[];\n\n trigger?: React.ReactNode;\n\n accountSlot?: React.ReactNode;\n\n footerSlot?: React.ReactNode;\n\n showKeyboardHints?: boolean;\n\n brandSlot?: React.ReactNode;\n\n search?: boolean;\n}\n\nconst ML_NAV_OPEN = \"ml:nav-open\";\nconst ML_NAV_CLOSE = \"ml:nav-close\";\n\nexport function useNavCommandMenu() {\n return {\n open: () => document.dispatchEvent(new CustomEvent(ML_NAV_OPEN)),\n close: () => document.dispatchEvent(new CustomEvent(ML_NAV_CLOSE)),\n };\n}\n\nfunction Kbd({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <kbd\n className={cn(\n \"inline-flex min-w-[18px] items-center justify-center rounded-md bg-muted/60 px-1.5 py-0.5\",\n \"font-sans text-2xs leading-none text-muted-foreground\",\n className\n )}\n >\n {children}\n </kbd>\n );\n}\n\nconst RELEVANCE_FLOOR = 0.2;\n\nexport function relevanceFilter(value: string, search: string, keywords?: string[]): number {\n const score = defaultFilter(value, search, keywords);\n return score >= RELEVANCE_FLOOR ? score : 0;\n}\n\nfunction commandValue(item: NavCommand) {\n return [item.label, ...(item.keywords ?? [])].join(\" \");\n}\n\nexport function matchCommands(commands: NavCommandGroup[], query: string): NavCommand[] {\n const q = query.trim();\n if (!q) return [];\n return commands\n .flatMap((group) => group.items)\n .map((item) => ({ item, score: relevanceFilter(commandValue(item), q) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n .map(({ item }) => item);\n}\n\nconst SEARCH_DEBOUNCE_MS = 250;\nconst SEARCH_LIMIT = 4;\n\nfunction useDebouncedQuery(query: string) {\n const [debounced, setDebounced] = React.useState(query);\n React.useEffect(() => {\n if (!query.trim()) {\n setDebounced(query);\n return;\n }\n const t = setTimeout(() => setDebounced(query), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(t);\n }, [query]);\n return debounced;\n}\n\nfunction useMenuSearch(query: string) {\n return useSearch(query, { limit: SEARCH_LIMIT, keepPrevious: true });\n}\n\nfunction SearchIcon({ query, active }: { query: string; active: boolean }) {\n const { isLoading } = useMenuSearch(query);\n return isLoading ? (\n <Loader2 className=\"h-[18px] w-[18px] shrink-0 animate-spin text-primary\" />\n ) : (\n <Search className={cn(\"h-[18px] w-[18px] shrink-0 transition-colors\", active ? \"text-primary\" : \"text-muted-foreground\")} />\n );\n}\n\nfunction ResultRow({ value, label, description, leading, onSelect }: {\n value: string;\n label: string;\n description?: string | null;\n leading: React.ReactNode;\n onSelect: () => void;\n}) {\n return (\n <Command.Item\n value={value}\n onSelect={onSelect}\n className=\"group/item flex cursor-pointer items-center gap-3 rounded-xl px-2.5 py-2 transition-colors duration-150 aria-selected:bg-primary/10\"\n >\n {leading}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm leading-tight\">{label}</span>\n {description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">{description}</span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nfunction SearchResults({ query, debouncedQuery, onNavigate }: {\n query: string;\n debouncedQuery: string;\n onNavigate: (href: string) => void;\n}) {\n const { results } = useMenuSearch(debouncedQuery);\n const creators = results?.creators ?? [];\n const collections = results?.collections ?? [];\n const tokens = results?.tokens ?? [];\n const q = query.trim();\n\n return (\n <>\n {creators.length > 0 && (\n <Command.Group heading=\"Creators\" className={GROUP_HEADING_CLASSES}>\n {creators.map((creator) => {\n const { identity, name } = profileIdentity(creator);\n return (\n <ResultRow\n key={creator.walletAddress}\n value={`creator:${creator.walletAddress}`}\n label={identity}\n description={name}\n leading={<ResultThumbnail src={creator.avatarImage} label={identity} round />}\n onSelect={() => onNavigate(profileHref({ username: creator.username, address: creator.walletAddress }))}\n />\n );\n })}\n </Command.Group>\n )}\n {collections.length > 0 && (\n <Command.Group heading=\"Collections\" className={GROUP_HEADING_CLASSES}>\n {collections.map((col) => {\n const label = col.name ?? \"Untitled\";\n return (\n <ResultRow\n key={col.contractAddress}\n value={`collection:${col.contractAddress}`}\n label={label}\n leading={<ResultThumbnail src={col.image} label={label} />}\n onSelect={() => onNavigate(collectionHref(\"STARKNET\", col.contractAddress))}\n />\n );\n })}\n </Command.Group>\n )}\n {tokens.length > 0 && (\n <Command.Group heading=\"Assets\" className={GROUP_HEADING_CLASSES}>\n {tokens.map((token) => {\n const label = token.name ?? `#${token.tokenId}`;\n return (\n <ResultRow\n key={`${token.contractAddress}-${token.tokenId}`}\n value={`asset:${token.contractAddress}:${token.tokenId}`}\n label={label}\n leading={<ResultThumbnail src={token.image} label={label} />}\n onSelect={() => onNavigate(assetHref(\"STARKNET\", token.contractAddress, token.tokenId))}\n />\n );\n })}\n </Command.Group>\n )}\n <Command.Group className={GROUP_HEADING_CLASSES}>\n <ResultRow\n value=\"search:all\"\n label={`All results for \"${q}\"`}\n leading={\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted/50 group-aria-selected/item:bg-primary/15\">\n <Search className=\"h-4 w-4 text-foreground/80 transition-colors group-aria-selected/item:text-primary\" />\n </span>\n }\n onSelect={() => onNavigate(`/search?q=${encodeURIComponent(q)}`)}\n />\n </Command.Group>\n </>\n );\n}\n\nfunction CommandRow({ item, primary, onSelect }: { item: NavCommand; primary: boolean; onSelect: () => void }) {\n return (\n <Command.Item\n value={commandValue(item)}\n onSelect={onSelect}\n className={cn(\n \"group/item flex cursor-pointer items-center gap-3 rounded-xl\",\n \"transition-colors duration-150 aria-selected:bg-primary/10\",\n primary ? \"px-2.5 py-2.5\" : \"px-2.5 py-2\"\n )}\n >\n {item.iconSrc ? (\n <img\n src={item.iconSrc}\n alt=\"\"\n className={cn(\"shrink-0 rounded-lg\", primary ? \"h-9 w-9\" : \"h-8 w-8\")}\n />\n ) : (\n <span\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-lg transition-colors\",\n \"bg-muted/50 group-aria-selected/item:bg-primary/15\",\n primary ? \"h-9 w-9\" : \"h-8 w-8\"\n )}\n >\n <item.icon\n className={cn(\n \"text-foreground/80 transition-colors group-aria-selected/item:text-primary\",\n primary ? \"h-[18px] w-[18px]\" : \"h-4 w-4\"\n )}\n />\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\n \"block truncate leading-tight\",\n primary ? \"text-base font-medium\" : \"text-sm\"\n )}\n >\n {item.label}\n </span>\n {item.description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">\n {item.description}\n </span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nconst GROUP_HEADING_CLASSES = cn(\n \"[&_[cmdk-group-heading]]:px-2.5\",\n \"[&_[cmdk-group-heading]]:pt-2\",\n \"[&_[cmdk-group-heading]]:pb-1\",\n \"[&_[cmdk-group-heading]]:text-[10.5px]\",\n \"[&_[cmdk-group-heading]]:font-semibold\",\n \"[&_[cmdk-group-heading]]:uppercase\",\n \"[&_[cmdk-group-heading]]:tracking-[0.08em]\",\n \"[&_[cmdk-group-heading]]:text-muted-foreground/60\"\n);\n\nexport function NavCommandMenu({\n commands,\n trigger,\n accountSlot,\n footerSlot,\n showKeyboardHints = true,\n brandSlot,\n search = false,\n}: NavCommandMenuProps) {\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState(\"\");\n const debouncedQuery = useDebouncedQuery(query);\n const searching = query.trim().length > 0;\n const searchingContent = search && query.trim().length >= SEARCH_MIN_LENGTH;\n const matches = React.useMemo(() => matchCommands(commands, query), [commands, query]);\n const router = useRouter();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n if (!open) return;\n setQuery(\"\");\n const t = setTimeout(() => inputRef.current?.focus(), 60);\n return () => clearTimeout(t);\n }, [open]);\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setOpen((prev) => !prev);\n }\n if (e.key === \"Escape\") setOpen(false);\n };\n const onOpen = () => setOpen(true);\n const onClose = () => setOpen(false);\n\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(ML_NAV_OPEN, onOpen);\n document.addEventListener(ML_NAV_CLOSE, onClose);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(ML_NAV_OPEN, onOpen);\n document.removeEventListener(ML_NAV_CLOSE, onClose);\n };\n }, []);\n\n const navigate = React.useCallback(\n (href: string) => {\n setOpen(false);\n router.push(href);\n },\n [router]\n );\n\n const runCommand = React.useCallback(\n (cmd: NavCommand) => {\n if (cmd.href) return navigate(cmd.href);\n setOpen(false);\n cmd.action?.();\n },\n [navigate]\n );\n\n return (\n <>\n {trigger}\n\n <AnimatePresence>\n {open && (\n <>\n\n <motion.div\n className=\"nav-canvas-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={() => setOpen(false)}\n />\n\n <motion.div\n className=\"fixed inset-0 z-[101] flex items-end justify-center p-3 pb-[calc(1rem+env(safe-area-inset-bottom))] sm:items-center sm:p-4\"\n initial={{ opacity: 0, y: 24, scale: 1 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 24 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={() => setOpen(false)}\n >\n <div\n className={cn(\n \"flex w-full max-h-[85dvh] flex-col overflow-hidden rounded-[20px] sm:max-h-[min(680px,88dvh)] sm:max-w-[620px]\",\n \"bg-background/90 backdrop-blur-2xl backdrop-saturate-150\"\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <Command shouldFilter={false} label=\"Medialane navigation\" className=\"flex min-h-0 flex-1 flex-col\">\n\n <div className=\"flex justify-center pt-2.5 sm:hidden\" aria-hidden=\"true\">\n <span className=\"h-1 w-9 rounded-full bg-muted-foreground/30\" />\n </div>\n\n <div className=\"flex items-center gap-3 border-b border-border/40 px-4 py-3.5\">\n {search ? (\n <SearchIcon query={debouncedQuery} active={Boolean(query)} />\n ) : (\n <Search\n className={cn(\n \"h-[18px] w-[18px] shrink-0 transition-colors\",\n query ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n )}\n <Command.Input\n ref={inputRef}\n value={query}\n onValueChange={setQuery}\n placeholder=\"Search or run a command…\"\n className=\"flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground\"\n />\n <Kbd className=\"hidden sm:inline-flex\">esc</Kbd>\n <button\n onClick={() => setOpen(false)}\n className=\"rounded-md p-1 transition-colors hover:bg-muted/50 sm:hidden\"\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </div>\n\n <Command.List className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2\">\n <Command.Empty className=\"py-8 text-center text-sm text-muted-foreground\">\n No results found.\n </Command.Empty>\n\n {searching ? (\n <>\n {matches.length > 0 && (\n <Command.Group className={GROUP_HEADING_CLASSES}>\n {matches.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={false}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n )}\n {searchingContent && (\n <SearchResults query={query} debouncedQuery={debouncedQuery} onNavigate={navigate} />\n )}\n </>\n ) : (\n commands.map((group, i) => {\n const primary = !group.heading;\n return (\n <React.Fragment key={group.heading ?? `__primary-${i}`}>\n {i > 0 && (\n <Command.Separator className=\"my-1.5 h-px bg-border/40\" />\n )}\n <Command.Group heading={group.heading} className={GROUP_HEADING_CLASSES}>\n {group.items.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={primary}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n </React.Fragment>\n );\n })\n )}\n </Command.List>\n\n {accountSlot && (\n <div className=\"border-t border-border/40 bg-muted/20 px-3 py-3\">\n {accountSlot}\n </div>\n )}\n\n <div className=\"flex items-center justify-between gap-3 border-t border-border/40 bg-muted/20 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n {footerSlot}\n {showKeyboardHints && (\n <span className=\"hidden items-center gap-3 text-[10.5px] text-muted-foreground/70 sm:flex\">\n <span className=\"flex items-center gap-1\"><Kbd>↑</Kbd><Kbd>↓</Kbd> Navigate</span>\n <span className=\"flex items-center gap-1\"><Kbd>↵</Kbd> Open</span>\n </span>\n )}\n </div>\n {brandSlot ?? (\n <span className=\"flex shrink-0 items-center gap-2 text-2xs text-muted-foreground/50\">\n medialane\n <Kbd className=\"hidden sm:inline-flex\">⌘K</Kbd>\n </span>\n )}\n </div>\n </Command>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4DI;AA1DJ,YAAuB;AACvB,kBAAuC;AACvC,iBAAuD;AACvD,oBAA0B;AAC1B,0BAA+C;AAC/C,2BAAwC;AACxC,gBAAmB;AACnB,8BAAgC;AAChC,wBAA6C;AAC7C,8BAAgC;AAqChC,MAAM,cAAe;AACrB,MAAM,eAAe;AAEd,SAAS,oBAAoB;AAClC,SAAO;AAAA,IACL,MAAO,MAAM,SAAS,cAAc,IAAI,YAAY,WAAW,CAAC;AAAA,IAChE,OAAO,MAAM,SAAS,cAAc,IAAI,YAAY,YAAY,CAAC;AAAA,EACnE;AACF;AAEA,SAAS,IAAI,EAAE,UAAU,UAAU,GAAsD;AACvF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,MAAM,kBAAkB;AAEjB,SAAS,gBAAgB,OAAe,QAAgB,UAA6B;AAC1F,QAAM,YAAQ,2BAAc,OAAO,QAAQ,QAAQ;AACnD,SAAO,SAAS,kBAAkB,QAAQ;AAC5C;AAEA,SAAS,aAAa,MAAkB;AACtC,SAAO,CAAC,KAAK,OAAO,GAAI,KAAK,YAAY,CAAC,CAAE,EAAE,KAAK,GAAG;AACxD;AAEO,SAAS,cAAc,UAA6B,OAA6B;AACtF,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,CAAC,EAAG,QAAO,CAAC;AAChB,SAAO,SACJ,QAAQ,CAAC,UAAU,MAAM,KAAK,EAC9B,IAAI,CAAC,UAAU,EAAE,MAAM,OAAO,gBAAgB,aAAa,IAAI,GAAG,CAAC,EAAE,EAAE,EACvE,OAAO,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC,EAC/B,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI;AAC3B;AAEA,MAAM,qBAAqB;AAC3B,MAAM,eAAe;AAErB,SAAS,kBAAkB,OAAe;AACxC,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,MAAM,KAAK,GAAG;AACjB,mBAAa,KAAK;AAClB;AAAA,IACF;AACA,UAAM,IAAI,WAAW,MAAM,aAAa,KAAK,GAAG,kBAAkB;AAClE,WAAO,MAAM,aAAa,CAAC;AAAA,EAC7B,GAAG,CAAC,KAAK,CAAC;AACV,SAAO;AACT;AAEA,SAAS,cAAc,OAAe;AACpC,aAAO,6BAAU,OAAO,EAAE,OAAO,cAAc,cAAc,KAAK,CAAC;AACrE;AAEA,SAAS,WAAW,EAAE,OAAO,OAAO,GAAuC;AACzE,QAAM,EAAE,UAAU,IAAI,cAAc,KAAK;AACzC,SAAO,YACL,4CAAC,+BAAQ,WAAU,wDAAuD,IAE1E,4CAAC,8BAAO,eAAW,cAAG,gDAAgD,SAAS,iBAAiB,uBAAuB,GAAG;AAE9H;AAEA,SAAS,UAAU,EAAE,OAAO,OAAO,aAAa,SAAS,SAAS,GAM/D;AACD,SACE;AAAA,IAAC,oBAAQ;AAAA,IAAR;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAU;AAAA,MAET;AAAA;AAAA,QACD,6CAAC,UAAK,WAAU,kBACd;AAAA,sDAAC,UAAK,WAAU,wCAAwC,iBAAM;AAAA,UAC7D,eACC,4CAAC,UAAK,WAAU,2EAA2E,uBAAY;AAAA,WAE3G;AAAA,QACA,4CAAC,kCAAW,WAAU,4GAA2G;AAAA;AAAA;AAAA,EACnI;AAEJ;AAEA,SAAS,cAAc,EAAE,OAAO,gBAAgB,WAAW,GAIxD;AACD,QAAM,EAAE,QAAQ,IAAI,cAAc,cAAc;AAChD,QAAM,WAAW,SAAS,YAAY,CAAC;AACvC,QAAM,cAAc,SAAS,eAAe,CAAC;AAC7C,QAAM,SAAS,SAAS,UAAU,CAAC;AACnC,QAAM,IAAI,MAAM,KAAK;AAErB,SACE,4EACG;AAAA,aAAS,SAAS,KACjB,4CAAC,oBAAQ,OAAR,EAAc,SAAQ,YAAW,WAAW,uBAC1C,mBAAS,IAAI,CAAC,YAAY;AACzB,YAAM,EAAE,UAAU,KAAK,QAAI,yCAAgB,OAAO;AAClD,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,WAAW,QAAQ,aAAa;AAAA,UACvC,OAAO;AAAA,UACP,aAAa;AAAA,UACb,SAAS,4CAAC,2CAAgB,KAAK,QAAQ,aAAa,OAAO,UAAU,OAAK,MAAC;AAAA,UAC3E,UAAU,MAAM,eAAW,wBAAY,EAAE,UAAU,QAAQ,UAAU,SAAS,QAAQ,cAAc,CAAC,CAAC;AAAA;AAAA,QALjG,QAAQ;AAAA,MAMf;AAAA,IAEJ,CAAC,GACH;AAAA,IAED,YAAY,SAAS,KACpB,4CAAC,oBAAQ,OAAR,EAAc,SAAQ,eAAc,WAAW,uBAC7C,sBAAY,IAAI,CAAC,QAAQ;AACxB,YAAM,QAAQ,IAAI,QAAQ;AAC1B,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,cAAc,IAAI,eAAe;AAAA,UACxC;AAAA,UACA,SAAS,4CAAC,2CAAgB,KAAK,IAAI,OAAO,OAAc;AAAA,UACxD,UAAU,MAAM,eAAW,2BAAe,YAAY,IAAI,eAAe,CAAC;AAAA;AAAA,QAJrE,IAAI;AAAA,MAKX;AAAA,IAEJ,CAAC,GACH;AAAA,IAED,OAAO,SAAS,KACf,4CAAC,oBAAQ,OAAR,EAAc,SAAQ,UAAS,WAAW,uBACxC,iBAAO,IAAI,CAAC,UAAU;AACrB,YAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,OAAO;AAC7C,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,SAAS,MAAM,eAAe,IAAI,MAAM,OAAO;AAAA,UACtD;AAAA,UACA,SAAS,4CAAC,2CAAgB,KAAK,MAAM,OAAO,OAAc;AAAA,UAC1D,UAAU,MAAM,eAAW,sBAAU,YAAY,MAAM,iBAAiB,MAAM,OAAO,CAAC;AAAA;AAAA,QAJjF,GAAG,MAAM,eAAe,IAAI,MAAM,OAAO;AAAA,MAKhD;AAAA,IAEJ,CAAC,GACH;AAAA,IAEF,4CAAC,oBAAQ,OAAR,EAAc,WAAW,uBACxB;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO,oBAAoB,CAAC;AAAA,QAC5B,SACE,4CAAC,UAAK,WAAU,mHACd,sDAAC,8BAAO,WAAU,sFAAqF,GACzG;AAAA,QAEF,UAAU,MAAM,WAAW,aAAa,mBAAmB,CAAC,CAAC,EAAE;AAAA;AAAA,IACjE,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW,EAAE,MAAM,SAAS,SAAS,GAAiE;AAC7G,SACE;AAAA,IAAC,oBAAQ;AAAA,IAAR;AAAA,MACC,OAAO,aAAa,IAAI;AAAA,MACxB;AAAA,MACA,eAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,UAAU,kBAAkB;AAAA,MAC9B;AAAA,MAEC;AAAA,aAAK,UACJ;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,KAAK;AAAA,YACV,KAAI;AAAA,YACJ,eAAW,cAAG,uBAAuB,UAAU,YAAY,SAAS;AAAA;AAAA,QACtE,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA,UAAU,YAAY;AAAA,YACxB;AAAA,YAEA;AAAA,cAAC,KAAK;AAAA,cAAL;AAAA,gBACC,eAAW;AAAA,kBACT;AAAA,kBACA,UAAU,sBAAsB;AAAA,gBAClC;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEF,6CAAC,UAAK,WAAU,kBACd;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA,UAAU,0BAA0B;AAAA,cACtC;AAAA,cAEC,eAAK;AAAA;AAAA,UACR;AAAA,UACC,KAAK,eACJ,4CAAC,UAAK,WAAU,2EACb,eAAK,aACR;AAAA,WAEJ;AAAA,QACA,4CAAC,kCAAW,WAAU,4GAA2G;AAAA;AAAA;AAAA,EACnI;AAEJ;AAEA,MAAM,4BAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA,SAAS;AACX,GAAwB;AACtB,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,EAAE;AAC3C,QAAM,iBAAiB,kBAAkB,KAAK;AAC9C,QAAM,YAAY,MAAM,KAAK,EAAE,SAAS;AACxC,QAAM,mBAAmB,UAAU,MAAM,KAAK,EAAE,UAAU;AAC1D,QAAM,UAAU,MAAM,QAAQ,MAAM,cAAc,UAAU,KAAK,GAAG,CAAC,UAAU,KAAK,CAAC;AACrF,QAAM,aAAS,yBAAU;AACzB,QAAM,WAAW,MAAM,OAAyB,IAAI;AAEpD,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,aAAS,EAAE;AACX,UAAM,IAAI,WAAW,MAAM,SAAS,SAAS,MAAM,GAAG,EAAE;AACxD,WAAO,MAAM,aAAa,CAAC;AAAA,EAC7B,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,UAAU,MAAM;AACpB,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,QAAQ,EAAE,WAAW,EAAE,UAAU;AAC7C,UAAE,eAAe;AACjB,gBAAQ,CAAC,SAAS,CAAC,IAAI;AAAA,MACzB;AACA,UAAI,EAAE,QAAQ,SAAU,SAAQ,KAAK;AAAA,IACvC;AACA,UAAM,SAAU,MAAM,QAAQ,IAAI;AAClC,UAAM,UAAU,MAAM,QAAQ,KAAK;AAEnC,aAAS,iBAAiB,WAAW,KAAK;AAC1C,aAAS,iBAAiB,aAAa,MAAM;AAC7C,aAAS,iBAAiB,cAAc,OAAO;AAC/C,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,KAAK;AAC7C,eAAS,oBAAoB,aAAa,MAAM;AAChD,eAAS,oBAAoB,cAAc,OAAO;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,MAAM;AAAA,IACrB,CAAC,SAAiB;AAChB,cAAQ,KAAK;AACb,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,aAAa,MAAM;AAAA,IACvB,CAAC,QAAoB;AACnB,UAAI,IAAI,KAAM,QAAO,SAAS,IAAI,IAAI;AACtC,cAAQ,KAAK;AACb,UAAI,SAAS;AAAA,IACf;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,SACE,4EACG;AAAA;AAAA,IAED,4CAAC,wCACE,kBACC,4EAEE;AAAA;AAAA,QAAC,4BAAO;AAAA,QAAP;AAAA,UACC,WAAU;AAAA,UACV,SAAS,EAAE,SAAS,EAAE;AAAA,UACtB,SAAS,EAAE,SAAS,EAAE;AAAA,UACtB,MAAM,EAAE,SAAS,EAAE;AAAA,UACnB,YAAY,EAAE,UAAU,KAAK;AAAA,UAC7B,SAAS,MAAM,QAAQ,KAAK;AAAA;AAAA,MAC9B;AAAA,MAEA;AAAA,QAAC,4BAAO;AAAA,QAAP;AAAA,UACC,WAAU;AAAA,UACV,SAAS,EAAE,SAAS,GAAG,GAAG,IAAI,OAAO,EAAE;AAAA,UACvC,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG,OAAO,EAAE;AAAA,UACtC,MAAM,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,UAC1B,YAAY,EAAE,UAAU,MAAM,MAAM,UAAU;AAAA,UAC9C,SAAS,MAAM,QAAQ,KAAK;AAAA,UAE5B;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,cAElC,uDAAC,uBAAQ,cAAc,OAAO,OAAM,wBAAuB,WAAU,gCAEnE;AAAA,4DAAC,SAAI,WAAU,wCAAuC,eAAY,QAChE,sDAAC,UAAK,WAAU,+CAA8C,GAChE;AAAA,gBAEA,6CAAC,SAAI,WAAU,iEACZ;AAAA,2BACC,4CAAC,cAAW,OAAO,gBAAgB,QAAQ,QAAQ,KAAK,GAAG,IAE3D;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW;AAAA,wBACT;AAAA,wBACA,QAAQ,iBAAiB;AAAA,sBAC3B;AAAA;AAAA,kBACF;AAAA,kBAEF;AAAA,oBAAC,oBAAQ;AAAA,oBAAR;AAAA,sBACC,KAAK;AAAA,sBACL,OAAO;AAAA,sBACP,eAAe;AAAA,sBACf,aAAY;AAAA,sBACZ,WAAU;AAAA;AAAA,kBACZ;AAAA,kBACA,4CAAC,OAAI,WAAU,yBAAwB,iBAAG;AAAA,kBAC1C;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS,MAAM,QAAQ,KAAK;AAAA,sBAC5B,WAAU;AAAA,sBACV,cAAW;AAAA,sBAEX,sDAAC,yBAAE,WAAU,iCAAgC;AAAA;AAAA,kBAC/C;AAAA,mBACF;AAAA,gBAEA,6CAAC,oBAAQ,MAAR,EAAa,WAAU,yDACtB;AAAA,8DAAC,oBAAQ,OAAR,EAAc,WAAU,kDAAiD,+BAE1E;AAAA,kBAEC,YACC,4EACG;AAAA,4BAAQ,SAAS,KAChB,4CAAC,oBAAQ,OAAR,EAAc,WAAW,uBACvB,kBAAQ,IAAI,CAAC,SACZ;AAAA,sBAAC;AAAA;AAAA,wBAEC;AAAA,wBACA,SAAS;AAAA,wBACT,UAAU,MAAM,WAAW,IAAI;AAAA;AAAA,sBAH1B,KAAK;AAAA,oBAIZ,CACD,GACH;AAAA,oBAED,oBACC,4CAAC,iBAAc,OAAc,gBAAgC,YAAY,UAAU;AAAA,qBAEvF,IAEA,SAAS,IAAI,CAAC,OAAO,MAAM;AACzB,0BAAM,UAAU,CAAC,MAAM;AACvB,2BACA,6CAAC,MAAM,UAAN,EACE;AAAA,0BAAI,KACH,4CAAC,oBAAQ,WAAR,EAAkB,WAAU,4BAA2B;AAAA,sBAE1D,4CAAC,oBAAQ,OAAR,EAAc,SAAS,MAAM,SAAS,WAAW,uBAC/C,gBAAM,MAAM,IAAI,CAAC,SAChB;AAAA,wBAAC;AAAA;AAAA,0BAEC;AAAA,0BACA;AAAA,0BACA,UAAU,MAAM,WAAW,IAAI;AAAA;AAAA,wBAH1B,KAAK;AAAA,sBAIZ,CACD,GACH;AAAA,yBAbmB,MAAM,WAAW,aAAa,CAAC,EAcpD;AAAA,kBAEF,CAAC;AAAA,mBAEL;AAAA,gBAEC,eACC,4CAAC,SAAI,WAAU,mDACZ,uBACH;AAAA,gBAGF,6CAAC,SAAI,WAAU,2FACb;AAAA,+DAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,oBACA,qBACC,6CAAC,UAAK,WAAU,4EACd;AAAA,mEAAC,UAAK,WAAU,2BAA0B;AAAA,oEAAC,OAAI,oBAAC;AAAA,wBAAM,4CAAC,OAAI,oBAAC;AAAA,wBAAM;AAAA,yBAAS;AAAA,sBAC3E,6CAAC,UAAK,WAAU,2BAA0B;AAAA,oEAAC,OAAI,oBAAC;AAAA,wBAAM;AAAA,yBAAK;AAAA,uBAC7D;AAAA,qBAEJ;AAAA,kBACC,aACC,6CAAC,UAAK,WAAU,sEAAqE;AAAA;AAAA,oBAEnF,4CAAC,OAAI,WAAU,yBAAwB,qBAAE;AAAA,qBAC3C;AAAA,mBAEJ;AAAA,iBACF;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,OACF,GAEJ;AAAA,KACF;AAEJ;","names":[]}
@@ -7,6 +7,7 @@ interface NavCommand {
7
7
  icon: React.ComponentType<{
8
8
  className?: string;
9
9
  }>;
10
+ iconSrc?: string;
10
11
  href?: string;
11
12
  action?: () => void;
12
13
  keywords?: string[];
@@ -7,6 +7,7 @@ interface NavCommand {
7
7
  icon: React.ComponentType<{
8
8
  className?: string;
9
9
  }>;
10
+ iconSrc?: string;
10
11
  href?: string;
11
12
  action?: () => void;
12
13
  keywords?: string[];
@@ -153,7 +153,14 @@ function CommandRow({ item, primary, onSelect }) {
153
153
  primary ? "px-2.5 py-2.5" : "px-2.5 py-2"
154
154
  ),
155
155
  children: [
156
- /* @__PURE__ */ jsx(
156
+ item.iconSrc ? /* @__PURE__ */ jsx(
157
+ "img",
158
+ {
159
+ src: item.iconSrc,
160
+ alt: "",
161
+ className: cn("shrink-0 rounded-lg", primary ? "h-9 w-9" : "h-8 w-8")
162
+ }
163
+ ) : /* @__PURE__ */ jsx(
157
164
  "span",
158
165
  {
159
166
  className: cn(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/nav-command-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Command, defaultFilter } from \"cmdk\";\nimport { assetHref, collectionHref, profileHref } from \"@medialane/sdk\";\nimport { useRouter } from \"./router.js\";\nimport { Search, X, ArrowRight, Loader2 } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"../utils/cn.js\";\nimport { profileIdentity } from \"../utils/profile-identity.js\";\nimport { useSearch, SEARCH_MIN_LENGTH } from \"../utils/use-search.js\";\nimport { ResultThumbnail } from \"./result-thumbnail.js\";\n\nexport interface NavCommand {\n id: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n href?: string;\n action?: () => void;\n\n keywords?: string[];\n\n description?: string;\n}\n\nexport interface NavCommandGroup {\n\n heading?: string;\n items: NavCommand[];\n}\n\nexport interface NavCommandMenuProps {\n commands: NavCommandGroup[];\n\n trigger?: React.ReactNode;\n\n accountSlot?: React.ReactNode;\n\n footerSlot?: React.ReactNode;\n\n showKeyboardHints?: boolean;\n\n brandSlot?: React.ReactNode;\n\n search?: boolean;\n}\n\nconst ML_NAV_OPEN = \"ml:nav-open\";\nconst ML_NAV_CLOSE = \"ml:nav-close\";\n\nexport function useNavCommandMenu() {\n return {\n open: () => document.dispatchEvent(new CustomEvent(ML_NAV_OPEN)),\n close: () => document.dispatchEvent(new CustomEvent(ML_NAV_CLOSE)),\n };\n}\n\nfunction Kbd({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <kbd\n className={cn(\n \"inline-flex min-w-[18px] items-center justify-center rounded-md bg-muted/60 px-1.5 py-0.5\",\n \"font-sans text-2xs leading-none text-muted-foreground\",\n className\n )}\n >\n {children}\n </kbd>\n );\n}\n\nconst RELEVANCE_FLOOR = 0.2;\n\nexport function relevanceFilter(value: string, search: string, keywords?: string[]): number {\n const score = defaultFilter(value, search, keywords);\n return score >= RELEVANCE_FLOOR ? score : 0;\n}\n\nfunction commandValue(item: NavCommand) {\n return [item.label, ...(item.keywords ?? [])].join(\" \");\n}\n\nexport function matchCommands(commands: NavCommandGroup[], query: string): NavCommand[] {\n const q = query.trim();\n if (!q) return [];\n return commands\n .flatMap((group) => group.items)\n .map((item) => ({ item, score: relevanceFilter(commandValue(item), q) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n .map(({ item }) => item);\n}\n\nconst SEARCH_DEBOUNCE_MS = 250;\nconst SEARCH_LIMIT = 4;\n\nfunction useDebouncedQuery(query: string) {\n const [debounced, setDebounced] = React.useState(query);\n React.useEffect(() => {\n if (!query.trim()) {\n setDebounced(query);\n return;\n }\n const t = setTimeout(() => setDebounced(query), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(t);\n }, [query]);\n return debounced;\n}\n\nfunction useMenuSearch(query: string) {\n return useSearch(query, { limit: SEARCH_LIMIT, keepPrevious: true });\n}\n\nfunction SearchIcon({ query, active }: { query: string; active: boolean }) {\n const { isLoading } = useMenuSearch(query);\n return isLoading ? (\n <Loader2 className=\"h-[18px] w-[18px] shrink-0 animate-spin text-primary\" />\n ) : (\n <Search className={cn(\"h-[18px] w-[18px] shrink-0 transition-colors\", active ? \"text-primary\" : \"text-muted-foreground\")} />\n );\n}\n\nfunction ResultRow({ value, label, description, leading, onSelect }: {\n value: string;\n label: string;\n description?: string | null;\n leading: React.ReactNode;\n onSelect: () => void;\n}) {\n return (\n <Command.Item\n value={value}\n onSelect={onSelect}\n className=\"group/item flex cursor-pointer items-center gap-3 rounded-xl px-2.5 py-2 transition-colors duration-150 aria-selected:bg-primary/10\"\n >\n {leading}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm leading-tight\">{label}</span>\n {description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">{description}</span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nfunction SearchResults({ query, debouncedQuery, onNavigate }: {\n query: string;\n debouncedQuery: string;\n onNavigate: (href: string) => void;\n}) {\n const { results } = useMenuSearch(debouncedQuery);\n const creators = results?.creators ?? [];\n const collections = results?.collections ?? [];\n const tokens = results?.tokens ?? [];\n const q = query.trim();\n\n return (\n <>\n {creators.length > 0 && (\n <Command.Group heading=\"Creators\" className={GROUP_HEADING_CLASSES}>\n {creators.map((creator) => {\n const { identity, name } = profileIdentity(creator);\n return (\n <ResultRow\n key={creator.walletAddress}\n value={`creator:${creator.walletAddress}`}\n label={identity}\n description={name}\n leading={<ResultThumbnail src={creator.avatarImage} label={identity} round />}\n onSelect={() => onNavigate(profileHref({ username: creator.username, address: creator.walletAddress }))}\n />\n );\n })}\n </Command.Group>\n )}\n {collections.length > 0 && (\n <Command.Group heading=\"Collections\" className={GROUP_HEADING_CLASSES}>\n {collections.map((col) => {\n const label = col.name ?? \"Untitled\";\n return (\n <ResultRow\n key={col.contractAddress}\n value={`collection:${col.contractAddress}`}\n label={label}\n leading={<ResultThumbnail src={col.image} label={label} />}\n onSelect={() => onNavigate(collectionHref(\"STARKNET\", col.contractAddress))}\n />\n );\n })}\n </Command.Group>\n )}\n {tokens.length > 0 && (\n <Command.Group heading=\"Assets\" className={GROUP_HEADING_CLASSES}>\n {tokens.map((token) => {\n const label = token.name ?? `#${token.tokenId}`;\n return (\n <ResultRow\n key={`${token.contractAddress}-${token.tokenId}`}\n value={`asset:${token.contractAddress}:${token.tokenId}`}\n label={label}\n leading={<ResultThumbnail src={token.image} label={label} />}\n onSelect={() => onNavigate(assetHref(\"STARKNET\", token.contractAddress, token.tokenId))}\n />\n );\n })}\n </Command.Group>\n )}\n <Command.Group className={GROUP_HEADING_CLASSES}>\n <ResultRow\n value=\"search:all\"\n label={`All results for \"${q}\"`}\n leading={\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted/50 group-aria-selected/item:bg-primary/15\">\n <Search className=\"h-4 w-4 text-foreground/80 transition-colors group-aria-selected/item:text-primary\" />\n </span>\n }\n onSelect={() => onNavigate(`/search?q=${encodeURIComponent(q)}`)}\n />\n </Command.Group>\n </>\n );\n}\n\nfunction CommandRow({ item, primary, onSelect }: { item: NavCommand; primary: boolean; onSelect: () => void }) {\n return (\n <Command.Item\n value={commandValue(item)}\n onSelect={onSelect}\n className={cn(\n \"group/item flex cursor-pointer items-center gap-3 rounded-xl\",\n \"transition-colors duration-150 aria-selected:bg-primary/10\",\n primary ? \"px-2.5 py-2.5\" : \"px-2.5 py-2\"\n )}\n >\n <span\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-lg transition-colors\",\n \"bg-muted/50 group-aria-selected/item:bg-primary/15\",\n primary ? \"h-9 w-9\" : \"h-8 w-8\"\n )}\n >\n <item.icon\n className={cn(\n \"text-foreground/80 transition-colors group-aria-selected/item:text-primary\",\n primary ? \"h-[18px] w-[18px]\" : \"h-4 w-4\"\n )}\n />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\n \"block truncate leading-tight\",\n primary ? \"text-base font-medium\" : \"text-sm\"\n )}\n >\n {item.label}\n </span>\n {item.description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">\n {item.description}\n </span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nconst GROUP_HEADING_CLASSES = cn(\n \"[&_[cmdk-group-heading]]:px-2.5\",\n \"[&_[cmdk-group-heading]]:pt-2\",\n \"[&_[cmdk-group-heading]]:pb-1\",\n \"[&_[cmdk-group-heading]]:text-[10.5px]\",\n \"[&_[cmdk-group-heading]]:font-semibold\",\n \"[&_[cmdk-group-heading]]:uppercase\",\n \"[&_[cmdk-group-heading]]:tracking-[0.08em]\",\n \"[&_[cmdk-group-heading]]:text-muted-foreground/60\"\n);\n\nexport function NavCommandMenu({\n commands,\n trigger,\n accountSlot,\n footerSlot,\n showKeyboardHints = true,\n brandSlot,\n search = false,\n}: NavCommandMenuProps) {\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState(\"\");\n const debouncedQuery = useDebouncedQuery(query);\n const searching = query.trim().length > 0;\n const searchingContent = search && query.trim().length >= SEARCH_MIN_LENGTH;\n const matches = React.useMemo(() => matchCommands(commands, query), [commands, query]);\n const router = useRouter();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n if (!open) return;\n setQuery(\"\");\n const t = setTimeout(() => inputRef.current?.focus(), 60);\n return () => clearTimeout(t);\n }, [open]);\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setOpen((prev) => !prev);\n }\n if (e.key === \"Escape\") setOpen(false);\n };\n const onOpen = () => setOpen(true);\n const onClose = () => setOpen(false);\n\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(ML_NAV_OPEN, onOpen);\n document.addEventListener(ML_NAV_CLOSE, onClose);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(ML_NAV_OPEN, onOpen);\n document.removeEventListener(ML_NAV_CLOSE, onClose);\n };\n }, []);\n\n const navigate = React.useCallback(\n (href: string) => {\n setOpen(false);\n router.push(href);\n },\n [router]\n );\n\n const runCommand = React.useCallback(\n (cmd: NavCommand) => {\n if (cmd.href) return navigate(cmd.href);\n setOpen(false);\n cmd.action?.();\n },\n [navigate]\n );\n\n return (\n <>\n {trigger}\n\n <AnimatePresence>\n {open && (\n <>\n\n <motion.div\n className=\"nav-canvas-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={() => setOpen(false)}\n />\n\n <motion.div\n className=\"fixed inset-0 z-[101] flex items-end justify-center p-3 pb-[calc(1rem+env(safe-area-inset-bottom))] sm:items-center sm:p-4\"\n initial={{ opacity: 0, y: 24, scale: 1 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 24 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={() => setOpen(false)}\n >\n <div\n className={cn(\n \"flex w-full max-h-[85dvh] flex-col overflow-hidden rounded-[20px] sm:max-h-[min(680px,88dvh)] sm:max-w-[620px]\",\n \"bg-background/90 backdrop-blur-2xl backdrop-saturate-150\"\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <Command shouldFilter={false} label=\"Medialane navigation\" className=\"flex min-h-0 flex-1 flex-col\">\n\n <div className=\"flex justify-center pt-2.5 sm:hidden\" aria-hidden=\"true\">\n <span className=\"h-1 w-9 rounded-full bg-muted-foreground/30\" />\n </div>\n\n <div className=\"flex items-center gap-3 border-b border-border/40 px-4 py-3.5\">\n {search ? (\n <SearchIcon query={debouncedQuery} active={Boolean(query)} />\n ) : (\n <Search\n className={cn(\n \"h-[18px] w-[18px] shrink-0 transition-colors\",\n query ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n )}\n <Command.Input\n ref={inputRef}\n value={query}\n onValueChange={setQuery}\n placeholder=\"Search or run a command…\"\n className=\"flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground\"\n />\n <Kbd className=\"hidden sm:inline-flex\">esc</Kbd>\n <button\n onClick={() => setOpen(false)}\n className=\"rounded-md p-1 transition-colors hover:bg-muted/50 sm:hidden\"\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </div>\n\n <Command.List className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2\">\n <Command.Empty className=\"py-8 text-center text-sm text-muted-foreground\">\n No results found.\n </Command.Empty>\n\n {searching ? (\n <>\n {matches.length > 0 && (\n <Command.Group className={GROUP_HEADING_CLASSES}>\n {matches.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={false}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n )}\n {searchingContent && (\n <SearchResults query={query} debouncedQuery={debouncedQuery} onNavigate={navigate} />\n )}\n </>\n ) : (\n commands.map((group, i) => {\n const primary = !group.heading;\n return (\n <React.Fragment key={group.heading ?? `__primary-${i}`}>\n {i > 0 && (\n <Command.Separator className=\"my-1.5 h-px bg-border/40\" />\n )}\n <Command.Group heading={group.heading} className={GROUP_HEADING_CLASSES}>\n {group.items.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={primary}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n </React.Fragment>\n );\n })\n )}\n </Command.List>\n\n {accountSlot && (\n <div className=\"border-t border-border/40 bg-muted/20 px-3 py-3\">\n {accountSlot}\n </div>\n )}\n\n <div className=\"flex items-center justify-between gap-3 border-t border-border/40 bg-muted/20 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n {footerSlot}\n {showKeyboardHints && (\n <span className=\"hidden items-center gap-3 text-[10.5px] text-muted-foreground/70 sm:flex\">\n <span className=\"flex items-center gap-1\"><Kbd>↑</Kbd><Kbd>↓</Kbd> Navigate</span>\n <span className=\"flex items-center gap-1\"><Kbd>↵</Kbd> Open</span>\n </span>\n )}\n </div>\n {brandSlot ?? (\n <span className=\"flex shrink-0 items-center gap-2 text-2xs text-muted-foreground/50\">\n medialane\n <Kbd className=\"hidden sm:inline-flex\">⌘K</Kbd>\n </span>\n )}\n </div>\n </Command>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/nav-command-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Command, defaultFilter } from \"cmdk\";\nimport { assetHref, collectionHref, profileHref } from \"@medialane/sdk\";\nimport { useRouter } from \"./router.js\";\nimport { Search, X, ArrowRight, Loader2 } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"../utils/cn.js\";\nimport { profileIdentity } from \"../utils/profile-identity.js\";\nimport { useSearch, SEARCH_MIN_LENGTH } from \"../utils/use-search.js\";\nimport { ResultThumbnail } from \"./result-thumbnail.js\";\n\nexport interface NavCommand {\n id: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n iconSrc?: string;\n href?: string;\n action?: () => void;\n\n keywords?: string[];\n\n description?: string;\n}\n\nexport interface NavCommandGroup {\n\n heading?: string;\n items: NavCommand[];\n}\n\nexport interface NavCommandMenuProps {\n commands: NavCommandGroup[];\n\n trigger?: React.ReactNode;\n\n accountSlot?: React.ReactNode;\n\n footerSlot?: React.ReactNode;\n\n showKeyboardHints?: boolean;\n\n brandSlot?: React.ReactNode;\n\n search?: boolean;\n}\n\nconst ML_NAV_OPEN = \"ml:nav-open\";\nconst ML_NAV_CLOSE = \"ml:nav-close\";\n\nexport function useNavCommandMenu() {\n return {\n open: () => document.dispatchEvent(new CustomEvent(ML_NAV_OPEN)),\n close: () => document.dispatchEvent(new CustomEvent(ML_NAV_CLOSE)),\n };\n}\n\nfunction Kbd({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <kbd\n className={cn(\n \"inline-flex min-w-[18px] items-center justify-center rounded-md bg-muted/60 px-1.5 py-0.5\",\n \"font-sans text-2xs leading-none text-muted-foreground\",\n className\n )}\n >\n {children}\n </kbd>\n );\n}\n\nconst RELEVANCE_FLOOR = 0.2;\n\nexport function relevanceFilter(value: string, search: string, keywords?: string[]): number {\n const score = defaultFilter(value, search, keywords);\n return score >= RELEVANCE_FLOOR ? score : 0;\n}\n\nfunction commandValue(item: NavCommand) {\n return [item.label, ...(item.keywords ?? [])].join(\" \");\n}\n\nexport function matchCommands(commands: NavCommandGroup[], query: string): NavCommand[] {\n const q = query.trim();\n if (!q) return [];\n return commands\n .flatMap((group) => group.items)\n .map((item) => ({ item, score: relevanceFilter(commandValue(item), q) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n .map(({ item }) => item);\n}\n\nconst SEARCH_DEBOUNCE_MS = 250;\nconst SEARCH_LIMIT = 4;\n\nfunction useDebouncedQuery(query: string) {\n const [debounced, setDebounced] = React.useState(query);\n React.useEffect(() => {\n if (!query.trim()) {\n setDebounced(query);\n return;\n }\n const t = setTimeout(() => setDebounced(query), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(t);\n }, [query]);\n return debounced;\n}\n\nfunction useMenuSearch(query: string) {\n return useSearch(query, { limit: SEARCH_LIMIT, keepPrevious: true });\n}\n\nfunction SearchIcon({ query, active }: { query: string; active: boolean }) {\n const { isLoading } = useMenuSearch(query);\n return isLoading ? (\n <Loader2 className=\"h-[18px] w-[18px] shrink-0 animate-spin text-primary\" />\n ) : (\n <Search className={cn(\"h-[18px] w-[18px] shrink-0 transition-colors\", active ? \"text-primary\" : \"text-muted-foreground\")} />\n );\n}\n\nfunction ResultRow({ value, label, description, leading, onSelect }: {\n value: string;\n label: string;\n description?: string | null;\n leading: React.ReactNode;\n onSelect: () => void;\n}) {\n return (\n <Command.Item\n value={value}\n onSelect={onSelect}\n className=\"group/item flex cursor-pointer items-center gap-3 rounded-xl px-2.5 py-2 transition-colors duration-150 aria-selected:bg-primary/10\"\n >\n {leading}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm leading-tight\">{label}</span>\n {description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">{description}</span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nfunction SearchResults({ query, debouncedQuery, onNavigate }: {\n query: string;\n debouncedQuery: string;\n onNavigate: (href: string) => void;\n}) {\n const { results } = useMenuSearch(debouncedQuery);\n const creators = results?.creators ?? [];\n const collections = results?.collections ?? [];\n const tokens = results?.tokens ?? [];\n const q = query.trim();\n\n return (\n <>\n {creators.length > 0 && (\n <Command.Group heading=\"Creators\" className={GROUP_HEADING_CLASSES}>\n {creators.map((creator) => {\n const { identity, name } = profileIdentity(creator);\n return (\n <ResultRow\n key={creator.walletAddress}\n value={`creator:${creator.walletAddress}`}\n label={identity}\n description={name}\n leading={<ResultThumbnail src={creator.avatarImage} label={identity} round />}\n onSelect={() => onNavigate(profileHref({ username: creator.username, address: creator.walletAddress }))}\n />\n );\n })}\n </Command.Group>\n )}\n {collections.length > 0 && (\n <Command.Group heading=\"Collections\" className={GROUP_HEADING_CLASSES}>\n {collections.map((col) => {\n const label = col.name ?? \"Untitled\";\n return (\n <ResultRow\n key={col.contractAddress}\n value={`collection:${col.contractAddress}`}\n label={label}\n leading={<ResultThumbnail src={col.image} label={label} />}\n onSelect={() => onNavigate(collectionHref(\"STARKNET\", col.contractAddress))}\n />\n );\n })}\n </Command.Group>\n )}\n {tokens.length > 0 && (\n <Command.Group heading=\"Assets\" className={GROUP_HEADING_CLASSES}>\n {tokens.map((token) => {\n const label = token.name ?? `#${token.tokenId}`;\n return (\n <ResultRow\n key={`${token.contractAddress}-${token.tokenId}`}\n value={`asset:${token.contractAddress}:${token.tokenId}`}\n label={label}\n leading={<ResultThumbnail src={token.image} label={label} />}\n onSelect={() => onNavigate(assetHref(\"STARKNET\", token.contractAddress, token.tokenId))}\n />\n );\n })}\n </Command.Group>\n )}\n <Command.Group className={GROUP_HEADING_CLASSES}>\n <ResultRow\n value=\"search:all\"\n label={`All results for \"${q}\"`}\n leading={\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted/50 group-aria-selected/item:bg-primary/15\">\n <Search className=\"h-4 w-4 text-foreground/80 transition-colors group-aria-selected/item:text-primary\" />\n </span>\n }\n onSelect={() => onNavigate(`/search?q=${encodeURIComponent(q)}`)}\n />\n </Command.Group>\n </>\n );\n}\n\nfunction CommandRow({ item, primary, onSelect }: { item: NavCommand; primary: boolean; onSelect: () => void }) {\n return (\n <Command.Item\n value={commandValue(item)}\n onSelect={onSelect}\n className={cn(\n \"group/item flex cursor-pointer items-center gap-3 rounded-xl\",\n \"transition-colors duration-150 aria-selected:bg-primary/10\",\n primary ? \"px-2.5 py-2.5\" : \"px-2.5 py-2\"\n )}\n >\n {item.iconSrc ? (\n <img\n src={item.iconSrc}\n alt=\"\"\n className={cn(\"shrink-0 rounded-lg\", primary ? \"h-9 w-9\" : \"h-8 w-8\")}\n />\n ) : (\n <span\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-lg transition-colors\",\n \"bg-muted/50 group-aria-selected/item:bg-primary/15\",\n primary ? \"h-9 w-9\" : \"h-8 w-8\"\n )}\n >\n <item.icon\n className={cn(\n \"text-foreground/80 transition-colors group-aria-selected/item:text-primary\",\n primary ? \"h-[18px] w-[18px]\" : \"h-4 w-4\"\n )}\n />\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\n \"block truncate leading-tight\",\n primary ? \"text-base font-medium\" : \"text-sm\"\n )}\n >\n {item.label}\n </span>\n {item.description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">\n {item.description}\n </span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nconst GROUP_HEADING_CLASSES = cn(\n \"[&_[cmdk-group-heading]]:px-2.5\",\n \"[&_[cmdk-group-heading]]:pt-2\",\n \"[&_[cmdk-group-heading]]:pb-1\",\n \"[&_[cmdk-group-heading]]:text-[10.5px]\",\n \"[&_[cmdk-group-heading]]:font-semibold\",\n \"[&_[cmdk-group-heading]]:uppercase\",\n \"[&_[cmdk-group-heading]]:tracking-[0.08em]\",\n \"[&_[cmdk-group-heading]]:text-muted-foreground/60\"\n);\n\nexport function NavCommandMenu({\n commands,\n trigger,\n accountSlot,\n footerSlot,\n showKeyboardHints = true,\n brandSlot,\n search = false,\n}: NavCommandMenuProps) {\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState(\"\");\n const debouncedQuery = useDebouncedQuery(query);\n const searching = query.trim().length > 0;\n const searchingContent = search && query.trim().length >= SEARCH_MIN_LENGTH;\n const matches = React.useMemo(() => matchCommands(commands, query), [commands, query]);\n const router = useRouter();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n if (!open) return;\n setQuery(\"\");\n const t = setTimeout(() => inputRef.current?.focus(), 60);\n return () => clearTimeout(t);\n }, [open]);\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setOpen((prev) => !prev);\n }\n if (e.key === \"Escape\") setOpen(false);\n };\n const onOpen = () => setOpen(true);\n const onClose = () => setOpen(false);\n\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(ML_NAV_OPEN, onOpen);\n document.addEventListener(ML_NAV_CLOSE, onClose);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(ML_NAV_OPEN, onOpen);\n document.removeEventListener(ML_NAV_CLOSE, onClose);\n };\n }, []);\n\n const navigate = React.useCallback(\n (href: string) => {\n setOpen(false);\n router.push(href);\n },\n [router]\n );\n\n const runCommand = React.useCallback(\n (cmd: NavCommand) => {\n if (cmd.href) return navigate(cmd.href);\n setOpen(false);\n cmd.action?.();\n },\n [navigate]\n );\n\n return (\n <>\n {trigger}\n\n <AnimatePresence>\n {open && (\n <>\n\n <motion.div\n className=\"nav-canvas-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={() => setOpen(false)}\n />\n\n <motion.div\n className=\"fixed inset-0 z-[101] flex items-end justify-center p-3 pb-[calc(1rem+env(safe-area-inset-bottom))] sm:items-center sm:p-4\"\n initial={{ opacity: 0, y: 24, scale: 1 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 24 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={() => setOpen(false)}\n >\n <div\n className={cn(\n \"flex w-full max-h-[85dvh] flex-col overflow-hidden rounded-[20px] sm:max-h-[min(680px,88dvh)] sm:max-w-[620px]\",\n \"bg-background/90 backdrop-blur-2xl backdrop-saturate-150\"\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <Command shouldFilter={false} label=\"Medialane navigation\" className=\"flex min-h-0 flex-1 flex-col\">\n\n <div className=\"flex justify-center pt-2.5 sm:hidden\" aria-hidden=\"true\">\n <span className=\"h-1 w-9 rounded-full bg-muted-foreground/30\" />\n </div>\n\n <div className=\"flex items-center gap-3 border-b border-border/40 px-4 py-3.5\">\n {search ? (\n <SearchIcon query={debouncedQuery} active={Boolean(query)} />\n ) : (\n <Search\n className={cn(\n \"h-[18px] w-[18px] shrink-0 transition-colors\",\n query ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n )}\n <Command.Input\n ref={inputRef}\n value={query}\n onValueChange={setQuery}\n placeholder=\"Search or run a command…\"\n className=\"flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground\"\n />\n <Kbd className=\"hidden sm:inline-flex\">esc</Kbd>\n <button\n onClick={() => setOpen(false)}\n className=\"rounded-md p-1 transition-colors hover:bg-muted/50 sm:hidden\"\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </div>\n\n <Command.List className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2\">\n <Command.Empty className=\"py-8 text-center text-sm text-muted-foreground\">\n No results found.\n </Command.Empty>\n\n {searching ? (\n <>\n {matches.length > 0 && (\n <Command.Group className={GROUP_HEADING_CLASSES}>\n {matches.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={false}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n )}\n {searchingContent && (\n <SearchResults query={query} debouncedQuery={debouncedQuery} onNavigate={navigate} />\n )}\n </>\n ) : (\n commands.map((group, i) => {\n const primary = !group.heading;\n return (\n <React.Fragment key={group.heading ?? `__primary-${i}`}>\n {i > 0 && (\n <Command.Separator className=\"my-1.5 h-px bg-border/40\" />\n )}\n <Command.Group heading={group.heading} className={GROUP_HEADING_CLASSES}>\n {group.items.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={primary}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n </React.Fragment>\n );\n })\n )}\n </Command.List>\n\n {accountSlot && (\n <div className=\"border-t border-border/40 bg-muted/20 px-3 py-3\">\n {accountSlot}\n </div>\n )}\n\n <div className=\"flex items-center justify-between gap-3 border-t border-border/40 bg-muted/20 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n {footerSlot}\n {showKeyboardHints && (\n <span className=\"hidden items-center gap-3 text-[10.5px] text-muted-foreground/70 sm:flex\">\n <span className=\"flex items-center gap-1\"><Kbd>↑</Kbd><Kbd>↓</Kbd> Navigate</span>\n <span className=\"flex items-center gap-1\"><Kbd>↵</Kbd> Open</span>\n </span>\n )}\n </div>\n {brandSlot ?? (\n <span className=\"flex shrink-0 items-center gap-2 text-2xs text-muted-foreground/50\">\n medialane\n <Kbd className=\"hidden sm:inline-flex\">⌘K</Kbd>\n </span>\n )}\n </div>\n </Command>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -10,7 +10,7 @@ declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogC
10
10
  declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
11
11
  declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
12
12
  declare const sheetVariants: (props?: ({
13
- side?: "bottom" | "left" | "right" | "top" | null | undefined;
13
+ side?: "left" | "right" | "bottom" | "top" | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string;
15
15
  interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
16
16
  overlayClassName?: string;
@@ -10,7 +10,7 @@ declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogC
10
10
  declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
11
11
  declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
12
12
  declare const sheetVariants: (props?: ({
13
- side?: "bottom" | "left" | "right" | "top" | null | undefined;
13
+ side?: "left" | "right" | "bottom" | "top" | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string;
15
15
  interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
16
16
  overlayClassName?: string;
@@ -24,7 +24,7 @@ __export(nav_commands_exports, {
24
24
  module.exports = __toCommonJS(nav_commands_exports);
25
25
  var import_lucide_react = require("lucide-react");
26
26
  const NAV_ITEMS = {
27
- home: { id: "home", label: "Medialane", icon: import_lucide_react.Home, href: "/", keywords: ["home", "frontpage", "start", "homepage", "main"], description: "Start here" },
27
+ home: { id: "home", label: "Medialane", icon: import_lucide_react.Home, iconSrc: "/icon.png", href: "/", keywords: ["home", "frontpage", "start", "homepage", "main"], description: "Start here" },
28
28
  discover: { id: "discover", label: "Discover", icon: import_lucide_react.Telescope, href: "/discover", keywords: ["feed", "explore", "trending"], description: "Feeds, collections & creators" },
29
29
  marketplace: { id: "marketplace", label: "Marketplace", icon: import_lucide_react.Store, href: "/marketplace", keywords: ["buy", "sell", "trade", "listings", "browse"], description: "Buy, sell & make offers" },
30
30
  launchpad: { id: "launchpad", label: "Launchpad", icon: import_lucide_react.Zap, href: "/launchpad", keywords: ["start", "launch", "creator", "mint", "create"], description: "Create, mint & launch" },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data/nav-commands.ts"],"sourcesContent":["import {\n Activity, BookOpen, Briefcase, Camera, Coins, FileText, Film, Gem, Gift, Handshake, Home, Layers, LayoutGrid, List, Music, Palette, Plus, Repeat2, ScrollText, Settings, ShieldCheck, Store, Tag, Telescope, Ticket, Trophy, Users, Zap,\n} from \"lucide-react\";\nimport type { NavCommand, NavCommandGroup } from \"../components/nav-command-menu.js\";\n\nexport const NAV_ITEMS = {\n home: { id: \"home\", label: \"Medialane\", icon: Home, href: \"/\", keywords: [\"home\", \"frontpage\", \"start\", \"homepage\", \"main\"], description: \"Start here\" },\n discover: { id: \"discover\", label: \"Discover\", icon: Telescope, href: \"/discover\", keywords: [\"feed\", \"explore\", \"trending\"], description: \"Feeds, collections & creators\" },\n marketplace: { id: \"marketplace\", label: \"Marketplace\", icon: Store, href: \"/marketplace\", keywords: [\"buy\", \"sell\", \"trade\", \"listings\", \"browse\"], description: \"Buy, sell & make offers\" },\n launchpad: { id: \"launchpad\", label: \"Launchpad\", icon: Zap, href: \"/launchpad\", keywords: [\"start\", \"launch\", \"creator\", \"mint\", \"create\"], description: \"Create, mint & launch\" },\n portfolio: { id: \"portfolio\", label: \"Portfolio\", icon: Briefcase, href: \"/portfolio\", keywords: [\"owned\", \"my nfts\", \"wallet\", \"account\"], description: \"Your assets & activity\" },\n collections: { id: \"collections\", label: \"Collections\", icon: LayoutGrid, href: \"/collections\", keywords: [\"nft\", \"drops\", \"browse\"] },\n coins: { id: \"coins\", label: \"Coins\", icon: Coins, href: \"/coins\", keywords: [\"token\", \"creator coin\", \"memecoin\", \"discover\", \"trade\", \"swap\"] },\n creators: { id: \"creators\", label: \"Creators\", icon: Users, href: \"/creators\", keywords: [\"artists\", \"profile\", \"profiles\", \"community\"] },\n activities: { id: \"activities\", label: \"Activity\", icon: Activity, href: \"/activities\", keywords: [\"history\", \"transactions\", \"feed\", \"events\"] },\n rewards: { id: \"rewards\", label: \"Rewards\", icon: Trophy, href: \"/rewards\", keywords: [\"xp\", \"points\", \"scoreboard\", \"leaderboard\", \"badges\", \"rank\"] },\n airdrop: { id: \"airdrop\", label: \"Airdrop\", icon: Gift, href: \"/airdrop\", keywords: [\"claim\", \"free\", \"drop\", \"genesis\", \"creator's fund\"] },\n settings: { id: \"settings\", label: \"Account Settings\", icon: Settings, href: \"/settings\", keywords: [\"profile\", \"username\", \"preferences\", \"account\"] },\n \"mint-ip-asset\": { id: \"mint-ip-asset\", label: \"Mint Unique NFT\", icon: Plus, href: \"/launchpad/single-editions\", keywords: [\"mint\", \"upload\", \"publish\", \"token\", \"erc721\", \"singular\", \"unique\", \"original\"] },\n \"create-collection\": { id: \"create-collection\", label: \"Create NFT Collection\", icon: LayoutGrid, href: \"/launchpad/single-editions/collection\", keywords: [\"deploy\", \"series\", \"erc721\", \"collection\", \"branded\"] },\n \"mint-editions\": { id: \"mint-editions\", label: \"Mint Limited Edition\", icon: Layers, href: \"/launchpad/nfteditions\", keywords: [\"mint\", \"edition\", \"erc1155\", \"multi\", \"copies\", \"limited\"] },\n \"create-1155\": { id: \"create-1155\", label: \"Create Limited Edition Contract\", icon: Layers, href: \"/launchpad/nfteditions/create\", keywords: [\"deploy\", \"erc1155\", \"edition\", \"contract\", \"limited\", \"multi-edition\"] },\n \"collection-drop\": { id: \"collection-drop\", label: \"Launch Collection Drop\", icon: Gift, href: \"/launchpad/drop/create\", keywords: [\"drop\", \"timed\", \"fixed supply\", \"release\", \"erc721\"] },\n \"browse-drops\": { id: \"browse-drops\", label: \"Browse Drops\", icon: Store, href: \"/launchpad/drop\", keywords: [\"drop\", \"browse\", \"active\"] },\n \"pop-create\": { id: \"pop-create\", label: \"Create POP Event\", icon: Ticket, href: \"/launchpad/pop/create\", keywords: [\"pop\", \"proof of participation\", \"event\", \"community\", \"soulbound\"] },\n \"pop-browse\": { id: \"pop-browse\", label: \"Browse POP Events\", icon: Ticket, href: \"/launchpad/pop\", keywords: [\"pop\", \"events\", \"proof of participation\"] },\n \"tickets-create\": { id: \"tickets-create\", label: \"Create IP Tickets\", icon: Ticket, href: \"/launchpad/tickets/create\", keywords: [\"tickets\", \"event\", \"verifiable\", \"attendee\", \"pass\"] },\n \"tickets-browse\": { id: \"tickets-browse\", label: \"Browse IP Tickets\", icon: Ticket, href: \"/launchpad/tickets\", keywords: [\"tickets\", \"browse\", \"events\"] },\n \"club-create\": { id: \"club-create\", label: \"Create IP Club\", icon: Users, href: \"/launchpad/club/create\", keywords: [\"club\", \"membership\", \"tiers\", \"community\", \"fans\"] },\n \"club-browse\": { id: \"club-browse\", label: \"Browse IP Clubs\", icon: Users, href: \"/launchpad/club\", keywords: [\"club\", \"membership\", \"browse\"] },\n \"sponsorship-create\": { id: \"sponsorship-create\", label: \"Create IP Sponsorship\", icon: Handshake, href: \"/launchpad/sponsorship/create\", keywords: [\"sponsorship\", \"sponsor\", \"license\", \"offer\", \"deal\"] },\n \"sponsorship-browse\": { id: \"sponsorship-browse\", label: \"Browse IP Sponsorship\", icon: Handshake, href: \"/launchpad/sponsorship\", keywords: [\"sponsorship\", \"browse\", \"offers\"] },\n \"launch-coin\": { id: \"launch-coin\", label: \"Launch a Creator Coin\", icon: Coins, href: \"/launchpad/coin/create\", keywords: [\"coin\", \"creator coin\", \"erc20\", \"token\", \"ekubo\", \"liquidity\", \"launch\"] },\n remix: { id: \"remix\", label: \"Remix an Asset\", icon: Repeat2, href: \"/marketplace\", keywords: [\"remix\", \"derivative\", \"attribution\", \"fork\"] },\n \"portfolio-collections\": { id: \"portfolio-collections\",label: \"My Collections\", icon: LayoutGrid, href: \"/portfolio/collections\", keywords: [\"deployed\", \"created\", \"my contracts\", \"claim\", \"import\"] },\n \"portfolio-assets\": { id: \"portfolio-assets\", label: \"My Assets\", icon: Gem, href: \"/portfolio/assets\", keywords: [\"owned\", \"nfts\", \"tokens\", \"collected\"] },\n \"portfolio-listings\": { id: \"portfolio-listings\", label: \"My Listings\", icon: Tag, href: \"/portfolio/listings\", keywords: [\"sell\", \"listed\", \"active listings\"] },\n \"portfolio-offers\": { id: \"portfolio-offers\", label: \"My Offers\", icon: List, href: \"/portfolio/offers\", keywords: [\"bids\", \"made\", \"sent offers\"] },\n \"portfolio-received\": { id: \"portfolio-received\", label: \"Received Offers\", icon: ScrollText, href: \"/portfolio/received\", keywords: [\"incoming\", \"bids\", \"offers received\"] },\n \"portfolio-activity\": { id: \"portfolio-activity\", label: \"My Activity\", icon: Activity, href: \"/portfolio/activity\", keywords: [\"history\", \"transactions\", \"events\"] },\n audio: { id: \"audio\", label: \"Audio\", icon: Music, href: \"/audio\", keywords: [\"music\", \"sound\", \"track\", \"podcast\"] },\n art: { id: \"art\", label: \"Art\", icon: Palette, href: \"/art\", keywords: [\"illustration\", \"drawing\", \"painting\", \"digital art\"] },\n video: { id: \"video\", label: \"Video\", icon: Film, href: \"/video\", keywords: [\"film\", \"clip\", \"animation\", \"short\"] },\n photography: { id: \"photography\", label: \"Photography\", icon: Camera, href: \"/photography\", keywords: [\"photo\", \"image\", \"picture\", \"shot\"] },\n publications: { id: \"publications\", label: \"Publications\", icon: BookOpen, href: \"/publications\", keywords: [\"article\", \"articles\", \"blog\", \"news\", \"writing\", \"book\", \"journal\"] },\n nft: { id: \"nft\", label: \"NFT\", icon: Gem, href: \"/nft\", keywords: [\"collectible\", \"token\", \"generative\"] },\n docs: { id: \"docs\", label: \"Docs — Overview\", icon: BookOpen, action: () => window.open(\"https://docs.medialane.io\", \"_blank\"), keywords: [\"docs\", \"help\", \"guide\", \"documentation\"] },\n \"docs-market\": { id: \"docs-market\", label: \"Docs — Marketplace\", icon: Store, action: () => window.open(\"https://docs.medialane.io/marketplace\", \"_blank\"), keywords: [\"docs\", \"buy\", \"sell\", \"orders\", \"guide\"] },\n \"docs-launchpad\": { id: \"docs-launchpad\",label: \"Docs — Launchpad\", icon: Zap, action: () => window.open(\"https://docs.medialane.io/launchpad\", \"_blank\"), keywords: [\"docs\", \"creator\", \"mint\", \"deploy\", \"guide\"] },\n \"docs-ip\": { id: \"docs-ip\", label: \"Docs — IP & Licensing\", icon: ShieldCheck, action: () => window.open(\"https://docs.medialane.io/ip-licensing\", \"_blank\"), keywords: [\"docs\", \"license\", \"ip\", \"rights\", \"royalty\"] },\n \"docs-sdk\": { id: \"docs-sdk\", label: \"Docs — SDK & API\", icon: FileText, action: () => window.open(\"https://docs.medialane.io/sdk\", \"_blank\"), keywords: [\"docs\", \"developer\", \"api\", \"sdk\", \"integration\"] },\n \"docs-terms\": { id: \"docs-terms\", label: \"Terms of Service\", icon: FileText, action: () => window.open(\"https://docs.medialane.io/guidelines/terms\", \"_blank\"), keywords: [\"legal\", \"terms\", \"tos\"] },\n \"docs-privacy\": { id: \"docs-privacy\", label: \"Privacy Policy\", icon: ShieldCheck, action: () => window.open(\"https://docs.medialane.io/guidelines/privacy\", \"_blank\"), keywords: [\"privacy\", \"data\", \"gdpr\"] },\n} satisfies Record<string, NavCommand>;\n\nexport type NavItemId = keyof typeof NAV_ITEMS;\n\nexport interface NavGroupSpec {\n heading?: string;\n items: (NavItemId | NavCommand)[];\n}\n\nexport function navGroups(groups: NavGroupSpec[]): NavCommandGroup[] {\n return groups.map(({ heading, items }) => ({\n heading,\n items: items.map((item) => (typeof item === \"string\" ? NAV_ITEMS[item] : item)),\n }));\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/data/nav-commands.ts"],"sourcesContent":["import {\n Activity, BookOpen, Briefcase, Camera, Coins, FileText, Film, Gem, Gift, Handshake, Home, Layers, LayoutGrid, List, Music, Palette, Plus, Repeat2, ScrollText, Settings, ShieldCheck, Store, Tag, Telescope, Ticket, Trophy, Users, Zap,\n} from \"lucide-react\";\nimport type { NavCommand, NavCommandGroup } from \"../components/nav-command-menu.js\";\n\nexport const NAV_ITEMS = {\n home: { id: \"home\", label: \"Medialane\", icon: Home, iconSrc: \"/icon.png\", href: \"/\", keywords: [\"home\", \"frontpage\", \"start\", \"homepage\", \"main\"], description: \"Start here\" },\n discover: { id: \"discover\", label: \"Discover\", icon: Telescope, href: \"/discover\", keywords: [\"feed\", \"explore\", \"trending\"], description: \"Feeds, collections & creators\" },\n marketplace: { id: \"marketplace\", label: \"Marketplace\", icon: Store, href: \"/marketplace\", keywords: [\"buy\", \"sell\", \"trade\", \"listings\", \"browse\"], description: \"Buy, sell & make offers\" },\n launchpad: { id: \"launchpad\", label: \"Launchpad\", icon: Zap, href: \"/launchpad\", keywords: [\"start\", \"launch\", \"creator\", \"mint\", \"create\"], description: \"Create, mint & launch\" },\n portfolio: { id: \"portfolio\", label: \"Portfolio\", icon: Briefcase, href: \"/portfolio\", keywords: [\"owned\", \"my nfts\", \"wallet\", \"account\"], description: \"Your assets & activity\" },\n collections: { id: \"collections\", label: \"Collections\", icon: LayoutGrid, href: \"/collections\", keywords: [\"nft\", \"drops\", \"browse\"] },\n coins: { id: \"coins\", label: \"Coins\", icon: Coins, href: \"/coins\", keywords: [\"token\", \"creator coin\", \"memecoin\", \"discover\", \"trade\", \"swap\"] },\n creators: { id: \"creators\", label: \"Creators\", icon: Users, href: \"/creators\", keywords: [\"artists\", \"profile\", \"profiles\", \"community\"] },\n activities: { id: \"activities\", label: \"Activity\", icon: Activity, href: \"/activities\", keywords: [\"history\", \"transactions\", \"feed\", \"events\"] },\n rewards: { id: \"rewards\", label: \"Rewards\", icon: Trophy, href: \"/rewards\", keywords: [\"xp\", \"points\", \"scoreboard\", \"leaderboard\", \"badges\", \"rank\"] },\n airdrop: { id: \"airdrop\", label: \"Airdrop\", icon: Gift, href: \"/airdrop\", keywords: [\"claim\", \"free\", \"drop\", \"genesis\", \"creator's fund\"] },\n settings: { id: \"settings\", label: \"Account Settings\", icon: Settings, href: \"/settings\", keywords: [\"profile\", \"username\", \"preferences\", \"account\"] },\n \"mint-ip-asset\": { id: \"mint-ip-asset\", label: \"Mint Unique NFT\", icon: Plus, href: \"/launchpad/single-editions\", keywords: [\"mint\", \"upload\", \"publish\", \"token\", \"erc721\", \"singular\", \"unique\", \"original\"] },\n \"create-collection\": { id: \"create-collection\", label: \"Create NFT Collection\", icon: LayoutGrid, href: \"/launchpad/single-editions/collection\", keywords: [\"deploy\", \"series\", \"erc721\", \"collection\", \"branded\"] },\n \"mint-editions\": { id: \"mint-editions\", label: \"Mint Limited Edition\", icon: Layers, href: \"/launchpad/nfteditions\", keywords: [\"mint\", \"edition\", \"erc1155\", \"multi\", \"copies\", \"limited\"] },\n \"create-1155\": { id: \"create-1155\", label: \"Create Limited Edition Contract\", icon: Layers, href: \"/launchpad/nfteditions/create\", keywords: [\"deploy\", \"erc1155\", \"edition\", \"contract\", \"limited\", \"multi-edition\"] },\n \"collection-drop\": { id: \"collection-drop\", label: \"Launch Collection Drop\", icon: Gift, href: \"/launchpad/drop/create\", keywords: [\"drop\", \"timed\", \"fixed supply\", \"release\", \"erc721\"] },\n \"browse-drops\": { id: \"browse-drops\", label: \"Browse Drops\", icon: Store, href: \"/launchpad/drop\", keywords: [\"drop\", \"browse\", \"active\"] },\n \"pop-create\": { id: \"pop-create\", label: \"Create POP Event\", icon: Ticket, href: \"/launchpad/pop/create\", keywords: [\"pop\", \"proof of participation\", \"event\", \"community\", \"soulbound\"] },\n \"pop-browse\": { id: \"pop-browse\", label: \"Browse POP Events\", icon: Ticket, href: \"/launchpad/pop\", keywords: [\"pop\", \"events\", \"proof of participation\"] },\n \"tickets-create\": { id: \"tickets-create\", label: \"Create IP Tickets\", icon: Ticket, href: \"/launchpad/tickets/create\", keywords: [\"tickets\", \"event\", \"verifiable\", \"attendee\", \"pass\"] },\n \"tickets-browse\": { id: \"tickets-browse\", label: \"Browse IP Tickets\", icon: Ticket, href: \"/launchpad/tickets\", keywords: [\"tickets\", \"browse\", \"events\"] },\n \"club-create\": { id: \"club-create\", label: \"Create IP Club\", icon: Users, href: \"/launchpad/club/create\", keywords: [\"club\", \"membership\", \"tiers\", \"community\", \"fans\"] },\n \"club-browse\": { id: \"club-browse\", label: \"Browse IP Clubs\", icon: Users, href: \"/launchpad/club\", keywords: [\"club\", \"membership\", \"browse\"] },\n \"sponsorship-create\": { id: \"sponsorship-create\", label: \"Create IP Sponsorship\", icon: Handshake, href: \"/launchpad/sponsorship/create\", keywords: [\"sponsorship\", \"sponsor\", \"license\", \"offer\", \"deal\"] },\n \"sponsorship-browse\": { id: \"sponsorship-browse\", label: \"Browse IP Sponsorship\", icon: Handshake, href: \"/launchpad/sponsorship\", keywords: [\"sponsorship\", \"browse\", \"offers\"] },\n \"launch-coin\": { id: \"launch-coin\", label: \"Launch a Creator Coin\", icon: Coins, href: \"/launchpad/coin/create\", keywords: [\"coin\", \"creator coin\", \"erc20\", \"token\", \"ekubo\", \"liquidity\", \"launch\"] },\n remix: { id: \"remix\", label: \"Remix an Asset\", icon: Repeat2, href: \"/marketplace\", keywords: [\"remix\", \"derivative\", \"attribution\", \"fork\"] },\n \"portfolio-collections\": { id: \"portfolio-collections\",label: \"My Collections\", icon: LayoutGrid, href: \"/portfolio/collections\", keywords: [\"deployed\", \"created\", \"my contracts\", \"claim\", \"import\"] },\n \"portfolio-assets\": { id: \"portfolio-assets\", label: \"My Assets\", icon: Gem, href: \"/portfolio/assets\", keywords: [\"owned\", \"nfts\", \"tokens\", \"collected\"] },\n \"portfolio-listings\": { id: \"portfolio-listings\", label: \"My Listings\", icon: Tag, href: \"/portfolio/listings\", keywords: [\"sell\", \"listed\", \"active listings\"] },\n \"portfolio-offers\": { id: \"portfolio-offers\", label: \"My Offers\", icon: List, href: \"/portfolio/offers\", keywords: [\"bids\", \"made\", \"sent offers\"] },\n \"portfolio-received\": { id: \"portfolio-received\", label: \"Received Offers\", icon: ScrollText, href: \"/portfolio/received\", keywords: [\"incoming\", \"bids\", \"offers received\"] },\n \"portfolio-activity\": { id: \"portfolio-activity\", label: \"My Activity\", icon: Activity, href: \"/portfolio/activity\", keywords: [\"history\", \"transactions\", \"events\"] },\n audio: { id: \"audio\", label: \"Audio\", icon: Music, href: \"/audio\", keywords: [\"music\", \"sound\", \"track\", \"podcast\"] },\n art: { id: \"art\", label: \"Art\", icon: Palette, href: \"/art\", keywords: [\"illustration\", \"drawing\", \"painting\", \"digital art\"] },\n video: { id: \"video\", label: \"Video\", icon: Film, href: \"/video\", keywords: [\"film\", \"clip\", \"animation\", \"short\"] },\n photography: { id: \"photography\", label: \"Photography\", icon: Camera, href: \"/photography\", keywords: [\"photo\", \"image\", \"picture\", \"shot\"] },\n publications: { id: \"publications\", label: \"Publications\", icon: BookOpen, href: \"/publications\", keywords: [\"article\", \"articles\", \"blog\", \"news\", \"writing\", \"book\", \"journal\"] },\n nft: { id: \"nft\", label: \"NFT\", icon: Gem, href: \"/nft\", keywords: [\"collectible\", \"token\", \"generative\"] },\n docs: { id: \"docs\", label: \"Docs — Overview\", icon: BookOpen, action: () => window.open(\"https://docs.medialane.io\", \"_blank\"), keywords: [\"docs\", \"help\", \"guide\", \"documentation\"] },\n \"docs-market\": { id: \"docs-market\", label: \"Docs — Marketplace\", icon: Store, action: () => window.open(\"https://docs.medialane.io/marketplace\", \"_blank\"), keywords: [\"docs\", \"buy\", \"sell\", \"orders\", \"guide\"] },\n \"docs-launchpad\": { id: \"docs-launchpad\",label: \"Docs — Launchpad\", icon: Zap, action: () => window.open(\"https://docs.medialane.io/launchpad\", \"_blank\"), keywords: [\"docs\", \"creator\", \"mint\", \"deploy\", \"guide\"] },\n \"docs-ip\": { id: \"docs-ip\", label: \"Docs — IP & Licensing\", icon: ShieldCheck, action: () => window.open(\"https://docs.medialane.io/ip-licensing\", \"_blank\"), keywords: [\"docs\", \"license\", \"ip\", \"rights\", \"royalty\"] },\n \"docs-sdk\": { id: \"docs-sdk\", label: \"Docs — SDK & API\", icon: FileText, action: () => window.open(\"https://docs.medialane.io/sdk\", \"_blank\"), keywords: [\"docs\", \"developer\", \"api\", \"sdk\", \"integration\"] },\n \"docs-terms\": { id: \"docs-terms\", label: \"Terms of Service\", icon: FileText, action: () => window.open(\"https://docs.medialane.io/guidelines/terms\", \"_blank\"), keywords: [\"legal\", \"terms\", \"tos\"] },\n \"docs-privacy\": { id: \"docs-privacy\", label: \"Privacy Policy\", icon: ShieldCheck, action: () => window.open(\"https://docs.medialane.io/guidelines/privacy\", \"_blank\"), keywords: [\"privacy\", \"data\", \"gdpr\"] },\n} satisfies Record<string, NavCommand>;\n\nexport type NavItemId = keyof typeof NAV_ITEMS;\n\nexport interface NavGroupSpec {\n heading?: string;\n items: (NavItemId | NavCommand)[];\n}\n\nexport function navGroups(groups: NavGroupSpec[]): NavCommandGroup[] {\n return groups.map(({ heading, items }) => ({\n heading,\n items: items.map((item) => (typeof item === \"string\" ? NAV_ITEMS[item] : item)),\n }));\n}\n"],"mappings":"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","names":[]}
@@ -8,6 +8,7 @@ declare const NAV_ITEMS: {
8
8
  id: string;
9
9
  label: string;
10
10
  icon: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
11
+ iconSrc: string;
11
12
  href: string;
12
13
  keywords: string[];
13
14
  description: string;
@@ -8,6 +8,7 @@ declare const NAV_ITEMS: {
8
8
  id: string;
9
9
  label: string;
10
10
  icon: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
11
+ iconSrc: string;
11
12
  href: string;
12
13
  keywords: string[];
13
14
  description: string;
@@ -29,7 +29,7 @@ import {
29
29
  Zap
30
30
  } from "lucide-react";
31
31
  const NAV_ITEMS = {
32
- home: { id: "home", label: "Medialane", icon: Home, href: "/", keywords: ["home", "frontpage", "start", "homepage", "main"], description: "Start here" },
32
+ home: { id: "home", label: "Medialane", icon: Home, iconSrc: "/icon.png", href: "/", keywords: ["home", "frontpage", "start", "homepage", "main"], description: "Start here" },
33
33
  discover: { id: "discover", label: "Discover", icon: Telescope, href: "/discover", keywords: ["feed", "explore", "trending"], description: "Feeds, collections & creators" },
34
34
  marketplace: { id: "marketplace", label: "Marketplace", icon: Store, href: "/marketplace", keywords: ["buy", "sell", "trade", "listings", "browse"], description: "Buy, sell & make offers" },
35
35
  launchpad: { id: "launchpad", label: "Launchpad", icon: Zap, href: "/launchpad", keywords: ["start", "launch", "creator", "mint", "create"], description: "Create, mint & launch" },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data/nav-commands.ts"],"sourcesContent":["import {\n Activity, BookOpen, Briefcase, Camera, Coins, FileText, Film, Gem, Gift, Handshake, Home, Layers, LayoutGrid, List, Music, Palette, Plus, Repeat2, ScrollText, Settings, ShieldCheck, Store, Tag, Telescope, Ticket, Trophy, Users, Zap,\n} from \"lucide-react\";\nimport type { NavCommand, NavCommandGroup } from \"../components/nav-command-menu.js\";\n\nexport const NAV_ITEMS = {\n home: { id: \"home\", label: \"Medialane\", icon: Home, href: \"/\", keywords: [\"home\", \"frontpage\", \"start\", \"homepage\", \"main\"], description: \"Start here\" },\n discover: { id: \"discover\", label: \"Discover\", icon: Telescope, href: \"/discover\", keywords: [\"feed\", \"explore\", \"trending\"], description: \"Feeds, collections & creators\" },\n marketplace: { id: \"marketplace\", label: \"Marketplace\", icon: Store, href: \"/marketplace\", keywords: [\"buy\", \"sell\", \"trade\", \"listings\", \"browse\"], description: \"Buy, sell & make offers\" },\n launchpad: { id: \"launchpad\", label: \"Launchpad\", icon: Zap, href: \"/launchpad\", keywords: [\"start\", \"launch\", \"creator\", \"mint\", \"create\"], description: \"Create, mint & launch\" },\n portfolio: { id: \"portfolio\", label: \"Portfolio\", icon: Briefcase, href: \"/portfolio\", keywords: [\"owned\", \"my nfts\", \"wallet\", \"account\"], description: \"Your assets & activity\" },\n collections: { id: \"collections\", label: \"Collections\", icon: LayoutGrid, href: \"/collections\", keywords: [\"nft\", \"drops\", \"browse\"] },\n coins: { id: \"coins\", label: \"Coins\", icon: Coins, href: \"/coins\", keywords: [\"token\", \"creator coin\", \"memecoin\", \"discover\", \"trade\", \"swap\"] },\n creators: { id: \"creators\", label: \"Creators\", icon: Users, href: \"/creators\", keywords: [\"artists\", \"profile\", \"profiles\", \"community\"] },\n activities: { id: \"activities\", label: \"Activity\", icon: Activity, href: \"/activities\", keywords: [\"history\", \"transactions\", \"feed\", \"events\"] },\n rewards: { id: \"rewards\", label: \"Rewards\", icon: Trophy, href: \"/rewards\", keywords: [\"xp\", \"points\", \"scoreboard\", \"leaderboard\", \"badges\", \"rank\"] },\n airdrop: { id: \"airdrop\", label: \"Airdrop\", icon: Gift, href: \"/airdrop\", keywords: [\"claim\", \"free\", \"drop\", \"genesis\", \"creator's fund\"] },\n settings: { id: \"settings\", label: \"Account Settings\", icon: Settings, href: \"/settings\", keywords: [\"profile\", \"username\", \"preferences\", \"account\"] },\n \"mint-ip-asset\": { id: \"mint-ip-asset\", label: \"Mint Unique NFT\", icon: Plus, href: \"/launchpad/single-editions\", keywords: [\"mint\", \"upload\", \"publish\", \"token\", \"erc721\", \"singular\", \"unique\", \"original\"] },\n \"create-collection\": { id: \"create-collection\", label: \"Create NFT Collection\", icon: LayoutGrid, href: \"/launchpad/single-editions/collection\", keywords: [\"deploy\", \"series\", \"erc721\", \"collection\", \"branded\"] },\n \"mint-editions\": { id: \"mint-editions\", label: \"Mint Limited Edition\", icon: Layers, href: \"/launchpad/nfteditions\", keywords: [\"mint\", \"edition\", \"erc1155\", \"multi\", \"copies\", \"limited\"] },\n \"create-1155\": { id: \"create-1155\", label: \"Create Limited Edition Contract\", icon: Layers, href: \"/launchpad/nfteditions/create\", keywords: [\"deploy\", \"erc1155\", \"edition\", \"contract\", \"limited\", \"multi-edition\"] },\n \"collection-drop\": { id: \"collection-drop\", label: \"Launch Collection Drop\", icon: Gift, href: \"/launchpad/drop/create\", keywords: [\"drop\", \"timed\", \"fixed supply\", \"release\", \"erc721\"] },\n \"browse-drops\": { id: \"browse-drops\", label: \"Browse Drops\", icon: Store, href: \"/launchpad/drop\", keywords: [\"drop\", \"browse\", \"active\"] },\n \"pop-create\": { id: \"pop-create\", label: \"Create POP Event\", icon: Ticket, href: \"/launchpad/pop/create\", keywords: [\"pop\", \"proof of participation\", \"event\", \"community\", \"soulbound\"] },\n \"pop-browse\": { id: \"pop-browse\", label: \"Browse POP Events\", icon: Ticket, href: \"/launchpad/pop\", keywords: [\"pop\", \"events\", \"proof of participation\"] },\n \"tickets-create\": { id: \"tickets-create\", label: \"Create IP Tickets\", icon: Ticket, href: \"/launchpad/tickets/create\", keywords: [\"tickets\", \"event\", \"verifiable\", \"attendee\", \"pass\"] },\n \"tickets-browse\": { id: \"tickets-browse\", label: \"Browse IP Tickets\", icon: Ticket, href: \"/launchpad/tickets\", keywords: [\"tickets\", \"browse\", \"events\"] },\n \"club-create\": { id: \"club-create\", label: \"Create IP Club\", icon: Users, href: \"/launchpad/club/create\", keywords: [\"club\", \"membership\", \"tiers\", \"community\", \"fans\"] },\n \"club-browse\": { id: \"club-browse\", label: \"Browse IP Clubs\", icon: Users, href: \"/launchpad/club\", keywords: [\"club\", \"membership\", \"browse\"] },\n \"sponsorship-create\": { id: \"sponsorship-create\", label: \"Create IP Sponsorship\", icon: Handshake, href: \"/launchpad/sponsorship/create\", keywords: [\"sponsorship\", \"sponsor\", \"license\", \"offer\", \"deal\"] },\n \"sponsorship-browse\": { id: \"sponsorship-browse\", label: \"Browse IP Sponsorship\", icon: Handshake, href: \"/launchpad/sponsorship\", keywords: [\"sponsorship\", \"browse\", \"offers\"] },\n \"launch-coin\": { id: \"launch-coin\", label: \"Launch a Creator Coin\", icon: Coins, href: \"/launchpad/coin/create\", keywords: [\"coin\", \"creator coin\", \"erc20\", \"token\", \"ekubo\", \"liquidity\", \"launch\"] },\n remix: { id: \"remix\", label: \"Remix an Asset\", icon: Repeat2, href: \"/marketplace\", keywords: [\"remix\", \"derivative\", \"attribution\", \"fork\"] },\n \"portfolio-collections\": { id: \"portfolio-collections\",label: \"My Collections\", icon: LayoutGrid, href: \"/portfolio/collections\", keywords: [\"deployed\", \"created\", \"my contracts\", \"claim\", \"import\"] },\n \"portfolio-assets\": { id: \"portfolio-assets\", label: \"My Assets\", icon: Gem, href: \"/portfolio/assets\", keywords: [\"owned\", \"nfts\", \"tokens\", \"collected\"] },\n \"portfolio-listings\": { id: \"portfolio-listings\", label: \"My Listings\", icon: Tag, href: \"/portfolio/listings\", keywords: [\"sell\", \"listed\", \"active listings\"] },\n \"portfolio-offers\": { id: \"portfolio-offers\", label: \"My Offers\", icon: List, href: \"/portfolio/offers\", keywords: [\"bids\", \"made\", \"sent offers\"] },\n \"portfolio-received\": { id: \"portfolio-received\", label: \"Received Offers\", icon: ScrollText, href: \"/portfolio/received\", keywords: [\"incoming\", \"bids\", \"offers received\"] },\n \"portfolio-activity\": { id: \"portfolio-activity\", label: \"My Activity\", icon: Activity, href: \"/portfolio/activity\", keywords: [\"history\", \"transactions\", \"events\"] },\n audio: { id: \"audio\", label: \"Audio\", icon: Music, href: \"/audio\", keywords: [\"music\", \"sound\", \"track\", \"podcast\"] },\n art: { id: \"art\", label: \"Art\", icon: Palette, href: \"/art\", keywords: [\"illustration\", \"drawing\", \"painting\", \"digital art\"] },\n video: { id: \"video\", label: \"Video\", icon: Film, href: \"/video\", keywords: [\"film\", \"clip\", \"animation\", \"short\"] },\n photography: { id: \"photography\", label: \"Photography\", icon: Camera, href: \"/photography\", keywords: [\"photo\", \"image\", \"picture\", \"shot\"] },\n publications: { id: \"publications\", label: \"Publications\", icon: BookOpen, href: \"/publications\", keywords: [\"article\", \"articles\", \"blog\", \"news\", \"writing\", \"book\", \"journal\"] },\n nft: { id: \"nft\", label: \"NFT\", icon: Gem, href: \"/nft\", keywords: [\"collectible\", \"token\", \"generative\"] },\n docs: { id: \"docs\", label: \"Docs — Overview\", icon: BookOpen, action: () => window.open(\"https://docs.medialane.io\", \"_blank\"), keywords: [\"docs\", \"help\", \"guide\", \"documentation\"] },\n \"docs-market\": { id: \"docs-market\", label: \"Docs — Marketplace\", icon: Store, action: () => window.open(\"https://docs.medialane.io/marketplace\", \"_blank\"), keywords: [\"docs\", \"buy\", \"sell\", \"orders\", \"guide\"] },\n \"docs-launchpad\": { id: \"docs-launchpad\",label: \"Docs — Launchpad\", icon: Zap, action: () => window.open(\"https://docs.medialane.io/launchpad\", \"_blank\"), keywords: [\"docs\", \"creator\", \"mint\", \"deploy\", \"guide\"] },\n \"docs-ip\": { id: \"docs-ip\", label: \"Docs — IP & Licensing\", icon: ShieldCheck, action: () => window.open(\"https://docs.medialane.io/ip-licensing\", \"_blank\"), keywords: [\"docs\", \"license\", \"ip\", \"rights\", \"royalty\"] },\n \"docs-sdk\": { id: \"docs-sdk\", label: \"Docs — SDK & API\", icon: FileText, action: () => window.open(\"https://docs.medialane.io/sdk\", \"_blank\"), keywords: [\"docs\", \"developer\", \"api\", \"sdk\", \"integration\"] },\n \"docs-terms\": { id: \"docs-terms\", label: \"Terms of Service\", icon: FileText, action: () => window.open(\"https://docs.medialane.io/guidelines/terms\", \"_blank\"), keywords: [\"legal\", \"terms\", \"tos\"] },\n \"docs-privacy\": { id: \"docs-privacy\", label: \"Privacy Policy\", icon: ShieldCheck, action: () => window.open(\"https://docs.medialane.io/guidelines/privacy\", \"_blank\"), keywords: [\"privacy\", \"data\", \"gdpr\"] },\n} satisfies Record<string, NavCommand>;\n\nexport type NavItemId = keyof typeof NAV_ITEMS;\n\nexport interface NavGroupSpec {\n heading?: string;\n items: (NavItemId | NavCommand)[];\n}\n\nexport function navGroups(groups: NavGroupSpec[]): NavCommandGroup[] {\n return groups.map(({ heading, items }) => ({\n heading,\n items: items.map((item) => (typeof item === \"string\" ? NAV_ITEMS[item] : item)),\n }));\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/data/nav-commands.ts"],"sourcesContent":["import {\n Activity, BookOpen, Briefcase, Camera, Coins, FileText, Film, Gem, Gift, Handshake, Home, Layers, LayoutGrid, List, Music, Palette, Plus, Repeat2, ScrollText, Settings, ShieldCheck, Store, Tag, Telescope, Ticket, Trophy, Users, Zap,\n} from \"lucide-react\";\nimport type { NavCommand, NavCommandGroup } from \"../components/nav-command-menu.js\";\n\nexport const NAV_ITEMS = {\n home: { id: \"home\", label: \"Medialane\", icon: Home, iconSrc: \"/icon.png\", href: \"/\", keywords: [\"home\", \"frontpage\", \"start\", \"homepage\", \"main\"], description: \"Start here\" },\n discover: { id: \"discover\", label: \"Discover\", icon: Telescope, href: \"/discover\", keywords: [\"feed\", \"explore\", \"trending\"], description: \"Feeds, collections & creators\" },\n marketplace: { id: \"marketplace\", label: \"Marketplace\", icon: Store, href: \"/marketplace\", keywords: [\"buy\", \"sell\", \"trade\", \"listings\", \"browse\"], description: \"Buy, sell & make offers\" },\n launchpad: { id: \"launchpad\", label: \"Launchpad\", icon: Zap, href: \"/launchpad\", keywords: [\"start\", \"launch\", \"creator\", \"mint\", \"create\"], description: \"Create, mint & launch\" },\n portfolio: { id: \"portfolio\", label: \"Portfolio\", icon: Briefcase, href: \"/portfolio\", keywords: [\"owned\", \"my nfts\", \"wallet\", \"account\"], description: \"Your assets & activity\" },\n collections: { id: \"collections\", label: \"Collections\", icon: LayoutGrid, href: \"/collections\", keywords: [\"nft\", \"drops\", \"browse\"] },\n coins: { id: \"coins\", label: \"Coins\", icon: Coins, href: \"/coins\", keywords: [\"token\", \"creator coin\", \"memecoin\", \"discover\", \"trade\", \"swap\"] },\n creators: { id: \"creators\", label: \"Creators\", icon: Users, href: \"/creators\", keywords: [\"artists\", \"profile\", \"profiles\", \"community\"] },\n activities: { id: \"activities\", label: \"Activity\", icon: Activity, href: \"/activities\", keywords: [\"history\", \"transactions\", \"feed\", \"events\"] },\n rewards: { id: \"rewards\", label: \"Rewards\", icon: Trophy, href: \"/rewards\", keywords: [\"xp\", \"points\", \"scoreboard\", \"leaderboard\", \"badges\", \"rank\"] },\n airdrop: { id: \"airdrop\", label: \"Airdrop\", icon: Gift, href: \"/airdrop\", keywords: [\"claim\", \"free\", \"drop\", \"genesis\", \"creator's fund\"] },\n settings: { id: \"settings\", label: \"Account Settings\", icon: Settings, href: \"/settings\", keywords: [\"profile\", \"username\", \"preferences\", \"account\"] },\n \"mint-ip-asset\": { id: \"mint-ip-asset\", label: \"Mint Unique NFT\", icon: Plus, href: \"/launchpad/single-editions\", keywords: [\"mint\", \"upload\", \"publish\", \"token\", \"erc721\", \"singular\", \"unique\", \"original\"] },\n \"create-collection\": { id: \"create-collection\", label: \"Create NFT Collection\", icon: LayoutGrid, href: \"/launchpad/single-editions/collection\", keywords: [\"deploy\", \"series\", \"erc721\", \"collection\", \"branded\"] },\n \"mint-editions\": { id: \"mint-editions\", label: \"Mint Limited Edition\", icon: Layers, href: \"/launchpad/nfteditions\", keywords: [\"mint\", \"edition\", \"erc1155\", \"multi\", \"copies\", \"limited\"] },\n \"create-1155\": { id: \"create-1155\", label: \"Create Limited Edition Contract\", icon: Layers, href: \"/launchpad/nfteditions/create\", keywords: [\"deploy\", \"erc1155\", \"edition\", \"contract\", \"limited\", \"multi-edition\"] },\n \"collection-drop\": { id: \"collection-drop\", label: \"Launch Collection Drop\", icon: Gift, href: \"/launchpad/drop/create\", keywords: [\"drop\", \"timed\", \"fixed supply\", \"release\", \"erc721\"] },\n \"browse-drops\": { id: \"browse-drops\", label: \"Browse Drops\", icon: Store, href: \"/launchpad/drop\", keywords: [\"drop\", \"browse\", \"active\"] },\n \"pop-create\": { id: \"pop-create\", label: \"Create POP Event\", icon: Ticket, href: \"/launchpad/pop/create\", keywords: [\"pop\", \"proof of participation\", \"event\", \"community\", \"soulbound\"] },\n \"pop-browse\": { id: \"pop-browse\", label: \"Browse POP Events\", icon: Ticket, href: \"/launchpad/pop\", keywords: [\"pop\", \"events\", \"proof of participation\"] },\n \"tickets-create\": { id: \"tickets-create\", label: \"Create IP Tickets\", icon: Ticket, href: \"/launchpad/tickets/create\", keywords: [\"tickets\", \"event\", \"verifiable\", \"attendee\", \"pass\"] },\n \"tickets-browse\": { id: \"tickets-browse\", label: \"Browse IP Tickets\", icon: Ticket, href: \"/launchpad/tickets\", keywords: [\"tickets\", \"browse\", \"events\"] },\n \"club-create\": { id: \"club-create\", label: \"Create IP Club\", icon: Users, href: \"/launchpad/club/create\", keywords: [\"club\", \"membership\", \"tiers\", \"community\", \"fans\"] },\n \"club-browse\": { id: \"club-browse\", label: \"Browse IP Clubs\", icon: Users, href: \"/launchpad/club\", keywords: [\"club\", \"membership\", \"browse\"] },\n \"sponsorship-create\": { id: \"sponsorship-create\", label: \"Create IP Sponsorship\", icon: Handshake, href: \"/launchpad/sponsorship/create\", keywords: [\"sponsorship\", \"sponsor\", \"license\", \"offer\", \"deal\"] },\n \"sponsorship-browse\": { id: \"sponsorship-browse\", label: \"Browse IP Sponsorship\", icon: Handshake, href: \"/launchpad/sponsorship\", keywords: [\"sponsorship\", \"browse\", \"offers\"] },\n \"launch-coin\": { id: \"launch-coin\", label: \"Launch a Creator Coin\", icon: Coins, href: \"/launchpad/coin/create\", keywords: [\"coin\", \"creator coin\", \"erc20\", \"token\", \"ekubo\", \"liquidity\", \"launch\"] },\n remix: { id: \"remix\", label: \"Remix an Asset\", icon: Repeat2, href: \"/marketplace\", keywords: [\"remix\", \"derivative\", \"attribution\", \"fork\"] },\n \"portfolio-collections\": { id: \"portfolio-collections\",label: \"My Collections\", icon: LayoutGrid, href: \"/portfolio/collections\", keywords: [\"deployed\", \"created\", \"my contracts\", \"claim\", \"import\"] },\n \"portfolio-assets\": { id: \"portfolio-assets\", label: \"My Assets\", icon: Gem, href: \"/portfolio/assets\", keywords: [\"owned\", \"nfts\", \"tokens\", \"collected\"] },\n \"portfolio-listings\": { id: \"portfolio-listings\", label: \"My Listings\", icon: Tag, href: \"/portfolio/listings\", keywords: [\"sell\", \"listed\", \"active listings\"] },\n \"portfolio-offers\": { id: \"portfolio-offers\", label: \"My Offers\", icon: List, href: \"/portfolio/offers\", keywords: [\"bids\", \"made\", \"sent offers\"] },\n \"portfolio-received\": { id: \"portfolio-received\", label: \"Received Offers\", icon: ScrollText, href: \"/portfolio/received\", keywords: [\"incoming\", \"bids\", \"offers received\"] },\n \"portfolio-activity\": { id: \"portfolio-activity\", label: \"My Activity\", icon: Activity, href: \"/portfolio/activity\", keywords: [\"history\", \"transactions\", \"events\"] },\n audio: { id: \"audio\", label: \"Audio\", icon: Music, href: \"/audio\", keywords: [\"music\", \"sound\", \"track\", \"podcast\"] },\n art: { id: \"art\", label: \"Art\", icon: Palette, href: \"/art\", keywords: [\"illustration\", \"drawing\", \"painting\", \"digital art\"] },\n video: { id: \"video\", label: \"Video\", icon: Film, href: \"/video\", keywords: [\"film\", \"clip\", \"animation\", \"short\"] },\n photography: { id: \"photography\", label: \"Photography\", icon: Camera, href: \"/photography\", keywords: [\"photo\", \"image\", \"picture\", \"shot\"] },\n publications: { id: \"publications\", label: \"Publications\", icon: BookOpen, href: \"/publications\", keywords: [\"article\", \"articles\", \"blog\", \"news\", \"writing\", \"book\", \"journal\"] },\n nft: { id: \"nft\", label: \"NFT\", icon: Gem, href: \"/nft\", keywords: [\"collectible\", \"token\", \"generative\"] },\n docs: { id: \"docs\", label: \"Docs — Overview\", icon: BookOpen, action: () => window.open(\"https://docs.medialane.io\", \"_blank\"), keywords: [\"docs\", \"help\", \"guide\", \"documentation\"] },\n \"docs-market\": { id: \"docs-market\", label: \"Docs — Marketplace\", icon: Store, action: () => window.open(\"https://docs.medialane.io/marketplace\", \"_blank\"), keywords: [\"docs\", \"buy\", \"sell\", \"orders\", \"guide\"] },\n \"docs-launchpad\": { id: \"docs-launchpad\",label: \"Docs — Launchpad\", icon: Zap, action: () => window.open(\"https://docs.medialane.io/launchpad\", \"_blank\"), keywords: [\"docs\", \"creator\", \"mint\", \"deploy\", \"guide\"] },\n \"docs-ip\": { id: \"docs-ip\", label: \"Docs — IP & Licensing\", icon: ShieldCheck, action: () => window.open(\"https://docs.medialane.io/ip-licensing\", \"_blank\"), keywords: [\"docs\", \"license\", \"ip\", \"rights\", \"royalty\"] },\n \"docs-sdk\": { id: \"docs-sdk\", label: \"Docs — SDK & API\", icon: FileText, action: () => window.open(\"https://docs.medialane.io/sdk\", \"_blank\"), keywords: [\"docs\", \"developer\", \"api\", \"sdk\", \"integration\"] },\n \"docs-terms\": { id: \"docs-terms\", label: \"Terms of Service\", icon: FileText, action: () => window.open(\"https://docs.medialane.io/guidelines/terms\", \"_blank\"), keywords: [\"legal\", \"terms\", \"tos\"] },\n \"docs-privacy\": { id: \"docs-privacy\", label: \"Privacy Policy\", icon: ShieldCheck, action: () => window.open(\"https://docs.medialane.io/guidelines/privacy\", \"_blank\"), keywords: [\"privacy\", \"data\", \"gdpr\"] },\n} satisfies Record<string, NavCommand>;\n\nexport type NavItemId = keyof typeof NAV_ITEMS;\n\nexport interface NavGroupSpec {\n heading?: string;\n items: (NavItemId | NavCommand)[];\n}\n\nexport function navGroups(groups: NavGroupSpec[]): NavCommandGroup[] {\n return groups.map(({ heading, items }) => ({\n heading,\n items: items.map((item) => (typeof item === \"string\" ? NAV_ITEMS[item] : item)),\n }));\n}\n"],"mappings":"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","names":[]}
@@ -7,7 +7,7 @@ declare function useTokenBalance(symbol: string | null, holderAddress: string |
7
7
  rawBalance: bigint | null;
8
8
  isLoading: boolean;
9
9
  error: any;
10
- decimals: 6 | 8 | 18;
10
+ decimals: 8 | 6 | 18;
11
11
  };
12
12
  declare function hasSufficientBalance(rawBalance: bigint | null, requiredHuman: string, decimals: number): boolean | null;
13
13
 
@@ -7,7 +7,7 @@ declare function useTokenBalance(symbol: string | null, holderAddress: string |
7
7
  rawBalance: bigint | null;
8
8
  isLoading: boolean;
9
9
  error: any;
10
- decimals: 6 | 8 | 18;
10
+ decimals: 8 | 6 | 18;
11
11
  };
12
12
  declare function hasSufficientBalance(rawBalance: bigint | null, requiredHuman: string, decimals: number): boolean | null;
13
13
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medialane/ui",
3
- "version": "0.298.0",
3
+ "version": "0.300.0",
4
4
  "description": "Shared UI components for Medialane apps",
5
5
  "type": "module",
6
6
  "sideEffects": false,