automoby-kit 1.0.73 → 1.0.74
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/Select.js +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/esm/Select.js +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/types/Select.js +131 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +3 -1
- package/package.json +6 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("./utils.js"),a=require("./contexts.js");const ChevronDownIcon=({className:t})=>e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:t,children:e.jsx("path",{d:"M6 9L12 15L18 9",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),l=t.forwardRef(({label:l,placeholder:s="انتخاب کنید",options:n,value:o,defaultValue:i,onChange:u,disabled:d=!1,error:c=!1,helperText:x,className:p,...m},b)=>{const[h,v]=t.useState(!1),[g,f]=t.useState(-1),[w,j]=t.useState(i||""),y=t.useRef(null),k=t.useRef(null),N=t.useId(),D=a.useMobile(),E=void 0!==o,L=E?o:w,S=n.find(e=>e.value===L),$=Boolean(S);t.useEffect(()=>{const handleClickOutside=e=>{y.current&&!y.current.contains(e.target)&&(v(!1),f(-1))};return document.addEventListener("mousedown",handleClickOutside),()=>document.removeEventListener("mousedown",handleClickOutside)},[]);const handleSelect=e=>{E||j(e),u?.(e),v(!1),f(-1)},q=D?"min-w-[204px] w-full":"min-w-[229px] w-full",C=D?"h-12 px-3 py-[13px] gap-2":"h-14 px-4 py-[15px] gap-3",I=D?"text-sm":"text-base",M=D?"w-5 h-5":"w-6 h-6",R=D?"py-[13px] px-3 gap-4":"py-4 px-4 gap-4",A=D?"text-sm":"text-base";return e.jsxs("div",{className:r("relative",q,p),...m,children:[e.jsxs("div",{ref:b,role:"combobox","aria-expanded":h,"aria-haspopup":"listbox","aria-controls":`${N}-listbox`,"aria-labelledby":`${N}-label`,tabIndex:d?-1:0,className:r("relative flex items-center justify-between bg-white border rounded-md cursor-pointer transition-colors duration-200",C,{"border-neutral-light hover:border-neutral-main":!c&&!d,"border-error":c,"border-neutral-light bg-neutral-lighter cursor-not-allowed":d,"border-primary":h&&!c}),onClick:()=>{d||(v(!h),f(h?-1:0))},onKeyDown:e=>{if(!d)switch(e.key){case"Enter":case" ":e.preventDefault(),h?g>=0&&handleSelect(n[g].value):(v(!0),f(0));break;case"Escape":case"Tab":v(!1),f(-1);break;case"ArrowDown":e.preventDefault(),h?f(e=>e<n.length-1?e+1:e):(v(!0),f(0));break;case"ArrowUp":e.preventDefault(),h&&f(e=>e>0?e-1:e)}},children:[e.jsx("div",{className:"flex-1 text-right",children:e.jsx("span",{className:r("block transition-colors",I,{"text-neutral-main":!$&&!d||d,"text-neutral-darker":$&&!d}),children:S?S.label:s})}),e.jsx(ChevronDownIcon,{className:r("transition-transform duration-200 text-neutral-main",M,{"rotate-180":h,"text-neutral-light":d})}),$&&e.jsx("div",{className:r("absolute -top-2 bg-white px-1 text-neutral-main transition-all duration-200",D?"right-2 text-xs":"right-3 text-sm"),id:`${N}-label`,children:l})]}),h&&e.jsx("div",{className:r("absolute top-full left-0 right-0 z-50 mt-1 bg-white border border-neutral-light rounded-md shadow-lg",R),children:e.jsx("ul",{ref:k,role:"listbox",id:`${N}-listbox`,"aria-labelledby":`${N}-label`,className:"flex flex-col items-end",children:n.map((t,a)=>e.jsx("li",{role:"option","aria-selected":t.value===L,className:r("w-full cursor-pointer text-right py-2 transition-colors duration-150",A,{"bg-primary-lightest":a===g,"text-neutral-darker":t.value!==L,"text-primary font-medium":t.value===L}),onClick:()=>handleSelect(t.value),onKeyDown:e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),handleSelect(t.value))},onMouseEnter:()=>f(a),tabIndex:-1,children:t.label},t.value))})}),x&&e.jsx("div",{className:r("mt-1 text-xs text-right",{"text-error":c,"text-neutral-main":!c}),children:x})]})});l.displayName="Select",exports.Select=l;
|
package/dist/cjs/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("./Typography.js"),r=require("./Button.js"),a=require("./Input.js"),s=require("./Tabs.js"),t=require("./Drawer.js"),l=require("./Backdrop.js"),i=require("./Breadcrumb.js"),o=require("./Pagination.js"),n=require("./Accordion.js"),c=require("./Divider.js"),d=require("./RadioGroup.js"),u=require("./chunks/Chips-Ws80QAgh.js"),p=require("./Menu.js"),m=require("react/jsx-runtime"),x=require("react"),h=require("./utils.js"),g=require("./chunks/createLucideIcon-BqJVOzoK.js"),b=require("./contexts.js");require("react-dom"),require("./chunks/chevron-left-Do__K6cA.js");const
|
|
1
|
+
"use strict";var e=require("./Typography.js"),r=require("./Button.js"),a=require("./Input.js"),s=require("./Tabs.js"),t=require("./Drawer.js"),l=require("./Backdrop.js"),i=require("./Breadcrumb.js"),o=require("./Pagination.js"),n=require("./Accordion.js"),c=require("./Divider.js"),d=require("./RadioGroup.js"),u=require("./chunks/Chips-Ws80QAgh.js"),p=require("./Menu.js"),m=require("react/jsx-runtime"),x=require("react"),h=require("./utils.js"),g=require("./chunks/createLucideIcon-BqJVOzoK.js"),b=require("./Select.js"),f=require("./contexts.js");require("react-dom"),require("./chunks/chevron-left-Do__K6cA.js");const j=g.createLucideIcon("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);const y=x.forwardRef(({value:r,onChange:a,label:s="ارسال عکس",instruction:t,maxSize:l=10485760,accept:i="image/jpeg,image/jpg,image/png",maxCount:o,onRejected:n,disabled:c=!1,className:d,addButtonText:p="اضافه",removeButtonAriaLabel:g="حذف عکس"},b)=>{const f=x.useMemo(()=>function(e){if(!e||"*"===e)return/.*/;const r=e.split(",").map(e=>e.trim().replace(/^[^/]+\//,"").replace(/^\*\./,"")).filter(Boolean);if(0===r.length)return/.*/;const a=r.map(e=>e.replace(".","\\.")).join("|");return new RegExp(`\\.(${a})$`,"i")}(i),[i]),y=x.useId(),v=x.useMemo(()=>r.map(e=>e.type.startsWith("image/")?URL.createObjectURL(e):null),[r]);x.useEffect(()=>()=>{v.forEach(e=>e&&URL.revokeObjectURL(e))},[v]);const w=x.useCallback(e=>{const s=e.target.files?Array.from(e.target.files):[];e.target.value="";const t=r.length,{rejected:i,valid:c}=s.reduce((e,r)=>null!=o&&t+e.valid.length>=o?(e.rejected.push({file:r,reason:"count"}),e):r.size>l?(e.rejected.push({file:r,reason:"size"}),e):f.test(r.name)?(e.valid.push(r),e):(e.rejected.push({file:r,reason:"type"}),e),{rejected:[],valid:[]});if(c.length>0){const e=null!=o?[...r,...c].slice(0,o):[...r,...c];a(e)}i.length>0&&n?.(i)},[r,a,l,f,o,n]),N=x.useCallback(e=>{if(c)return;const s=r.filter((r,a)=>a!==e);a(s)},[r,a,c]),q=null!=o&&r.length>=o;return m.jsxs("div",{ref:b,className:h("",d),children:[s&&m.jsx(e.Typography,{variant:"body-s-medium",color:"neutral-darker",className:"mb-1",children:s}),null!=t&&m.jsx(e.Typography,{variant:"body-xs-medium",color:"neutral-main",className:"mb-2",children:t}),m.jsxs("div",{className:"flex flex-wrap gap-2 items-center",children:[r.map((r,a)=>m.jsxs("div",{className:"relative w-16 h-16 rounded-lg bg-neutral-light overflow-hidden group",children:[r.type.startsWith("image/")&&v[a]?m.jsx("img",{src:v[a],alt:"",className:"w-full h-full object-cover"}):m.jsx("div",{className:"w-full h-full flex items-center justify-center",children:m.jsx(e.Typography,{variant:"body-xs-medium",children:"فایل"})}),!c&&m.jsx("button",{type:"button",onClick:()=>N(a),className:"absolute top-0.5 left-0.5 w-5 h-5 rounded-full bg-neutral-darker/70 text-white flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity","aria-label":g,children:m.jsx(u.X,{className:"w-3 h-3"})})]},`${r.name}-${r.size}-${r.lastModified}`)),!c&&!q&&m.jsxs("label",{htmlFor:y,className:"w-16 h-16 rounded-lg border-2 border-dashed border-neutral-main flex items-center justify-center cursor-pointer hover:border-primary-main hover:bg-primary-main/5 transition-colors",children:[m.jsx("input",{id:y,type:"file",accept:i,multiple:!0,className:"sr-only",onChange:w}),m.jsxs("div",{className:"flex flex-col items-center gap-0.5",children:[m.jsx(j,{className:"w-5 h-5 text-neutral-main"}),m.jsx(e.Typography,{variant:"body-xs-medium",color:"neutral-main",children:p})]})]})]})]})});y.displayName="ImageUpload";const v=x.forwardRef(({isOpen:e=!1,onClose:r,title:a,content:s,buttons:t,showCloseButton:i=!0,size:o="md",className:n,children:c},d)=>{const handleClose=()=>{r&&r()},p=h("bg-white rounded-[10px] shadow-lg mx-4",{sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-xl"}[o],n);return m.jsx(l.Backdrop,{isOpen:e,onClick:handleClose,blur:!0,children:m.jsx("div",{ref:d,className:p,onClick:e=>e.stopPropagation(),onKeyDown:e=>{"Escape"===e.key&&r&&r()},role:"dialog","aria-modal":"true","aria-labelledby":a?"dialog-title":void 0,children:m.jsxs("div",{className:"flex flex-col p-6 gap-8",children:[a&&m.jsx("div",{className:"flex flex-col gap-2.5",children:m.jsx("div",{className:"flex items-center justify-between pb-4 border-b border-[#ebeaf0]",children:m.jsxs("div",{className:"flex items-center justify-between gap-3 w-full flex-row-reverse",children:[m.jsx("div",{className:"text-[#590d8b] text-xl font-extrabold leading-8",children:a}),i&&m.jsx("button",{type:"button",onClick:handleClose,className:"p-1 rounded-full hover:bg-gray-100 transition-colors","aria-label":"Close dialog",children:m.jsx(u.X,{className:"w-6 h-6 text-[#a4a2bb]"})})]})})}),s&&m.jsx("div",{className:"flex flex-col gap-4",children:s}),c&&!s&&m.jsx("div",{className:"flex flex-col gap-4",children:c}),t&&m.jsx("div",{className:"flex flex-col gap-1.5",children:t})]})})})});v.displayName="Dialog";const w=x.forwardRef(({variant:e="primary",icon:r,children:a,className:s,...t},l)=>{const i=h("h-14 px-4 py-[13px] rounded-md font-bold text-base leading-[1.8] flex items-center justify-center gap-2 transition-colors",{"bg-[#590d8b] text-white hover:bg-[#4a0a75]":"primary"===e,"bg-white text-[#1a1922] border border-[#ebeaf0] hover:bg-gray-50":"secondary"===e},s);return m.jsxs("button",{type:"button",ref:l,className:i,...t,children:[a,r&&m.jsx("span",{className:"w-5 h-5",children:r})]})});w.displayName="DialogButton";const N=e.Typography,q=r.Button,k=a.Input,B=s.Tabs,C=t.Drawer,T=l.Backdrop,M=i.Breadcrumb,R=o.Pagination,D=n.Accordion,I=c.Divider,L=d.RadioGroup,P=u.Chips,U=p.Menu,z=y,A=b.Select;exports.MobileProvider=f.MobileProvider,exports.useMobile=f.useMobile,exports.useTablet=f.useTablet,exports.Accordion=D,exports.Backdrop=T,exports.Breadcrumb=M,exports.Button=q,exports.Chips=P,exports.Dialog=v,exports.DialogButton=w,exports.Divider=I,exports.Drawer=C,exports.ImageUpload=z,exports.Input=k,exports.Menu=U,exports.Pagination=R,exports.RadioGroup=L,exports.Select=A,exports.Tabs=B,exports.Typography=N;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsxs as e,jsx as t}from"react/jsx-runtime";import r,{useState as a,useRef as l,useId as o,useEffect as n}from"react";import i from"./utils.js";import{useMobile as s}from"./contexts.js";const ChevronDownIcon=({className:e})=>t("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:e,children:t("path",{d:"M6 9L12 15L18 9",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),d=r.forwardRef(({label:r,placeholder:d="انتخاب کنید",options:u,value:c,defaultValue:m,onChange:p,disabled:x=!1,error:h=!1,helperText:b,className:g,...v},f)=>{const[w,y]=a(!1),[k,N]=a(-1),[D,E]=a(m||""),L=l(null),j=l(null),$=o(),C=s(),A=void 0!==c,B=A?c:D,I=u.find(e=>e.value===B),K=Boolean(I);n(()=>{const handleClickOutside=e=>{L.current&&!L.current.contains(e.target)&&(y(!1),N(-1))};return document.addEventListener("mousedown",handleClickOutside),()=>document.removeEventListener("mousedown",handleClickOutside)},[]);const handleSelect=e=>{A||E(e),p?.(e),y(!1),N(-1)},M=C?"h-12 px-3 py-[13px] gap-2":"h-14 px-4 py-[15px] gap-3",T=C?"text-sm":"text-base",z=C?"w-5 h-5":"w-6 h-6",R=C?"py-[13px] px-3 gap-4":"py-4 px-4 gap-4",S=C?"text-sm":"text-base";return e("div",{className:i("relative",C?"min-w-[204px] w-full":"min-w-[229px] w-full",g),...v,children:[e("div",{ref:f,role:"combobox","aria-expanded":w,"aria-haspopup":"listbox","aria-controls":`${$}-listbox`,"aria-labelledby":`${$}-label`,tabIndex:x?-1:0,className:i("relative flex items-center justify-between bg-white border rounded-md cursor-pointer transition-colors duration-200",M,{"border-neutral-light hover:border-neutral-main":!h&&!x,"border-error":h,"border-neutral-light bg-neutral-lighter cursor-not-allowed":x,"border-primary":w&&!h}),onClick:()=>{x||(y(!w),N(w?-1:0))},onKeyDown:e=>{if(!x)switch(e.key){case"Enter":case" ":e.preventDefault(),w?k>=0&&handleSelect(u[k].value):(y(!0),N(0));break;case"Escape":case"Tab":y(!1),N(-1);break;case"ArrowDown":e.preventDefault(),w?N(e=>e<u.length-1?e+1:e):(y(!0),N(0));break;case"ArrowUp":e.preventDefault(),w&&N(e=>e>0?e-1:e)}},children:[t("div",{className:"flex-1 text-right",children:t("span",{className:i("block transition-colors",T,{"text-neutral-main":!K&&!x||x,"text-neutral-darker":K&&!x}),children:I?I.label:d})}),t(ChevronDownIcon,{className:i("transition-transform duration-200 text-neutral-main",z,{"rotate-180":w,"text-neutral-light":x})}),K&&t("div",{className:i("absolute -top-2 bg-white px-1 text-neutral-main transition-all duration-200",C?"right-2 text-xs":"right-3 text-sm"),id:`${$}-label`,children:r})]}),w&&t("div",{className:i("absolute top-full left-0 right-0 z-50 mt-1 bg-white border border-neutral-light rounded-md shadow-lg",R),children:t("ul",{ref:j,role:"listbox",id:`${$}-listbox`,"aria-labelledby":`${$}-label`,className:"flex flex-col items-end",children:u.map((e,r)=>t("li",{role:"option","aria-selected":e.value===B,className:i("w-full cursor-pointer text-right py-2 transition-colors duration-150",S,{"bg-primary-lightest":r===k,"text-neutral-darker":e.value!==B,"text-primary font-medium":e.value===B}),onClick:()=>handleSelect(e.value),onKeyDown:t=>{"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),handleSelect(e.value))},onMouseEnter:()=>N(r),tabIndex:-1,children:e.label},e.value))})}),b&&t("div",{className:i("mt-1 text-xs text-right",{"text-error":h,"text-neutral-main":!h}),children:b})]})});d.displayName="Select";export{d as Select};
|
package/dist/esm/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Typography as e}from"./Typography.js";import{Button as r}from"./Button.js";import{Input as a}from"./Input.js";import{Tabs as t}from"./Tabs.js";import{Drawer as l}from"./Drawer.js";import{Backdrop as o}from"./Backdrop.js";import{Breadcrumb as i}from"./Breadcrumb.js";import{Pagination as s}from"./Pagination.js";import{Accordion as n}from"./Accordion.js";import{Divider as c}from"./Divider.js";import{RadioGroup as m}from"./RadioGroup.js";import{X as d,C as p}from"./chunks/Chips-Dg1jNlMl.js";import{Menu as u}from"./Menu.js";import{jsxs as f,jsx as h}from"react/jsx-runtime";import b,{useMemo as g,useId as x,useEffect as v,useCallback as y}from"react";import j from"./utils.js";import{c as w}from"./chunks/createLucideIcon-DGp0SoUT.js";export{MobileProvider,useMobile,useTablet}from"./contexts.js";import"react-dom";import"./chunks/chevron-left-4HSuTes3.js";const
|
|
1
|
+
import{Typography as e}from"./Typography.js";import{Button as r}from"./Button.js";import{Input as a}from"./Input.js";import{Tabs as t}from"./Tabs.js";import{Drawer as l}from"./Drawer.js";import{Backdrop as o}from"./Backdrop.js";import{Breadcrumb as i}from"./Breadcrumb.js";import{Pagination as s}from"./Pagination.js";import{Accordion as n}from"./Accordion.js";import{Divider as c}from"./Divider.js";import{RadioGroup as m}from"./RadioGroup.js";import{X as d,C as p}from"./chunks/Chips-Dg1jNlMl.js";import{Menu as u}from"./Menu.js";import{jsxs as f,jsx as h}from"react/jsx-runtime";import b,{useMemo as g,useId as x,useEffect as v,useCallback as y}from"react";import j from"./utils.js";import{c as w}from"./chunks/createLucideIcon-DGp0SoUT.js";import{Select as N}from"./Select.js";export{MobileProvider,useMobile,useTablet}from"./contexts.js";import"react-dom";import"./chunks/chevron-left-4HSuTes3.js";const k=w("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);const C=b.forwardRef(({value:r,onChange:a,label:t="ارسال عکس",instruction:l,maxSize:o=10485760,accept:i="image/jpeg,image/jpg,image/png",maxCount:s,onRejected:n,disabled:c=!1,className:m,addButtonText:p="اضافه",removeButtonAriaLabel:u="حذف عکس"},b)=>{const w=g(()=>function(e){if(!e||"*"===e)return/.*/;const r=e.split(",").map(e=>e.trim().replace(/^[^/]+\//,"").replace(/^\*\./,"")).filter(Boolean);if(0===r.length)return/.*/;const a=r.map(e=>e.replace(".","\\.")).join("|");return new RegExp(`\\.(${a})$`,"i")}(i),[i]),N=x(),C=g(()=>r.map(e=>e.type.startsWith("image/")?URL.createObjectURL(e):null),[r]);v(()=>()=>{C.forEach(e=>e&&URL.revokeObjectURL(e))},[C]);const B=y(e=>{const t=e.target.files?Array.from(e.target.files):[];e.target.value="";const l=r.length,{rejected:i,valid:c}=t.reduce((e,r)=>null!=s&&l+e.valid.length>=s?(e.rejected.push({file:r,reason:"count"}),e):r.size>o?(e.rejected.push({file:r,reason:"size"}),e):w.test(r.name)?(e.valid.push(r),e):(e.rejected.push({file:r,reason:"type"}),e),{rejected:[],valid:[]});if(c.length>0){const e=null!=s?[...r,...c].slice(0,s):[...r,...c];a(e)}i.length>0&&n?.(i)},[r,a,o,w,s,n]),R=y(e=>{if(c)return;const t=r.filter((r,a)=>a!==e);a(t)},[r,a,c]),D=null!=s&&r.length>=s;return f("div",{ref:b,className:j("",m),children:[t&&h(e,{variant:"body-s-medium",color:"neutral-darker",className:"mb-1",children:t}),null!=l&&h(e,{variant:"body-xs-medium",color:"neutral-main",className:"mb-2",children:l}),f("div",{className:"flex flex-wrap gap-2 items-center",children:[r.map((r,a)=>f("div",{className:"relative w-16 h-16 rounded-lg bg-neutral-light overflow-hidden group",children:[r.type.startsWith("image/")&&C[a]?h("img",{src:C[a],alt:"",className:"w-full h-full object-cover"}):h("div",{className:"w-full h-full flex items-center justify-center",children:h(e,{variant:"body-xs-medium",children:"فایل"})}),!c&&h("button",{type:"button",onClick:()=>R(a),className:"absolute top-0.5 left-0.5 w-5 h-5 rounded-full bg-neutral-darker/70 text-white flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity","aria-label":u,children:h(d,{className:"w-3 h-3"})})]},`${r.name}-${r.size}-${r.lastModified}`)),!c&&!D&&f("label",{htmlFor:N,className:"w-16 h-16 rounded-lg border-2 border-dashed border-neutral-main flex items-center justify-center cursor-pointer hover:border-primary-main hover:bg-primary-main/5 transition-colors",children:[h("input",{id:N,type:"file",accept:i,multiple:!0,className:"sr-only",onChange:B}),f("div",{className:"flex flex-col items-center gap-0.5",children:[h(k,{className:"w-5 h-5 text-neutral-main"}),h(e,{variant:"body-xs-medium",color:"neutral-main",children:p})]})]})]})]})});C.displayName="ImageUpload";const B=b.forwardRef(({isOpen:e=!1,onClose:r,title:a,content:t,buttons:l,showCloseButton:i=!0,size:s="md",className:n,children:c},m)=>{const handleClose=()=>{r&&r()},p=j("bg-white rounded-[10px] shadow-lg mx-4",{sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-xl"}[s],n);return h(o,{isOpen:e,onClick:handleClose,blur:!0,children:h("div",{ref:m,className:p,onClick:e=>e.stopPropagation(),onKeyDown:e=>{"Escape"===e.key&&r&&r()},role:"dialog","aria-modal":"true","aria-labelledby":a?"dialog-title":void 0,children:f("div",{className:"flex flex-col p-6 gap-8",children:[a&&h("div",{className:"flex flex-col gap-2.5",children:h("div",{className:"flex items-center justify-between pb-4 border-b border-[#ebeaf0]",children:f("div",{className:"flex items-center justify-between gap-3 w-full flex-row-reverse",children:[h("div",{className:"text-[#590d8b] text-xl font-extrabold leading-8",children:a}),i&&h("button",{type:"button",onClick:handleClose,className:"p-1 rounded-full hover:bg-gray-100 transition-colors","aria-label":"Close dialog",children:h(d,{className:"w-6 h-6 text-[#a4a2bb]"})})]})})}),t&&h("div",{className:"flex flex-col gap-4",children:t}),c&&!t&&h("div",{className:"flex flex-col gap-4",children:c}),l&&h("div",{className:"flex flex-col gap-1.5",children:l})]})})})});B.displayName="Dialog";const R=b.forwardRef(({variant:e="primary",icon:r,children:a,className:t,...l},o)=>{const i=j("h-14 px-4 py-[13px] rounded-md font-bold text-base leading-[1.8] flex items-center justify-center gap-2 transition-colors",{"bg-[#590d8b] text-white hover:bg-[#4a0a75]":"primary"===e,"bg-white text-[#1a1922] border border-[#ebeaf0] hover:bg-gray-50":"secondary"===e},t);return f("button",{type:"button",ref:o,className:i,...l,children:[a,r&&h("span",{className:"w-5 h-5",children:r})]})});R.displayName="DialogButton";const D=e,M=r,L=a,T=t,z=l,U=o,$=i,A=s,I=n,O=c,P=m,E=p,S=u,G=C,W=N;export{I as Accordion,U as Backdrop,$ as Breadcrumb,M as Button,E as Chips,B as Dialog,R as DialogButton,O as Divider,z as Drawer,G as ImageUpload,L as Input,S as Menu,A as Pagination,P as RadioGroup,W as Select,T as Tabs,D as Typography};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React, { useState, useRef, useId, useEffect } from 'react';
|
|
3
|
+
import cn from './utils.js';
|
|
4
|
+
import { useMobile } from './contexts.js';
|
|
5
|
+
|
|
6
|
+
const ChevronDownIcon = ({ className }) => (jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, children: jsx("path", { d: "M6 9L12 15L18 9", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }));
|
|
7
|
+
const Select = React.forwardRef(({ label, placeholder = 'انتخاب کنید', options, value: controlledValue, defaultValue, onChange, disabled = false, error = false, helperText, className, ...props }, ref) => {
|
|
8
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
9
|
+
const [focusedIndex, setFocusedIndex] = useState(-1);
|
|
10
|
+
const [internalValue, setInternalValue] = useState(defaultValue || '');
|
|
11
|
+
const selectRef = useRef(null);
|
|
12
|
+
const listRef = useRef(null);
|
|
13
|
+
const id = useId();
|
|
14
|
+
const isMobile = useMobile();
|
|
15
|
+
// Determine if component is controlled or uncontrolled
|
|
16
|
+
const isControlled = controlledValue !== undefined;
|
|
17
|
+
const value = isControlled ? controlledValue : internalValue;
|
|
18
|
+
const selectedOption = options.find((option) => option.value === value);
|
|
19
|
+
const hasValue = Boolean(selectedOption);
|
|
20
|
+
// Close dropdown when clicking outside
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const handleClickOutside = (event) => {
|
|
23
|
+
if (selectRef.current &&
|
|
24
|
+
!selectRef.current.contains(event.target)) {
|
|
25
|
+
setIsOpen(false);
|
|
26
|
+
setFocusedIndex(-1);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
30
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
31
|
+
}, []);
|
|
32
|
+
const handleSelect = (optionValue) => {
|
|
33
|
+
// Update internal state for uncontrolled component
|
|
34
|
+
if (!isControlled) {
|
|
35
|
+
setInternalValue(optionValue);
|
|
36
|
+
}
|
|
37
|
+
// Call onChange callback
|
|
38
|
+
onChange?.(optionValue);
|
|
39
|
+
// Close dropdown
|
|
40
|
+
setIsOpen(false);
|
|
41
|
+
setFocusedIndex(-1);
|
|
42
|
+
};
|
|
43
|
+
// Handle keyboard navigation
|
|
44
|
+
const handleKeyDown = (event) => {
|
|
45
|
+
if (disabled)
|
|
46
|
+
return;
|
|
47
|
+
switch (event.key) {
|
|
48
|
+
case 'Enter':
|
|
49
|
+
case ' ':
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
if (!isOpen) {
|
|
52
|
+
setIsOpen(true);
|
|
53
|
+
setFocusedIndex(0);
|
|
54
|
+
}
|
|
55
|
+
else if (focusedIndex >= 0) {
|
|
56
|
+
handleSelect(options[focusedIndex].value);
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
case 'Escape':
|
|
60
|
+
setIsOpen(false);
|
|
61
|
+
setFocusedIndex(-1);
|
|
62
|
+
break;
|
|
63
|
+
case 'ArrowDown':
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
if (!isOpen) {
|
|
66
|
+
setIsOpen(true);
|
|
67
|
+
setFocusedIndex(0);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
setFocusedIndex((prev) => prev < options.length - 1 ? prev + 1 : prev);
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case 'ArrowUp':
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
if (isOpen) {
|
|
76
|
+
setFocusedIndex((prev) => (prev > 0 ? prev - 1 : prev));
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
case 'Tab':
|
|
80
|
+
setIsOpen(false);
|
|
81
|
+
setFocusedIndex(-1);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const handleToggle = () => {
|
|
86
|
+
if (!disabled) {
|
|
87
|
+
setIsOpen(!isOpen);
|
|
88
|
+
setFocusedIndex(isOpen ? -1 : 0);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
// Responsive dimensions and styles
|
|
92
|
+
const containerClasses = isMobile
|
|
93
|
+
? 'min-w-[204px] w-full'
|
|
94
|
+
: 'min-w-[229px] w-full';
|
|
95
|
+
const inputClasses = isMobile
|
|
96
|
+
? 'h-12 px-3 py-[13px] gap-2'
|
|
97
|
+
: 'h-14 px-4 py-[15px] gap-3';
|
|
98
|
+
const textClasses = isMobile ? 'text-sm' : 'text-base';
|
|
99
|
+
const iconClasses = isMobile ? 'w-5 h-5' : 'w-6 h-6';
|
|
100
|
+
const dropdownClasses = isMobile
|
|
101
|
+
? 'py-[13px] px-3 gap-4'
|
|
102
|
+
: 'py-4 px-4 gap-4';
|
|
103
|
+
const optionClasses = isMobile ? 'text-sm' : 'text-base';
|
|
104
|
+
return (jsxs("div", { className: cn('relative', containerClasses, className), ...props, children: [jsxs("div", { ref: ref, role: "combobox", "aria-expanded": isOpen, "aria-haspopup": "listbox", "aria-controls": `${id}-listbox`, "aria-labelledby": `${id}-label`, tabIndex: disabled ? -1 : 0, className: cn('relative flex items-center justify-between bg-white border rounded-md cursor-pointer transition-colors duration-200', inputClasses, {
|
|
105
|
+
'border-neutral-light hover:border-neutral-main': !error && !disabled,
|
|
106
|
+
'border-error': error,
|
|
107
|
+
'border-neutral-light bg-neutral-lighter cursor-not-allowed': disabled,
|
|
108
|
+
'border-primary': isOpen && !error,
|
|
109
|
+
}), onClick: handleToggle, onKeyDown: handleKeyDown, children: [jsx("div", { className: "flex-1 text-right", children: jsx("span", { className: cn('block transition-colors', textClasses, {
|
|
110
|
+
'text-neutral-main': (!hasValue && !disabled) || disabled,
|
|
111
|
+
'text-neutral-darker': hasValue && !disabled,
|
|
112
|
+
}), children: selectedOption ? selectedOption.label : placeholder }) }), jsx(ChevronDownIcon, { className: cn('transition-transform duration-200 text-neutral-main', iconClasses, {
|
|
113
|
+
'rotate-180': isOpen,
|
|
114
|
+
'text-neutral-light': disabled,
|
|
115
|
+
}) }), hasValue && (jsx("div", { className: cn('absolute -top-2 bg-white px-1 text-neutral-main transition-all duration-200', isMobile ? 'right-2 text-xs' : 'right-3 text-sm'), id: `${id}-label`, children: label }))] }), isOpen && (jsx("div", { className: cn('absolute top-full left-0 right-0 z-50 mt-1 bg-white border border-neutral-light rounded-md shadow-lg', dropdownClasses), children: jsx("ul", { ref: listRef, role: "listbox", id: `${id}-listbox`, "aria-labelledby": `${id}-label`, className: "flex flex-col items-end", children: options.map((option, index) => (jsx("li", { role: "option", "aria-selected": option.value === value, className: cn('w-full cursor-pointer text-right py-2 transition-colors duration-150', optionClasses, {
|
|
116
|
+
'bg-primary-lightest': index === focusedIndex,
|
|
117
|
+
'text-neutral-darker': option.value !== value,
|
|
118
|
+
'text-primary font-medium': option.value === value,
|
|
119
|
+
}), onClick: () => handleSelect(option.value), onKeyDown: (e) => {
|
|
120
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
handleSelect(option.value);
|
|
123
|
+
}
|
|
124
|
+
}, onMouseEnter: () => setFocusedIndex(index), tabIndex: -1, children: option.label }, option.value))) }) })), helperText && (jsx("div", { className: cn('mt-1 text-xs text-right', {
|
|
125
|
+
'text-error': error,
|
|
126
|
+
'text-neutral-main': !error,
|
|
127
|
+
}), children: helperText }))] }));
|
|
128
|
+
});
|
|
129
|
+
Select.displayName = 'Select';
|
|
130
|
+
|
|
131
|
+
export { Select };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export declare const RadioGroup: import("react").ForwardRefExoticComponent<impor
|
|
|
20
20
|
export declare const Chips: import("react").ForwardRefExoticComponent<import("./components/Chips/Chips").ChipsProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
21
21
|
export declare const Menu: import("react").ForwardRefExoticComponent<import("./components/Menu/Menu").MenuProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
22
22
|
export declare const ImageUpload: import("react").ForwardRefExoticComponent<import("./components/ImageUpload/ImageUpload").ImageUploadProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
23
|
+
export declare const Select: import("react").ForwardRefExoticComponent<import("./components/Select/Select").SelectProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
23
24
|
export type { TypographyProps, TypographyVariant, } from './components/Typography/Typography';
|
|
24
25
|
export type { ButtonProps, ButtonVariant, ButtonSize, } from './components/Button/Button';
|
|
25
26
|
export type { InputProps } from './components/Input/Input';
|
|
@@ -35,6 +36,7 @@ export type { RadioGroupProps, RadioOption, } from './components/RadioGroup/Radi
|
|
|
35
36
|
export type { ChipsProps } from './components/Chips/Chips';
|
|
36
37
|
export type { MenuProps, MenuItem } from './components/Menu/Menu';
|
|
37
38
|
export type { ImageUploadProps, ImageUploadRejected, } from './components/ImageUpload/ImageUpload';
|
|
39
|
+
export type { SelectProps, SelectOption } from './components/Select/Select';
|
|
38
40
|
export { MobileProvider } from './contexts/MobileContext';
|
|
39
41
|
export { useMobile } from './contexts/MobileContext';
|
|
40
42
|
export { useTablet } from './contexts/MobileContext';
|
package/dist/types/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
15
15
|
import React, { useMemo, useId, useEffect, useCallback } from 'react';
|
|
16
16
|
import cn from './utils.js';
|
|
17
17
|
import { c as createLucideIcon } from './createLucideIcon-D-q73LTT.js';
|
|
18
|
+
import { Select as Select$1 } from './Select.js';
|
|
18
19
|
export { MobileProvider, useMobile, useTablet } from './contexts.js';
|
|
19
20
|
import 'react-dom';
|
|
20
21
|
import './chevron-left-Ck6O99eF.js';
|
|
@@ -147,5 +148,6 @@ const RadioGroup = RadioGroup$1;
|
|
|
147
148
|
const Chips = Chips$1;
|
|
148
149
|
const Menu = Menu$1;
|
|
149
150
|
const ImageUpload = ImageUpload$1;
|
|
151
|
+
const Select = Select$1;
|
|
150
152
|
|
|
151
|
-
export { Accordion, Backdrop, Breadcrumb, Button, Chips, Dialog, DialogButton, Divider, Drawer, ImageUpload, Input, Menu, Pagination, RadioGroup, Tabs, Typography };
|
|
153
|
+
export { Accordion, Backdrop, Breadcrumb, Button, Chips, Dialog, DialogButton, Divider, Drawer, ImageUpload, Input, Menu, Pagination, RadioGroup, Select, Tabs, Typography };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "automoby-kit",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.74",
|
|
4
4
|
"description": "A comprehensive React UI component library - created in war 2025",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -79,6 +79,11 @@
|
|
|
79
79
|
"require": "./dist/cjs/Menu.js",
|
|
80
80
|
"types": "./dist/types/components/Menu/Menu.d.ts"
|
|
81
81
|
},
|
|
82
|
+
"./Select": {
|
|
83
|
+
"import": "./dist/esm/Select.js",
|
|
84
|
+
"require": "./dist/cjs/Select.js",
|
|
85
|
+
"types": "./dist/types/components/Select/Select.d.ts"
|
|
86
|
+
},
|
|
82
87
|
"./contexts": {
|
|
83
88
|
"import": "./dist/esm/contexts.js",
|
|
84
89
|
"require": "./dist/cjs/contexts.js",
|