@medialane/ui 0.323.0 → 0.325.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.
Files changed (31) hide show
  1. package/dist/components/account/input-otp.d.cts +2 -2
  2. package/dist/components/account/input-otp.d.ts +2 -2
  3. package/dist/components/button.d.cts +2 -2
  4. package/dist/components/button.d.ts +2 -2
  5. package/dist/components/collection-filters.cjs +0 -1
  6. package/dist/components/collection-filters.cjs.map +1 -1
  7. package/dist/components/collection-filters.js +0 -1
  8. package/dist/components/collection-filters.js.map +1 -1
  9. package/dist/components/currency-icon.cjs +7 -2
  10. package/dist/components/currency-icon.cjs.map +1 -1
  11. package/dist/components/currency-icon.d.cts +2 -1
  12. package/dist/components/currency-icon.d.ts +2 -1
  13. package/dist/components/currency-icon.js +5 -1
  14. package/dist/components/currency-icon.js.map +1 -1
  15. package/dist/components/ip-type-page.cjs +1 -1
  16. package/dist/components/ip-type-page.cjs.map +1 -1
  17. package/dist/components/ip-type-page.js +1 -1
  18. package/dist/components/ip-type-page.js.map +1 -1
  19. package/dist/components/launchpad/edition-mint-schema.d.cts +4 -4
  20. package/dist/components/launchpad/edition-mint-schema.d.ts +4 -4
  21. package/dist/components/listing-card.cjs +17 -12
  22. package/dist/components/listing-card.cjs.map +1 -1
  23. package/dist/components/listing-card.js +17 -12
  24. package/dist/components/listing-card.js.map +1 -1
  25. package/dist/components/marketplace-filters.cjs +1 -1
  26. package/dist/components/marketplace-filters.cjs.map +1 -1
  27. package/dist/components/marketplace-filters.js +1 -1
  28. package/dist/components/marketplace-filters.js.map +1 -1
  29. package/dist/utils/media-wallet/use-erc20-balance.d.cts +1 -1
  30. package/dist/utils/media-wallet/use-erc20-balance.d.ts +1 -1
  31. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/marketplace-filters.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport Link from \"./link.js\";\nimport { usePathname } from \"next/navigation\";\nimport { SlidersHorizontal } from \"lucide-react\";\nimport { getTokenBySymbol, parseAmount, SUPPORTED_TOKENS } from \"@medialane/sdk\";\nimport { Input } from \"./input.js\";\nimport { Button } from \"./button.js\";\nimport { Dialog, DialogContent, DialogTitle } from \"./dialog.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { HelpIcon } from \"./help-icon.js\";\nimport { IP_TYPES } from \"../data/ip.js\";\nimport { useDebouncedValue } from \"../utils/use-debounced-value.js\";\nimport { cn } from \"../utils/cn.js\";\n\nconst SORT_OPTIONS = [\n { label: \"Recent\", value: \"recent\" },\n { label: \"Price ↑\", value: \"price_asc\" },\n { label: \"Price ↓\", value: \"price_desc\" },\n];\n\nconst TYPE_OPTIONS = [\n { label: \"All\", value: \"\" },\n { label: \"Listings\", value: \"listings\" },\n { label: \"Offers\", value: \"offers\" },\n];\n\nconst CURRENCY_OPTIONS = SUPPORTED_TOKENS.map((t) => ({\n label: t.symbol,\n value: t.symbol,\n icon: <CurrencyIcon symbol={t.symbol} size={13} />,\n}));\n\nfunction toRawAmount(value: string, decimals: number): string | undefined {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n try {\n return parseAmount(trimmed, decimals);\n } catch {\n return undefined;\n }\n}\n\nexport function useMarketplaceFilters() {\n const [open, setOpen] = useState(false);\n const [sort, setSort] = useState(\"recent\");\n const [currency, setCurrency] = useState(\"\");\n const [orderType, setOrderType] = useState(\"\");\n const [minInput, setMinInput] = useState(\"\");\n const [maxInput, setMaxInput] = useState(\"\");\n const debouncedMin = useDebouncedValue(minInput, 400);\n const debouncedMax = useDebouncedValue(maxInput, 400);\n\n const decimals = getTokenBySymbol(currency)?.decimals ?? 18;\n const minPrice = minInput ? toRawAmount(debouncedMin, decimals) : undefined;\n const maxPrice = maxInput ? toRawAmount(debouncedMax, decimals) : undefined;\n\n const clearPrice = () => {\n setMinInput(\"\");\n setMaxInput(\"\");\n };\n\n const selectCurrency = (symbol: string) => {\n setCurrency(currency === symbol ? \"\" : symbol);\n clearPrice();\n };\n\n const reset = () => {\n setSort(\"recent\");\n setCurrency(\"\");\n setOrderType(\"\");\n clearPrice();\n };\n\n const count = [sort !== \"recent\", currency, orderType, minPrice || maxPrice].filter(Boolean).length;\n\n return {\n open, setOpen,\n sort, setSort,\n currency, selectCurrency,\n orderType, setOrderType,\n minInput, setMinInput,\n maxInput, setMaxInput,\n minPrice, maxPrice,\n clearPrice, reset, count,\n };\n}\n\nexport type MarketplaceFilters = ReturnType<typeof useMarketplaceFilters>;\n\nconst chipClass = (active: boolean) =>\n cn(\n \"inline-flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n active\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n );\n\nfunction ChipGroup({ title, options, value, onSelect }: {\n title: string;\n options: { label: string; value: string; icon?: ReactNode }[];\n value: string;\n onSelect: (value: string) => void;\n}) {\n return (\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">{title}</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {options.map((opt) => (\n <button key={opt.value} onClick={() => onSelect(opt.value)} className={chipClass(value === opt.value)}>\n {opt.icon}\n <span>{opt.label}</span>\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction IpTypeChip({ href, label }: { href: string; label: string }) {\n const pathname = usePathname();\n return (\n <Link\n href={href}\n className={cn(\n \"text-xs px-3 py-1 rounded-full border transition-colors whitespace-nowrap\",\n pathname === href\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50 hover:text-foreground\"\n )}\n >\n {label}\n </Link>\n );\n}\n\nfunction ActiveChip({ children, onClear }: { children: ReactNode; onClear: () => void }) {\n return (\n <span className=\"flex items-center gap-1 text-xs px-2.5 py-1 rounded-full border border-primary/40 bg-primary/10 text-primary\">\n {children}\n <button onClick={onClear} className=\"ml-0.5 hover:text-primary/60\">×</button>\n </span>\n );\n}\n\nexport function FiltersButton({ filters }: { filters: MarketplaceFilters }) {\n return (\n <button\n onClick={() => filters.setOpen(true)}\n className={cn(\n \"relative flex items-center gap-1.5 h-9 px-3 rounded-lg border text-xs font-medium transition-colors shrink-0\",\n filters.count > 0\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground hover:border-primary/50 hover:text-foreground\"\n )}\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n Filters\n {filters.count > 0 && (\n <span className=\"flex h-4 w-4 items-center justify-center rounded-full bg-primary text-2xs font-bold text-primary-foreground\">\n {filters.count}\n </span>\n )}\n </button>\n );\n}\n\nexport function ActiveFilters({ filters }: { filters: MarketplaceFilters }) {\n const { sort, setSort, orderType, setOrderType, currency, selectCurrency, minPrice, maxPrice, minInput, maxInput, clearPrice, count } = filters;\n if (count === 0) return null;\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {sort !== \"recent\" && (\n <ActiveChip onClear={() => setSort(\"recent\")}>{SORT_OPTIONS.find((o) => o.value === sort)?.label}</ActiveChip>\n )}\n {orderType && (\n <ActiveChip onClear={() => setOrderType(\"\")}>{TYPE_OPTIONS.find((o) => o.value === orderType)?.label}</ActiveChip>\n )}\n {currency && (\n <ActiveChip onClear={() => selectCurrency(currency)}>\n <CurrencyIcon symbol={currency} size={12} />\n {currency}\n </ActiveChip>\n )}\n {(minPrice || maxPrice) && (\n <ActiveChip onClear={clearPrice}>{minInput || \"0\"} – {maxInput || \"∞\"}</ActiveChip>\n )}\n </div>\n );\n}\n\nexport function FiltersDialog({ filters }: { filters: MarketplaceFilters }) {\n const { open, setOpen, sort, setSort, orderType, setOrderType, currency, selectCurrency, minInput, setMinInput, maxInput, setMaxInput, reset, count } = filters;\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"w-full max-w-sm sm:max-w-md p-0 overflow-hidden gap-0 flex flex-col max-h-[85svh]\">\n\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border/60 pr-12\">\n <DialogTitle className=\"text-base font-bold flex items-center gap-2\">\n <SlidersHorizontal className=\"h-4 w-4 text-primary\" />\n Filters\n </DialogTitle>\n {count > 0 && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={reset}>\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n <ChipGroup title=\"Sort\" options={SORT_OPTIONS} value={sort} onSelect={setSort} />\n <ChipGroup title=\"Order type\" options={TYPE_OPTIONS} value={orderType} onSelect={setOrderType} />\n <ChipGroup title=\"Currency\" options={CURRENCY_OPTIONS} value={currency} onSelect={selectCurrency} />\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Price range</p>\n <div className=\"flex items-center gap-2\">\n <Input\n placeholder=\"Min\"\n value={minInput}\n onChange={(e) => setMinInput(e.target.value)}\n className=\"h-9 text-sm\"\n type=\"number\"\n min=\"0\"\n />\n <span className=\"text-sm text-muted-foreground shrink-0\">–</span>\n <Input\n placeholder=\"Max\"\n value={maxInput}\n onChange={(e) => setMaxInput(e.target.value)}\n className=\"h-9 text-sm\"\n type=\"number\"\n min=\"0\"\n />\n </div>\n </div>\n\n <div className=\"space-y-2 pt-1 border-t border-border/60\">\n <p className=\"flex items-center gap-1 text-2xs font-semibold text-muted-foreground\">\n IP Type\n <HelpIcon content=\"Filter by intellectual property category — Art, Audio, Video, Software, and more\" side=\"right\" />\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n <IpTypeChip href=\"/marketplace\" label=\"All\" />\n {IP_TYPES.map((type) => (\n <IpTypeChip key={type} href={`/${type.toLowerCase()}`} label={type} />\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"px-5 py-3 border-t border-border/60\">\n <Button className=\"w-full\" onClick={() => setOpen(false)}>\n Apply filters\n </Button>\n </div>\n\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";AA+BQ,cA+EE,YA/EF;AA7BR,SAAS,gBAAgC;AACzC,OAAO,UAAU;AACjB,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC,SAAS,kBAAkB,aAAa,wBAAwB;AAChE,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,QAAQ,eAAe,mBAAmB;AACnD,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,yBAAyB;AAClC,SAAS,UAAU;AAEnB,MAAM,eAAe;AAAA,EACnB,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,gBAAW,OAAO,YAAY;AAAA,EACvC,EAAE,OAAO,gBAAW,OAAO,aAAa;AAC1C;AAEA,MAAM,eAAe;AAAA,EACnB,EAAE,OAAO,OAAO,OAAO,GAAG;AAAA,EAC1B,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,EACvC,EAAE,OAAO,UAAU,OAAO,SAAS;AACrC;AAEA,MAAM,mBAAmB,iBAAiB,IAAI,CAAC,OAAO;AAAA,EACpD,OAAO,EAAE;AAAA,EACT,OAAO,EAAE;AAAA,EACT,MAAM,oBAAC,gBAAa,QAAQ,EAAE,QAAQ,MAAM,IAAI;AAClD,EAAE;AAEF,SAAS,YAAY,OAAe,UAAsC;AACxE,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,WAAO,YAAY,SAAS,QAAQ;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,wBAAwB;AACtC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,QAAQ;AACzC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,EAAE;AAC7C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,eAAe,kBAAkB,UAAU,GAAG;AACpD,QAAM,eAAe,kBAAkB,UAAU,GAAG;AAEpD,QAAM,WAAW,iBAAiB,QAAQ,GAAG,YAAY;AACzD,QAAM,WAAW,WAAW,YAAY,cAAc,QAAQ,IAAI;AAClE,QAAM,WAAW,WAAW,YAAY,cAAc,QAAQ,IAAI;AAElE,QAAM,aAAa,MAAM;AACvB,gBAAY,EAAE;AACd,gBAAY,EAAE;AAAA,EAChB;AAEA,QAAM,iBAAiB,CAAC,WAAmB;AACzC,gBAAY,aAAa,SAAS,KAAK,MAAM;AAC7C,eAAW;AAAA,EACb;AAEA,QAAM,QAAQ,MAAM;AAClB,YAAQ,QAAQ;AAChB,gBAAY,EAAE;AACd,iBAAa,EAAE;AACf,eAAW;AAAA,EACb;AAEA,QAAM,QAAQ,CAAC,SAAS,UAAU,UAAU,WAAW,YAAY,QAAQ,EAAE,OAAO,OAAO,EAAE;AAE7F,SAAO;AAAA,IACL;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAU;AAAA,IACV;AAAA,IAAW;AAAA,IACX;AAAA,IAAU;AAAA,IACV;AAAA,IAAU;AAAA,IACV;AAAA,IAAU;AAAA,IACV;AAAA,IAAY;AAAA,IAAO;AAAA,EACrB;AACF;AAIA,MAAM,YAAY,CAAC,WACjB;AAAA,EACE;AAAA,EACA,SACI,0DACA;AACN;AAEF,SAAS,UAAU,EAAE,OAAO,SAAS,OAAO,SAAS,GAKlD;AACD,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,OAAE,WAAU,gDAAgD,iBAAM;AAAA,IACnE,oBAAC,SAAI,WAAU,0BACZ,kBAAQ,IAAI,CAAC,QACZ,qBAAC,YAAuB,SAAS,MAAM,SAAS,IAAI,KAAK,GAAG,WAAW,UAAU,UAAU,IAAI,KAAK,GACjG;AAAA,UAAI;AAAA,MACL,oBAAC,UAAM,cAAI,OAAM;AAAA,SAFN,IAAI,KAGjB,CACD,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW,EAAE,MAAM,MAAM,GAAoC;AACpE,QAAM,WAAW,YAAY;AAC7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,aAAa,OACT,0DACA;AAAA,MACN;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,WAAW,EAAE,UAAU,QAAQ,GAAiD;AACvF,SACE,qBAAC,UAAK,WAAU,gHACb;AAAA;AAAA,IACD,oBAAC,YAAO,SAAS,SAAS,WAAU,gCAA+B,kBAAC;AAAA,KACtE;AAEJ;AAEO,SAAS,cAAc,EAAE,QAAQ,GAAoC;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,QAAQ,QAAQ,IAAI;AAAA,MACnC,WAAW;AAAA,QACT;AAAA,QACA,QAAQ,QAAQ,IACZ,8CACA;AAAA,MACN;AAAA,MAEA;AAAA,4BAAC,qBAAkB,WAAU,eAAc;AAAA,QAAE;AAAA,QAE5C,QAAQ,QAAQ,KACf,oBAAC,UAAK,WAAU,+GACb,kBAAQ,OACX;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEO,SAAS,cAAc,EAAE,QAAQ,GAAoC;AAC1E,QAAM,EAAE,MAAM,SAAS,WAAW,cAAc,UAAU,gBAAgB,UAAU,UAAU,UAAU,UAAU,YAAY,MAAM,IAAI;AACxI,MAAI,UAAU,EAAG,QAAO;AACxB,SACE,qBAAC,SAAI,WAAU,0BACZ;AAAA,aAAS,YACR,oBAAC,cAAW,SAAS,MAAM,QAAQ,QAAQ,GAAI,uBAAa,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI,GAAG,OAAM;AAAA,IAElG,aACC,oBAAC,cAAW,SAAS,MAAM,aAAa,EAAE,GAAI,uBAAa,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS,GAAG,OAAM;AAAA,IAEtG,YACC,qBAAC,cAAW,SAAS,MAAM,eAAe,QAAQ,GAChD;AAAA,0BAAC,gBAAa,QAAQ,UAAU,MAAM,IAAI;AAAA,MACzC;AAAA,OACH;AAAA,KAEA,YAAY,aACZ,qBAAC,cAAW,SAAS,YAAa;AAAA,kBAAY;AAAA,MAAI;AAAA,MAAI,YAAY;AAAA,OAAI;AAAA,KAE1E;AAEJ;AAEO,SAAS,cAAc,EAAE,QAAQ,GAAoC;AAC1E,QAAM,EAAE,MAAM,SAAS,MAAM,SAAS,WAAW,cAAc,UAAU,gBAAgB,UAAU,aAAa,UAAU,aAAa,OAAO,MAAM,IAAI;AACxJ,SACE,oBAAC,UAAO,MAAY,cAAc,SAChC,+BAAC,iBAAc,WAAU,qFAEvB;AAAA,yBAAC,SAAI,WAAU,+EACb;AAAA,2BAAC,eAAY,WAAU,+CACrB;AAAA,4BAAC,qBAAkB,WAAU,wBAAuB;AAAA,QAAE;AAAA,SAExD;AAAA,MACC,QAAQ,KACP,oBAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,WAAU,qCAAoC,SAAS,OAAO,uBAEhG;AAAA,OAEJ;AAAA,IAEA,qBAAC,SAAI,WAAU,8CACb;AAAA,0BAAC,aAAU,OAAM,QAAO,SAAS,cAAc,OAAO,MAAM,UAAU,SAAS;AAAA,MAC/E,oBAAC,aAAU,OAAM,cAAa,SAAS,cAAc,OAAO,WAAW,UAAU,cAAc;AAAA,MAC/F,oBAAC,aAAU,OAAM,YAAW,SAAS,kBAAkB,OAAO,UAAU,UAAU,gBAAgB;AAAA,MAElG,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,OAAE,WAAU,gDAA+C,yBAAW;AAAA,QACvE,qBAAC,SAAI,WAAU,2BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,cAC3C,WAAU;AAAA,cACV,MAAK;AAAA,cACL,KAAI;AAAA;AAAA,UACN;AAAA,UACA,oBAAC,UAAK,WAAU,0CAAyC,oBAAC;AAAA,UAC1D;AAAA,YAAC;AAAA;AAAA,cACC,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,cAC3C,WAAU;AAAA,cACV,MAAK;AAAA,cACL,KAAI;AAAA;AAAA,UACN;AAAA,WACF;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,4CACb;AAAA,6BAAC,OAAE,WAAU,wEAAuE;AAAA;AAAA,UAElF,oBAAC,YAAS,SAAQ,yFAAmF,MAAK,SAAQ;AAAA,WACpH;AAAA,QACA,qBAAC,SAAI,WAAU,0BACb;AAAA,8BAAC,cAAW,MAAK,gBAAe,OAAM,OAAM;AAAA,UAC3C,SAAS,IAAI,CAAC,SACb,oBAAC,cAAsB,MAAM,IAAI,KAAK,YAAY,CAAC,IAAI,OAAO,QAA7C,IAAmD,CACrE;AAAA,WACH;AAAA,SACF;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAU,uCACb,8BAAC,UAAO,WAAU,UAAS,SAAS,MAAM,QAAQ,KAAK,GAAG,2BAE1D,GACF;AAAA,KAEF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/marketplace-filters.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport Link from \"./link.js\";\nimport { usePathname } from \"next/navigation\";\nimport { SlidersHorizontal } from \"lucide-react\";\nimport { getTokenBySymbol, parseAmount, SUPPORTED_TOKENS } from \"@medialane/sdk\";\nimport { Input } from \"./input.js\";\nimport { Button } from \"./button.js\";\nimport { Dialog, DialogContent, DialogTitle } from \"./dialog.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { HelpIcon } from \"./help-icon.js\";\nimport { IP_TYPES } from \"../data/ip.js\";\nimport { useDebouncedValue } from \"../utils/use-debounced-value.js\";\nimport { cn } from \"../utils/cn.js\";\n\nconst SORT_OPTIONS = [\n { label: \"Recent\", value: \"recent\" },\n { label: \"Price ↑\", value: \"price_asc\" },\n { label: \"Price ↓\", value: \"price_desc\" },\n];\n\nconst TYPE_OPTIONS = [\n { label: \"All\", value: \"\" },\n { label: \"Listings\", value: \"listings\" },\n { label: \"Offers\", value: \"offers\" },\n];\n\nconst CURRENCY_OPTIONS = SUPPORTED_TOKENS.map((t) => ({\n label: t.symbol,\n value: t.symbol,\n icon: <CurrencyIcon symbol={t.symbol} size={13} />,\n}));\n\nfunction toRawAmount(value: string, decimals: number): string | undefined {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n try {\n return parseAmount(trimmed, decimals);\n } catch {\n return undefined;\n }\n}\n\nexport function useMarketplaceFilters() {\n const [open, setOpen] = useState(false);\n const [sort, setSort] = useState(\"recent\");\n const [currency, setCurrency] = useState(\"\");\n const [orderType, setOrderType] = useState(\"\");\n const [minInput, setMinInput] = useState(\"\");\n const [maxInput, setMaxInput] = useState(\"\");\n const debouncedMin = useDebouncedValue(minInput, 400);\n const debouncedMax = useDebouncedValue(maxInput, 400);\n\n const decimals = getTokenBySymbol(currency)?.decimals ?? 18;\n const minPrice = minInput ? toRawAmount(debouncedMin, decimals) : undefined;\n const maxPrice = maxInput ? toRawAmount(debouncedMax, decimals) : undefined;\n\n const clearPrice = () => {\n setMinInput(\"\");\n setMaxInput(\"\");\n };\n\n const selectCurrency = (symbol: string) => {\n setCurrency(currency === symbol ? \"\" : symbol);\n clearPrice();\n };\n\n const reset = () => {\n setSort(\"recent\");\n setCurrency(\"\");\n setOrderType(\"\");\n clearPrice();\n };\n\n const count = [sort !== \"recent\", currency, orderType, minPrice || maxPrice].filter(Boolean).length;\n\n return {\n open, setOpen,\n sort, setSort,\n currency, selectCurrency,\n orderType, setOrderType,\n minInput, setMinInput,\n maxInput, setMaxInput,\n minPrice, maxPrice,\n clearPrice, reset, count,\n };\n}\n\nexport type MarketplaceFilters = ReturnType<typeof useMarketplaceFilters>;\n\nconst chipClass = (active: boolean) =>\n cn(\n \"inline-flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n active\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n );\n\nfunction ChipGroup({ title, options, value, onSelect }: {\n title: string;\n options: { label: string; value: string; icon?: ReactNode }[];\n value: string;\n onSelect: (value: string) => void;\n}) {\n return (\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">{title}</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {options.map((opt) => (\n <button key={opt.value} onClick={() => onSelect(opt.value)} className={chipClass(value === opt.value)}>\n {opt.icon}\n <span>{opt.label}</span>\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction IpTypeChip({ href, label }: { href: string; label: string }) {\n const pathname = usePathname();\n return (\n <Link\n href={href}\n className={cn(\n \"text-xs px-3 py-1 rounded-full border transition-colors whitespace-nowrap\",\n pathname === href\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50 hover:text-foreground\"\n )}\n >\n {label}\n </Link>\n );\n}\n\nfunction ActiveChip({ children, onClear }: { children: ReactNode; onClear: () => void }) {\n return (\n <span className=\"flex items-center gap-1 text-xs px-2.5 py-1 rounded-full border border-primary/40 bg-primary/10 text-primary\">\n {children}\n <button onClick={onClear} className=\"ml-0.5 hover:text-primary/60\">×</button>\n </span>\n );\n}\n\nexport function FiltersButton({ filters }: { filters: MarketplaceFilters }) {\n return (\n <button\n onClick={() => filters.setOpen(true)}\n aria-label=\"Filters\"\n className={cn(\n \"relative flex items-center gap-1.5 h-9 px-3 rounded-lg border text-xs font-medium transition-colors shrink-0\",\n filters.count > 0\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground hover:border-primary/50 hover:text-foreground\"\n )}\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n {filters.count > 0 && (\n <span className=\"flex h-4 w-4 items-center justify-center rounded-full bg-primary text-2xs font-bold text-primary-foreground\">\n {filters.count}\n </span>\n )}\n </button>\n );\n}\n\nexport function ActiveFilters({ filters }: { filters: MarketplaceFilters }) {\n const { sort, setSort, orderType, setOrderType, currency, selectCurrency, minPrice, maxPrice, minInput, maxInput, clearPrice, count } = filters;\n if (count === 0) return null;\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {sort !== \"recent\" && (\n <ActiveChip onClear={() => setSort(\"recent\")}>{SORT_OPTIONS.find((o) => o.value === sort)?.label}</ActiveChip>\n )}\n {orderType && (\n <ActiveChip onClear={() => setOrderType(\"\")}>{TYPE_OPTIONS.find((o) => o.value === orderType)?.label}</ActiveChip>\n )}\n {currency && (\n <ActiveChip onClear={() => selectCurrency(currency)}>\n <CurrencyIcon symbol={currency} size={12} />\n {currency}\n </ActiveChip>\n )}\n {(minPrice || maxPrice) && (\n <ActiveChip onClear={clearPrice}>{minInput || \"0\"} – {maxInput || \"∞\"}</ActiveChip>\n )}\n </div>\n );\n}\n\nexport function FiltersDialog({ filters }: { filters: MarketplaceFilters }) {\n const { open, setOpen, sort, setSort, orderType, setOrderType, currency, selectCurrency, minInput, setMinInput, maxInput, setMaxInput, reset, count } = filters;\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"w-full max-w-sm sm:max-w-md p-0 overflow-hidden gap-0 flex flex-col max-h-[85svh]\">\n\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border/60 pr-12\">\n <DialogTitle className=\"text-base font-bold flex items-center gap-2\">\n <SlidersHorizontal className=\"h-4 w-4 text-primary\" />\n Filters\n </DialogTitle>\n {count > 0 && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={reset}>\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n <ChipGroup title=\"Sort\" options={SORT_OPTIONS} value={sort} onSelect={setSort} />\n <ChipGroup title=\"Order type\" options={TYPE_OPTIONS} value={orderType} onSelect={setOrderType} />\n <ChipGroup title=\"Currency\" options={CURRENCY_OPTIONS} value={currency} onSelect={selectCurrency} />\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Price range</p>\n <div className=\"flex items-center gap-2\">\n <Input\n placeholder=\"Min\"\n value={minInput}\n onChange={(e) => setMinInput(e.target.value)}\n className=\"h-9 text-sm\"\n type=\"number\"\n min=\"0\"\n />\n <span className=\"text-sm text-muted-foreground shrink-0\">–</span>\n <Input\n placeholder=\"Max\"\n value={maxInput}\n onChange={(e) => setMaxInput(e.target.value)}\n className=\"h-9 text-sm\"\n type=\"number\"\n min=\"0\"\n />\n </div>\n </div>\n\n <div className=\"space-y-2 pt-1 border-t border-border/60\">\n <p className=\"flex items-center gap-1 text-2xs font-semibold text-muted-foreground\">\n IP Type\n <HelpIcon content=\"Filter by intellectual property category — Art, Audio, Video, Software, and more\" side=\"right\" />\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n <IpTypeChip href=\"/marketplace\" label=\"All\" />\n {IP_TYPES.map((type) => (\n <IpTypeChip key={type} href={`/${type.toLowerCase()}`} label={type} />\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"px-5 py-3 border-t border-border/60\">\n <Button className=\"w-full\" onClick={() => setOpen(false)}>\n Apply filters\n </Button>\n </div>\n\n </DialogContent>\n </Dialog>\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: 8 | 6 | 18;
10
+ decimals: 6 | 8 | 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: 8 | 6 | 18;
10
+ decimals: 6 | 8 | 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.323.0",
3
+ "version": "0.325.0",
4
4
  "description": "Shared UI components for Medialane apps",
5
5
  "type": "module",
6
6
  "sideEffects": false,