@blueshift-gg/ui-components 0.1.8 → 0.1.9

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.
@@ -119,6 +119,7 @@ const Pagination = ({
119
119
  label: item.toString(),
120
120
  value: item.toString()
121
121
  })),
122
+ selectedItem: itemsPerPage?.toString(),
122
123
  size: "sm",
123
124
  handleChange: (value) => onItemsPerPageChange(Number(value))
124
125
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Pagination.tsx"],"names":["useWindowSize","jsxs","classNames","jsx","Dropdown","motion","Fragment","anticipate","CrosshairCorners","Icon"],"mappings":"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","file":"Pagination.js","sourcesContent":["\"use client\";\n\nimport classNames from \"classnames\";\nimport { Icon } from \"./Icon\";\nimport { CrosshairCorners } from \"./CrossHair\";\nimport { anticipate, motion } from \"motion/react\";\nimport { Dropdown } from \"./Dropdown\";\nimport { useWindowSize } from \"usehooks-ts\";\n\nexport type PaginationProps = {\n totalPages: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n itemsPerPage?: number;\n itemsPerPageOptions?: number[];\n onItemsPerPageChange: (itemsPerPage: number) => void;\n className?: string;\n};\n\nexport const Pagination = ({\n totalPages,\n currentPage,\n onPageChange,\n onItemsPerPageChange,\n className,\n itemsPerPage,\n itemsPerPageOptions,\n}: PaginationProps) => {\n // Mobile detection using useWindowSize\n const { width } = useWindowSize();\n const isMobile = width < 768; // md breakpoint\n // Generate page numbers with logic for showing max 6 pages on desktop, 4 on mobile\n const generatePageNumbers = () => {\n const pages: (number | \"divider\")[] = [];\n const maxPages = isMobile ? 4 : 6;\n\n if (totalPages <= maxPages) {\n // Show all pages if within the limit\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Complex logic for more than max pages\n if (currentPage <= (isMobile ? 3 : 4)) {\n // Show first pages + last page with divider\n const firstPagesCount = isMobile ? 3 : 5;\n for (let i = 1; i <= firstPagesCount; i++) {\n pages.push(i);\n }\n pages.push(\"divider\");\n pages.push(totalPages);\n } else if (currentPage >= totalPages - (isMobile ? 2 : 3)) {\n // Show first page + divider + last pages\n const lastPagesCount = isMobile ? 3 : 5;\n pages.push(1);\n pages.push(\"divider\");\n for (let i = totalPages - (lastPagesCount - 1); i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Show first page + divider + current page and surrounding + divider + last page\n pages.push(1);\n pages.push(\"divider\");\n const surroundingCount = isMobile ? 1 : 1; // Show current page and 1 on each side\n for (\n let i = currentPage - surroundingCount;\n i <= currentPage + surroundingCount;\n i++\n ) {\n pages.push(i);\n }\n pages.push(\"divider\");\n pages.push(totalPages);\n }\n }\n\n return pages;\n };\n\n const pageNumbers = generatePageNumbers();\n\n return (\n <div\n className={classNames(\n \"flex flex-col sm:flex-row items-center w-full gap-6\",\n itemsPerPageOptions ? \"justify-between\" : \"justify-center\"\n )}\n >\n <div className={classNames(\"flex items-center gap-1\", className)}>\n {/* Left control */}\n <PaginationButton\n label=\"\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage === 1}\n isControl={true}\n controlDirection=\"left\"\n />\n\n {/* Page numbers and dividers */}\n {pageNumbers.map((page, index) => {\n if (page === \"divider\") {\n return (\n <div\n key={`divider-${index}`}\n className=\"flex items-center justify-center w-[36px] h-[36px]\"\n >\n <div className=\"w-1 h-1 bg-shade-tertiary/15\" />\n </div>\n );\n }\n\n return (\n <PaginationButton\n key={page}\n label={page.toString()}\n onClick={() => onPageChange(page)}\n disabled={false}\n isActive={page === currentPage}\n />\n );\n })}\n\n {/* Right control */}\n <PaginationButton\n label=\"\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n isControl={true}\n controlDirection=\"right\"\n />\n </div>\n <div className=\"relative\">\n {itemsPerPageOptions && (\n <Dropdown\n label={`${itemsPerPage ? itemsPerPage : \"Items\"} items per page`}\n items={itemsPerPageOptions.map((item) => ({\n label: item.toString(),\n value: item.toString(),\n }))}\n size=\"sm\"\n handleChange={(value) => onItemsPerPageChange(Number(value))}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport type PaginationButtonProps = {\n label: string;\n onClick: () => void;\n disabled: boolean;\n isControl?: boolean;\n isActive?: boolean;\n controlDirection?: \"left\" | \"right\";\n};\n\nexport const PaginationButton = ({\n label,\n onClick,\n disabled,\n isControl = false,\n isActive = false,\n controlDirection = \"left\",\n}: PaginationButtonProps) => {\n return (\n <motion.button\n disabled={disabled}\n onClick={onClick}\n className={classNames(\n \"disabled:opacity-40 border border-border-light relative flex items-center transition-colors justify-center w-[36px] h-[36px] shadow-[inset_0px_0px_12px_rgba(173,185,210,0.15)] bg-background\",\n isActive && \"text-brand-primary\",\n !isActive &&\n \"enabled:hover:bg-shade-tertiary/5 enabled:hover:text-shade-secondary\"\n )}\n >\n {isActive && (\n <>\n <motion.div\n className=\"absolute inset-0 bg-current/5 before:!inset-[-1px] gradient-border before:bg-brand-primary/25 shadow-current/25 shadow-[inset_0px_0px_12px]\"\n initial={{ opacity: 0 }}\n animate={{ opacity: [0, 1, 0.2, 1, 0.4, 1, 0.6, 1, 0.8, 1] }}\n transition={{ duration: 0.5, ease: anticipate }}\n />\n <CrosshairCorners\n size={4}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-current\"\n animationDuration={0.85}\n animationDelay={0}\n />\n </>\n )}\n {isControl ? (\n <Icon\n name={controlDirection === \"left\" ? \"ChevronLeft\" : \"ChevronRight\"}\n size={14}\n />\n ) : (\n <span className=\"font-mono\">{label}</span>\n )}\n </motion.button>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Pagination.tsx"],"names":["useWindowSize","jsxs","classNames","jsx","Dropdown","motion","Fragment","anticipate","CrosshairCorners","Icon"],"mappings":"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","file":"Pagination.js","sourcesContent":["\"use client\";\n\nimport classNames from \"classnames\";\nimport { Icon } from \"./Icon\";\nimport { CrosshairCorners } from \"./CrossHair\";\nimport { anticipate, motion } from \"motion/react\";\nimport { Dropdown } from \"./Dropdown\";\nimport { useWindowSize } from \"usehooks-ts\";\n\nexport type PaginationProps = {\n totalPages: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n itemsPerPage?: number;\n itemsPerPageOptions?: number[];\n onItemsPerPageChange: (itemsPerPage: number) => void;\n className?: string;\n};\n\nexport const Pagination = ({\n totalPages,\n currentPage,\n onPageChange,\n onItemsPerPageChange,\n className,\n itemsPerPage,\n itemsPerPageOptions,\n}: PaginationProps) => {\n // Mobile detection using useWindowSize\n const { width } = useWindowSize();\n const isMobile = width < 768; // md breakpoint\n // Generate page numbers with logic for showing max 6 pages on desktop, 4 on mobile\n const generatePageNumbers = () => {\n const pages: (number | \"divider\")[] = [];\n const maxPages = isMobile ? 4 : 6;\n\n if (totalPages <= maxPages) {\n // Show all pages if within the limit\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Complex logic for more than max pages\n if (currentPage <= (isMobile ? 3 : 4)) {\n // Show first pages + last page with divider\n const firstPagesCount = isMobile ? 3 : 5;\n for (let i = 1; i <= firstPagesCount; i++) {\n pages.push(i);\n }\n pages.push(\"divider\");\n pages.push(totalPages);\n } else if (currentPage >= totalPages - (isMobile ? 2 : 3)) {\n // Show first page + divider + last pages\n const lastPagesCount = isMobile ? 3 : 5;\n pages.push(1);\n pages.push(\"divider\");\n for (let i = totalPages - (lastPagesCount - 1); i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Show first page + divider + current page and surrounding + divider + last page\n pages.push(1);\n pages.push(\"divider\");\n const surroundingCount = isMobile ? 1 : 1; // Show current page and 1 on each side\n for (\n let i = currentPage - surroundingCount;\n i <= currentPage + surroundingCount;\n i++\n ) {\n pages.push(i);\n }\n pages.push(\"divider\");\n pages.push(totalPages);\n }\n }\n\n return pages;\n };\n\n const pageNumbers = generatePageNumbers();\n\n return (\n <div\n className={classNames(\n \"flex flex-col sm:flex-row items-center w-full gap-6\",\n itemsPerPageOptions ? \"justify-between\" : \"justify-center\"\n )}\n >\n <div className={classNames(\"flex items-center gap-1\", className)}>\n {/* Left control */}\n <PaginationButton\n label=\"\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage === 1}\n isControl={true}\n controlDirection=\"left\"\n />\n\n {/* Page numbers and dividers */}\n {pageNumbers.map((page, index) => {\n if (page === \"divider\") {\n return (\n <div\n key={`divider-${index}`}\n className=\"flex items-center justify-center w-[36px] h-[36px]\"\n >\n <div className=\"w-1 h-1 bg-shade-tertiary/15\" />\n </div>\n );\n }\n\n return (\n <PaginationButton\n key={page}\n label={page.toString()}\n onClick={() => onPageChange(page)}\n disabled={false}\n isActive={page === currentPage}\n />\n );\n })}\n\n {/* Right control */}\n <PaginationButton\n label=\"\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n isControl={true}\n controlDirection=\"right\"\n />\n </div>\n <div className=\"relative\">\n {itemsPerPageOptions && (\n <Dropdown\n label={`${itemsPerPage ? itemsPerPage : \"Items\"} items per page`}\n items={itemsPerPageOptions.map((item) => ({\n label: item.toString(),\n value: item.toString(),\n }))}\n selectedItem={itemsPerPage?.toString()}\n size=\"sm\"\n handleChange={(value) => onItemsPerPageChange(Number(value))}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport type PaginationButtonProps = {\n label: string;\n onClick: () => void;\n disabled: boolean;\n isControl?: boolean;\n isActive?: boolean;\n controlDirection?: \"left\" | \"right\";\n};\n\nexport const PaginationButton = ({\n label,\n onClick,\n disabled,\n isControl = false,\n isActive = false,\n controlDirection = \"left\",\n}: PaginationButtonProps) => {\n return (\n <motion.button\n disabled={disabled}\n onClick={onClick}\n className={classNames(\n \"disabled:opacity-40 border border-border-light relative flex items-center transition-colors justify-center w-[36px] h-[36px] shadow-[inset_0px_0px_12px_rgba(173,185,210,0.15)] bg-background\",\n isActive && \"text-brand-primary\",\n !isActive &&\n \"enabled:hover:bg-shade-tertiary/5 enabled:hover:text-shade-secondary\"\n )}\n >\n {isActive && (\n <>\n <motion.div\n className=\"absolute inset-0 bg-current/5 before:!inset-[-1px] gradient-border before:bg-brand-primary/25 shadow-current/25 shadow-[inset_0px_0px_12px]\"\n initial={{ opacity: 0 }}\n animate={{ opacity: [0, 1, 0.2, 1, 0.4, 1, 0.6, 1, 0.8, 1] }}\n transition={{ duration: 0.5, ease: anticipate }}\n />\n <CrosshairCorners\n size={4}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-current\"\n animationDuration={0.85}\n animationDelay={0}\n />\n </>\n )}\n {isControl ? (\n <Icon\n name={controlDirection === \"left\" ? \"ChevronLeft\" : \"ChevronRight\"}\n size={14}\n />\n ) : (\n <span className=\"font-mono\">{label}</span>\n )}\n </motion.button>\n );\n};\n"]}
@@ -113,6 +113,7 @@ const Pagination = ({
113
113
  label: item.toString(),
114
114
  value: item.toString()
115
115
  })),
116
+ selectedItem: itemsPerPage?.toString(),
116
117
  size: "sm",
117
118
  handleChange: (value) => onItemsPerPageChange(Number(value))
118
119
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Pagination.tsx"],"names":[],"mappings":"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","file":"Pagination.mjs","sourcesContent":["\"use client\";\n\nimport classNames from \"classnames\";\nimport { Icon } from \"./Icon\";\nimport { CrosshairCorners } from \"./CrossHair\";\nimport { anticipate, motion } from \"motion/react\";\nimport { Dropdown } from \"./Dropdown\";\nimport { useWindowSize } from \"usehooks-ts\";\n\nexport type PaginationProps = {\n totalPages: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n itemsPerPage?: number;\n itemsPerPageOptions?: number[];\n onItemsPerPageChange: (itemsPerPage: number) => void;\n className?: string;\n};\n\nexport const Pagination = ({\n totalPages,\n currentPage,\n onPageChange,\n onItemsPerPageChange,\n className,\n itemsPerPage,\n itemsPerPageOptions,\n}: PaginationProps) => {\n // Mobile detection using useWindowSize\n const { width } = useWindowSize();\n const isMobile = width < 768; // md breakpoint\n // Generate page numbers with logic for showing max 6 pages on desktop, 4 on mobile\n const generatePageNumbers = () => {\n const pages: (number | \"divider\")[] = [];\n const maxPages = isMobile ? 4 : 6;\n\n if (totalPages <= maxPages) {\n // Show all pages if within the limit\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Complex logic for more than max pages\n if (currentPage <= (isMobile ? 3 : 4)) {\n // Show first pages + last page with divider\n const firstPagesCount = isMobile ? 3 : 5;\n for (let i = 1; i <= firstPagesCount; i++) {\n pages.push(i);\n }\n pages.push(\"divider\");\n pages.push(totalPages);\n } else if (currentPage >= totalPages - (isMobile ? 2 : 3)) {\n // Show first page + divider + last pages\n const lastPagesCount = isMobile ? 3 : 5;\n pages.push(1);\n pages.push(\"divider\");\n for (let i = totalPages - (lastPagesCount - 1); i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Show first page + divider + current page and surrounding + divider + last page\n pages.push(1);\n pages.push(\"divider\");\n const surroundingCount = isMobile ? 1 : 1; // Show current page and 1 on each side\n for (\n let i = currentPage - surroundingCount;\n i <= currentPage + surroundingCount;\n i++\n ) {\n pages.push(i);\n }\n pages.push(\"divider\");\n pages.push(totalPages);\n }\n }\n\n return pages;\n };\n\n const pageNumbers = generatePageNumbers();\n\n return (\n <div\n className={classNames(\n \"flex flex-col sm:flex-row items-center w-full gap-6\",\n itemsPerPageOptions ? \"justify-between\" : \"justify-center\"\n )}\n >\n <div className={classNames(\"flex items-center gap-1\", className)}>\n {/* Left control */}\n <PaginationButton\n label=\"\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage === 1}\n isControl={true}\n controlDirection=\"left\"\n />\n\n {/* Page numbers and dividers */}\n {pageNumbers.map((page, index) => {\n if (page === \"divider\") {\n return (\n <div\n key={`divider-${index}`}\n className=\"flex items-center justify-center w-[36px] h-[36px]\"\n >\n <div className=\"w-1 h-1 bg-shade-tertiary/15\" />\n </div>\n );\n }\n\n return (\n <PaginationButton\n key={page}\n label={page.toString()}\n onClick={() => onPageChange(page)}\n disabled={false}\n isActive={page === currentPage}\n />\n );\n })}\n\n {/* Right control */}\n <PaginationButton\n label=\"\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n isControl={true}\n controlDirection=\"right\"\n />\n </div>\n <div className=\"relative\">\n {itemsPerPageOptions && (\n <Dropdown\n label={`${itemsPerPage ? itemsPerPage : \"Items\"} items per page`}\n items={itemsPerPageOptions.map((item) => ({\n label: item.toString(),\n value: item.toString(),\n }))}\n size=\"sm\"\n handleChange={(value) => onItemsPerPageChange(Number(value))}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport type PaginationButtonProps = {\n label: string;\n onClick: () => void;\n disabled: boolean;\n isControl?: boolean;\n isActive?: boolean;\n controlDirection?: \"left\" | \"right\";\n};\n\nexport const PaginationButton = ({\n label,\n onClick,\n disabled,\n isControl = false,\n isActive = false,\n controlDirection = \"left\",\n}: PaginationButtonProps) => {\n return (\n <motion.button\n disabled={disabled}\n onClick={onClick}\n className={classNames(\n \"disabled:opacity-40 border border-border-light relative flex items-center transition-colors justify-center w-[36px] h-[36px] shadow-[inset_0px_0px_12px_rgba(173,185,210,0.15)] bg-background\",\n isActive && \"text-brand-primary\",\n !isActive &&\n \"enabled:hover:bg-shade-tertiary/5 enabled:hover:text-shade-secondary\"\n )}\n >\n {isActive && (\n <>\n <motion.div\n className=\"absolute inset-0 bg-current/5 before:!inset-[-1px] gradient-border before:bg-brand-primary/25 shadow-current/25 shadow-[inset_0px_0px_12px]\"\n initial={{ opacity: 0 }}\n animate={{ opacity: [0, 1, 0.2, 1, 0.4, 1, 0.6, 1, 0.8, 1] }}\n transition={{ duration: 0.5, ease: anticipate }}\n />\n <CrosshairCorners\n size={4}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-current\"\n animationDuration={0.85}\n animationDelay={0}\n />\n </>\n )}\n {isControl ? (\n <Icon\n name={controlDirection === \"left\" ? \"ChevronLeft\" : \"ChevronRight\"}\n size={14}\n />\n ) : (\n <span className=\"font-mono\">{label}</span>\n )}\n </motion.button>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Pagination.tsx"],"names":[],"mappings":"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","file":"Pagination.mjs","sourcesContent":["\"use client\";\n\nimport classNames from \"classnames\";\nimport { Icon } from \"./Icon\";\nimport { CrosshairCorners } from \"./CrossHair\";\nimport { anticipate, motion } from \"motion/react\";\nimport { Dropdown } from \"./Dropdown\";\nimport { useWindowSize } from \"usehooks-ts\";\n\nexport type PaginationProps = {\n totalPages: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n itemsPerPage?: number;\n itemsPerPageOptions?: number[];\n onItemsPerPageChange: (itemsPerPage: number) => void;\n className?: string;\n};\n\nexport const Pagination = ({\n totalPages,\n currentPage,\n onPageChange,\n onItemsPerPageChange,\n className,\n itemsPerPage,\n itemsPerPageOptions,\n}: PaginationProps) => {\n // Mobile detection using useWindowSize\n const { width } = useWindowSize();\n const isMobile = width < 768; // md breakpoint\n // Generate page numbers with logic for showing max 6 pages on desktop, 4 on mobile\n const generatePageNumbers = () => {\n const pages: (number | \"divider\")[] = [];\n const maxPages = isMobile ? 4 : 6;\n\n if (totalPages <= maxPages) {\n // Show all pages if within the limit\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Complex logic for more than max pages\n if (currentPage <= (isMobile ? 3 : 4)) {\n // Show first pages + last page with divider\n const firstPagesCount = isMobile ? 3 : 5;\n for (let i = 1; i <= firstPagesCount; i++) {\n pages.push(i);\n }\n pages.push(\"divider\");\n pages.push(totalPages);\n } else if (currentPage >= totalPages - (isMobile ? 2 : 3)) {\n // Show first page + divider + last pages\n const lastPagesCount = isMobile ? 3 : 5;\n pages.push(1);\n pages.push(\"divider\");\n for (let i = totalPages - (lastPagesCount - 1); i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Show first page + divider + current page and surrounding + divider + last page\n pages.push(1);\n pages.push(\"divider\");\n const surroundingCount = isMobile ? 1 : 1; // Show current page and 1 on each side\n for (\n let i = currentPage - surroundingCount;\n i <= currentPage + surroundingCount;\n i++\n ) {\n pages.push(i);\n }\n pages.push(\"divider\");\n pages.push(totalPages);\n }\n }\n\n return pages;\n };\n\n const pageNumbers = generatePageNumbers();\n\n return (\n <div\n className={classNames(\n \"flex flex-col sm:flex-row items-center w-full gap-6\",\n itemsPerPageOptions ? \"justify-between\" : \"justify-center\"\n )}\n >\n <div className={classNames(\"flex items-center gap-1\", className)}>\n {/* Left control */}\n <PaginationButton\n label=\"\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage === 1}\n isControl={true}\n controlDirection=\"left\"\n />\n\n {/* Page numbers and dividers */}\n {pageNumbers.map((page, index) => {\n if (page === \"divider\") {\n return (\n <div\n key={`divider-${index}`}\n className=\"flex items-center justify-center w-[36px] h-[36px]\"\n >\n <div className=\"w-1 h-1 bg-shade-tertiary/15\" />\n </div>\n );\n }\n\n return (\n <PaginationButton\n key={page}\n label={page.toString()}\n onClick={() => onPageChange(page)}\n disabled={false}\n isActive={page === currentPage}\n />\n );\n })}\n\n {/* Right control */}\n <PaginationButton\n label=\"\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n isControl={true}\n controlDirection=\"right\"\n />\n </div>\n <div className=\"relative\">\n {itemsPerPageOptions && (\n <Dropdown\n label={`${itemsPerPage ? itemsPerPage : \"Items\"} items per page`}\n items={itemsPerPageOptions.map((item) => ({\n label: item.toString(),\n value: item.toString(),\n }))}\n selectedItem={itemsPerPage?.toString()}\n size=\"sm\"\n handleChange={(value) => onItemsPerPageChange(Number(value))}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport type PaginationButtonProps = {\n label: string;\n onClick: () => void;\n disabled: boolean;\n isControl?: boolean;\n isActive?: boolean;\n controlDirection?: \"left\" | \"right\";\n};\n\nexport const PaginationButton = ({\n label,\n onClick,\n disabled,\n isControl = false,\n isActive = false,\n controlDirection = \"left\",\n}: PaginationButtonProps) => {\n return (\n <motion.button\n disabled={disabled}\n onClick={onClick}\n className={classNames(\n \"disabled:opacity-40 border border-border-light relative flex items-center transition-colors justify-center w-[36px] h-[36px] shadow-[inset_0px_0px_12px_rgba(173,185,210,0.15)] bg-background\",\n isActive && \"text-brand-primary\",\n !isActive &&\n \"enabled:hover:bg-shade-tertiary/5 enabled:hover:text-shade-secondary\"\n )}\n >\n {isActive && (\n <>\n <motion.div\n className=\"absolute inset-0 bg-current/5 before:!inset-[-1px] gradient-border before:bg-brand-primary/25 shadow-current/25 shadow-[inset_0px_0px_12px]\"\n initial={{ opacity: 0 }}\n animate={{ opacity: [0, 1, 0.2, 1, 0.4, 1, 0.6, 1, 0.8, 1] }}\n transition={{ duration: 0.5, ease: anticipate }}\n />\n <CrosshairCorners\n size={4}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-current\"\n animationDuration={0.85}\n animationDelay={0}\n />\n </>\n )}\n {isControl ? (\n <Icon\n name={controlDirection === \"left\" ? \"ChevronLeft\" : \"ChevronRight\"}\n size={14}\n />\n ) : (\n <span className=\"font-mono\">{label}</span>\n )}\n </motion.button>\n );\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blueshift-gg/ui-components",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -57,15 +57,6 @@
57
57
  "README.md",
58
58
  "LICENSE"
59
59
  ],
60
- "scripts": {
61
- "lint": "eslint . --max-warnings 0",
62
- "generate:component": "turbo gen react-component",
63
- "check-types": "tsc --noEmit",
64
- "build": "tsup",
65
- "prepublishOnly": "pnpm build",
66
- "publish:dry-run": "npm publish --dry-run",
67
- "publish:npm": "npm publish --access public"
68
- },
69
60
  "devDependencies": {
70
61
  "@types/node": "^22.15.3",
71
62
  "@types/react": "19.1.0",
@@ -84,5 +75,13 @@
84
75
  "sonner": "^2.0.7",
85
76
  "tailwindcss": "^4.1.4",
86
77
  "usehooks-ts": "^3.1.1"
78
+ },
79
+ "scripts": {
80
+ "lint": "eslint . --max-warnings 0",
81
+ "generate:component": "turbo gen react-component",
82
+ "check-types": "tsc --noEmit",
83
+ "build": "tsup",
84
+ "publish:dry-run": "npm publish --dry-run",
85
+ "publish:npm": "npm publish --access public"
87
86
  }
88
- }
87
+ }