automoby-kit 1.0.9 → 1.0.11
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.
- package/dist/cjs/Accordion.js +2 -1
- package/dist/cjs/Accordion.js.map +1 -0
- package/dist/cjs/Backdrop.js +2 -1
- package/dist/cjs/Backdrop.js.map +1 -0
- package/dist/cjs/Breadcrumb.js +2 -1
- package/dist/cjs/Breadcrumb.js.map +1 -0
- package/dist/cjs/Button.js +2 -1
- package/dist/cjs/Button.js.map +1 -0
- package/dist/cjs/Chips.js +2 -1
- package/dist/cjs/Chips.js.map +1 -0
- package/dist/cjs/Divider.js +2 -1
- package/dist/cjs/Divider.js.map +1 -0
- package/dist/cjs/Drawer.js +2 -1
- package/dist/cjs/Drawer.js.map +1 -0
- package/dist/cjs/Input.js +2 -1
- package/dist/cjs/Input.js.map +1 -0
- package/dist/cjs/Menu.js +2 -1
- package/dist/cjs/Menu.js.map +1 -0
- package/dist/cjs/Pagination.js +2 -1
- package/dist/cjs/Pagination.js.map +1 -0
- package/dist/cjs/ProtectedComponent.js +2 -1
- package/dist/cjs/ProtectedComponent.js.map +1 -0
- package/dist/cjs/RadioGroup.js +2 -1
- package/dist/cjs/RadioGroup.js.map +1 -0
- package/dist/cjs/Tabs.js +2 -1
- package/dist/cjs/Tabs.js.map +1 -0
- package/dist/cjs/Typography.js +1 -0
- package/dist/cjs/Typography.js.map +1 -0
- package/dist/cjs/chunks/chevron-left-Do__K6cA.js +1 -0
- package/dist/cjs/chunks/chevron-left-Do__K6cA.js.map +1 -0
- package/dist/cjs/chunks/createLucideIcon-BqJVOzoK.js +1 -0
- package/dist/cjs/chunks/createLucideIcon-BqJVOzoK.js.map +1 -0
- package/dist/cjs/contexts.js +2 -1
- package/dist/cjs/contexts.js.map +1 -0
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/licensing.js +1 -0
- package/dist/cjs/licensing.js.map +1 -0
- package/dist/cjs/utils.js +1 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/Accordion.js +2 -1
- package/dist/esm/Accordion.js.map +1 -0
- package/dist/esm/Backdrop.js +2 -1
- package/dist/esm/Backdrop.js.map +1 -0
- package/dist/esm/Breadcrumb.js +2 -1
- package/dist/esm/Breadcrumb.js.map +1 -0
- package/dist/esm/Button.js +2 -1
- package/dist/esm/Button.js.map +1 -0
- package/dist/esm/Chips.js +2 -1
- package/dist/esm/Chips.js.map +1 -0
- package/dist/esm/Divider.js +2 -1
- package/dist/esm/Divider.js.map +1 -0
- package/dist/esm/Drawer.js +2 -1
- package/dist/esm/Drawer.js.map +1 -0
- package/dist/esm/Input.js +2 -1
- package/dist/esm/Input.js.map +1 -0
- package/dist/esm/Menu.js +2 -1
- package/dist/esm/Menu.js.map +1 -0
- package/dist/esm/Pagination.js +2 -1
- package/dist/esm/Pagination.js.map +1 -0
- package/dist/esm/ProtectedComponent.js +2 -1
- package/dist/esm/ProtectedComponent.js.map +1 -0
- package/dist/esm/RadioGroup.js +2 -1
- package/dist/esm/RadioGroup.js.map +1 -0
- package/dist/esm/Tabs.js +2 -1
- package/dist/esm/Tabs.js.map +1 -0
- package/dist/esm/Typography.js +1 -0
- package/dist/esm/Typography.js.map +1 -0
- package/dist/esm/chunks/chevron-left-4HSuTes3.js +1 -0
- package/dist/esm/chunks/chevron-left-4HSuTes3.js.map +1 -0
- package/dist/esm/chunks/createLucideIcon-DGp0SoUT.js +1 -0
- package/dist/esm/chunks/createLucideIcon-DGp0SoUT.js.map +1 -0
- package/dist/esm/contexts.js +2 -1
- package/dist/esm/contexts.js.map +1 -0
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/licensing.js +1 -0
- package/dist/esm/licensing.js.map +1 -0
- package/dist/esm/utils.js +1 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/types/Accordion.js +2 -2
- package/dist/types/Backdrop.js +2 -2
- package/dist/types/Breadcrumb.js +6 -6
- package/dist/types/Button.js +2 -2
- package/dist/types/Chips.js +5 -5
- package/dist/types/Divider.js +2 -2
- package/dist/types/Drawer.js +2 -2
- package/dist/types/Input.js +2 -2
- package/dist/types/Menu.js +5 -5
- package/dist/types/Pagination.js +20 -20
- package/dist/types/ProtectedComponent.js +4 -4
- package/dist/types/RadioGroup.js +7 -7
- package/dist/types/Tabs.js +8 -8
- package/dist/types/contexts.js +2 -2
- package/dist/types/index.js +1 -1
- package/package.json +1 -2
- package/dist/cjs/chunks/jsx-runtime-Bgd4cJfV.js +0 -1
- package/dist/esm/chunks/jsx-runtime-DZXOD2H9.js +0 -1
- package/dist/types/jsx-runtime-BiC2V0nk.js +0 -430
package/dist/cjs/Accordion.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var e=require("
|
|
1
|
+
"use client";"use strict";var e=require("react/jsx-runtime"),r=require("react"),a=require("./utils.js"),i=require("./Typography.js"),s=require("./chunks/createLucideIcon-BqJVOzoK.js");const t=s.createLucideIcon("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),n=s.createLucideIcon("chevron-up",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]),d=r.forwardRef(({title:s,body:d,startIcon:o,isExpanded:l,onToggle:c,defaultExpanded:u=!1,className:h,id:m,disabled:x=!1,isMobile:p,...f},y)=>{const[b,v]=r.useState(u),j=void 0!==l?l:b,g=m||`accordion-${Math.random().toString(36).substr(2,9)}`,N=`${g}-header`,k=`${g}-content`,w=p?20:24,q=p?"body-s-heavy":"body-l-heavy",I=p?"body-s-medium":"body-m-medium";return e.jsxs("div",{ref:y,className:a("rounded-2xl border-0 overflow-hidden","transition-all duration-200 ease-in-out",h),...f,children:[e.jsxs("button",{id:N,type:"button",onClick:()=>{if(x)return;const e=!j;void 0===l&&v(e),c?.(e)},disabled:x,"aria-expanded":j,"aria-controls":k,className:a("w-full flex items-center justify-between",p?"p-3":"p-4","focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2","disabled:opacity-50 disabled:cursor-not-allowed","transition-all duration-200 ease-in-out",!x&&"hover:bg-neutral-lighter"),children:[e.jsx("div",{className:"flex-shrink-0 mr-4",children:j?e.jsx(n,{size:w,className:"text-neutral-darker transition-transform duration-200","aria-hidden":"true"}):e.jsx(t,{size:w,className:"text-neutral-darker transition-transform duration-200","aria-hidden":"true"})}),e.jsxs("div",{className:a("flex items-center flex-1",p?"gap-3":"gap-4"),children:[e.jsx("div",{className:"flex-1 text-right",children:e.jsx(i.Typography,{variant:q,color:"neutral-darker",children:s})}),o&&e.jsx("div",{className:a("flex-shrink-0 flex items-center justify-center",p?"w-6 h-6":"w-8 h-8"),children:o})]})]}),e.jsx("div",{id:k,role:"region","aria-labelledby":N,className:a("w-full overflow-hidden transition-all duration-300 ease-in-out",j?"max-h-screen opacity-100":"max-h-0 opacity-0"),children:e.jsx("div",{className:a(p?"pb-3 mt-1":"pb-4 mt-1.5"),children:e.jsx("div",{className:a("bg-neutral-lighter rounded-lg",p?"p-3":"p-4"),children:e.jsx(i.Typography,{variant:I,color:"neutral-dark",children:d})})})})]})});d.displayName="Accordion",exports.Accordion=d;
|
|
2
|
+
//# sourceMappingURL=Accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../../node_modules/lucide-react/dist/esm/icons/chevron-up.js","../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.522.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.522.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m18 15-6-6-6 6\", key: \"153udz\" }]];\nconst ChevronUp = createLucideIcon(\"chevron-up\", __iconNode);\n\nexport { __iconNode, ChevronUp as default };\n//# sourceMappingURL=chevron-up.js.map\n","import React, { useState } from 'react';\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport cn from '@/utils/cn';\nimport { Typography } from '../Typography/Typography';\n\nexport interface AccordionProps {\n /** The header text content */\n title: string;\n /** The body text content */\n body: string;\n /** Icon to display at the start of the header */\n startIcon?: React.ReactNode;\n /** Whether the accordion is expanded (controlled) */\n isExpanded?: boolean;\n /** Callback when the accordion state changes */\n onToggle?: (isExpanded: boolean) => void;\n /** Default expanded state (uncontrolled) */\n defaultExpanded?: boolean;\n /** Additional CSS classes for the root element */\n className?: string;\n /** Unique identifier for the accordion */\n id?: string;\n /** Whether the accordion is disabled */\n disabled?: boolean;\n /** Whether the component is in mobile mode */\n isMobile: boolean;\n}\n\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n (\n {\n title,\n body,\n startIcon,\n isExpanded: controlledExpanded,\n onToggle,\n defaultExpanded = false,\n className,\n id,\n disabled = false,\n isMobile,\n ...props\n },\n ref,\n ) => {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n\n // Use controlled state if provided, otherwise use internal state\n const isExpanded =\n controlledExpanded !== undefined ? controlledExpanded : internalExpanded;\n\n const handleToggle = () => {\n if (disabled) return;\n\n const newExpanded = !isExpanded;\n\n if (controlledExpanded === undefined) {\n setInternalExpanded(newExpanded);\n }\n\n onToggle?.(newExpanded);\n };\n\n const accordionId =\n id || `accordion-${Math.random().toString(36).substr(2, 9)}`;\n const headerId = `${accordionId}-header`;\n const contentId = `${accordionId}-content`;\n\n // Icon size based on device\n const iconSize = isMobile ? 20 : 24;\n\n // Typography variants based on device\n const titleVariant = isMobile ? 'body-s-heavy' : 'body-l-heavy';\n const bodyVariant = isMobile ? 'body-s-medium' : 'body-m-medium';\n\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-2xl border-0 overflow-hidden',\n 'transition-all duration-200 ease-in-out',\n className,\n )}\n {...props}\n >\n {/* Header */}\n <button\n id={headerId}\n type=\"button\"\n onClick={handleToggle}\n disabled={disabled}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n className={cn(\n 'w-full flex items-center justify-between',\n isMobile ? 'p-3' : 'p-4',\n 'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'transition-all duration-200 ease-in-out',\n !disabled && 'hover:bg-neutral-lighter',\n )}\n >\n {/* Left side: Chevron icon */}\n <div className=\"flex-shrink-0 mr-4\">\n {isExpanded ? (\n <ChevronUp\n size={iconSize}\n className=\"text-neutral-darker transition-transform duration-200\"\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronDown\n size={iconSize}\n className=\"text-neutral-darker transition-transform duration-200\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {/* Right side: Start icon and title */}\n <div\n className={cn(\n 'flex items-center flex-1',\n isMobile ? 'gap-3' : 'gap-4',\n )}\n >\n <div className=\"flex-1 text-right\">\n <Typography variant={titleVariant} color=\"neutral-darker\">\n {title}\n </Typography>\n </div>\n {startIcon && (\n <div\n className={cn(\n 'flex-shrink-0 flex items-center justify-center',\n isMobile ? 'w-6 h-6' : 'w-8 h-8',\n )}\n >\n {startIcon}\n </div>\n )}\n </div>\n </button>\n\n {/* Content */}\n <div\n id={contentId}\n role=\"region\"\n aria-labelledby={headerId}\n className={cn(\n 'w-full overflow-hidden transition-all duration-300 ease-in-out',\n isExpanded ? 'max-h-screen opacity-100' : 'max-h-0 opacity-0',\n )}\n >\n <div className={cn(isMobile ? 'pb-3 mt-1' : 'pb-4 mt-1.5')}>\n <div\n className={cn(\n 'bg-neutral-lighter rounded-lg',\n isMobile ? 'p-3' : 'p-4',\n )}\n >\n <Typography variant={bodyVariant} color=\"neutral-dark\">\n {body}\n </Typography>\n </div>\n </div>\n </div>\n </div>\n );\n },\n);\n\nAccordion.displayName = 'Accordion';\n\nexport { Accordion };\n"],"names":["ChevronDown","createLucideIcon","d","key","ChevronUp","Accordion","React","forwardRef","title","body","startIcon","isExpanded","controlledExpanded","onToggle","defaultExpanded","className","id","disabled","isMobile","props","ref","internalExpanded","setInternalExpanded","useState","undefined","accordionId","Math","random","toString","substr","headerId","contentId","iconSize","titleVariant","bodyVariant","_jsxs","cn","children","type","onClick","newExpanded","_jsx","size","Typography","variant","color","role","displayName"],"mappings":"wLASA,MACMA,EAAcC,EAAAA,iBAAiB,eADlB,CAAC,CAAC,OAAQ,CAAEC,EAAG,eAAgBC,IAAK,aCCjDC,EAAYH,EAAAA,iBAAiB,aADhB,CAAC,CAAC,OAAQ,CAAEC,EAAG,iBAAkBC,IAAK,aCmBnDE,EAAYC,EAAMC,WACtB,EAEIC,QACAC,OACAC,YACAC,WAAYC,EACZC,WACAC,mBAAkB,EAClBC,YACAC,KACAC,YAAW,EACXC,cACGC,GAELC,KAEA,MAAOC,EAAkBC,GAAuBC,EAAAA,SAAST,GAGnDH,OACmBa,IAAvBZ,EAAmCA,EAAqBS,EAcpDI,EACJT,GAAM,aAAaU,KAAKC,SAASC,SAAS,IAAIC,OAAO,EAAG,KACpDC,EAAW,GAAGL,WACdM,EAAY,GAAGN,YAGfO,EAAWd,EAAW,GAAK,GAG3Be,EAAef,EAAW,eAAiB,eAC3CgB,EAAchB,EAAW,gBAAkB,gBAEjD,OACEiB,EAAAA,KAAA,MAAA,CACEf,IAAKA,EACLL,UAAWqB,EACT,uCACA,0CACArB,MAEEI,EAAKkB,SAAA,CAGTF,EAAAA,KAAA,SAAA,CACEnB,GAAIc,EACJQ,KAAK,SACLC,QAtCe,KACnB,GAAItB,EAAU,OAEd,MAAMuB,GAAe7B,OAEMa,IAAvBZ,GACFU,EAAoBkB,GAGtB3B,IAAW2B,IA8BPvB,SAAUA,EAAQ,gBACHN,EAAU,gBACVoB,EACfhB,UAAWqB,EACT,2CACAlB,EAAW,MAAQ,MACnB,yEACA,kDACA,2CACCD,GAAY,4BACdoB,SAAA,CAGDI,EAAAA,IAAA,MAAA,CAAK1B,UAAU,qBAAoBsB,SAChC1B,EACC8B,EAAAA,IAACrC,EAAS,CACRsC,KAAMV,EACNjB,UAAU,wDAAuD,cACrD,SAGd0B,MAACzC,EAAW,CACV0C,KAAMV,EACNjB,UAAU,wDAAuD,cACrD,WAMlBoB,EAAAA,KAAA,MAAA,CACEpB,UAAWqB,EACT,2BACAlB,EAAW,QAAU,SACtBmB,SAAA,CAEDI,EAAAA,IAAA,MAAA,CAAK1B,UAAU,oBAAmBsB,SAChCI,EAAAA,IAACE,aAAU,CAACC,QAASX,EAAcY,MAAM,iBAAgBR,SACtD7B,MAGJE,GACC+B,EAAAA,IAAA,MAAA,CACE1B,UAAWqB,EACT,iDACAlB,EAAW,UAAY,WACxBmB,SAEA3B,UAOT+B,EAAAA,IAAA,MAAA,CACEzB,GAAIe,EACJe,KAAK,SAAQ,kBACIhB,EACjBf,UAAWqB,EACT,iEACAzB,EAAa,2BAA6B,qBAC3C0B,SAEDI,EAAAA,IAAA,MAAA,CAAK1B,UAAWqB,EAAGlB,EAAW,YAAc,eAAcmB,SACxDI,EAAAA,IAAA,MAAA,CACE1B,UAAWqB,EACT,gCACAlB,EAAW,MAAQ,OACpBmB,SAEDI,EAAAA,IAACE,EAAAA,WAAU,CAACC,QAASV,EAAaW,MAAM,eAAcR,SACnD5B,eAUjBJ,EAAU0C,YAAc","x_google_ignoreList":[0,1]}
|
package/dist/cjs/Backdrop.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),r=require("react"),t=require("./utils.js");const a=r.forwardRef(({isOpen:r=!1,onClick:a,blur:n=!1,zIndex:i=51,className:o,children:s,...c},d)=>{const l=t("fixed inset-0 transition-all duration-300",{"opacity-100 pointer-events-auto":r,"opacity-0 pointer-events-none":!r,"backdrop-blur-sm":n},o),u={backgroundColor:"rgba(0, 0, 0, 0.60)",zIndex:i};return e.jsx("div",{ref:d,className:l,style:u,onClick:e=>{a&&e.target===e.currentTarget&&a()},role:"presentation","aria-hidden":!r,...c,children:s})});a.displayName="Backdrop",exports.Backdrop=a;
|
|
2
|
+
//# sourceMappingURL=Backdrop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Backdrop.js","sources":["../../src/components/Backdrop/Backdrop.tsx"],"sourcesContent":["import React from 'react';\nimport cn from '@/utils/cn';\n\nexport interface BackdropProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Whether the backdrop is visible\n */\n isOpen?: boolean;\n /**\n * Callback function when backdrop is clicked\n */\n onClick?: () => void;\n /**\n * Whether to show a blur effect\n */\n blur?: boolean;\n /**\n * Custom z-index (defaults to z-51 which is drawer z-index + 1)\n */\n zIndex?: number;\n}\n\nexport const Backdrop = React.forwardRef<HTMLDivElement, BackdropProps>(\n (\n {\n isOpen = false,\n onClick,\n blur = false,\n zIndex = 51,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (onClick && event.target === event.currentTarget) {\n onClick();\n }\n };\n\n const backdropClasses = cn(\n 'fixed inset-0 transition-all duration-300',\n {\n 'opacity-100 pointer-events-auto': isOpen,\n 'opacity-0 pointer-events-none': !isOpen,\n 'backdrop-blur-sm': blur,\n },\n className,\n );\n\n const backdropStyle: React.CSSProperties = {\n backgroundColor: 'rgba(0, 0, 0, 0.60)',\n zIndex,\n };\n\n return (\n <div\n ref={ref}\n className={backdropClasses}\n style={backdropStyle}\n onClick={handleClick}\n role=\"presentation\"\n aria-hidden={!isOpen}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nBackdrop.displayName = 'Backdrop';\n"],"names":["Backdrop","React","forwardRef","isOpen","onClick","blur","zIndex","className","children","props","ref","backdropClasses","cn","backdropStyle","backgroundColor","_jsx","style","event","target","currentTarget","role","displayName"],"mappings":"2FAsBO,MAAMA,EAAWC,EAAMC,WAC5B,EAEIC,UAAS,EACTC,UACAC,QAAO,EACPC,SAAS,GACTC,YACAC,cACGC,GAELC,KAEA,MAMMC,EAAkBC,EACtB,4CACA,CACE,kCAAmCT,EACnC,iCAAkCA,EAClC,mBAAoBE,GAEtBE,GAGIM,EAAqC,CACzCC,gBAAiB,sBACjBR,UAGF,OACES,EAAAA,IAAA,MAAA,CACEL,IAAKA,EACLH,UAAWI,EACXK,MAAOH,EACPT,QA1BiBa,IACfb,GAAWa,EAAMC,SAAWD,EAAME,eACpCf,KAyBAgB,KAAK,eAAc,eACLjB,KACVM,EAAKD,SAERA,MAMTR,EAASqB,YAAc"}
|
package/dist/cjs/Breadcrumb.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),r=require("react"),a=require("./utils.js"),t=require("./chunks/chevron-left-Do__K6cA.js");require("./chunks/createLucideIcon-BqJVOzoK.js");const n=r.forwardRef(({items:r,className:n,isMobile:l},s)=>e.jsx("nav",{ref:s,className:a("flex flex-row-reverse items-center",l?"gap-1 px-4 py-2.5":"gap-3 pr-1 pt-3 pb-4 pl-0",n),"aria-label":"Breadcrumb navigation",children:e.jsx("ol",{className:"flex flex-row-reverse items-center gap-inherit",children:r.map((n,s)=>{const i=s===r.length-1,c=!i&&(n.href||n.onClick),o=`${n.label}-${s}`;return e.jsxs("li",{className:"flex items-center gap-inherit",children:[c?e.jsx("a",{href:n.href||"#",className:a("whitespace-nowrap border-0 bg-transparent p-0 no-underline",l?"text-t":"text-s","text-neutral-main","cursor-pointer hover:text-neutral-dark transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1 rounded-sm"),onClick:e=>((e,a,t)=>{a!==r.length-1&&e.onClick&&(t.preventDefault(),e.onClick())})(n,s,e),onKeyDown:e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),n.onClick&&n.onClick())},"aria-label":`Go to ${n.label}`,children:n.label}):e.jsx("span",{className:a("whitespace-nowrap",l?"text-t":"text-s","text-neutral-main","font-medium"),"aria-current":i?"page":void 0,"aria-label":i?`Current page: ${n.label}`:void 0,children:n.label}),!i&&e.jsx(t.ChevronLeft,{className:a("text-black flex-shrink-0",l?"w-2.5 h-2.5":"w-3 h-3"),"aria-hidden":"true"})]},o)})})}));n.displayName="Breadcrumb",exports.Breadcrumb=n;
|
|
2
|
+
//# sourceMappingURL=Breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumb.js","sources":["../../src/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import React from 'react';\nimport { ChevronLeft } from 'lucide-react';\nimport cn from '@/utils/cn';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n className?: string;\n /**\n * Whether the component is in mobile mode\n */\n isMobile: boolean;\n}\n\nconst Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n ({ items, className, isMobile }, ref) => {\n const handleItemClick = (\n item: BreadcrumbItem,\n index: number,\n e: React.MouseEvent,\n ) => {\n // Don't make the last item (current page) clickable\n if (index === items.length - 1) return;\n\n if (item.onClick) {\n e.preventDefault();\n item.onClick();\n }\n // If item has href, let the anchor tag handle navigation naturally\n };\n\n return (\n <nav\n ref={ref}\n className={cn(\n // Base layout - RTL with flex-row-reverse to show items right to left\n 'flex flex-row-reverse items-center',\n // Responsive gap and padding based on mobile state\n isMobile ? 'gap-1 px-4 py-2.5' : 'gap-3 pr-1 pt-3 pb-4 pl-0',\n className,\n )}\n aria-label=\"Breadcrumb navigation\"\n >\n <ol className=\"flex flex-row-reverse items-center gap-inherit\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const isClickable = !isLast && (item.href || item.onClick);\n const itemKey = `${item.label}-${index}`;\n\n return (\n <li key={itemKey} className=\"flex items-center gap-inherit\">\n {/* Breadcrumb item */}\n {isClickable ? (\n <a\n href={item.href || '#'}\n className={cn(\n // Base styles\n 'whitespace-nowrap border-0 bg-transparent p-0 no-underline',\n // Responsive font size based on mobile state\n isMobile ? 'text-t' : 'text-s',\n // Color\n 'text-neutral-main',\n // Cursor and hover effects for clickable items\n 'cursor-pointer hover:text-neutral-dark transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1 rounded-sm',\n )}\n onClick={(e) => handleItemClick(item, index, e)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (item.onClick) {\n item.onClick();\n }\n }\n }}\n aria-label={`Go to ${item.label}`}\n >\n {item.label}\n </a>\n ) : (\n <span\n className={cn(\n // Base styles\n 'whitespace-nowrap',\n // Responsive font size based on mobile state\n isMobile ? 'text-t' : 'text-s',\n // Color\n 'text-neutral-main',\n // Different styles for current page (last item)\n 'font-medium',\n )}\n aria-current={isLast ? 'page' : undefined}\n aria-label={\n isLast ? `Current page: ${item.label}` : undefined\n }\n >\n {item.label}\n </span>\n )}\n\n {/* Separator - only show if not the last item */}\n {!isLast && (\n <ChevronLeft\n className={cn(\n 'text-black flex-shrink-0',\n // Responsive icon size\n isMobile ? 'w-2.5 h-2.5' : 'w-3 h-3',\n )}\n aria-hidden=\"true\"\n />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n },\n);\n\nBreadcrumb.displayName = 'Breadcrumb';\n\nexport { Breadcrumb };\n"],"names":["Breadcrumb","React","forwardRef","items","className","isMobile","ref","_jsx","cn","children","map","item","index","isLast","length","isClickable","href","onClick","itemKey","label","_jsxs","e","preventDefault","handleItemClick","onKeyDown","key","undefined","ChevronLeft","displayName"],"mappings":"2LAmBA,MAAMA,EAAaC,EAAMC,WACvB,EAAGC,QAAOC,YAAWC,YAAYC,IAiB7BC,EAAAA,WACED,IAAKA,EACLF,UAAWI,EAET,qCAEAH,EAAW,oBAAsB,4BACjCD,GACD,aACU,wBAAuBK,SAElCF,EAAAA,IAAA,KAAA,CAAIH,UAAU,iDAAgDK,SAC3DN,EAAMO,IAAI,CAACC,EAAMC,KAChB,MAAMC,EAASD,IAAUT,EAAMW,OAAS,EAClCC,GAAeF,IAAWF,EAAKK,MAAQL,EAAKM,SAC5CC,EAAU,GAAGP,EAAKQ,SAASP,IAEjC,OACEQ,EAAAA,WAAkBhB,UAAU,gCAA+BK,SAAA,CAExDM,EACCR,EAAAA,SACES,KAAML,EAAKK,MAAQ,IACnBZ,UAAWI,EAET,6DAEAH,EAAW,SAAW,SAEtB,oBAEA,+IAEFY,QAAUI,GAjDF,EACtBV,EACAC,EACAS,KAGIT,IAAUT,EAAMW,OAAS,GAEzBH,EAAKM,UACPI,EAAEC,iBACFX,EAAKM,YAuCuBM,CAAgBZ,EAAMC,EAAOS,GAC7CG,UAAYH,IACI,UAAVA,EAAEI,KAA6B,MAAVJ,EAAEI,MACzBJ,EAAEC,iBACEX,EAAKM,SACPN,EAAKM,yBAIC,SAASN,EAAKQ,iBAEzBR,EAAKQ,QAGRZ,EAAAA,IAAA,OAAA,CACEH,UAAWI,EAET,oBAEAH,EAAW,SAAW,SAEtB,oBAEA,eACD,eACaQ,EAAS,YAASa,EAAS,aAEvCb,EAAS,iBAAiBF,EAAKQ,aAAUO,EAASjB,SAGnDE,EAAKQ,SAKRN,GACAN,EAAAA,IAACoB,EAAAA,YAAW,CACVvB,UAAWI,EACT,2BAEAH,EAAW,cAAgB,WAC5B,cACW,WAzDTa,UAqEvBlB,EAAW4B,YAAc"}
|
package/dist/cjs/Button.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var r=require("
|
|
1
|
+
"use strict";var r=require("react/jsx-runtime"),e=require("react"),a=require("./utils.js"),t=require("./Typography.js");const l={sm:"px-[16px] py-[7px]",md:"px-[16px] py-[9px]",lg:"px-[16px] py-[13px]",xl:"px-[20px] py-[13px]"},o={sm:"body-s-bold",md:"body-m-bold",lg:"body-l-bold",xl:"body-xl-heavy"},i={primary:"\n bg-[var(--color-primary)] text-white\n hover:bg-[var(--color-primary-dark)]\n disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]\n ",secondary:"\n bg-[var(--color-primary-lightest)] text-[var(--color-primary)]\n hover:bg-[var(--color-primary-lighter)]\n disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]\n ",tertiary:"\n bg-white border border-[var(--color-primary-light)] text-[var(--color-primary)]\n hover:bg-[var(--color-neutral-lighter)]\n disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]\n ",ghost:"\n bg-transparent text-[var(--color-primary)]\n hover:bg-[var(--color-primary-lightest)]\n disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]\n "},n=e.forwardRef(({className:e,variant:n="primary",size:s="md",icon:d,iconPosition:c="right",children:p,loading:b=!1,disabled:x,textVariant:g,...y},m)=>{const v=g||o[s];return r.jsxs("button",{ref:m,type:"button",className:a("inline-flex items-center justify-center rounded-[8px] transition-colors duration-200",l[s],i[n],t.getTypographyClasses(v),x&&"opacity-50 pointer-events-none",e),disabled:x||b,...y,children:[d&&"left"===c&&r.jsx("span",{className:"mr-2 flex items-center",children:d}),b?"...":p,d&&"right"===c&&r.jsx("span",{className:"ml-2 flex items-center",children:d})]})});n.displayName="Button",exports.Button=n;
|
|
2
|
+
//# sourceMappingURL=Button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.js","sources":["../../src/components/Button/Button.tsx"],"sourcesContent":["import React from 'react';\nimport cn from '@/utils/cn';\nimport {\n TypographyVariant,\n getTypographyClasses,\n} from '../Typography/Typography';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'ghost';\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n textVariant?: TypographyVariant;\n icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n loading?: boolean;\n}\n\nconst sizeClasses: Record<ButtonSize, string> = {\n sm: 'px-[16px] py-[7px]',\n md: 'px-[16px] py-[9px]',\n lg: 'px-[16px] py-[13px]',\n xl: 'px-[20px] py-[13px]',\n};\n\nconst defaultTextVariants: Record<ButtonSize, TypographyVariant> = {\n sm: 'body-s-bold', // 14px / Bold (600)\n md: 'body-m-bold', // 16px / Bold (600)\n lg: 'body-l-bold', // 18px / Bold (600)\n xl: 'body-xl-heavy', // 20px / Heavy (700)\n};\n\nconst variantClasses: Record<ButtonVariant, string> = {\n primary: `\n bg-[var(--color-primary)] text-white\n hover:bg-[var(--color-primary-dark)]\n disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]\n `,\n secondary: `\n bg-[var(--color-primary-lightest)] text-[var(--color-primary)]\n hover:bg-[var(--color-primary-lighter)]\n disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]\n `,\n tertiary: `\n bg-white border border-[var(--color-primary-light)] text-[var(--color-primary)]\n hover:bg-[var(--color-neutral-lighter)]\n disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]\n `,\n ghost: `\n bg-transparent text-[var(--color-primary)]\n hover:bg-[var(--color-primary-lightest)]\n disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]\n `,\n};\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'primary',\n size = 'md',\n icon,\n iconPosition = 'right',\n children,\n loading = false,\n disabled,\n textVariant,\n ...props\n },\n ref,\n ) => {\n const finalTextVariant = textVariant || defaultTextVariants[size];\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'inline-flex items-center justify-center rounded-[8px] transition-colors duration-200',\n sizeClasses[size],\n variantClasses[variant],\n getTypographyClasses(finalTextVariant),\n disabled && 'opacity-50 pointer-events-none',\n className,\n )}\n disabled={disabled || loading}\n {...props}\n >\n {icon && iconPosition === 'left' && (\n <span className=\"mr-2 flex items-center\">{icon}</span>\n )}\n {loading ? '...' : children}\n {icon && iconPosition === 'right' && (\n <span className=\"ml-2 flex items-center\">{icon}</span>\n )}\n </button>\n );\n },\n);\n\nButton.displayName = 'Button';\n"],"names":["sizeClasses","sm","md","lg","xl","defaultTextVariants","variantClasses","primary","secondary","tertiary","ghost","Button","React","forwardRef","className","variant","size","icon","iconPosition","children","loading","disabled","textVariant","props","ref","finalTextVariant","_jsxs","type","cn","getTypographyClasses","_jsx","displayName"],"mappings":"wHAoBA,MAAMA,EAA0C,CAC9CC,GAAI,qBACJC,GAAI,qBACJC,GAAI,sBACJC,GAAI,uBAGAC,EAA6D,CACjEJ,GAAI,cACJC,GAAI,cACJC,GAAI,cACJC,GAAI,iBAGAE,EAAgD,CACpDC,QAAS,qLAKTC,UAAW,kNAKXC,SAAU,mOAKVC,MAAO,gMAOIC,EAASC,EAAMC,WAC1B,EAEIC,YACAC,UAAU,UACVC,OAAO,KACPC,OACAC,eAAe,QACfC,WACAC,WAAU,EACVC,WACAC,iBACGC,GAELC,KAEA,MAAMC,EAAmBH,GAAejB,EAAoBW,GAE5D,OACEU,OAAA,SAAA,CACEF,IAAKA,EACLG,KAAK,SACLb,UAAWc,EACT,uFACA5B,EAAYgB,GACZV,EAAeS,GACfc,EAAAA,qBAAqBJ,GACrBJ,GAAY,iCACZP,GAEFO,SAAUA,GAAYD,KAClBG,EAAKJ,SAAA,CAERF,GAAyB,SAAjBC,GACPY,EAAAA,IAAA,OAAA,CAAMhB,UAAU,yBAAwBK,SAAEF,IAE3CG,EAAU,MAAQD,EAClBF,GAAyB,UAAjBC,GACPY,EAAAA,YAAMhB,UAAU,yBAAwBK,SAAEF,SAOpDN,EAAOoB,YAAc"}
|
package/dist/cjs/Chips.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),r=require("react"),o=require("./utils.js");const t=require("./chunks/createLucideIcon-BqJVOzoK.js").createLucideIcon("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),i={purple:{background:"bg-[var(--color-primary-lightest)]",text:"text-[var(--color-primary-darkest)]",border:"border-[var(--color-primary-light)]"},red:{background:"bg-[var(--color-error-light)]",text:"text-[var(--color-error)]",border:"border-[#f0d6d6]"},green:{background:"bg-[var(--color-success-light)]",text:"text-[var(--color-success)]",border:"border-[#d4e8dc]"},orange:{background:"bg-[var(--color-warning-light)]",text:"text-[var(--color-warning)]",border:"border-[#f5e1d1]"},blue:{background:"bg-[var(--color-info-light)]",text:"text-[var(--color-info)]",border:"border-[#d3e9f2]"},white:{background:"bg-[var(--color-white)]",text:"text-[var(--color-neutral-darker)]",border:"border-[var(--color-neutral-light)]"},disabled:{background:"bg-[var(--color-neutral-lighter)]",text:"text-[var(--color-neutral-main)]",border:"border-[var(--color-neutral-light)]"}},a={mobile:{padding:"px-2.5 py-1",gap:"gap-1",iconSize:"size-4",fontSize:"text-[12px]",lineHeight:"leading-[1.8]"},desktop:{padding:"px-3 py-1",gap:"gap-1.5",iconSize:"size-5",fontSize:"text-[14px]",lineHeight:"leading-[24px]"}},n=r.forwardRef(({variant:r="purple",size:n,children:l="متن پیشفرض",disabled:d=!1,onClick:c,onIconClick:s,className:b,isMobile:p,...u},g)=>{const x=i[d?"disabled":r],v=a[n||(p?"mobile":"desktop")],handleIconClick=e=>{e.stopPropagation(),s&&s()};return e.jsxs("div",{ref:g,className:o("relative rounded-[50px] border border-solid inline-flex","flex-row items-center justify-center","font-sans font-bold not-italic","text-nowrap text-right","transition-all duration-200",x.background,x.text,x.border,v.padding,v.gap,v.fontSize,v.lineHeight,c&&!d&&"cursor-pointer hover:opacity-80",d&&"cursor-not-allowed opacity-60",b),onClick:d?void 0:c,onKeyDown:c&&!d?e=>{"Enter"!==e.key&&" "!==e.key||!c||d||(e.preventDefault(),c())}:void 0,tabIndex:c&&!d?0:void 0,role:c?"button":void 0,...u,children:[e.jsx("span",{className:"text-center",children:l}),(()=>{const r=e.jsx(t,{className:o(v.iconSize)});return s?e.jsx("button",{type:"button",onClick:handleIconClick,disabled:d,className:o("flex items-center justify-center","hover:opacity-70 transition-opacity",d&&"cursor-not-allowed opacity-50"),"aria-label":"حذف",children:r}):r})()]})});n.displayName="Chips",exports.Chips=n,exports.default=n;
|
|
2
|
+
//# sourceMappingURL=Chips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chips.js","sources":["../../node_modules/lucide-react/dist/esm/icons/x.js","../../src/components/Chips/Chips.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.522.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.js.map\n","import React from 'react';\nimport { X } from 'lucide-react';\nimport cn from '@/utils/cn';\n\nexport interface ChipsProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * The variant/color of the chip\n */\n variant?:\n | 'purple'\n | 'red'\n | 'green'\n | 'orange'\n | 'blue'\n | 'white'\n | 'disabled';\n /**\n * Size of the chip - affects padding and font size. If not provided, automatically detected from MobileContext\n */\n size?: 'mobile' | 'desktop';\n /**\n * Text content of the chip\n */\n children?: React.ReactNode;\n /**\n * Whether the chip is disabled\n */\n disabled?: boolean;\n /**\n * Click handler for the chip\n */\n onClick?: () => void;\n /**\n * Click handler for the X icon/close button\n */\n onIconClick?: () => void;\n /**\n * Custom class name\n */\n className?: string;\n /**\n * Whether the component is in mobile mode\n */\n isMobile: boolean;\n}\n\nconst chipVariants = {\n purple: {\n background: 'bg-[var(--color-primary-lightest)]',\n text: 'text-[var(--color-primary-darkest)]',\n border: 'border-[var(--color-primary-light)]',\n },\n red: {\n background: 'bg-[var(--color-error-light)]',\n text: 'text-[var(--color-error)]',\n border: 'border-[#f0d6d6]',\n },\n green: {\n background: 'bg-[var(--color-success-light)]',\n text: 'text-[var(--color-success)]',\n border: 'border-[#d4e8dc]',\n },\n orange: {\n background: 'bg-[var(--color-warning-light)]',\n text: 'text-[var(--color-warning)]',\n border: 'border-[#f5e1d1]',\n },\n blue: {\n background: 'bg-[var(--color-info-light)]',\n text: 'text-[var(--color-info)]',\n border: 'border-[#d3e9f2]',\n },\n white: {\n background: 'bg-[var(--color-white)]',\n text: 'text-[var(--color-neutral-darker)]',\n border: 'border-[var(--color-neutral-light)]',\n },\n disabled: {\n background: 'bg-[var(--color-neutral-lighter)]',\n text: 'text-[var(--color-neutral-main)]',\n border: 'border-[var(--color-neutral-light)]',\n },\n};\n\nconst chipSizes = {\n mobile: {\n padding: 'px-2.5 py-1',\n gap: 'gap-1',\n iconSize: 'size-4',\n fontSize: 'text-[12px]',\n lineHeight: 'leading-[1.8]',\n },\n desktop: {\n padding: 'px-3 py-1',\n gap: 'gap-1.5',\n iconSize: 'size-5',\n fontSize: 'text-[14px]',\n lineHeight: 'leading-[24px]',\n },\n};\n\nexport const Chips = React.forwardRef<HTMLDivElement, ChipsProps>(\n (\n {\n variant = 'purple',\n size,\n children = 'متن پیشفرض',\n disabled = false,\n onClick,\n onIconClick,\n className,\n isMobile,\n ...props\n },\n ref,\n ) => {\n const actualSize = size || (isMobile ? 'mobile' : 'desktop');\n\n const actualVariant = disabled ? 'disabled' : variant;\n const variantStyles = chipVariants[actualVariant];\n const sizeStyles = chipSizes[actualSize];\n\n const handleIconClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (onIconClick) {\n onIconClick();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && onClick && !disabled) {\n e.preventDefault();\n onClick();\n }\n };\n\n const renderIcon = () => {\n const iconElement = <X className={cn(sizeStyles.iconSize)} />;\n\n if (onIconClick) {\n return (\n <button\n type=\"button\"\n onClick={handleIconClick}\n disabled={disabled}\n className={cn(\n 'flex items-center justify-center',\n 'hover:opacity-70 transition-opacity',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n aria-label=\"حذف\"\n >\n {iconElement}\n </button>\n );\n }\n\n return iconElement;\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n // Base styles\n 'relative rounded-[50px] border border-solid inline-flex',\n 'flex-row items-center justify-center',\n 'font-sans font-bold not-italic',\n 'text-nowrap text-right',\n 'transition-all duration-200',\n\n // Variant styles\n variantStyles.background,\n variantStyles.text,\n variantStyles.border,\n\n // Size styles\n sizeStyles.padding,\n sizeStyles.gap,\n sizeStyles.fontSize,\n sizeStyles.lineHeight,\n\n // Interactive styles\n onClick && !disabled && 'cursor-pointer hover:opacity-80',\n disabled && 'cursor-not-allowed opacity-60',\n\n className,\n )}\n onClick={disabled ? undefined : onClick}\n onKeyDown={onClick && !disabled ? handleKeyDown : undefined}\n tabIndex={onClick && !disabled ? 0 : undefined}\n role={onClick ? 'button' : undefined}\n {...props}\n >\n <span className=\"text-center\">{children}</span>\n {renderIcon()}\n </div>\n );\n },\n);\n\nChips.displayName = 'Chips';\n\nexport default Chips;\n"],"names":["X","createLucideIcon","d","key","chipVariants","purple","background","text","border","red","green","orange","blue","white","disabled","chipSizes","mobile","padding","gap","iconSize","fontSize","lineHeight","desktop","Chips","React","forwardRef","variant","size","children","onClick","onIconClick","className","isMobile","props","ref","variantStyles","sizeStyles","handleIconClick","e","stopPropagation","_jsxs","cn","undefined","onKeyDown","preventDefault","tabIndex","role","_jsx","iconElement","type","renderIcon","displayName"],"mappings":"kJASA,MAIMA,mDAAIC,iBAAiB,IAJR,CACjB,CAAC,OAAQ,CAAEC,EAAG,aAAcC,IAAK,WACjC,CAAC,OAAQ,CAAED,EAAG,aAAcC,IAAK,aCmC7BC,EAAe,CACnBC,OAAQ,CACNC,WAAY,qCACZC,KAAM,sCACNC,OAAQ,uCAEVC,IAAK,CACHH,WAAY,gCACZC,KAAM,4BACNC,OAAQ,oBAEVE,MAAO,CACLJ,WAAY,kCACZC,KAAM,8BACNC,OAAQ,oBAEVG,OAAQ,CACNL,WAAY,kCACZC,KAAM,8BACNC,OAAQ,oBAEVI,KAAM,CACJN,WAAY,+BACZC,KAAM,2BACNC,OAAQ,oBAEVK,MAAO,CACLP,WAAY,0BACZC,KAAM,qCACNC,OAAQ,uCAEVM,SAAU,CACRR,WAAY,oCACZC,KAAM,mCACNC,OAAQ,wCAINO,EAAY,CAChBC,OAAQ,CACNC,QAAS,cACTC,IAAK,QACLC,SAAU,SACVC,SAAU,cACVC,WAAY,iBAEdC,QAAS,CACPL,QAAS,YACTC,IAAK,UACLC,SAAU,SACVC,SAAU,cACVC,WAAY,mBAIHE,EAAQC,EAAMC,WACzB,EAEIC,UAAU,SACVC,OACAC,WAAW,aACXd,YAAW,EACXe,UACAC,cACAC,YACAC,cACGC,GAELC,KAEA,MAGMC,EAAgB/B,EADAU,EAAW,WAAaY,GAExCU,EAAarB,EAJAY,IAASK,EAAW,SAAW,YAM5CK,gBAAmBC,IACvBA,EAAEC,kBACET,GACFA,KAmCJ,OACEU,EAAAA,YACEN,IAAKA,EACLH,UAAWU,EAET,0DACA,uCACA,iCACA,yBACA,8BAGAN,EAAc7B,WACd6B,EAAc5B,KACd4B,EAAc3B,OAGd4B,EAAWnB,QACXmB,EAAWlB,IACXkB,EAAWhB,SACXgB,EAAWf,WAGXQ,IAAYf,GAAY,kCACxBA,GAAY,gCAEZiB,GAEFF,QAASf,OAAW4B,EAAYb,EAChCc,UAAWd,IAAYf,EA5DJwB,IACN,UAAVA,EAAEnC,KAA6B,MAAVmC,EAAEnC,MAAgB0B,GAAYf,IACtDwB,EAAEM,iBACFf,WAyDkDa,EAClDG,SAAUhB,IAAYf,EAAW,OAAI4B,EACrCI,KAAMjB,EAAU,cAAWa,KACvBT,EAAKL,SAAA,CAETmB,EAAAA,YAAMhB,UAAU,cAAaH,SAAEA,IA1DhB,MACjB,MAAMoB,EAAcD,EAAAA,IAAC/C,GAAE+B,UAAWU,EAAGL,EAAWjB,YAEhD,OAAIW,EAEAiB,EAAAA,IAAA,SAAA,CACEE,KAAK,SACLpB,QAASQ,gBACTvB,SAAUA,EACViB,UAAWU,EACT,mCACA,sCACA3B,GAAY,iCACb,aACU,MAAKc,SAEfoB,IAKAA,GAsCJE,QAMT3B,EAAM4B,YAAc","x_google_ignoreList":[0]}
|
package/dist/cjs/Divider.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var r=require("
|
|
1
|
+
"use strict";var r=require("react/jsx-runtime"),e=require("react"),t=require("./utils.js");const i=e.forwardRef(({width:e="100%",height:i=1,orientation:a="horizontal",variant:s="neutral-light",className:l,style:n,...h},o)=>{const u="horizontal"===a,g={width:u?e:i,height:u?i:e,...n};return r.jsx("div",{ref:o,className:t("shrink-0",{"neutral-light":"bg-neutral-light","neutral-main":"bg-neutral-main",primary:"bg-primary"}[s],l),style:g,role:"separator",...h})});i.displayName="Divider",exports.Divider=i;
|
|
2
|
+
//# sourceMappingURL=Divider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Divider.js","sources":["../../src/components/Divider/Divider.tsx"],"sourcesContent":["import React from 'react';\nimport cn from '@/utils/cn';\n\nexport interface DividerProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Width of the divider\n * @default \"100%\"\n */\n width?: string | number;\n /**\n * Height (thickness) of the divider\n * @default 1\n */\n height?: string | number;\n /**\n * Orientation of the divider\n * @default \"horizontal\"\n */\n orientation?: 'horizontal' | 'vertical';\n /**\n * Color variant of the divider\n * @default \"neutral-light\"\n */\n variant?: 'neutral-light' | 'neutral-main' | 'primary';\n}\n\nconst Divider = React.forwardRef<HTMLDivElement, DividerProps>(\n (\n {\n width = '100%',\n height = 1,\n orientation = 'horizontal',\n variant = 'neutral-light',\n className,\n style,\n ...props\n },\n ref,\n ) => {\n const isHorizontal = orientation === 'horizontal';\n\n const variantClasses = {\n 'neutral-light': 'bg-neutral-light',\n 'neutral-main': 'bg-neutral-main',\n primary: 'bg-primary',\n };\n\n const dividerStyle = {\n width: isHorizontal ? width : height,\n height: isHorizontal ? height : width,\n ...style,\n };\n\n return (\n <div\n ref={ref}\n className={cn('shrink-0', variantClasses[variant], className)}\n style={dividerStyle}\n role=\"separator\"\n {...props}\n />\n );\n },\n);\n\nDivider.displayName = 'Divider';\n\nexport { Divider };\n"],"names":["Divider","React","forwardRef","width","height","orientation","variant","className","style","props","ref","isHorizontal","dividerStyle","_jsx","cn","primary","role","displayName"],"mappings":"2FA0BA,MAAMA,EAAUC,EAAMC,WACpB,EAEIC,QAAQ,OACRC,SAAS,EACTC,cAAc,aACdC,UAAU,gBACVC,YACAC,WACGC,GAELC,KAEA,MAAMC,EAA+B,eAAhBN,EAQfO,EAAe,CACnBT,MAAOQ,EAAeR,EAAQC,EAC9BA,OAAQO,EAAeP,EAASD,KAC7BK,GAGL,OACEK,EAAAA,IAAA,MAAA,CACEH,IAAKA,EACLH,UAAWO,EAAG,WAfK,CACrB,gBAAiB,mBACjB,eAAgB,kBAChBC,QAAS,cAYkCT,GAAUC,GACnDC,MAAOI,EACPI,KAAK,eACDP,MAMZT,EAAQiB,YAAc"}
|
package/dist/cjs/Drawer.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var e=require("
|
|
1
|
+
"use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("./utils.js");const l=t.forwardRef(({children:l,direction:n="bottom",fullScreen:o=!1,isOpen:a=!1,onClose:s,className:u,isMobile:i,...d},c)=>{const f=t.useRef(null),m=t.useRef(null);t.useEffect(()=>{const handleEscape=e=>{"Escape"===e.key&&a&&s&&s()};return a&&(document.addEventListener("keydown",handleEscape),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",handleEscape),document.body.style.overflow="auto"}},[a,s]);const b=r("fixed inset-0 z-50 transition-all duration-300",{"bg-neutral-darker/50 backdrop-blur-sm":a,"bg-transparent pointer-events-none":!a}),w=r("fixed bg-white shadow-2xl transition-all duration-300 ease-out overflow-auto",(()=>{switch(n){case"top":return"top-0 left-0 right-0";case"bottom":default:return"bottom-0 left-0 right-0";case"left":return"top-0 left-0 bottom-0";case"right":return"top-0 right-0 bottom-0"}})(),(()=>{const e="top"===n||"bottom"===n;return o?"w-full h-full":e?"w-full max-h-[90vh]":"h-full max-w-[90vw]"})(),(()=>{if(!a)switch(n){case"top":return"-translate-y-full";case"bottom":default:return"translate-y-full";case"left":return"-translate-x-full";case"right":return"translate-x-full"}return"translate-x-0 translate-y-0"})(),{"rounded-t-2xl":"bottom"===n&&!o,"rounded-b-2xl":"top"===n&&!o,"rounded-r-2xl":"left"===n&&!o,"rounded-l-2xl":"right"===n&&!o,"p-6":!i,"p-4":i},u);return a?e.jsx("div",{ref:f,className:b,onClick:e=>{!o&&s&&f.current&&e.target===f.current&&s()},onKeyDown:e=>{"Enter"!==e.key&&" "!==e.key||!o&&s&&f.current&&e.target===f.current&&s()},tabIndex:-1,role:"button","aria-label":"Close drawer",children:e.jsx("div",{ref:c||m,className:w,role:"dialog","aria-modal":"true","aria-label":"Drawer",...d,children:l})}):null});l.displayName="Drawer",exports.Drawer=l;
|
|
2
|
+
//# sourceMappingURL=Drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawer.js","sources":["../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["import React, { useEffect, useRef, ReactNode } from 'react';\nimport cn from '@/utils/cn';\n\nexport type DrawerDirection = 'top' | 'bottom' | 'left' | 'right';\n\nexport type DrawerProps = {\n children: ReactNode;\n direction?: DrawerDirection;\n fullScreen?: boolean;\n isOpen?: boolean;\n onClose?: () => void;\n className?: string;\n /**\n * Whether the component is in mobile mode\n */\n isMobile: boolean;\n};\n\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(\n (\n {\n children,\n direction = 'bottom',\n fullScreen = false,\n isOpen = false,\n onClose,\n className,\n isMobile,\n ...props\n },\n ref,\n ) => {\n const overlayRef = useRef<HTMLDivElement>(null);\n const drawerRef = useRef<HTMLDivElement>(null);\n\n // Handle escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen && onClose) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n // Prevent body scroll when drawer is open\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'auto';\n };\n }, [isOpen, onClose]);\n\n // Handle click outside\n const handleOverlayClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (\n !fullScreen &&\n onClose &&\n overlayRef.current &&\n event.target === overlayRef.current\n ) {\n onClose();\n }\n };\n\n // Handle keyboard events on overlay\n const handleOverlayKeyDown = (\n event: React.KeyboardEvent<HTMLDivElement>,\n ) => {\n if (event.key === 'Enter' || event.key === ' ') {\n if (\n !fullScreen &&\n onClose &&\n overlayRef.current &&\n event.target === overlayRef.current\n ) {\n onClose();\n }\n }\n };\n\n const getTranslateClasses = () => {\n if (!isOpen) {\n switch (direction) {\n case 'top':\n return '-translate-y-full';\n case 'bottom':\n return 'translate-y-full';\n case 'left':\n return '-translate-x-full';\n case 'right':\n return 'translate-x-full';\n default:\n return 'translate-y-full';\n }\n }\n return 'translate-x-0 translate-y-0';\n };\n\n const getPositionClasses = () => {\n switch (direction) {\n case 'top':\n return 'top-0 left-0 right-0';\n case 'bottom':\n return 'bottom-0 left-0 right-0';\n case 'left':\n return 'top-0 left-0 bottom-0';\n case 'right':\n return 'top-0 right-0 bottom-0';\n default:\n return 'bottom-0 left-0 right-0';\n }\n };\n\n const getSizeClasses = () => {\n const isVertical = direction === 'top' || direction === 'bottom';\n\n if (fullScreen) {\n return isVertical ? 'w-full h-full' : 'w-full h-full';\n }\n\n if (isVertical) {\n return 'w-full max-h-[90vh]';\n }\n return 'h-full max-w-[90vw]';\n };\n\n const baseOverlayClasses = 'fixed inset-0 z-50 transition-all duration-300';\n const baseDrawerClasses =\n 'fixed bg-white shadow-2xl transition-all duration-300 ease-out overflow-auto';\n\n const overlayClasses = cn(baseOverlayClasses, {\n 'bg-neutral-darker/50 backdrop-blur-sm': isOpen,\n 'bg-transparent pointer-events-none': !isOpen,\n });\n\n const drawerClasses = cn(\n baseDrawerClasses,\n getPositionClasses(),\n getSizeClasses(),\n getTranslateClasses(),\n {\n 'rounded-t-2xl': direction === 'bottom' && !fullScreen,\n 'rounded-b-2xl': direction === 'top' && !fullScreen,\n 'rounded-r-2xl': direction === 'left' && !fullScreen,\n 'rounded-l-2xl': direction === 'right' && !fullScreen,\n 'p-6': !isMobile,\n 'p-4': isMobile,\n },\n className,\n );\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n ref={overlayRef}\n className={overlayClasses}\n onClick={handleOverlayClick}\n onKeyDown={handleOverlayKeyDown}\n tabIndex={-1}\n role=\"button\"\n aria-label=\"Close drawer\"\n >\n <div\n ref={ref || drawerRef}\n className={drawerClasses}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Drawer\"\n {...props}\n >\n {children}\n </div>\n </div>\n );\n },\n);\n\nDrawer.displayName = 'Drawer';\n\nexport { Drawer };\n"],"names":["Drawer","React","forwardRef","children","direction","fullScreen","isOpen","onClose","className","isMobile","props","ref","overlayRef","useRef","drawerRef","useEffect","handleEscape","event","key","document","addEventListener","body","style","overflow","removeEventListener","overlayClasses","cn","drawerClasses","getPositionClasses","isVertical","getSizeClasses","getTranslateClasses","_jsx","onClick","current","target","onKeyDown","tabIndex","role","displayName"],"mappings":"wGAkBA,MAAMA,EAASC,EAAMC,WACnB,EAEIC,WACAC,YAAY,SACZC,cAAa,EACbC,UAAS,EACTC,UACAC,YACAC,cACGC,GAELC,KAEA,MAAMC,EAAaC,EAAAA,OAAuB,MACpCC,EAAYD,EAAAA,OAAuB,MAGzCE,EAAAA,UAAU,KACR,MAAMC,aAAgBC,IACF,WAAdA,EAAMC,KAAoBZ,GAAUC,GACtCA,KAUJ,OANID,IACFa,SAASC,iBAAiB,UAAWJ,cAErCG,SAASE,KAAKC,MAAMC,SAAW,UAG1B,KACLJ,SAASK,oBAAoB,UAAWR,cACxCG,SAASE,KAAKC,MAAMC,SAAW,SAEhC,CAACjB,EAAQC,IAGZ,MA6EMkB,EAAiBC,EAJI,iDAImB,CAC5C,wCAAyCpB,EACzC,sCAAuCA,IAGnCqB,EAAgBD,EAPpB,+EA9ByB,MACzB,OAAQtB,GACN,IAAK,MACH,MAAO,uBACT,IAAK,SAML,QACE,MAAO,0BALT,IAAK,OACH,MAAO,wBACT,IAAK,QACH,MAAO,2BA8BXwB,GAxBqB,MACrB,MAAMC,EAA2B,QAAdzB,GAAqC,WAAdA,EAE1C,OAAIC,EACkB,gBAGlBwB,EACK,sBAEF,uBAePC,GA1D0B,MAC1B,IAAKxB,EACH,OAAQF,GACN,IAAK,MACH,MAAO,oBACT,IAAK,SAML,QACE,MAAO,mBALT,IAAK,OACH,MAAO,oBACT,IAAK,QACH,MAAO,mBAKb,MAAO,+BA4CP2B,GACA,CACE,gBAA+B,WAAd3B,IAA2BC,EAC5C,gBAA+B,QAAdD,IAAwBC,EACzC,gBAA+B,SAAdD,IAAyBC,EAC1C,gBAA+B,UAAdD,IAA0BC,EAC3C,OAAQI,EACR,MAAOA,GAETD,GAGF,OAAKF,EAKH0B,EAAAA,IAAA,MAAA,CACErB,IAAKC,EACLJ,UAAWiB,EACXQ,QA1GwBhB,KAEvBZ,GACDE,GACAK,EAAWsB,SACXjB,EAAMkB,SAAWvB,EAAWsB,SAE5B3B,KAoGA6B,UA9FFnB,IAEkB,UAAdA,EAAMC,KAAiC,MAAdD,EAAMC,MAE9Bb,GACDE,GACAK,EAAWsB,SACXjB,EAAMkB,SAAWvB,EAAWsB,SAE5B3B,KAsFF8B,UAAU,EACVC,KAAK,SAAQ,aACF,eAAcnC,SAEzB6B,EAAAA,IAAA,MAAA,CACErB,IAAKA,GAAOG,EACZN,UAAWmB,EACXW,KAAK,SAAQ,aACF,OAAM,aACN,YACP5B,EAAKP,SAERA,MArBE,OA4BbH,EAAOuC,YAAc"}
|
package/dist/cjs/Input.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var t=require("
|
|
1
|
+
"use client";"use strict";var t=require("react/jsx-runtime"),e=require("react"),r=require("./utils.js");const l=e.forwardRef(({state:l="default",label:a,value:n,onChange:i,helperText:s,startIcon:o,endIcon:u,type:d="text",isMobile:x,...p},h)=>{const[m,c]=e.useState(!1),f=e.useId(),g=m||""!==n&&null!=n,b="disabled"===l,j=r("relative flex items-center border rounded-lg transition-all duration-300 w-[360px]",{"h-[54px]":!x,"h-12":x,"border-neutral-light":"default"===l&&!m,"border-primary":"default"===l&&m,"border-error":"error"===l,"bg-white border-neutral-light cursor-not-allowed":b}),w=r("absolute pointer-events-none transition-all duration-300",{"top-[-10px] bg-white px-1 mx-3 font-medium":g,"text-s":!x&&g||x&&!g,"text-xs":x&&g,"text-m":!x&&!g,"right-1":o,"right-3":!o,"top-1/2 -translate-y-1/2 text-m font-medium":!g,"right-11":!g&&o,"right-4":!g&&!o,"text-neutral-main":!m&&"default"===l,"text-neutral-light":b,"text-primary":m&&"default"===l,"text-error":g&&"error"===l}),y=r("peer w-full h-full bg-transparent outline-none text-m font-medium disabled:text-neutral-light",{"pr-12":o,"pl-12":u,"px-4":!o&&!u,"pr-4 pl-12":!o&&u,"pl-4 pr-12":o&&!u,"cursor-not-allowed text-red-500":b,"text-neutral-dark":!m,"text-neutral-darker":m}),v=r("absolute h-5 w-5 transition-colors duration-300",{"text-neutral-main":"error"!==l&&!m,"text-primary":"default"===l&&m,"text-error":"error"===l,"text-neutral-light":b}),N=r("font-light mt-1 px-2 h-4",{"text-s":!x,"text-xs":x,"text-neutral-main":"default"===l,"text-primary":"default"===l&&m,"text-error":"error"===l,"text-neutral-light":b});return t.jsxs("div",{children:[t.jsxs("div",{className:j,children:[u&&t.jsx("span",{className:r(v,"left-4"),children:u}),t.jsx("label",{htmlFor:f,className:w,children:a}),t.jsx("input",{ref:h,id:f,type:d,value:n,onChange:i,onFocus:t=>{b||(c(!0),p.onFocus?.(t))},onBlur:t=>{b||(c(!1),p.onBlur?.(t))},disabled:b,className:y,...p}),o&&t.jsx("span",{className:r(v,"right-4"),children:o})]}),s&&t.jsx("p",{className:N,children:s})]})});l.displayName="Input",exports.Input=l;
|
|
2
|
+
//# sourceMappingURL=Input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.js","sources":["../../src/components/Input/Input.tsx"],"sourcesContent":["import React, { useState, useId, ReactNode } from 'react';\nimport cn from '@/utils/cn';\n\nexport type InputProps = {\n state?: 'default' | 'disabled' | 'error';\n label: string;\n helperText?: string;\n startIcon?: ReactNode;\n endIcon?: ReactNode;\n /**\n * Whether the component is in mobile mode\n */\n isMobile: boolean;\n} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'id'>;\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n state = 'default',\n label,\n value,\n onChange,\n helperText,\n startIcon,\n endIcon,\n type = 'text',\n isMobile,\n ...props\n },\n ref,\n ) => {\n const [isFocused, setIsFocused] = useState(false);\n const id = useId();\n\n const hasContent = value !== '' && value !== null && value !== undefined;\n const isLabelFloated = isFocused || hasContent;\n const isDisabled = state === 'disabled';\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n if (!isDisabled) {\n setIsFocused(true);\n props.onFocus?.(e);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (!isDisabled) {\n setIsFocused(false);\n props.onBlur?.(e);\n }\n };\n\n const baseContainerClasses =\n 'relative flex items-center border rounded-lg transition-all duration-300 w-[360px]';\n const baseLabelClasses =\n 'absolute pointer-events-none transition-all duration-300';\n const baseInputClasses =\n 'peer w-full h-full bg-transparent outline-none text-m font-medium disabled:text-neutral-light';\n const baseIconClasses = 'absolute h-5 w-5 transition-colors duration-300';\n\n const containerClasses = cn(baseContainerClasses, {\n 'h-[54px]': !isMobile,\n 'h-12': isMobile,\n 'border-neutral-light': state === 'default' && !isFocused,\n 'border-primary': state === 'default' && isFocused,\n 'border-error': state === 'error',\n 'bg-white border-neutral-light cursor-not-allowed': isDisabled,\n });\n\n const labelClasses = cn(baseLabelClasses, {\n 'top-[-10px] bg-white px-1 mx-3 font-medium': isLabelFloated,\n 'text-s': (!isMobile && isLabelFloated) || (isMobile && !isLabelFloated),\n 'text-xs': isMobile && isLabelFloated,\n 'text-m': !isMobile && !isLabelFloated,\n 'right-1': startIcon,\n 'right-3': !startIcon,\n 'top-1/2 -translate-y-1/2 text-m font-medium': !isLabelFloated,\n 'right-11': !isLabelFloated && startIcon,\n 'right-4': !isLabelFloated && !startIcon,\n 'text-neutral-main': !isFocused && state === 'default',\n 'text-neutral-light': isDisabled,\n 'text-primary': isFocused && state === 'default',\n 'text-error': isLabelFloated && state === 'error',\n });\n\n const inputClasses = cn(baseInputClasses, {\n 'pr-12': startIcon,\n 'pl-12': endIcon,\n 'px-4': !startIcon && !endIcon,\n 'pr-4 pl-12': !startIcon && endIcon,\n 'pl-4 pr-12': startIcon && !endIcon,\n 'cursor-not-allowed text-red-500': isDisabled,\n 'text-neutral-dark': !isFocused,\n 'text-neutral-darker': isFocused,\n });\n\n const iconClasses = cn(baseIconClasses, {\n 'text-neutral-main': state !== 'error' && !isFocused,\n 'text-primary': state === 'default' && isFocused,\n 'text-error': state === 'error',\n 'text-neutral-light': isDisabled,\n });\n\n const helperTextClasses = cn('font-light mt-1 px-2 h-4', {\n 'text-s': !isMobile,\n 'text-xs': isMobile,\n 'text-neutral-main': state === 'default',\n 'text-primary': state === 'default' && isFocused,\n 'text-error': state === 'error',\n 'text-neutral-light': isDisabled,\n });\n\n return (\n <div>\n <div className={containerClasses}>\n {endIcon && (\n <span className={cn(iconClasses, 'left-4')}>{endIcon}</span>\n )}\n\n <label htmlFor={id} className={labelClasses}>\n {label}\n </label>\n\n <input\n ref={ref}\n id={id}\n type={type}\n value={value}\n onChange={onChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={isDisabled}\n className={inputClasses}\n {...props}\n />\n\n {startIcon && (\n <span className={cn(iconClasses, 'right-4')}>{startIcon}</span>\n )}\n </div>\n\n {helperText && <p className={helperTextClasses}>{helperText}</p>}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n\nexport { Input };\n"],"names":["Input","React","forwardRef","state","label","value","onChange","helperText","startIcon","endIcon","type","isMobile","props","ref","isFocused","setIsFocused","useState","id","useId","isLabelFloated","isDisabled","containerClasses","cn","labelClasses","inputClasses","iconClasses","helperTextClasses","_jsxs","className","children","_jsx","htmlFor","onFocus","e","onBlur","disabled","displayName"],"mappings":"wGAeA,MAAMA,EAAQC,EAAMC,WAClB,EAEIC,QAAQ,UACRC,QACAC,QACAC,WACAC,aACAC,YACAC,UACAC,OAAO,OACPC,cACGC,GAELC,KAEA,MAAOC,EAAWC,GAAgBC,EAAAA,UAAS,GACrCC,EAAKC,EAAAA,QAGLC,EAAiBL,GADM,KAAVT,SAAgBA,EAE7Be,EAAuB,aAAVjB,EAwBbkB,EAAmBC,EAPvB,qFAOgD,CAChD,YAAaX,EACb,OAAQA,EACR,uBAAkC,YAAVR,IAAwBW,EAChD,iBAA4B,YAAVX,GAAuBW,EACzC,eAA0B,UAAVX,EAChB,mDAAoDiB,IAGhDG,EAAeD,EAdnB,2DAcwC,CACxC,6CAA8CH,EAC9C,UAAYR,GAAYQ,GAAoBR,IAAaQ,EACzD,UAAWR,GAAYQ,EACvB,UAAWR,IAAaQ,EACxB,UAAWX,EACX,WAAYA,EACZ,+CAAgDW,EAChD,YAAaA,GAAkBX,EAC/B,WAAYW,IAAmBX,EAC/B,qBAAsBM,GAAuB,YAAVX,EACnC,qBAAsBiB,EACtB,eAAgBN,GAAuB,YAAVX,EAC7B,aAAcgB,GAA4B,UAAVhB,IAG5BqB,EAAeF,EA5BnB,gGA4BwC,CACxC,QAASd,EACT,QAASC,EACT,QAASD,IAAcC,EACvB,cAAeD,GAAaC,EAC5B,aAAcD,IAAcC,EAC5B,kCAAmCW,EACnC,qBAAsBN,EACtB,sBAAuBA,IAGnBW,EAAcH,EAtCI,kDAsCgB,CACtC,oBAA+B,UAAVnB,IAAsBW,EAC3C,eAA0B,YAAVX,GAAuBW,EACvC,aAAwB,UAAVX,EACd,qBAAsBiB,IAGlBM,EAAoBJ,EAAG,2BAA4B,CACvD,UAAWX,EACX,UAAWA,EACX,oBAA+B,YAAVR,EACrB,eAA0B,YAAVA,GAAuBW,EACvC,aAAwB,UAAVX,EACd,qBAAsBiB,IAGxB,OACEO,EAAAA,sBACEA,OAAA,MAAA,CAAKC,UAAWP,EAAgBQ,SAAA,CAC7BpB,GACCqB,EAAAA,IAAA,OAAA,CAAMF,UAAWN,EAAGG,EAAa,UAASI,SAAGpB,IAG/CqB,EAAAA,IAAA,QAAA,CAAOC,QAASd,EAAIW,UAAWL,EAAYM,SACxCzB,IAGH0B,MAAA,QAAA,CACEjB,IAAKA,EACLI,GAAIA,EACJP,KAAMA,EACNL,MAAOA,EACPC,SAAUA,EACV0B,QA3FaC,IACdb,IACHL,GAAa,GACbH,EAAMoB,UAAUC,KAyFZC,OArFYD,IACbb,IACHL,GAAa,GACbH,EAAMsB,SAASD,KAmFXE,SAAUf,EACVQ,UAAWJ,KACPZ,IAGLJ,GACCsB,EAAAA,YAAMF,UAAWN,EAAGG,EAAa,WAAUI,SAAGrB,OAIjDD,GAAcuB,MAAA,IAAA,CAAGF,UAAWF,WAAoBnB,SAMzDP,EAAMoC,YAAc"}
|
package/dist/cjs/Menu.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var e=require("
|
|
1
|
+
"use client";"use strict";var e=require("react/jsx-runtime"),r=require("react"),t=require("./utils.js"),a=require("./Typography.js");const o=r.forwardRef(({buttonText:o,items:n,disabled:i=!1,className:l,onOpenChange:s,isOpen:c,"aria-label":d,...u},p)=>{const[b,x]=r.useState(!1),f=r.useRef(null),h=r.useRef(null),v=void 0!==c?c:b,handleToggle=()=>{if(i)return;const e=!v;void 0===c&&x(e),s?.(e)};r.useEffect(()=>{const handleClickOutside=e=>{f.current&&!f.current.contains(e.target)&&(void 0===c&&x(!1),s?.(!1))};if(v)return document.addEventListener("mousedown",handleClickOutside),()=>{document.removeEventListener("mousedown",handleClickOutside)}},[v,c,s]);const m=t("inline-flex items-center justify-center","bg-white border border-[var(--color-neutral-light)]","rounded-[6px] px-[16px] py-[13px]","transition-colors duration-200","hover:bg-[var(--color-neutral-lighter)]","focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] focus:ring-offset-2",{"opacity-50 cursor-not-allowed":i,"cursor-pointer":!i}),y=t("absolute top-full left-0 right-0 z-10 mt-[4px]","bg-white border border-[var(--color-neutral-light)]","rounded-[6px] py-[13px] px-[16px]","shadow-lg","transition-all duration-200",{"opacity-100 translate-y-0 pointer-events-auto":v,"opacity-0 -translate-y-2 pointer-events-none":!v}),g=t("block w-full text-right","transition-colors duration-200","hover:bg-[var(--color-neutral-lighter)] rounded-[4px] px-[8px] py-[4px] -mx-[8px]","focus:outline-none focus:bg-[var(--color-neutral-lighter)]");return e.jsx("div",{ref:p,className:t("relative inline-block",l),...u,children:e.jsxs("div",{ref:f,children:[e.jsx("button",{ref:h,type:"button",className:m,onClick:handleToggle,onKeyDown:e=>{if(!i)switch(e.key){case"Escape":v&&(e.preventDefault(),void 0===c&&x(!1),s?.(!1),h.current?.focus());break;case"ArrowDown":v||(e.preventDefault(),handleToggle());break;case"Enter":case" ":e.preventDefault(),handleToggle()}},disabled:i,"aria-expanded":v,"aria-haspopup":"true","aria-label":d||`منوی ${o}`,children:e.jsx(a.Typography,{variant:"body-s-heavy",color:"neutral-darker",className:"text-right",children:o})}),e.jsx("div",{className:y,children:e.jsx("div",{className:"flex flex-col gap-[16px]",children:n.map(r=>{const o=e.jsx(a.Typography,{variant:"body-s-heavy",color:r.disabled?"neutral-main":"neutral-darker",className:"text-right",children:r.label}),n={className:t(g,{"opacity-50 cursor-not-allowed":r.disabled,"cursor-pointer":!r.disabled}),onClick:r.disabled?void 0:()=>(e=>{e.disabled||(void 0===c&&x(!1),s?.(!1),e.onClick?.())})(r),"aria-label":`منوی ${r.label}`};return r.href&&!r.disabled?e.jsx("a",{...n,href:r.href,role:"menuitem",tabIndex:v?0:-1,children:o},r.id):e.jsx("button",{...n,type:"button",role:"menuitem",tabIndex:v?0:-1,disabled:r.disabled,children:o},r.id)})})})]})})});o.displayName="Menu",exports.Menu=o;
|
|
2
|
+
//# sourceMappingURL=Menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.js","sources":["../../src/components/Menu/Menu.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport cn from '@/utils/cn';\nimport { Typography } from '../Typography/Typography';\n\nexport interface MenuItem {\n id: string;\n label: string;\n href?: string;\n onClick?: () => void;\n disabled?: boolean;\n}\n\nexport interface MenuProps {\n /**\n * The text displayed on the main menu button\n */\n buttonText: string;\n /**\n * Array of menu items to display in the dropdown\n */\n items: MenuItem[];\n /**\n * Whether the menu is disabled\n */\n disabled?: boolean;\n /**\n * Additional CSS classes for the menu container\n */\n className?: string;\n /**\n * Callback fired when menu open state changes\n */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Whether the menu is initially open (controlled mode)\n */\n isOpen?: boolean;\n /**\n * Aria label for the menu button\n */\n 'aria-label'?: string;\n}\n\nexport const Menu = React.forwardRef<HTMLDivElement, MenuProps>(\n (\n {\n buttonText,\n items,\n disabled = false,\n className,\n onOpenChange,\n isOpen: controlledIsOpen,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n ) => {\n const [internalIsOpen, setInternalIsOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // Use controlled or uncontrolled state\n const isOpen =\n controlledIsOpen !== undefined ? controlledIsOpen : internalIsOpen;\n\n const handleToggle = () => {\n if (disabled) return;\n\n const newIsOpen = !isOpen;\n\n if (controlledIsOpen === undefined) {\n setInternalIsOpen(newIsOpen);\n }\n\n onOpenChange?.(newIsOpen);\n };\n\n const handleItemClick = (item: MenuItem) => {\n if (item.disabled) return;\n\n // Close menu after item click\n if (controlledIsOpen === undefined) {\n setInternalIsOpen(false);\n }\n onOpenChange?.(false);\n\n // Execute item's onClick if provided\n item.onClick?.();\n };\n\n // Close menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n menuRef.current &&\n !menuRef.current.contains(event.target as Node)\n ) {\n if (controlledIsOpen === undefined) {\n setInternalIsOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n return undefined;\n }, [isOpen, controlledIsOpen, onOpenChange]);\n\n // Handle keyboard navigation\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (event.key) {\n case 'Escape':\n if (isOpen) {\n event.preventDefault();\n if (controlledIsOpen === undefined) {\n setInternalIsOpen(false);\n }\n onOpenChange?.(false);\n buttonRef.current?.focus();\n }\n break;\n case 'ArrowDown':\n if (!isOpen) {\n event.preventDefault();\n handleToggle();\n }\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n handleToggle();\n break;\n default:\n // No action needed for other keys\n break;\n }\n };\n\n const buttonClasses = cn(\n // Base button styles matching Figma design\n 'inline-flex items-center justify-center',\n 'bg-white border border-[var(--color-neutral-light)]',\n 'rounded-[6px] px-[16px] py-[13px]',\n 'transition-colors duration-200',\n // Interactive states\n 'hover:bg-[var(--color-neutral-lighter)]',\n 'focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] focus:ring-offset-2',\n // Disabled state\n {\n 'opacity-50 cursor-not-allowed': disabled,\n 'cursor-pointer': !disabled,\n },\n );\n\n const dropdownClasses = cn(\n // Base dropdown styles\n 'absolute top-full left-0 right-0 z-10 mt-[4px]',\n 'bg-white border border-[var(--color-neutral-light)]',\n 'rounded-[6px] py-[13px] px-[16px]',\n 'shadow-lg',\n // Animation\n 'transition-all duration-200',\n {\n 'opacity-100 translate-y-0 pointer-events-auto': isOpen,\n 'opacity-0 -translate-y-2 pointer-events-none': !isOpen,\n },\n );\n\n const itemClasses = cn(\n 'block w-full text-right',\n 'transition-colors duration-200',\n 'hover:bg-[var(--color-neutral-lighter)] rounded-[4px] px-[8px] py-[4px] -mx-[8px]',\n 'focus:outline-none focus:bg-[var(--color-neutral-lighter)]',\n );\n\n return (\n <div\n ref={ref}\n className={cn('relative inline-block', className)}\n {...props}\n >\n <div ref={menuRef}>\n {/* Main Menu Button */}\n <button\n ref={buttonRef}\n type=\"button\"\n className={buttonClasses}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-label={ariaLabel || `منوی ${buttonText}`}\n >\n <Typography\n variant=\"body-s-heavy\"\n color=\"neutral-darker\"\n className=\"text-right\"\n >\n {buttonText}\n </Typography>\n </button>\n\n {/* Dropdown Menu */}\n <div className={dropdownClasses}>\n <div className=\"flex flex-col gap-[16px]\">\n {items.map((item) => {\n const content = (\n <Typography\n variant=\"body-s-heavy\"\n color={item.disabled ? 'neutral-main' : 'neutral-darker'}\n className=\"text-right\"\n >\n {item.label}\n </Typography>\n );\n\n const commonProps = {\n className: cn(itemClasses, {\n 'opacity-50 cursor-not-allowed': item.disabled,\n 'cursor-pointer': !item.disabled,\n }),\n onClick: item.disabled\n ? undefined\n : () => handleItemClick(item),\n 'aria-label': `منوی ${item.label}`,\n };\n\n // Render as link if href is provided\n if (item.href && !item.disabled) {\n return (\n <a\n key={item.id}\n {...commonProps}\n href={item.href}\n role=\"menuitem\"\n tabIndex={isOpen ? 0 : -1}\n >\n {content}\n </a>\n );\n }\n\n // Render as button\n return (\n <button\n key={item.id}\n {...commonProps}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isOpen ? 0 : -1}\n disabled={item.disabled}\n >\n {content}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n },\n);\n\nMenu.displayName = 'Menu';\n"],"names":["Menu","React","forwardRef","buttonText","items","disabled","className","onOpenChange","isOpen","controlledIsOpen","ariaLabel","props","ref","internalIsOpen","setInternalIsOpen","useState","menuRef","useRef","buttonRef","undefined","handleToggle","newIsOpen","useEffect","handleClickOutside","event","current","contains","target","document","addEventListener","removeEventListener","buttonClasses","cn","dropdownClasses","itemClasses","_jsx","_jsxs","children","type","onClick","onKeyDown","key","preventDefault","focus","Typography","variant","color","map","item","content","label","commonProps","handleItemClick","href","role","tabIndex","id","displayName"],"mappings":"qIA2CO,MAAMA,EAAOC,EAAMC,WACxB,EAEIC,aACAC,QACAC,YAAW,EACXC,YACAC,eACAC,OAAQC,EACR,aAAcC,KACXC,GAELC,KAEA,MAAOC,EAAgBC,GAAqBC,EAAAA,UAAS,GAC/CC,EAAUC,EAAAA,OAAuB,MACjCC,EAAYD,EAAAA,OAA0B,MAGtCT,OACiBW,IAArBV,EAAiCA,EAAmBI,EAEhDO,aAAe,KACnB,GAAIf,EAAU,OAEd,MAAMgB,GAAab,OAEMW,IAArBV,GACFK,EAAkBO,GAGpBd,IAAec,IAiBjBC,EAAAA,UAAU,KACR,MAAMC,mBAAsBC,IAExBR,EAAQS,UACPT,EAAQS,QAAQC,SAASF,EAAMG,eAEPR,IAArBV,GACFK,GAAkB,GAEpBP,KAAe,KAInB,GAAIC,EAEF,OADAoB,SAASC,iBAAiB,YAAaN,oBAChC,KACLK,SAASE,oBAAoB,YAAaP,sBAI7C,CAACf,EAAQC,EAAkBF,IAG9B,MA+BMwB,EAAgBC,EAEpB,0CACA,sDACA,oCACA,iCAEA,0CACA,wFAEA,CACE,gCAAiC3B,EACjC,kBAAmBA,IAIjB4B,EAAkBD,EAEtB,iDACA,sDACA,oCACA,YAEA,8BACA,CACE,gDAAiDxB,EACjD,gDAAiDA,IAI/C0B,EAAcF,EAClB,0BACA,iCACA,oFACA,8DAGF,OACEG,EAAAA,WACEvB,IAAKA,EACLN,UAAW0B,EAAG,wBAAyB1B,MACnCK,WAEJyB,EAAAA,KAAA,MAAA,CAAKxB,IAAKI,EAAOqB,SAAA,CAEfF,EAAAA,cACEvB,IAAKM,EACLoB,KAAK,SACLhC,UAAWyB,EACXQ,QAASnB,aACToB,UAjFehB,IACrB,IAAInB,EAEJ,OAAQmB,EAAMiB,KACZ,IAAK,SACCjC,IACFgB,EAAMkB,sBACmBvB,IAArBV,GACFK,GAAkB,GAEpBP,KAAe,GACfW,EAAUO,SAASkB,SAErB,MACF,IAAK,YACEnC,IACHgB,EAAMkB,iBACNtB,gBAEF,MACF,IAAK,QACL,IAAK,IACHI,EAAMkB,iBACNtB,iBA2DEf,SAAUA,kBACKG,EAAM,gBACP,OAAM,aACRE,GAAa,QAAQP,IAAYkC,SAE7CF,EAAAA,IAACS,EAAAA,WAAU,CACTC,QAAQ,eACRC,MAAM,iBACNxC,UAAU,aAAY+B,SAErBlC,MAKLgC,aAAK7B,UAAW2B,EAAeI,SAC7BF,EAAAA,IAAA,MAAA,CAAK7B,UAAU,oCACZF,EAAM2C,IAAKC,IACV,MAAMC,EACJd,EAAAA,IAACS,EAAAA,WAAU,CACTC,QAAQ,eACRC,MAAOE,EAAK3C,SAAW,eAAiB,iBACxCC,UAAU,sBAET0C,EAAKE,QAIJC,EAAc,CAClB7C,UAAW0B,EAAGE,EAAa,CACzB,gCAAiCc,EAAK3C,SACtC,kBAAmB2C,EAAK3C,WAE1BkC,QAASS,EAAK3C,cACVc,EACA,IA1JM,CAAC6B,IACnBA,EAAK3C,gBAGgBc,IAArBV,GACFK,GAAkB,GAEpBP,KAAe,GAGfyC,EAAKT,cAgJiBa,CAAgBJ,GAC1B,aAAc,QAAQA,EAAKE,SAI7B,OAAIF,EAAKK,OAASL,EAAK3C,SAEnB8B,EAAAA,IAAA,IAAA,IAEMgB,EACJE,KAAML,EAAKK,KACXC,KAAK,WACLC,SAAU/C,EAAS,GAAI,EAAE6B,SAExBY,GANID,EAAKQ,IAadrB,EAAAA,IAAA,SAAA,IAEMgB,EACJb,KAAK,SACLgB,KAAK,WACLC,SAAU/C,EAAS,GAAI,EACvBH,SAAU2C,EAAK3C,SAAQgC,SAEtBY,GAPID,EAAKQ,iBAmB9BxD,EAAKyD,YAAc"}
|
package/dist/cjs/Pagination.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var e=require("
|
|
1
|
+
"use client";"use strict";var e=require("react/jsx-runtime"),i=require("react"),a=require("./utils.js"),n=require("./chunks/createLucideIcon-BqJVOzoK.js"),t=require("./chunks/chevron-left-Do__K6cA.js");const r=n.createLucideIcon("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]),s=n.createLucideIcon("chevrons-left",[["path",{d:"m11 17-5-5 5-5",key:"13zhaf"}],["path",{d:"m18 17-5-5 5-5",key:"h8a8et"}]]),c=n.createLucideIcon("chevrons-right",[["path",{d:"m6 17 5-5-5-5",key:"xnjwq"}],["path",{d:"m13 17 5-5-5-5",key:"17xmmf"}]]),l=n.createLucideIcon("ellipsis",[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]]);function PaginationRoot({className:i,...n}){return e.jsx("nav",{role:"navigation","aria-label":"pagination","data-slot":"pagination",className:a("mx-auto flex w-full justify-center",i),...n})}function PaginationContent({className:i,device:n,...t}){return e.jsx("ul",{"data-slot":"pagination-content",className:a("flex flex-row items-center","mobile"===n?"gap-[6px]":"gap-2",i),...t})}function PaginationItem({...i}){return e.jsx("li",{"data-slot":"pagination-item",...i})}function PaginationLink({className:i,device:n,variant:t,isActive:r,...s}){return e.jsx("a",{"aria-current":r?"page":void 0,"data-slot":"pagination-link","data-active":r,className:a(buttonVariants({variant:"nextPrev"===t?t:r?"active":"outline",device:n}),i),tabIndex:s["aria-disabled"]?-1:0,...s})}function PaginationPrevious({className:i,device:a,variant:n,...t}){const s="mobile"===a,l={mobile:e.jsx(r,{size:18}),desktop:e.jsxs(e.Fragment,{children:[e.jsx(c,{size:20})," ",e.jsx("span",{children:"قبلی"})]})};return e.jsx(PaginationLink,{"aria-label":"Go to previous page",className:s?"ml-2.5":"flex justify-center items-center gap-2 w-[89px] h-[48px] ml-4",device:a,variant:"nextPrev",...t,children:"mobile"===a?l.mobile:l.desktop})}function PaginationNext({className:i,device:a,variant:n,...r}){const c="mobile"===a,l={mobile:e.jsx(t.ChevronLeft,{size:18}),desktop:e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"بعدی"}),e.jsx(s,{size:20})]})};return e.jsx(PaginationLink,{"aria-label":"Go to next page",className:c?"mr-2.5":"flex justify-center items-center gap-2 w-[89px] h-[48px] mr-4",device:a,variant:"nextPrev",...r,children:"mobile"===a?l.mobile:l.desktop})}function PaginationEllipsis({className:i,...n}){return e.jsx("span",{"aria-hidden":!0,"data-slot":"pagination-ellipsis",className:a("flex size-9 items-center justify-center",i),...n,children:e.jsx(l,{className:"size-4"})})}function buttonVariants({variant:e,device:i}){const n="mobile"===i;return[a({"flex items-center justify-center rounded-[6px]":!0,"w-[40px] h-[40px] text-s font-heavy":n,"w-[48px] h-[48px] text-l font-heavy":!n}),{outline:"border border-neutral-light bg-white text-neutral-darker",active:"bg-primary text-white",nextPrev:"border border-neutral-light bg-white text-neutral-darker"}[e]].join(" ")}exports.Pagination=({pageCount:a,page:n,defaultPage:t=1,onPageChange:r,className:s,isMobile:c,...l})=>{const o=void 0!==n,[d,x]=i.useState(t),u=o?n:d,h=c?"mobile":"desktop";i.useEffect(()=>{o||x(t)},[t,o]);const changePage=e=>{o||x(e),r?.(e)};return e.jsx(PaginationRoot,{className:s,...l,children:e.jsxs(PaginationContent,{device:"mobile",children:[e.jsx(PaginationItem,{children:e.jsx(PaginationPrevious,{href:"#",onClick:e=>{e.preventDefault(),u>1&&changePage(u-1)},variant:"nextPrev",device:h,"aria-disabled":1===u,tabIndex:1===u?-1:0})}),function(){const i=[];if(a<=5)for(let n=1;n<=a;n++)i.push(e.jsx(PaginationItem,{children:e.jsx(PaginationLink,{href:"#",isActive:u===n,variant:"main",device:h,onClick:e=>{e.preventDefault(),u!==n&&changePage(n)},"aria-disabled":u===n,tabIndex:u===n?-1:0,children:n})},n));else{i.push(e.jsx(PaginationItem,{children:e.jsx(PaginationLink,{href:"#",isActive:1===u,device:h,variant:"main",onClick:e=>{e.preventDefault(),1!==u&&changePage(1)},"aria-disabled":1===u,tabIndex:1===u?-1:0,children:"1"})},1)),u>3&&i.push(e.jsx(PaginationItem,{children:e.jsx(PaginationEllipsis,{})},"start-ellipsis"));const n=Math.max(2,u-1),t=Math.min(a-1,u+1);for(let a=n;a<=t;a++)i.push(e.jsx(PaginationItem,{children:e.jsx(PaginationLink,{href:"#",isActive:u===a,device:h,variant:"main",onClick:e=>{e.preventDefault(),u!==a&&changePage(a)},"aria-disabled":u===a,tabIndex:u===a?-1:0,children:a})},a));u<a-2&&i.push(e.jsx(PaginationItem,{children:e.jsx(PaginationEllipsis,{})},"end-ellipsis")),i.push(e.jsx(PaginationItem,{children:e.jsx(PaginationLink,{href:"#",isActive:u===a,device:h,variant:"main",onClick:e=>{e.preventDefault(),u!==a&&changePage(a)},"aria-disabled":u===a,tabIndex:u===a?-1:0,children:a})},a))}return i}(),e.jsx(PaginationItem,{children:e.jsx(PaginationNext,{href:"#",onClick:e=>{e.preventDefault(),u<a&&changePage(u+1)},variant:"nextPrev",device:h,"aria-disabled":u===a,tabIndex:u===a?-1:0})})]})})};
|
|
2
|
+
//# sourceMappingURL=Pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../../node_modules/lucide-react/dist/esm/icons/chevrons-left.js","../../node_modules/lucide-react/dist/esm/icons/chevrons-right.js","../../node_modules/lucide-react/dist/esm/icons/ellipsis.js","../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.522.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.522.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m11 17-5-5 5-5\", key: \"13zhaf\" }],\n [\"path\", { d: \"m18 17-5-5 5-5\", key: \"h8a8et\" }]\n];\nconst ChevronsLeft = createLucideIcon(\"chevrons-left\", __iconNode);\n\nexport { __iconNode, ChevronsLeft as default };\n//# sourceMappingURL=chevrons-left.js.map\n","/**\n * @license lucide-react v0.522.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m6 17 5-5-5-5\", key: \"xnjwq\" }],\n [\"path\", { d: \"m13 17 5-5-5-5\", key: \"17xmmf\" }]\n];\nconst ChevronsRight = createLucideIcon(\"chevrons-right\", __iconNode);\n\nexport { __iconNode, ChevronsRight as default };\n//# sourceMappingURL=chevrons-right.js.map\n","/**\n * @license lucide-react v0.522.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"1\", key: \"41hilf\" }],\n [\"circle\", { cx: \"19\", cy: \"12\", r: \"1\", key: \"1wjl8i\" }],\n [\"circle\", { cx: \"5\", cy: \"12\", r: \"1\", key: \"1pcz8c\" }]\n];\nconst Ellipsis = createLucideIcon(\"ellipsis\", __iconNode);\n\nexport { __iconNode, Ellipsis as default };\n//# sourceMappingURL=ellipsis.js.map\n","import { useEffect, useState } from 'react';\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n ChevronsRightIcon,\n ChevronsLeftIcon,\n MoreHorizontalIcon,\n} from 'lucide-react';\nimport cn from '@/utils/cn';\n\ntype Device = 'mobile' | 'desktop';\n\nfunction PaginationRoot({ className, ...props }: React.ComponentProps<'nav'>) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn('mx-auto flex w-full justify-center', className)}\n {...props}\n />\n );\n}\n\nfunction PaginationContent({\n className,\n device,\n ...props\n}: React.ComponentProps<'ul'> & { device: Device }) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\n 'flex flex-row items-center',\n device === 'mobile' ? 'gap-[6px]' : 'gap-2',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\ntype PaginationLinkVariant = 'main' | 'nextPrev';\n\ntype PaginationLinkProps = {\n variant: PaginationLinkVariant;\n isActive?: boolean;\n} & React.ComponentProps<'a'> & { device: Device };\n\nfunction PaginationLink({\n className,\n device,\n variant,\n isActive,\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? 'page' : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({\n variant:\n variant === 'nextPrev' ? variant : isActive ? 'active' : 'outline',\n device,\n }),\n className,\n )}\n tabIndex={props['aria-disabled'] ? -1 : 0}\n {...props}\n />\n );\n}\n\nfunction PaginationPrevious({\n className,\n device,\n variant,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n const isMobile = device === 'mobile';\n\n const content = {\n mobile: <ChevronRightIcon size={18} />,\n desktop: (\n <>\n <ChevronsRightIcon size={20} /> <span>قبلی</span>\n </>\n ),\n };\n\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n className={\n !isMobile\n ? 'flex justify-center items-center gap-2 w-[89px] h-[48px] ml-4'\n : 'ml-2.5'\n }\n device={device}\n variant=\"nextPrev\"\n {...props}\n >\n {device === 'mobile' ? content.mobile : content.desktop}\n </PaginationLink>\n );\n}\n\nfunction PaginationNext({\n className,\n device,\n variant,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n const isMobile = device === 'mobile';\n\n const content = {\n mobile: <ChevronLeftIcon size={18} />,\n desktop: (\n <>\n <span>بعدی</span>\n <ChevronsLeftIcon size={20} />\n </>\n ),\n };\n\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n className={\n !isMobile\n ? 'flex justify-center items-center gap-2 w-[89px] h-[48px] mr-4'\n : 'mr-2.5'\n }\n device={device}\n variant=\"nextPrev\"\n {...props}\n >\n {device === 'mobile' ? content.mobile : content.desktop}\n </PaginationLink>\n );\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn('flex size-9 items-center justify-center', className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n </span>\n );\n}\n\ntype ButtonVariant = 'outline' | 'active' | 'nextPrev';\n\nfunction buttonVariants({\n variant,\n device,\n}: {\n variant: ButtonVariant;\n device: Device;\n}) {\n const isMobile = device === 'mobile';\n\n const base = cn({\n 'flex items-center justify-center rounded-[6px]': true,\n 'w-[40px] h-[40px] text-s font-heavy': isMobile,\n 'w-[48px] h-[48px] text-l font-heavy': !isMobile,\n });\n\n const variants: Record<ButtonVariant, string> = {\n outline: 'border border-neutral-light bg-white text-neutral-darker',\n active: 'bg-primary text-white',\n nextPrev: 'border border-neutral-light bg-white text-neutral-darker',\n };\n\n return [base, variants[variant]].join(' ');\n}\n\nexport interface UnifiedPaginationProps {\n pageCount: number;\n page?: number;\n defaultPage?: number;\n onPageChange?: (page: number) => void;\n className?: string;\n /**\n * Whether the component is in mobile mode\n */\n isMobile: boolean;\n}\n\nexport const Pagination: React.FC<UnifiedPaginationProps> = ({\n pageCount,\n page: controlledPage,\n defaultPage = 1,\n onPageChange,\n className,\n isMobile,\n ...navProps\n}) => {\n const isControlled = controlledPage !== undefined;\n const [internalPage, setInternalPage] = useState(defaultPage);\n\n const page = isControlled ? controlledPage! : internalPage;\n\n const device = isMobile ? 'mobile' : 'desktop';\n\n useEffect(() => {\n if (!isControlled) setInternalPage(defaultPage);\n }, [defaultPage, isControlled]);\n\n const changePage = (newPage: number) => {\n if (!isControlled) setInternalPage(newPage);\n onPageChange?.(newPage);\n };\n\n function renderPages() {\n const items: React.ReactNode[] = [];\n\n if (pageCount <= 5) {\n for (let i = 1; i <= pageCount; i++) {\n items.push(\n <PaginationItem key={i}>\n <PaginationLink\n href=\"#\"\n isActive={page === i}\n variant=\"main\"\n device={device}\n onClick={(e) => {\n e.preventDefault();\n if (page !== i) changePage(i);\n }}\n aria-disabled={page === i}\n tabIndex={page === i ? -1 : 0}\n >\n {i}\n </PaginationLink>\n </PaginationItem>,\n );\n }\n } else {\n // First page\n items.push(\n <PaginationItem key={1}>\n <PaginationLink\n href=\"#\"\n isActive={page === 1}\n device={device}\n variant=\"main\"\n onClick={(e) => {\n e.preventDefault();\n if (page !== 1) changePage(1);\n }}\n aria-disabled={page === 1}\n tabIndex={page === 1 ? -1 : 0}\n >\n 1\n </PaginationLink>\n </PaginationItem>,\n );\n // Ellipsis start\n if (page > 3) {\n items.push(\n <PaginationItem key=\"start-ellipsis\">\n <PaginationEllipsis />\n </PaginationItem>,\n );\n }\n // Middle pages\n const start = Math.max(2, page - 1);\n const end = Math.min(pageCount - 1, page + 1);\n for (let i = start; i <= end; i++) {\n items.push(\n <PaginationItem key={i}>\n <PaginationLink\n href=\"#\"\n isActive={page === i}\n device={device}\n variant=\"main\"\n onClick={(e) => {\n e.preventDefault();\n if (page !== i) changePage(i);\n }}\n aria-disabled={page === i}\n tabIndex={page === i ? -1 : 0}\n >\n {i}\n </PaginationLink>\n </PaginationItem>,\n );\n }\n // Ellipsis end\n if (page < pageCount - 2) {\n items.push(\n <PaginationItem key=\"end-ellipsis\">\n <PaginationEllipsis />\n </PaginationItem>,\n );\n }\n // Last page\n items.push(\n <PaginationItem key={pageCount}>\n <PaginationLink\n href=\"#\"\n isActive={page === pageCount}\n device={device}\n variant=\"main\"\n onClick={(e) => {\n e.preventDefault();\n if (page !== pageCount) changePage(pageCount);\n }}\n aria-disabled={page === pageCount}\n tabIndex={page === pageCount ? -1 : 0}\n >\n {pageCount}\n </PaginationLink>\n </PaginationItem>,\n );\n }\n return items;\n }\n\n return (\n <PaginationRoot className={className} {...navProps}>\n <PaginationContent device=\"mobile\">\n <PaginationItem>\n <PaginationPrevious\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (page > 1) changePage(page - 1);\n }}\n variant=\"nextPrev\"\n device={device}\n aria-disabled={page === 1}\n tabIndex={page === 1 ? -1 : 0}\n />\n </PaginationItem>\n {renderPages()}\n <PaginationItem>\n <PaginationNext\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (page < pageCount) changePage(page + 1);\n }}\n variant=\"nextPrev\"\n device={device}\n aria-disabled={page === pageCount}\n tabIndex={page === pageCount ? -1 : 0}\n />\n </PaginationItem>\n </PaginationContent>\n </PaginationRoot>\n );\n};\n"],"names":["ChevronRight","createLucideIcon","d","key","ChevronsLeft","ChevronsRight","Ellipsis","cx","cy","r","PaginationRoot","className","props","_jsx","role","cn","PaginationContent","device","PaginationItem","PaginationLink","variant","isActive","undefined","buttonVariants","tabIndex","PaginationPrevious","isMobile","content","mobile","ChevronRightIcon","size","desktop","_jsxs","_Fragment","children","ChevronsRightIcon","PaginationNext","ChevronLeftIcon","ChevronsLeftIcon","PaginationEllipsis","MoreHorizontalIcon","outline","active","nextPrev","join","pageCount","page","controlledPage","defaultPage","onPageChange","navProps","isControlled","internalPage","setInternalPage","useState","useEffect","changePage","newPage","href","onClick","e","preventDefault","items","i","push","start","Math","max","end","min","renderPages"],"mappings":"0MASA,MACMA,EAAeC,EAAAA,iBAAiB,gBADnB,CAAC,CAAC,OAAQ,CAAEC,EAAG,gBAAiBC,IAAK,aCIlDC,EAAeH,EAAAA,iBAAiB,gBAJnB,CACjB,CAAC,OAAQ,CAAEC,EAAG,iBAAkBC,IAAK,WACrC,CAAC,OAAQ,CAAED,EAAG,iBAAkBC,IAAK,aCEjCE,EAAgBJ,EAAAA,iBAAiB,iBAJpB,CACjB,CAAC,OAAQ,CAAEC,EAAG,gBAAiBC,IAAK,UACpC,CAAC,OAAQ,CAAED,EAAG,iBAAkBC,IAAK,aCGjCG,EAAWL,EAAAA,iBAAiB,WALf,CACjB,CAAC,SAAU,CAAEM,GAAI,KAAMC,GAAI,KAAMC,EAAG,IAAKN,IAAK,WAC9C,CAAC,SAAU,CAAEI,GAAI,KAAMC,GAAI,KAAMC,EAAG,IAAKN,IAAK,WAC9C,CAAC,SAAU,CAAEI,GAAI,IAAKC,GAAI,KAAMC,EAAG,IAAKN,IAAK,aCA/C,SAASO,gBAAeC,UAAEA,KAAcC,IACtC,OACEC,EAAAA,WACEC,KAAK,aAAY,aACN,aAAY,YACb,aACVH,UAAWI,EAAG,qCAAsCJ,MAChDC,GAGV,CAEA,SAASI,mBAAkBL,UACzBA,EAASM,OACTA,KACGL,IAEH,OACEC,EAAAA,IAAA,KAAA,CAAA,YACY,qBACVF,UAAWI,EACT,6BACW,WAAXE,EAAsB,YAAc,QACpCN,MAEEC,GAGV,CAEA,SAASM,mBAAoBN,IAC3B,OAAOC,EAAAA,IAAA,KAAA,CAAA,YAAc,qBAAsBD,GAC7C,CASA,SAASO,gBAAeR,UACtBA,EAASM,OACTA,EAAMG,QACNA,EAAOC,SACPA,KACGT,IAEH,OACEC,EAAAA,wBACgBQ,EAAW,YAASC,EAAS,YACjC,gCACGD,EACbV,UAAWI,EACTQ,eAAe,CACbH,QACc,aAAZA,EAAyBA,EAAUC,EAAW,SAAW,UAC3DJ,WAEFN,GAEFa,SAAUZ,EAAM,oBAAwB,KACpCA,GAGV,CAEA,SAASa,oBAAmBd,UAC1BA,EAASM,OACTA,EAAMG,QACNA,KACGR,IAEH,MAAMc,EAAsB,WAAXT,EAEXU,EAAU,CACdC,OAAQf,EAAAA,IAACgB,GAAiBC,KAAM,KAChCC,QACEC,EAAAA,KAAAC,EAAAA,SAAA,CAAAC,SAAA,CACErB,MAACsB,EAAiB,CAACL,KAAM,KAAM,IAACjB,EAAAA,IAAA,OAAA,CAAAqB,SAAA,aAKtC,OACErB,EAAAA,IAACM,eAAc,CAAA,aACF,sBACXR,UACGe,EAEG,SADA,gEAGNT,OAAQA,EACRG,QAAQ,cACJR,WAEQ,WAAXK,EAAsBU,EAAQC,OAASD,EAAQI,SAGtD,CAEA,SAASK,gBAAezB,UACtBA,EAASM,OACTA,EAAMG,QACNA,KACGR,IAEH,MAAMc,EAAsB,WAAXT,EAEXU,EAAU,CACdC,OAAQf,EAAAA,IAACwB,EAAAA,aAAgBP,KAAM,KAC/BC,QACEC,EAAAA,KAAAC,WAAA,CAAAC,SAAA,CACErB,EAAAA,IAAA,OAAA,CAAAqB,SAAA,SACArB,EAAAA,IAACyB,EAAgB,CAACR,KAAM,SAK9B,OACEjB,EAAAA,IAACM,eAAc,CAAA,aACF,kBACXR,UACGe,EAEG,SADA,gEAGNT,OAAQA,EACRG,QAAQ,cACJR,WAEQ,WAAXK,EAAsBU,EAAQC,OAASD,EAAQI,SAGtD,CAEA,SAASQ,oBAAmB5B,UAC1BA,KACGC,IAEH,OACEC,EAAAA,IAAA,OAAA,CAAA,eAAA,EAAA,YAEY,sBACVF,UAAWI,EAAG,0CAA2CJ,MACrDC,EAAKsB,SAETrB,EAAAA,IAAC2B,EAAkB,CAAC7B,UAAU,YAGpC,CAIA,SAASY,gBAAeH,QACtBA,EAAOH,OACPA,IAKA,MAAMS,EAAsB,WAAXT,EAcjB,MAAO,CAZMF,EAAG,CACd,kDAAkD,EAClD,sCAAuCW,EACvC,uCAAwCA,IAGM,CAC9Ce,QAAS,2DACTC,OAAQ,wBACRC,SAAU,4DAGWvB,IAAUwB,KAAK,IACxC,oBAc4D,EAC1DC,YACAC,KAAMC,EACNC,cAAc,EACdC,eACAtC,YACAe,cACGwB,MAEH,MAAMC,OAAkC7B,IAAnByB,GACdK,EAAcC,GAAmBC,EAAAA,SAASN,GAE3CF,EAAOK,EAAeJ,EAAkBK,EAExCnC,EAASS,EAAW,SAAW,UAErC6B,EAAAA,UAAU,KACHJ,GAAcE,EAAgBL,IAClC,CAACA,EAAaG,IAEjB,MAAMK,WAAcC,IACbN,GAAcE,EAAgBI,GACnCR,IAAeQ,IA6GjB,OACE5C,MAACH,eAAc,CAACC,UAAWA,KAAeuC,EAAQhB,SAChDF,EAAAA,KAAChB,kBAAiB,CAACC,OAAO,SAAQiB,SAAA,CAChCrB,EAAAA,IAACK,eAAc,CAAAgB,SACbrB,EAAAA,IAACY,oBACCiC,KAAK,IACLC,QAAUC,IACRA,EAAEC,iBACEf,EAAO,GAAGU,WAAWV,EAAO,IAElC1B,QAAQ,WACRH,OAAQA,EAAM,gBACU,IAAT6B,EACftB,SAAmB,IAATsB,GAAa,EAAK,MAvHtC,WACE,MAAMgB,EAA2B,GAEjC,GAAIjB,GAAa,EACf,IAAK,IAAIkB,EAAI,EAAGA,GAAKlB,EAAWkB,IAC9BD,EAAME,KACJnD,EAAAA,IAACK,eAAc,CAAAgB,SACbrB,EAAAA,IAACM,eAAc,CACbuC,KAAK,IACLrC,SAAUyB,IAASiB,EACnB3C,QAAQ,OACRH,OAAQA,EACR0C,QAAUC,IACRA,EAAEC,iBACEf,IAASiB,GAAGP,WAAWO,IAC5B,gBACcjB,IAASiB,EACxBvC,SAAUsB,IAASiB,GAAI,EAAK,EAAC7B,SAE5B6B,KAbgBA,QAkBpB,CAELD,EAAME,KACJnD,EAAAA,IAACK,eAAc,CAAAgB,SACbrB,EAAAA,IAACM,eAAc,CACbuC,KAAK,IACLrC,SAAmB,IAATyB,EACV7B,OAAQA,EACRG,QAAQ,OACRuC,QAAUC,IACRA,EAAEC,iBACW,IAATf,GAAYU,WAAW,IAC5B,gBACuB,IAATV,EACftB,SAAmB,IAATsB,GAAa,EAAK,kBAXX,IAkBnBA,EAAO,GACTgB,EAAME,KACJnD,MAACK,eAAc,CAAAgB,SACbrB,EAAAA,IAAC0B,mBAAkB,CAAA,IADD,mBAMxB,MAAM0B,EAAQC,KAAKC,IAAI,EAAGrB,EAAO,GAC3BsB,EAAMF,KAAKG,IAAIxB,EAAY,EAAGC,EAAO,GAC3C,IAAK,IAAIiB,EAAIE,EAAOF,GAAKK,EAAKL,IAC5BD,EAAME,KACJnD,EAAAA,IAACK,eAAc,CAAAgB,SACbrB,EAAAA,IAACM,eAAc,CACbuC,KAAK,IACLrC,SAAUyB,IAASiB,EACnB9C,OAAQA,EACRG,QAAQ,OACRuC,QAAUC,IACRA,EAAEC,iBACEf,IAASiB,GAAGP,WAAWO,IAC5B,gBACcjB,IAASiB,EACxBvC,SAAUsB,IAASiB,GAAI,EAAK,EAAC7B,SAE5B6B,KAbgBA,IAmBrBjB,EAAOD,EAAY,GACrBiB,EAAME,KACJnD,MAACK,eAAc,CAAAgB,SACbrB,EAAAA,IAAC0B,mBAAkB,CAAA,IADD,iBAMxBuB,EAAME,KACJnD,EAAAA,IAACK,eAAc,CAAAgB,SACbrB,EAAAA,IAACM,eAAc,CACbuC,KAAK,IACLrC,SAAUyB,IAASD,EACnB5B,OAAQA,EACRG,QAAQ,OACRuC,QAAUC,IACRA,EAAEC,iBACEf,IAASD,GAAWW,WAAWX,IACpC,gBACcC,IAASD,EACxBrB,SAAUsB,IAASD,GAAY,EAAK,EAACX,SAEpCW,KAbgBA,GAiBzB,CACA,OAAOiB,CACT,CAkBOQ,GACDzD,MAACK,eAAc,CAAAgB,SACbrB,MAACuB,eAAc,CACbsB,KAAK,IACLC,QAAUC,IACRA,EAAEC,iBACEf,EAAOD,GAAWW,WAAWV,EAAO,IAE1C1B,QAAQ,WACRH,OAAQA,EAAM,gBACC6B,IAASD,EACxBrB,SAAUsB,IAASD,KAAiB","x_google_ignoreList":[0,1,2,3]}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),i=require("react"),t=require("./licensing.js");exports.withLicenseProtection=function(r,n){const s=i.forwardRef((i,s)=>t.canUseComponents()?e.jsx(r,{...i,ref:s}):e.jsxs("div",{style:{padding:"16px",border:"2px dashed #ef4444",borderRadius:"8px",backgroundColor:"#fef2f2",color:"#dc2626",textAlign:"center",fontFamily:"system-ui, sans-serif",fontSize:"14px",maxWidth:"400px",margin:"16px auto"},children:[e.jsx("div",{style:{fontWeight:"bold",marginBottom:"8px"},children:"🔒 License Required"}),e.jsxs("div",{style:{marginBottom:"8px"},children:['Component "',n,'" requires a valid license key.']}),e.jsx("div",{style:{fontSize:"12px",opacity:.8},children:"Please initialize Automoby Kit with your license key before using components."})]}));return s.displayName=`Protected(${n})`,s};
|
|
2
|
+
//# sourceMappingURL=ProtectedComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtectedComponent.js","sources":["../../src/components/ProtectedComponent.tsx"],"sourcesContent":["import React from 'react';\nimport { canUseComponents } from '../licensing';\n\n/**\n * Higher-order component that protects components with license validation\n */\nexport function withLicenseProtection<T extends object>(\n Component: React.ComponentType<T>,\n componentName: string,\n) {\n const ProtectedComponent = React.forwardRef<unknown, T>((props, ref) => {\n if (!canUseComponents()) {\n // Return a placeholder component with error styling\n return (\n <div\n style={{\n padding: '16px',\n border: '2px dashed #ef4444',\n borderRadius: '8px',\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n textAlign: 'center',\n fontFamily: 'system-ui, sans-serif',\n fontSize: '14px',\n maxWidth: '400px',\n margin: '16px auto',\n }}\n >\n <div style={{ fontWeight: 'bold', marginBottom: '8px' }}>\n 🔒 License Required\n </div>\n <div style={{ marginBottom: '8px' }}>\n Component "{componentName}" requires a valid license key.\n </div>\n <div style={{ fontSize: '12px', opacity: 0.8 }}>\n Please initialize Automoby Kit with your license key before using\n components.\n </div>\n </div>\n );\n }\n\n // If license is valid, render the actual component\n // Use type assertion to handle the generic component props properly\n return <Component {...(props as T)} ref={ref} />;\n });\n\n ProtectedComponent.displayName = `Protected(${componentName})`;\n\n return ProtectedComponent;\n}\n"],"names":["Component","componentName","ProtectedComponent","React","forwardRef","props","ref","canUseComponents","_jsx","_jsxs","style","padding","border","borderRadius","backgroundColor","color","textAlign","fontFamily","fontSize","maxWidth","margin","children","fontWeight","marginBottom","opacity","displayName"],"mappings":"6HAMM,SACJA,EACAC,GAEA,MAAMC,EAAqBC,EAAMC,WAAuB,CAACC,EAAOC,IACzDC,EAAAA,mBAiCEC,EAAAA,IAACR,EAAS,IAAMK,EAAaC,IAAKA,IA9BrCG,EAAAA,KAAA,MAAA,CACEC,MAAO,CACLC,QAAS,OACTC,OAAQ,qBACRC,aAAc,MACdC,gBAAiB,UACjBC,MAAO,UACPC,UAAW,SACXC,WAAY,wBACZC,SAAU,OACVC,SAAU,QACVC,OAAQ,aACTC,SAAA,CAEDb,EAAAA,WAAKE,MAAO,CAAEY,WAAY,OAAQC,aAAc,OAAOF,SAAA,wBAGvDZ,EAAAA,YAAKC,MAAO,CAAEa,aAAc,+BACTtB,EAAa,qCAEhCO,EAAAA,IAAA,MAAA,CAAKE,MAAO,CAAEQ,SAAU,OAAQM,QAAS,IAAKH,SAAA,sFAetD,OAFAnB,EAAmBuB,YAAc,aAAaxB,KAEvCC,CACT"}
|
package/dist/cjs/RadioGroup.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var e=require("
|
|
1
|
+
"use client";"use strict";var e=require("react/jsx-runtime"),r=require("react"),i=require("./utils.js");const RadioButton=({selected:r,disabled:s,isMobile:a})=>{const l=a?"size-5":"size-6";return r?e.jsxs("div",{className:i("relative flex items-center justify-center",l),children:[e.jsx("div",{className:i("absolute inset-0 rounded-full border-2",s?"bg-neutral-light border-neutral-light":"bg-primary border-primary")}),e.jsx("div",{className:i("absolute rounded-full bg-white",a?"inset-[5px]":"inset-1.5")})]}):e.jsx("div",{className:i("relative flex items-center justify-center",l),children:e.jsx("div",{className:i("absolute inset-0 rounded-full border",a?"border":"border-[1.5px]",s?"border-neutral-light":"border-midnight")})})},RadioOptionComponent=({option:s,selected:a,disabled:l,onClick:t,name:n,isMobile:d})=>{const[o,c]=r.useState(!1),getTextColor=()=>l?"text-midnight":a?"text-primary":"text-neutral-dark";return e.jsx("div",{className:i("relative rounded-lg border-[1.5px] cursor-pointer transition-all duration-200",l?"bg-neutral-lighter":a?"bg-primary-lightest":o?"bg-primary-lightest/20":"bg-white",a?"border-primary":"border-transparent",l?"":"shadow-[0px_2px_4px_0px_rgba(0,0,0,0.08)]",l&&"cursor-not-allowed"),onClick:l?void 0:t,onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),onKeyDown:e=>{"Enter"!==e.key&&" "!==e.key||l||(e.preventDefault(),t())},tabIndex:l?-1:0,role:"radio","aria-checked":a,"aria-disabled":l,children:e.jsx("div",{className:"flex flex-row items-center justify-end relative w-full",children:e.jsx("div",{className:i("box-border flex flex-row items-center justify-end relative w-full",d?"gap-2 px-4 py-3":"gap-4 px-6 py-4"),children:e.jsxs("div",{className:i("flex flex-row items-center justify-end p-0 relative shrink-0",d?"gap-2":"gap-3"),children:[e.jsx("input",{type:"radio",name:n,value:s.id,checked:a,disabled:l,onChange:t,className:"sr-only","aria-label":s.label}),e.jsx("div",{className:"flex flex-col gap-0.5 items-end justify-start p-0 relative shrink-0",children:e.jsx("div",{className:i("font-sans font-bold text-nowrap text-right transition-colors duration-200",d?"text-[14px] leading-[24px]":"text-[16px] leading-normal",getTextColor()),children:e.jsx("p",{className:"whitespace-pre",dir:"auto",children:s.label})})}),s.icon&&e.jsx("div",{className:i("flex items-center justify-center shrink-0 transition-colors duration-200",d?"size-6":"size-7",getTextColor()),children:s.icon}),e.jsx("div",{className:"flex flex-col items-start justify-start p-0 relative shrink-0",children:e.jsx(RadioButton,{selected:a,disabled:l,isMobile:d})})]})})})})},s=r.forwardRef(({options:r,value:s,onChange:a,name:l,disabled:t=!1,className:n,isMobile:d,direction:o="vertical",...c},x)=>e.jsx("div",{ref:x,className:"horizontal"===o?i("flex flex-row gap-2",d?"flex-wrap":"flex-nowrap",n):i("flex flex-col gap-2",n),role:"radiogroup",...c,children:r.map(r=>e.jsx(RadioOptionComponent,{option:r,selected:s===r.id,disabled:t||r.disabled,onClick:()=>{return e=r.id,void(!t&&a&&a(e));var e},name:l,isMobile:d},r.id))}));s.displayName="RadioGroup",exports.RadioGroup=s;
|
|
2
|
+
//# sourceMappingURL=RadioGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadioGroup.js","sources":["../../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import React from 'react';\nimport cn from '@/utils/cn';\n\nexport interface RadioOption {\n /**\n * Unique identifier for the radio option\n */\n id: string;\n /**\n * Display label for the option\n */\n label: string;\n /**\n * Optional icon element\n */\n icon?: React.ReactNode;\n /**\n * Whether this option is disabled\n */\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /**\n * Array of radio options\n */\n options: RadioOption[];\n /**\n * Currently selected option ID\n */\n value?: string;\n /**\n * Callback when selection changes\n */\n onChange?: (value: string) => void;\n /**\n * Name attribute for the radio group\n */\n name: string;\n /**\n * Whether the entire group is disabled\n */\n disabled?: boolean;\n /**\n * Custom class name\n */\n className?: string;\n /**\n * Whether the component is in mobile mode\n */\n isMobile: boolean;\n /**\n * Layout direction of radio options\n */\n direction?: 'vertical' | 'horizontal';\n}\n\ninterface RadioButtonProps {\n /**\n * Whether the radio is selected\n */\n selected: boolean;\n /**\n * Whether the radio is disabled\n */\n disabled?: boolean;\n /**\n * Whether in mobile mode\n */\n isMobile: boolean;\n}\n\nconst RadioButton: React.FC<RadioButtonProps> = ({\n selected,\n disabled,\n isMobile,\n}) => {\n const size = isMobile ? 'size-5' : 'size-6';\n\n if (selected) {\n return (\n <div className={cn('relative flex items-center justify-center', size)}>\n {/* Outer circle - filled when selected */}\n <div\n className={cn(\n 'absolute inset-0 rounded-full border-2',\n disabled\n ? 'bg-neutral-light border-neutral-light'\n : 'bg-primary border-primary',\n )}\n />\n {/* Inner white circle */}\n <div\n className={cn(\n 'absolute rounded-full bg-white',\n isMobile ? 'inset-[5px]' : 'inset-1.5',\n )}\n />\n </div>\n );\n }\n\n return (\n <div className={cn('relative flex items-center justify-center', size)}>\n {/* Empty circle border */}\n <div\n className={cn(\n 'absolute inset-0 rounded-full border',\n isMobile ? 'border' : 'border-[1.5px]',\n disabled ? 'border-neutral-light' : 'border-midnight',\n )}\n />\n </div>\n );\n};\n\ninterface RadioOptionComponentProps {\n /**\n * Radio option data\n */\n option: RadioOption;\n /**\n * Whether this option is selected\n */\n selected: boolean;\n /**\n * Whether the option is disabled\n */\n disabled?: boolean;\n /**\n * Click handler\n */\n onClick: () => void;\n /**\n * Name attribute for radio input\n */\n name: string;\n /**\n * Whether in mobile mode\n */\n isMobile: boolean;\n}\n\nconst RadioOptionComponent: React.FC<RadioOptionComponentProps> = ({\n option,\n selected,\n disabled,\n onClick,\n name,\n isMobile,\n}) => {\n const [isHovered, setIsHovered] = React.useState(false);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault();\n onClick();\n }\n };\n\n const getBackgroundColor = () => {\n if (disabled) return 'bg-neutral-lighter';\n if (selected) return 'bg-primary-lightest';\n if (isHovered) return 'bg-primary-lightest/20';\n return 'bg-white';\n };\n\n const getBorderColor = () => {\n if (selected) return 'border-primary';\n return 'border-transparent';\n };\n\n const getTextColor = () => {\n if (disabled) return 'text-midnight';\n if (selected) return 'text-primary';\n return 'text-neutral-dark';\n };\n\n const getShadow = () => {\n if (disabled) return '';\n return 'shadow-[0px_2px_4px_0px_rgba(0,0,0,0.08)]';\n };\n\n return (\n <div\n className={cn(\n 'relative rounded-lg border-[1.5px] cursor-pointer transition-all duration-200',\n getBackgroundColor(),\n getBorderColor(),\n getShadow(),\n disabled && 'cursor-not-allowed',\n )}\n onClick={disabled ? undefined : onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onKeyDown={handleKeyDown}\n tabIndex={disabled ? -1 : 0}\n role=\"radio\"\n aria-checked={selected}\n aria-disabled={disabled}\n >\n <div className=\"flex flex-row items-center justify-end relative w-full\">\n <div\n className={cn(\n 'box-border flex flex-row items-center justify-end relative w-full',\n isMobile ? 'gap-2 px-4 py-3' : 'gap-4 px-6 py-4',\n )}\n >\n <div\n className={cn(\n 'flex flex-row items-center justify-end p-0 relative shrink-0',\n isMobile ? 'gap-2' : 'gap-3',\n )}\n >\n {/* Hidden native radio input for accessibility */}\n <input\n type=\"radio\"\n name={name}\n value={option.id}\n checked={selected}\n disabled={disabled}\n onChange={onClick}\n className=\"sr-only\"\n aria-label={option.label}\n />\n\n {/* Text Label */}\n <div className=\"flex flex-col gap-0.5 items-end justify-start p-0 relative shrink-0\">\n <div\n className={cn(\n 'font-sans font-bold text-nowrap text-right transition-colors duration-200',\n isMobile\n ? 'text-[14px] leading-[24px]'\n : 'text-[16px] leading-normal',\n getTextColor(),\n )}\n >\n <p className=\"whitespace-pre\" dir=\"auto\">\n {option.label}\n </p>\n </div>\n </div>\n\n {/* Optional Icon */}\n {option.icon && (\n <div\n className={cn(\n 'flex items-center justify-center shrink-0 transition-colors duration-200',\n isMobile ? 'size-6' : 'size-7',\n getTextColor(),\n )}\n >\n {option.icon}\n </div>\n )}\n\n {/* Radio Button */}\n <div className=\"flex flex-col items-start justify-start p-0 relative shrink-0\">\n <RadioButton\n selected={selected}\n disabled={disabled}\n isMobile={isMobile}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nconst RadioGroup = React.forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n options,\n value,\n onChange,\n name,\n disabled = false,\n className,\n isMobile,\n direction = 'vertical',\n ...props\n },\n ref,\n ) => {\n const handleOptionClick = (optionId: string) => {\n if (!disabled && onChange) {\n onChange(optionId);\n }\n };\n\n const getContainerClasses = () => {\n if (direction === 'horizontal') {\n return cn(\n 'flex flex-row gap-2',\n isMobile ? 'flex-wrap' : 'flex-nowrap',\n className,\n );\n }\n return cn('flex flex-col gap-2', className);\n };\n\n return (\n <div\n ref={ref}\n className={getContainerClasses()}\n role=\"radiogroup\"\n {...props}\n >\n {options.map((option) => (\n <RadioOptionComponent\n key={option.id}\n option={option}\n selected={value === option.id}\n disabled={disabled || option.disabled}\n onClick={() => handleOptionClick(option.id)}\n name={name}\n isMobile={isMobile}\n />\n ))}\n </div>\n );\n },\n);\n\nRadioGroup.displayName = 'RadioGroup';\n\nexport { RadioGroup };\n"],"names":["RadioButton","selected","disabled","isMobile","size","_jsxs","className","cn","children","_jsx","RadioOptionComponent","option","onClick","name","isHovered","setIsHovered","React","useState","getTextColor","undefined","onMouseEnter","onMouseLeave","onKeyDown","e","key","preventDefault","tabIndex","role","type","value","id","checked","onChange","label","dir","icon","RadioGroup","forwardRef","options","direction","props","ref","map","handleOptionClick","optionId","displayName"],"mappings":"wGAyEA,MAAMA,YAA0C,EAC9CC,WACAC,WACAC,eAEA,MAAMC,EAAOD,EAAW,SAAW,SAEnC,OAAIF,EAEAI,EAAAA,KAAA,MAAA,CAAKC,UAAWC,EAAG,4CAA6CH,GAAKI,SAAA,CAEnEC,EAAAA,WACEH,UAAWC,EACT,yCACAL,EACI,wCACA,+BAIRO,EAAAA,WACEH,UAAWC,EACT,iCACAJ,EAAW,cAAgB,kBAQnCM,EAAAA,IAAA,MAAA,CAAKH,UAAWC,EAAG,4CAA6CH,GAAKI,SAEnEC,EAAAA,WACEH,UAAWC,EACT,uCACAJ,EAAW,SAAW,iBACtBD,EAAW,uBAAyB,wBAkCxCQ,qBAA4D,EAChEC,SACAV,WACAC,WACAU,UACAC,OACAV,eAEA,MAAOW,EAAWC,GAAgBC,EAAMC,UAAS,GAqB3CC,aAAe,IACfhB,EAAiB,gBACjBD,EAAiB,eACd,oBAQT,OACEQ,MAAA,MAAA,CACEH,UAAWC,EACT,gFAzBAL,EAAiB,qBACjBD,EAAiB,sBACjBa,EAAkB,yBACf,WAIHb,EAAiB,iBACd,qBAUHC,EAAiB,GACd,4CAUHA,GAAY,sBAEdU,QAASV,OAAWiB,EAAYP,EAChCQ,aAAc,IAAML,GAAa,GACjCM,aAAc,IAAMN,GAAa,GACjCO,UA1CmBC,IACN,UAAVA,EAAEC,KAA6B,MAAVD,EAAEC,KAAiBtB,IAC3CqB,EAAEE,iBACFb,MAwCAc,SAAUxB,GAAW,EAAK,EAC1ByB,KAAK,QAAO,eACE1B,EAAQ,gBACPC,WAEfO,EAAAA,IAAA,MAAA,CAAKH,UAAU,yDAAwDE,SACrEC,EAAAA,IAAA,MAAA,CACEH,UAAWC,EACT,oEACAJ,EAAW,kBAAoB,mBAChCK,SAEDH,EAAAA,YACEC,UAAWC,EACT,+DACAJ,EAAW,QAAU,SACtBK,SAAA,CAGDC,EAAAA,IAAA,QAAA,CACEmB,KAAK,QACLf,KAAMA,EACNgB,MAAOlB,EAAOmB,GACdC,QAAS9B,EACTC,SAAUA,EACV8B,SAAUpB,EACVN,UAAU,uBACEK,EAAOsB,QAIrBxB,EAAAA,WAAKH,UAAU,sEAAqEE,SAClFC,EAAAA,WACEH,UAAWC,EACT,4EACAJ,EACI,6BACA,6BACJe,gBACDV,SAEDC,EAAAA,IAAA,IAAA,CAAGH,UAAU,iBAAiB4B,IAAI,OAAM1B,SACrCG,EAAOsB,YAMbtB,EAAOwB,MACN1B,EAAAA,IAAA,MAAA,CACEH,UAAWC,EACT,2EACAJ,EAAW,SAAW,SACtBe,gBACDV,SAEAG,EAAOwB,OAKZ1B,EAAAA,WAAKH,UAAU,gEAA+DE,SAC5EC,EAAAA,IAACT,YAAW,CACVC,SAAUA,EACVC,SAAUA,EACVC,SAAUA,gBAUpBiC,EAAapB,EAAMqB,WACvB,EAEIC,UACAT,QACAG,WACAnB,OACAX,YAAW,EACXI,YACAH,WACAoC,YAAY,cACTC,GAELC,IAoBEhC,EAAAA,IAAA,MAAA,CACEgC,IAAKA,EACLnC,UAbgB,eAAdiC,EACKhC,EACL,sBACAJ,EAAW,YAAc,cACzBG,GAGGC,EAAG,sBAAuBD,GAO/BqB,KAAK,gBACDa,EAAKhC,SAER8B,EAAQI,IAAK/B,GACZF,EAAAA,IAACC,qBAAoB,CAEnBC,OAAQA,EACRV,SAAU4B,IAAUlB,EAAOmB,GAC3B5B,SAAUA,GAAYS,EAAOT,SAC7BU,QAAS,KAAM+B,OA9BIC,EA8BcjC,EAAOmB,SA7BzC5B,GAAY8B,GACfA,EAASY,IAFa,IAACA,GA+BnB/B,KAAMA,EACNV,SAAUA,GANLQ,EAAOmB,QAcxBM,EAAWS,YAAc"}
|
package/dist/cjs/Tabs.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),t=require("react"),i=require("./utils.js");const renderBadge=(t,r,a,s)=>void 0===t?null:e.jsx("div",{className:i("flex items-center justify-center rounded-[5px] font-sans font-bold text-white","transition-colors duration-200",s?"size-6 text-[14px] pt-0.5":"size-[25px] text-[14px] pt-[3px]",a?"bg-midnight":r?"bg-primary":"bg-neutral-main"),children:e.jsx("p",{className:"leading-[24px] whitespace-pre",dir:"auto",children:t})}),renderTabContent=(t,r,a)=>{const s=void 0!==t.count;return e.jsxs("div",{className:i("flex flex-row items-center justify-start transition-colors duration-200","gap-1.5"),children:[s&&renderBadge(t.count,r,t.disabled,a),e.jsx("div",{className:i("font-sans text-nowrap text-right transition-colors duration-200",a?"text-[14px]":r?"text-[16px]":"text-[18px]",t.disabled?"font-normal text-midnight":r?"font-bold text-primary":"font-normal text-neutral-main",a?"leading-[24px]":r?"leading-normal":"leading-[1.9]"),children:e.jsx("p",{className:"whitespace-pre",dir:"auto",children:t.label})})]})},r=t.forwardRef(({items:t,activeTab:r,onTabChange:a,className:s,isMobile:l,...n},d)=>e.jsxs("div",{ref:d,className:i("relative w-full",s),...n,children:[e.jsx("div",{className:"box-border flex flex-row items-center justify-end p-0 relative w-full",children:t.map(t=>((t,r,a,s)=>{const l=t.id===r;return e.jsxs("div",{className:i("box-border flex flex-col items-center justify-between relative shrink-0","cursor-pointer transition-all duration-200",a?"h-12 px-3":"h-14 px-4",l?a?"pt-[11px] pb-0":"pt-3.5 pb-0":"py-0 justify-center",t.disabled&&"cursor-not-allowed opacity-50",!t.disabled&&"hover:opacity-80"),onClick:()=>((e,t,i)=>{t||i(e)})(t.id,t.disabled,s),onKeyDown:e=>((e,t,i,r)=>{"Enter"!==e.key&&" "!==e.key||i||(e.preventDefault(),r(t))})(e,t.id,t.disabled,s),tabIndex:t.disabled?-1:0,role:"tab","aria-selected":l,"aria-disabled":t.disabled,children:[renderTabContent(t,l,a),l&&e.jsx("div",{className:"bg-primary h-1 rounded-tl-[8px] rounded-tr-[8px] shrink-0 w-full"})]},t.id)})(t,r,l,a))}),e.jsx("div",{className:"absolute border-midnight-light border-[0px_0px_1px] border-solid bottom-[-0.5px] left-0 right-0 top-0 pointer-events-none"})]}));r.displayName="Tabs",exports.Tabs=r;
|
|
2
|
+
//# sourceMappingURL=Tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.js","sources":["../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import React from 'react';\nimport cn from '@/utils/cn';\n\nexport interface TabItem {\n /**\n * Unique identifier for the tab\n */\n id: string;\n /**\n * Display label for the tab\n */\n label: string;\n /**\n * Badge count number (optional)\n */\n count?: number;\n /**\n * Whether the tab is disabled\n */\n disabled?: boolean;\n}\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Array of tab items\n */\n items: TabItem[];\n /**\n * Currently active tab ID\n */\n activeTab: string;\n /**\n * Callback when tab is clicked\n */\n onTabChange: (tabId: string) => void;\n /**\n * Custom class name\n */\n className?: string;\n /**\n * Whether the component is in mobile mode\n */\n isMobile: boolean;\n}\n\n// Helper functions moved outside component\nconst handleTabClick = (\n tabId: string,\n disabled: boolean | undefined,\n onTabChange: (tabId: string) => void,\n) => {\n if (!disabled) {\n onTabChange(tabId);\n }\n};\n\nconst handleKeyDown = (\n e: React.KeyboardEvent,\n tabId: string,\n disabled: boolean | undefined,\n onTabChange: (tabId: string) => void,\n) => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault();\n onTabChange(tabId);\n }\n};\n\nconst renderBadge = (\n count: number | undefined,\n isActive: boolean | undefined,\n disabled: boolean | undefined,\n isMobile: boolean,\n) => {\n if (count === undefined) return null;\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center rounded-[5px] font-sans font-bold text-white',\n 'transition-colors duration-200',\n isMobile\n ? 'size-6 text-[14px] pt-0.5'\n : 'size-[25px] text-[14px] pt-[3px]',\n disabled ? 'bg-midnight' : isActive ? 'bg-primary' : 'bg-neutral-main',\n )}\n >\n <p className=\"leading-[24px] whitespace-pre\" dir=\"auto\">\n {count}\n </p>\n </div>\n );\n};\n\nconst renderTabContent = (\n item: TabItem,\n isActive: boolean,\n isMobile: boolean,\n) => {\n const hasCount = item.count !== undefined;\n\n return (\n <div\n className={cn(\n 'flex flex-row items-center justify-start transition-colors duration-200',\n isMobile ? 'gap-1.5' : 'gap-1.5',\n )}\n >\n {hasCount && renderBadge(item.count, isActive, item.disabled, isMobile)}\n <div\n className={cn(\n 'font-sans text-nowrap text-right transition-colors duration-200',\n isMobile ? 'text-[14px]' : isActive ? 'text-[16px]' : 'text-[18px]',\n item.disabled\n ? 'font-normal text-midnight'\n : isActive\n ? 'font-bold text-primary'\n : 'font-normal text-neutral-main',\n isMobile\n ? 'leading-[24px]'\n : isActive\n ? 'leading-normal'\n : 'leading-[1.9]',\n )}\n >\n <p className=\"whitespace-pre\" dir=\"auto\">\n {item.label}\n </p>\n </div>\n </div>\n );\n};\n\nconst renderTab = (\n item: TabItem,\n activeTab: string,\n isMobile: boolean,\n onTabChange: (tabId: string) => void,\n) => {\n const isActive = item.id === activeTab;\n\n return (\n <div\n key={item.id}\n className={cn(\n 'box-border flex flex-col items-center justify-between relative shrink-0',\n 'cursor-pointer transition-all duration-200',\n isMobile ? 'h-12 px-3' : 'h-14 px-4',\n isActive\n ? isMobile\n ? 'pt-[11px] pb-0'\n : 'pt-3.5 pb-0'\n : 'py-0 justify-center',\n item.disabled && 'cursor-not-allowed opacity-50',\n !item.disabled && 'hover:opacity-80',\n )}\n onClick={() => handleTabClick(item.id, item.disabled, onTabChange)}\n onKeyDown={(e) => handleKeyDown(e, item.id, item.disabled, onTabChange)}\n tabIndex={item.disabled ? -1 : 0}\n role=\"tab\"\n aria-selected={isActive}\n aria-disabled={item.disabled}\n >\n {renderTabContent(item, isActive, isMobile)}\n\n {/* Active indicator line */}\n {isActive && (\n <div className=\"bg-primary h-1 rounded-tl-[8px] rounded-tr-[8px] shrink-0 w-full\" />\n )}\n </div>\n );\n};\n\nconst Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n ({ items, activeTab, onTabChange, className, isMobile, ...props }, ref) => {\n return (\n <div ref={ref} className={cn('relative w-full', className)} {...props}>\n <div className=\"box-border flex flex-row items-center justify-end p-0 relative w-full\">\n {items.map((item) =>\n renderTab(item, activeTab, isMobile, onTabChange),\n )}\n </div>\n\n {/* Bottom border line */}\n <div className=\"absolute border-midnight-light border-[0px_0px_1px] border-solid bottom-[-0.5px] left-0 right-0 top-0 pointer-events-none\" />\n </div>\n );\n },\n);\n\nTabs.displayName = 'Tabs';\n\nexport { Tabs };\n"],"names":["renderBadge","count","isActive","disabled","isMobile","undefined","_jsx","className","cn","children","dir","renderTabContent","item","hasCount","_jsxs","label","Tabs","React","forwardRef","items","activeTab","onTabChange","props","ref","map","id","onClick","tabId","handleTabClick","onKeyDown","e","key","preventDefault","handleKeyDown","tabIndex","role","renderTab","displayName"],"mappings":"2FA8CA,MAsBMA,YAAc,CAClBC,EACAC,EACAC,EACAC,SAEcC,IAAVJ,EAA4B,KAG9BK,EAAAA,IAAA,MAAA,CACEC,UAAWC,EACT,gFACA,iCACAJ,EACI,4BACA,mCACJD,EAAW,cAAgBD,EAAW,aAAe,mBACtDO,SAEDH,EAAAA,IAAA,IAAA,CAAGC,UAAU,gCAAgCG,IAAI,OAAMD,SACpDR,MAMHU,iBAAmB,CACvBC,EACAV,EACAE,KAEA,MAAMS,OAA0BR,IAAfO,EAAKX,MAEtB,OACEa,EAAAA,KAAA,MAAA,CACEP,UAAWC,EACT,0EACW,WACZC,SAAA,CAEAI,GAAYb,YAAYY,EAAKX,MAAOC,EAAUU,EAAKT,SAAUC,GAC9DE,EAAAA,IAAA,MAAA,CACEC,UAAWC,EACT,kEACAJ,EAAW,cAAgBF,EAAW,cAAgB,cACtDU,EAAKT,SACD,4BACAD,EACE,yBACA,gCACNE,EACI,iBACAF,EACE,iBACA,iBACPO,SAEDH,EAAAA,SAAGC,UAAU,iBAAiBG,IAAI,OAAMD,SACrCG,EAAKG,cA+CVC,EAAOC,EAAMC,WACjB,EAAGC,QAAOC,YAAWC,cAAad,YAAWH,cAAakB,GAASC,IAE/DT,EAAAA,YAAKS,IAAKA,EAAKhB,UAAWC,EAAG,kBAAmBD,MAAgBe,EAAKb,SAAA,CACnEH,EAAAA,IAAA,MAAA,CAAKC,UAAU,wEAAuEE,SACnFU,EAAMK,IAAKZ,GA7CJ,EAChBA,EACAQ,EACAhB,EACAiB,KAEA,MAAMnB,EAAWU,EAAKa,KAAOL,EAE7B,OACEN,EAAAA,YAEEP,UAAWC,EACT,0EACA,6CACAJ,EAAW,YAAc,YACzBF,EACIE,EACE,iBACA,cACF,sBACJQ,EAAKT,UAAY,iCAChBS,EAAKT,UAAY,oBAEpBuB,QAAS,IA9GQ,EACrBC,EACAxB,EACAkB,KAEKlB,GACHkB,EAAYM,IAwGKC,CAAehB,EAAKa,GAAIb,EAAKT,SAAUkB,GACtDQ,UAAYC,GArGI,EACpBA,EACAH,EACAxB,EACAkB,KAEe,UAAVS,EAAEC,KAA6B,MAAVD,EAAEC,KAAiB5B,IAC3C2B,EAAEE,iBACFX,EAAYM,KA6FQM,CAAcH,EAAGlB,EAAKa,GAAIb,EAAKT,SAAUkB,GAC3Da,SAAUtB,EAAKT,UAAW,EAAK,EAC/BgC,KAAK,MAAK,gBACKjC,EAAQ,gBACRU,EAAKT,SAAQM,SAAA,CAE3BE,iBAAiBC,EAAMV,EAAUE,GAGjCF,GACCI,EAAAA,WAAKC,UAAU,uEAxBZK,EAAKa,KAoCJW,CAAUxB,EAAMQ,EAAWhB,EAAUiB,MAKzCf,EAAAA,IAAA,MAAA,CAAKC,UAAU,kIAMvBS,EAAKqB,YAAc"}
|
package/dist/cjs/Typography.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
1
|
"use strict";var t=require("react"),e=require("./utils.js");const o={h1:"text-[36px] font-[var(--font-weight-fat)]",h2:"text-[32px] font-[var(--font-weight-fat)]",h3:"text-[28px] font-[var(--font-weight-fat)]",h4:"text-[24px] font-[var(--font-weight-heavy)]",h5:"text-[22px] font-[var(--font-weight-heavy)]",h6:"text-[20px] font-[var(--font-weight-heavy)]","body-xl-heavy":"text-[20px] font-[var(--font-weight-heavy)]","body-l-heavy":"text-[18px] font-[var(--font-weight-heavy)]","body-l-bold":"text-[18px] font-[var(--font-weight-bold)]","body-l-medium":"text-[18px] font-[var(--font-weight-medium)]","body-m-heavy":"text-[16px] font-[var(--font-weight-heavy)]","body-m-bold":"text-[16px] font-[var(--font-weight-bold)]","body-m-medium":"text-[16px] font-[var(--font-weight-medium)]","body-s-heavy":"text-[14px] font-[var(--font-weight-heavy)]","body-s-bold":"text-[14px] font-[var(--font-weight-bold)]","body-s-medium":"text-[14px] font-[var(--font-weight-medium)]","body-ms-bold":"text-[13px] font-[var(--font-weight-bold)]","body-ms-medium":"text-[13px] font-[var(--font-weight-medium)]","body-xs-bold":"text-[12px] font-[var(--font-weight-bold)]","body-xs-medium":"text-[12px] font-[var(--font-weight-medium)]","body-t-bold":"text-[10px] font-[var(--font-weight-bold)]","body-t-medium":"text-[10px] font-[var(--font-weight-medium)]","body-ss-medium":"text-[9px] font-[var(--font-weight-medium)]"},a={primary:"text-[var(--color-primary)]",secondary:"text-[var(--color-secondary)]","neutral-darker":"text-[var(--color-neutral-darker)]","neutral-dark":"text-[var(--color-neutral-dark)]","neutral-main":"text-[var(--color-neutral-main)]",white:"text-[var(--color-white)]",inherit:"text-inherit"},r=t.forwardRef(({variant:r="body-m-medium",color:n="inherit",as:i,className:x,children:d,...f},h)=>{const m=i||(t=>t.startsWith("h")?t.split("-")[0]:"p")(r);return t.createElement(m,{ref:h,className:e(o[r],a[n],"leading-[var(--leading-default)]",x),...f},d)});r.displayName="Typography",exports.Typography=r,exports.getTypographyClasses=t=>o[t];
|
|
2
|
+
//# sourceMappingURL=Typography.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Typography.js","sources":["../../src/components/Typography/Typography.tsx"],"sourcesContent":["import React from 'react';\nimport cn from '@/utils/cn';\n\nexport type TypographyVariant =\n // Headings with Fat weight (900)\n | 'h1' // 36px / Fat (900)\n | 'h2' // 32px / Fat (900)\n | 'h3' // 28px / Fat (900)\n | 'h4' // 24px / Heavy (700)\n | 'h5' // 22px / Heavy (700)\n | 'h6' // 20px / Heavy (700)\n // Body Copy variants with specific weights\n | 'body-xl-heavy' // 20px / Heavy (700)\n | 'body-l-heavy' // 18px / Heavy (700)\n | 'body-l-bold' // 18px / Bold (600)\n | 'body-l-medium' // 18px / Medium (400)\n | 'body-m-heavy' // 16px / Heavy (700)\n | 'body-m-bold' // 16px / Bold (600)\n | 'body-m-medium' // 16px / Medium (400)\n | 'body-s-heavy' // 14px / Heavy (700)\n | 'body-s-bold' // 14px / Bold (600)\n | 'body-s-medium' // 14px / Medium (400)\n | 'body-ms-bold' // 13px / Bold (600)\n | 'body-ms-medium' // 13px / Medium (400)\n | 'body-xs-bold' // 12px / Bold (600)\n | 'body-xs-medium' // 12px / Medium (400)\n | 'body-t-bold' // 10px / Bold (600)\n | 'body-t-medium' // 10px / Medium (400)\n | 'body-ss-medium'; // 9px / Medium (400)\n\nexport interface TypographyProps extends React.HTMLAttributes<HTMLElement> {\n variant?: TypographyVariant;\n color?:\n | 'primary'\n | 'secondary'\n | 'neutral-darker'\n | 'neutral-dark'\n | 'neutral-main'\n | 'white'\n | 'inherit';\n as?: React.ElementType;\n}\n\nconst variantClasses: Record<TypographyVariant, string> = {\n // Headings with Fat weight (900)\n h1: 'text-[36px] font-[var(--font-weight-fat)]',\n h2: 'text-[32px] font-[var(--font-weight-fat)]',\n h3: 'text-[28px] font-[var(--font-weight-fat)]',\n h4: 'text-[24px] font-[var(--font-weight-heavy)]',\n h5: 'text-[22px] font-[var(--font-weight-heavy)]',\n h6: 'text-[20px] font-[var(--font-weight-heavy)]',\n\n // Body Copy with specific weight variants\n 'body-xl-heavy': 'text-[20px] font-[var(--font-weight-heavy)]',\n 'body-l-heavy': 'text-[18px] font-[var(--font-weight-heavy)]',\n 'body-l-bold': 'text-[18px] font-[var(--font-weight-bold)]',\n 'body-l-medium': 'text-[18px] font-[var(--font-weight-medium)]',\n 'body-m-heavy': 'text-[16px] font-[var(--font-weight-heavy)]',\n 'body-m-bold': 'text-[16px] font-[var(--font-weight-bold)]',\n 'body-m-medium': 'text-[16px] font-[var(--font-weight-medium)]',\n 'body-s-heavy': 'text-[14px] font-[var(--font-weight-heavy)]',\n 'body-s-bold': 'text-[14px] font-[var(--font-weight-bold)]',\n 'body-s-medium': 'text-[14px] font-[var(--font-weight-medium)]',\n 'body-ms-bold': 'text-[13px] font-[var(--font-weight-bold)]',\n 'body-ms-medium': 'text-[13px] font-[var(--font-weight-medium)]',\n 'body-xs-bold': 'text-[12px] font-[var(--font-weight-bold)]',\n 'body-xs-medium': 'text-[12px] font-[var(--font-weight-medium)]',\n 'body-t-bold': 'text-[10px] font-[var(--font-weight-bold)]',\n 'body-t-medium': 'text-[10px] font-[var(--font-weight-medium)]',\n 'body-ss-medium': 'text-[9px] font-[var(--font-weight-medium)]',\n};\n\n// Export for reuse in other components\nexport const getTypographyClasses = (variant: TypographyVariant): string => {\n return variantClasses[variant];\n};\n\nconst colorClasses: Record<string, string> = {\n primary: 'text-[var(--color-primary)]',\n secondary: 'text-[var(--color-secondary)]',\n 'neutral-darker': 'text-[var(--color-neutral-darker)]',\n 'neutral-dark': 'text-[var(--color-neutral-dark)]',\n 'neutral-main': 'text-[var(--color-neutral-main)]',\n white: 'text-[var(--color-white)]',\n inherit: 'text-inherit',\n};\n\nconst getDefaultElement = (variant: TypographyVariant): string => {\n if (variant.startsWith('h')) return variant.split('-')[0]; // h1, h2, etc.\n return 'p';\n};\n\nexport const Typography = React.forwardRef<HTMLElement, TypographyProps>(\n (\n {\n variant = 'body-m-medium',\n color = 'inherit',\n as,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const Element = as || getDefaultElement(variant);\n\n return React.createElement(\n Element,\n {\n ref,\n className: cn(\n variantClasses[variant],\n colorClasses[color],\n 'leading-[var(--leading-default)]', // 180% line height\n className,\n ),\n ...props,\n },\n children,\n );\n },\n);\n\nTypography.displayName = 'Typography';\n"],"names":["variantClasses","h1","h2","h3","h4","h5","h6","colorClasses","primary","secondary","white","inherit","Typography","React","forwardRef","variant","color","as","className","children","props","ref","Element","startsWith","split","getDefaultElement","createElement","cn","displayName"],"mappings":"4DA2CA,MAAMA,EAAoD,CAExDC,GAAI,4CACJC,GAAI,4CACJC,GAAI,4CACJC,GAAI,8CACJC,GAAI,8CACJC,GAAI,8CAGJ,gBAAiB,8CACjB,eAAgB,8CAChB,cAAe,6CACf,gBAAiB,+CACjB,eAAgB,8CAChB,cAAe,6CACf,gBAAiB,+CACjB,eAAgB,8CAChB,cAAe,6CACf,gBAAiB,+CACjB,eAAgB,6CAChB,iBAAkB,+CAClB,eAAgB,6CAChB,iBAAkB,+CAClB,cAAe,6CACf,gBAAiB,+CACjB,iBAAkB,+CAQdC,EAAuC,CAC3CC,QAAS,8BACTC,UAAW,gCACX,iBAAkB,qCAClB,eAAgB,mCAChB,eAAgB,mCAChBC,MAAO,4BACPC,QAAS,gBAQEC,EAAaC,EAAMC,WAC9B,EAEIC,UAAU,gBACVC,QAAQ,UACRC,KACAC,YACAC,cACGC,GAELC,KAEA,MAAMC,EAAUL,GAjBM,CAACF,GACrBA,EAAQQ,WAAW,KAAaR,EAAQS,MAAM,KAAK,GAChD,IAeiBC,CAAkBV,GAExC,OAAOF,EAAMa,cACXJ,EACA,CACED,MACAH,UAAWS,EACT3B,EAAee,GACfR,EAAaS,GACb,mCACAE,MAECE,GAELD,KAKNP,EAAWgB,YAAc,+DAlDYb,GAC5Bf,EAAee"}
|