@banzamel/mineralui 0.10.1 → 0.10.2
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/README.md +1 -1
- package/dist/{CardGrid-Cm0qx9ue.cjs → CardGrid-Dvu64wUg.cjs} +2 -2
- package/dist/{CardGrid-Cm0qx9ue.cjs.map → CardGrid-Dvu64wUg.cjs.map} +1 -1
- package/dist/{CardGrid-nqnCwmTD.js → CardGrid-mHLkd1pL.js} +21 -21
- package/dist/{CardGrid-nqnCwmTD.js.map → CardGrid-mHLkd1pL.js.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/style-runtime.cjs +1 -1
- package/dist/style-runtime.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
React component framework for dashboards, admin panels, documentation shells, settings screens and data-heavy internal products.
|
|
4
4
|
|
|
5
5
|
- npm: `@banzamel/mineralui`
|
|
6
|
-
- version: `0.10.
|
|
6
|
+
- version: `0.10.2`
|
|
7
7
|
- peer dependencies: `react >= 19`, `react-dom >= 19`
|
|
8
8
|
- repository: `https://github.com/Banzamel/mineralui`
|
|
9
9
|
- homepage: `https://mineralui.banzamel.pl`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./ArrowDownIcon-EfyFLBHR.cjs`),t=require(`./ClockIcon-DeDZlnTQ.cjs`),n=require(`./PhoneIcon-CPGZ1D2-.cjs`),r=require(`./BrandMoreIcons-Cb4cXa_M.cjs`),i=require(`./cn-BOmEz3Rt.cjs`),a=require(`./creditCards-CUM63Oia.cjs`),o=require(`./Checkbox-BXetIDRT.cjs`),s=require(`./QrCode-scUXUrNj.cjs`),c=require(`./InputSearch-Bk5YFz09.cjs`);let l=require(`react`),u=require(`react/jsx-runtime`);function d(e){let t=e.replace(/\D/g,``);return t.length<=4?t:`\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 ${t.slice(-4)}`}function f({holder:e,number:t,expiry:n,brand:r,brandIcon:o,balance:s,balanceLabel:c=`Current balance`,color:l,className:f,...p}){let m=r??a.n(t).brand,h=d(t),g=a.n(t).iconLabel;return(0,u.jsxs)(`div`,{className:i.t(`card-payment`,f),...p,children:[s!==void 0&&(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`p`,{className:`cp-balance-label`,children:c}),(0,u.jsx)(`p`,{className:`cp-balance`,children:s})]}),(0,u.jsxs)(`div`,{className:`cp-row`,children:[(0,u.jsx)(`span`,{className:i.t(`cp-brand`,!o&&m),children:o??g}),(0,u.jsx)(`span`,{className:`cp-number`,children:h})]}),(0,u.jsxs)(`div`,{className:`cp-details`,children:[(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`p`,{className:`cp-field-label`,children:`Card holder`}),(0,u.jsx)(`p`,{className:`cp-field-value`,children:e})]}),(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`p`,{className:`cp-field-label`,children:`Expiration date`}),(0,u.jsx)(`p`,{className:`cp-field-value`,children:n})]})]})]})}function p(e){return e.split(/\s+/).slice(0,2).map(e=>e[0]?.toUpperCase()??``).join(``)}function m(e){return e?[e.street,[e.zip,e.city].filter(Boolean).join(` `),e.country].filter(Boolean).join(`, `):null}function h(e){return e.trim().toLowerCase().replace(/[\s._-]+/g,``)}function g(e){switch(h(e)){case`github`:return(0,u.jsx)(r.P,{});case`linkedin`:return(0,u.jsx)(r.B,{});case`x`:case`twitter`:return(0,u.jsx)(r.W,{});case`instagram`:return(0,u.jsx)(r.R,{});case`facebook`:return(0,u.jsx)(r.A,{});case`youtube`:return(0,u.jsx)(r.K,{});case`discord`:return(0,u.jsx)(r.O,{});case`figma`:return(0,u.jsx)(r.M,{});case`slack`:return(0,u.jsx)(r.H,{});case`google`:return(0,u.jsx)(r.I,{});case`spotify`:return(0,u.jsx)(r.g,{});case`pinterest`:return(0,u.jsx)(r.m,{});case`tumblr`:return(0,u.jsx)(r.v,{});case`vimeo`:return(0,u.jsx)(r.S,{});case`vk`:case`vkontakte`:return(0,u.jsx)(r.E,{});default:return null}}function _({variant:e=`user`,name:t,title:a,avatar:o,address:c,contact:l,socials:d,online:f,lastActive:h,qrCode:_,qrValue:v,color:y=`primary`,className:b,...x}){let S=m(c);return(0,u.jsxs)(`div`,{className:i.t(`card-business`,e,y,b),...x,children:[(0,u.jsxs)(`div`,{className:`cb-header`,children:[(0,u.jsxs)(`div`,{className:`cb-avatar-wrap`,children:[o?(0,u.jsx)(`img`,{src:o,alt:t,className:i.t(`cb-avatar`,e)}):(0,u.jsx)(`span`,{className:i.t(`cb-avatar`,`cb-initials`,e),children:p(t)}),f!==void 0&&(0,u.jsx)(`span`,{className:i.t(`cb-status`,f?`online`:`offline`)})]}),(0,u.jsxs)(`div`,{className:`cb-info`,children:[(0,u.jsx)(`h3`,{className:`cb-name`,children:t}),a&&(0,u.jsx)(`p`,{className:`cb-title`,children:a}),h&&(0,u.jsx)(`p`,{className:`cb-last-active`,children:h})]}),(v||_)&&(0,u.jsx)(`div`,{className:`cb-qr`,children:v?(0,u.jsx)(s.t,{value:v,size:56,padding:3,className:`cb-qr-code`}):(0,u.jsx)(`img`,{src:_,alt:`QR`,className:`cb-qr-img`})})]}),(l||S)&&(0,u.jsxs)(`div`,{className:`cb-details`,children:[l?.email&&(0,u.jsxs)(`div`,{className:`cb-detail`,children:[(0,u.jsx)(`span`,{className:`cb-detail-icon`,children:(0,u.jsx)(n.n,{})}),(0,u.jsx)(`a`,{href:`mailto:${l.email}`,className:`cb-detail-value`,children:l.email})]}),l?.phone&&(0,u.jsxs)(`div`,{className:`cb-detail`,children:[(0,u.jsx)(`span`,{className:`cb-detail-icon`,children:(0,u.jsx)(n.t,{})}),(0,u.jsx)(`a`,{href:`tel:${l.phone}`,className:`cb-detail-value`,children:l.phone})]}),l?.website&&(0,u.jsxs)(`div`,{className:`cb-detail`,children:[(0,u.jsx)(`span`,{className:`cb-detail-icon`,children:(0,u.jsx)(r.tt,{})}),(0,u.jsx)(`a`,{href:l.website,target:`_blank`,rel:`noopener noreferrer`,className:`cb-detail-value`,children:l.website.replace(/^https?:\/\//,``)})]}),S&&(0,u.jsxs)(`div`,{className:`cb-detail`,children:[(0,u.jsx)(`span`,{className:`cb-detail-icon`,children:(0,u.jsx)(r.et,{})}),(0,u.jsx)(`span`,{className:`cb-detail-value`,children:S})]})]}),d&&d.length>0&&(0,u.jsx)(`div`,{className:`cb-socials`,children:d.map(e=>(0,u.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,className:`cb-social`,title:e.platform,"aria-label":e.platform,children:e.icon??g(e.platform)??(0,u.jsx)(`span`,{className:`cb-social-text`,children:e.platform})},e.platform))})]})}function v({people:e,max:t=4}){if(!e||e.length===0)return null;let n=e.slice(0,t),r=e.length-t;return(0,u.jsxs)(`div`,{className:`cs-avatars`,children:[n.map((e,t)=>(0,u.jsx)(`span`,{className:`cs-avatar-sm`,title:e.name,children:e.avatar?(0,u.jsx)(`img`,{src:e.avatar,alt:e.name}):(0,u.jsx)(`span`,{children:e.name[0]?.toUpperCase()})},t)),r>0&&(0,u.jsxs)(`span`,{className:`cs-avatar-sm cs-overflow`,children:[`+`,r]})]})}function y({variant:e=`service`,title:n,description:a,price:o,currency:c=`PLN`,duration:d,available:f,image:p,gallery:m,rating:h,reviewCount:g,favorite:_,onFavorite:y,menuItems:b,onAddToCart:x,icon:S,color:C=`primary`,leader:w,participants:T,maxParticipants:E,quantity:D,onQuantityChange:O,className:k,...A}){let[j,M]=(0,l.useState)(!1),[N,P]=(0,l.useState)(0),[F,I]=(0,l.useState)(1),L=(0,l.useRef)(null),R=D??F,z=m&&m.length>0?m:p?[p]:[];(0,l.useEffect)(()=>{if(!j)return;function e(e){L.current&&!L.current.contains(e.target)&&M(!1)}return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[j]);function B(e){let t=Math.max(1,e);O?O(t):I(t)}let V=f===!0?`Available`:f===!1?`Unavailable`:typeof f==`number`?`${f} spots`:null;return(0,u.jsxs)(`div`,{className:i.t(`card-service`,e,C,k),...A,children:[z.length>0&&(0,u.jsxs)(`div`,{className:`cs-gallery`,children:[(0,u.jsx)(`img`,{src:z[N],alt:n,className:`cs-image`}),z.length>1&&(0,u.jsx)(`div`,{className:`cs-gallery-dots`,children:z.map((e,t)=>(0,u.jsx)(`button`,{className:i.t(`cs-dot`,t===N&&`active`),onClick:()=>P(t),"aria-label":`Image ${t+1}`},t))}),y&&(0,u.jsx)(`button`,{className:i.t(`cs-fav`,_&&`active`),onClick:y,"aria-label":_?`Remove from favorites`:`Add to favorites`,children:_?(0,u.jsx)(r.X,{}):(0,u.jsx)(r.Z,{})}),b&&b.length>0&&(0,u.jsxs)(`div`,{className:`cs-menu-wrap`,ref:L,children:[(0,u.jsx)(`button`,{className:`cs-menu-btn`,onClick:()=>M(!j),"aria-label":`More options`,children:(0,u.jsx)(r.Y,{})}),j&&(0,u.jsx)(`div`,{className:`cs-menu`,children:b.map((e,t)=>(0,u.jsxs)(`button`,{className:i.t(`cs-menu-item`,e.danger&&`danger`),onClick:()=>{e.onClick?.(),M(!1)},children:[e.icon&&(0,u.jsx)(`span`,{className:`cs-menu-icon`,children:e.icon}),e.label]},t))})]})]}),(0,u.jsxs)(`div`,{className:`cs-body`,children:[(0,u.jsxs)(`div`,{className:`cs-top`,children:[S&&(0,u.jsx)(`span`,{className:`cs-icon`,children:S}),(0,u.jsx)(`h3`,{className:`cs-title`,children:n})]}),a&&(0,u.jsx)(`p`,{className:`cs-desc`,children:a}),h!==void 0&&(0,u.jsxs)(`div`,{className:`cs-rating`,children:[(0,u.jsx)(s.n,{value:Math.round(h),size:`sm`,color:`warning`,readOnly:!0,className:`cs-stars`}),(0,u.jsx)(`span`,{className:`cs-rating-value`,children:h.toFixed(1)}),g!==void 0&&(0,u.jsxs)(`span`,{className:`cs-review-count`,children:[`(`,g,`)`]})]}),w&&(0,u.jsxs)(`div`,{className:`cs-leader`,children:[(0,u.jsx)(`span`,{className:`cs-avatar-sm`,title:w.name,children:w.avatar?(0,u.jsx)(`img`,{src:w.avatar,alt:w.name}):(0,u.jsx)(`span`,{children:w.name[0]?.toUpperCase()})}),(0,u.jsx)(`span`,{className:`cs-leader-name`,children:w.name})]}),e===`course`&&T&&(0,u.jsxs)(`div`,{className:`cs-participants`,children:[(0,u.jsx)(v,{people:T}),E&&(0,u.jsxs)(`span`,{className:`cs-spots`,children:[T.length,`/`,E]})]}),(0,u.jsxs)(`div`,{className:`cs-meta`,children:[d&&(0,u.jsxs)(`span`,{className:`cs-tag`,children:[(0,u.jsx)(t.t,{}),d]}),V&&(0,u.jsx)(`span`,{className:i.t(`cs-tag`,f===!1&&`unavailable`),children:V})]})]}),(0,u.jsxs)(`div`,{className:`cs-footer`,children:[o!==void 0&&(0,u.jsxs)(`span`,{className:`cs-price`,children:[typeof o==`number`?o.toFixed(2):o,` `,(0,u.jsx)(`span`,{className:`cs-currency`,children:c})]}),(0,u.jsxs)(`div`,{className:`cs-actions`,children:[e===`product`&&x&&(0,u.jsxs)(`div`,{className:`cs-qty`,children:[(0,u.jsx)(`button`,{className:`cs-qty-btn`,onClick:()=>B(R-1),"aria-label":`Decrease`,children:(0,u.jsx)(r.Q,{})}),(0,u.jsx)(`span`,{className:`cs-qty-value`,children:R}),(0,u.jsx)(`button`,{className:`cs-qty-btn`,onClick:()=>B(R+1),"aria-label":`Increase`,children:(0,u.jsx)(r.$,{})})]}),x&&(0,u.jsx)(`button`,{className:`cs-cart-btn`,onClick:()=>x(R),disabled:f===!1,children:`Add to cart`})]})]})]})}function b(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r}function x({items:t,renderCard:n,searchable:a=!1,searchKeys:s,searchPlaceholder:d=`Search...`,filterable:f=!1,filterKeys:p=[],sortable:m=!1,sortKeys:h=[],defaultSort:g,columns:_=3,emptyMessage:v=`No results found.`,className:y,style:x,...S}){let[C,w]=(0,l.useState)(``),[T,E]=(0,l.useState)({}),[D,O]=(0,l.useState)(g?.key??null),[k,A]=(0,l.useState)(g?.direction??`asc`),[j,M]=(0,l.useState)(!1),[N,P]=(0,l.useState)(!1),F=(0,l.useRef)(null),I=(0,l.useRef)(null);(0,l.useEffect)(()=>{function e(e){F.current&&!F.current.contains(e.target)&&M(!1),I.current&&!I.current.contains(e.target)&&P(!1)}return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[]);let L=(0,l.useMemo)(()=>{let e=[...t];if(C&&s&&s.length>0){let t=C.toLowerCase();e=e.filter(e=>s.some(n=>{let r=b(e,n);return r!=null&&String(r).toLowerCase().includes(t)}))}for(let[t,n]of Object.entries(T))n.size!==0&&(e=e.filter(e=>{let r=b(e,t);return r!=null&&n.has(String(r))}));return D&&e.sort((e,t)=>{let n=b(e,D),r=b(t,D);if(n==null&&r==null)return 0;if(n==null)return 1;if(r==null)return-1;let i=String(n).localeCompare(String(r),void 0,{numeric:!0});return k===`asc`?i:-i}),e},[t,C,s,T,D,k]);function R(e,t){E(n=>{let r=new Set(n[e]??[]);return r.has(t)?r.delete(t):r.add(t),{...n,[e]:r}})}let z=(0,l.useMemo)(()=>{let e={};for(let n of p){if(n.options){e[n.key]=n.options;continue}let r=new Set;for(let e of t){let t=b(e,n.key);t!=null&&r.add(String(t))}e[n.key]=Array.from(r).sort()}return e},[t,p]),B=h.find(e=>e.key===D);return(0,u.jsxs)(`div`,{className:i.t(`card grid`,y),style:x,...S,children:[(a||f||m)&&(0,u.jsxs)(`div`,{className:`card grid toolbar`,children:[a&&(0,u.jsx)(c.t,{className:`card grid search`,size:`sm`,fullWidth:!0,placeholder:d,value:C,onChange:e=>w(e.target.value),onClear:()=>w(``)}),(0,u.jsxs)(`div`,{className:`card grid actions`,children:[f&&p.length>0&&(0,u.jsxs)(`div`,{className:`card grid dropdown wrap`,ref:F,children:[(0,u.jsxs)(`button`,{type:`button`,className:`card grid toolbar button`,"aria-expanded":j,onClick:()=>{M(!j),P(!1)},children:[(0,u.jsx)(r.J,{className:`card grid button icon`}),`Filter`]}),j&&(0,u.jsx)(`div`,{className:`card grid dropdown`,children:p.map(e=>(0,u.jsxs)(`div`,{className:`card grid filter group`,children:[(0,u.jsx)(`span`,{className:`card grid filter label`,children:e.label}),(z[e.key]??[]).map(t=>(0,u.jsx)(`div`,{className:`card grid filter option`,children:(0,u.jsx)(o.t,{size:`sm`,clickEffect:`none`,checked:T[e.key]?.has(t)??!1,onChange:()=>R(e.key,t),label:t})},t))]},e.key))})]}),m&&h.length>0&&(0,u.jsxs)(`div`,{className:`card grid dropdown wrap`,ref:I,children:[(0,u.jsxs)(`button`,{type:`button`,className:`card grid toolbar button`,"aria-expanded":N,onClick:()=>{P(!N),M(!1)},children:[D?k===`asc`?(0,u.jsx)(e.n,{className:`card grid button icon`}):(0,u.jsx)(e.t,{className:`card grid button icon`}):(0,u.jsx)(r.q,{className:`card grid button icon`}),B?`Sort: ${B.label}`:`Sort`]}),N&&(0,u.jsx)(`div`,{className:`card grid dropdown`,children:h.map(t=>(0,u.jsxs)(`button`,{type:`button`,className:i.t(`card grid sort item`,D===t.key&&`active`),onClick:()=>{D===t.key?A(k===`asc`?`desc`:`asc`):(O(t.key),A(`asc`)),P(!1)},children:[t.label,D===t.key&&(0,u.jsx)(`span`,{className:`card grid sort dir`,children:k===`asc`?(0,u.jsx)(e.n,{className:`card grid sort icon`}):(0,u.jsx)(e.t,{className:`card grid sort icon`})})]},t.key))})]})]})]}),L.length>0?(0,u.jsx)(`div`,{className:`card grid items`,style:{gridTemplateColumns:`repeat(${_}, 1fr)`},children:L.map((e,t)=>n(e,t))}):(0,u.jsx)(`div`,{className:`card grid empty`,children:v})]})}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return x}});
|
|
2
|
-
//# sourceMappingURL=CardGrid-
|
|
1
|
+
const e=require(`./ArrowDownIcon-EfyFLBHR.cjs`),t=require(`./ClockIcon-DeDZlnTQ.cjs`),n=require(`./PhoneIcon-CPGZ1D2-.cjs`),r=require(`./BrandMoreIcons-Cb4cXa_M.cjs`),i=require(`./cn-BOmEz3Rt.cjs`),a=require(`./creditCards-CUM63Oia.cjs`),o=require(`./Checkbox-BXetIDRT.cjs`),s=require(`./QrCode-scUXUrNj.cjs`),c=require(`./InputSearch-Bk5YFz09.cjs`);let l=require(`react`),u=require(`react/jsx-runtime`);function d(e){let t=e.replace(/\D/g,``);return t.length<=4?t:`\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 ${t.slice(-4)}`}function f({holder:e,number:t,expiry:n,brand:r,brandIcon:o,balance:s,balanceLabel:c=`Current balance`,color:l,className:f,...p}){let m=r??a.n(t).brand,h=d(t),g=a.n(t).iconLabel;return(0,u.jsxs)(`div`,{className:i.t(`card-payment`,f),...p,children:[s!==void 0&&(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`p`,{className:`cp-balance-label`,children:c}),(0,u.jsx)(`p`,{className:`cp-balance`,children:s})]}),(0,u.jsxs)(`div`,{className:`cp-row`,children:[(0,u.jsx)(`span`,{className:i.t(`cp-brand`,!o&&m),children:o??g}),(0,u.jsx)(`span`,{className:`cp-number`,children:h})]}),(0,u.jsxs)(`div`,{className:`cp-details`,children:[(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`p`,{className:`cp-field-label`,children:`Card holder`}),(0,u.jsx)(`p`,{className:`cp-field-value`,children:e})]}),(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`p`,{className:`cp-field-label`,children:`Expiration date`}),(0,u.jsx)(`p`,{className:`cp-field-value`,children:n})]})]})]})}function p(e){return e.split(/\s+/).slice(0,2).map(e=>e[0]?.toUpperCase()??``).join(``)}function m(e){return e?[e.street,[e.zip,e.city].filter(Boolean).join(` `),e.country].filter(Boolean).join(`, `):null}function h(e){return e.trim().toLowerCase().replace(/[\s._-]+/g,``)}function g(e){switch(h(e)){case`github`:return(0,u.jsx)(r.P,{});case`linkedin`:return(0,u.jsx)(r.B,{});case`x`:case`twitter`:return(0,u.jsx)(r.W,{});case`instagram`:return(0,u.jsx)(r.R,{});case`facebook`:return(0,u.jsx)(r.A,{});case`youtube`:return(0,u.jsx)(r.K,{});case`discord`:return(0,u.jsx)(r.O,{});case`figma`:return(0,u.jsx)(r.M,{});case`slack`:return(0,u.jsx)(r.H,{});case`google`:return(0,u.jsx)(r.I,{});case`spotify`:return(0,u.jsx)(r.g,{});case`pinterest`:return(0,u.jsx)(r.m,{});case`tumblr`:return(0,u.jsx)(r.v,{});case`vimeo`:return(0,u.jsx)(r.S,{});case`vk`:case`vkontakte`:return(0,u.jsx)(r.E,{});default:return null}}function _({variant:e=`user`,name:t,title:a,avatar:o,address:c,contact:l,socials:d,online:f,lastActive:h,qrCode:_,qrValue:v,color:y=`primary`,className:b,...x}){let S=m(c);return(0,u.jsxs)(`div`,{className:i.t(`card-business`,e,y,b),...x,children:[(0,u.jsxs)(`div`,{className:`cb-header`,children:[(0,u.jsxs)(`div`,{className:`cb-avatar-wrap`,children:[o?(0,u.jsx)(`img`,{src:o,alt:t,className:i.t(`cb-avatar`,e)}):(0,u.jsx)(`span`,{className:i.t(`cb-avatar`,`cb-initials`,e),children:p(t)}),f!==void 0&&(0,u.jsx)(`span`,{className:i.t(`cb-status`,f?`online`:`offline`)})]}),(0,u.jsxs)(`div`,{className:`cb-info`,children:[(0,u.jsx)(`h3`,{className:`cb-name`,children:t}),a&&(0,u.jsx)(`p`,{className:`cb-title`,children:a}),h&&(0,u.jsx)(`p`,{className:`cb-last-active`,children:h})]}),(v||_)&&(0,u.jsx)(`div`,{className:`cb-qr`,children:v?(0,u.jsx)(s.t,{value:v,size:56,padding:3,className:`cb-qr-code`}):(0,u.jsx)(`img`,{src:_,alt:`QR`,className:`cb-qr-img`})})]}),(l||S)&&(0,u.jsxs)(`div`,{className:`cb-details`,children:[l?.email&&(0,u.jsxs)(`div`,{className:`cb-detail`,children:[(0,u.jsx)(`span`,{className:`cb-detail-icon`,children:(0,u.jsx)(n.n,{})}),(0,u.jsx)(`a`,{href:`mailto:${l.email}`,className:`cb-detail-value`,children:l.email})]}),l?.phone&&(0,u.jsxs)(`div`,{className:`cb-detail`,children:[(0,u.jsx)(`span`,{className:`cb-detail-icon`,children:(0,u.jsx)(n.t,{})}),(0,u.jsx)(`a`,{href:`tel:${l.phone}`,className:`cb-detail-value`,children:l.phone})]}),l?.website&&(0,u.jsxs)(`div`,{className:`cb-detail`,children:[(0,u.jsx)(`span`,{className:`cb-detail-icon`,children:(0,u.jsx)(r.tt,{})}),(0,u.jsx)(`a`,{href:l.website,target:`_blank`,rel:`noopener noreferrer`,className:`cb-detail-value`,children:l.website.replace(/^https?:\/\//,``)})]}),S&&(0,u.jsxs)(`div`,{className:`cb-detail`,children:[(0,u.jsx)(`span`,{className:`cb-detail-icon`,children:(0,u.jsx)(r.et,{})}),(0,u.jsx)(`span`,{className:`cb-detail-value`,children:S})]})]}),d&&d.length>0&&(0,u.jsx)(`div`,{className:`cb-socials`,children:d.map(e=>(0,u.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,className:`cb-social`,title:e.platform,"aria-label":e.platform,children:e.icon??g(e.platform)??(0,u.jsx)(`span`,{className:`cb-social-text`,children:e.platform})},e.platform))})]})}function v({people:e,max:t=4}){if(!e||e.length===0)return null;let n=e.slice(0,t),r=e.length-t;return(0,u.jsxs)(`div`,{className:`cs-avatars`,children:[n.map((e,t)=>(0,u.jsx)(`span`,{className:`cs-avatar-sm`,title:e.name,children:e.avatar?(0,u.jsx)(`img`,{src:e.avatar,alt:e.name}):(0,u.jsx)(`span`,{children:e.name[0]?.toUpperCase()})},t)),r>0&&(0,u.jsxs)(`span`,{className:`cs-avatar-sm cs-overflow`,children:[`+`,r]})]})}function y({variant:e=`service`,title:n,description:a,price:o,currency:c=`PLN`,duration:d,available:f,image:p,gallery:m,rating:h,reviewCount:g,favorite:_,onFavorite:y,menuItems:b,onAddToCart:x,icon:S,color:C=`primary`,leader:w,participants:T,maxParticipants:E,quantity:D,onQuantityChange:O,className:k,...A}){let[j,M]=(0,l.useState)(!1),[N,P]=(0,l.useState)(0),[F,I]=(0,l.useState)(1),L=(0,l.useRef)(null),R=D??F,z=m&&m.length>0?m:p?[p]:[];(0,l.useEffect)(()=>{if(!j)return;function e(e){L.current&&!L.current.contains(e.target)&&M(!1)}return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[j]);function B(e){let t=Math.max(1,e);O?O(t):I(t)}let V=f===!0?`Available`:f===!1?`Unavailable`:typeof f==`number`?`${f} spots`:null;return(0,u.jsxs)(`div`,{className:i.t(`card-service`,e,C,k),...A,children:[z.length>0&&(0,u.jsxs)(`div`,{className:`cs-gallery`,children:[(0,u.jsx)(`img`,{src:z[N],alt:n,className:`cs-image`}),z.length>1&&(0,u.jsx)(`div`,{className:`cs-gallery-dots`,children:z.map((e,t)=>(0,u.jsx)(`button`,{className:i.t(`cs-dot`,t===N&&`active`),onClick:()=>P(t),"aria-label":`Image ${t+1}`},t))}),y&&(0,u.jsx)(`button`,{className:i.t(`cs-fav`,_&&`active`),onClick:y,"aria-label":_?`Remove from favorites`:`Add to favorites`,children:_?(0,u.jsx)(r.X,{}):(0,u.jsx)(r.Z,{})}),b&&b.length>0&&(0,u.jsxs)(`div`,{className:`cs-menu-wrap`,ref:L,children:[(0,u.jsx)(`button`,{className:`cs-menu-btn`,onClick:()=>M(!j),"aria-label":`More options`,children:(0,u.jsx)(r.Y,{})}),j&&(0,u.jsx)(`div`,{className:`cs-menu`,children:b.map((e,t)=>(0,u.jsxs)(`button`,{className:i.t(`cs-menu-item`,e.danger&&`danger`),onClick:()=>{e.onClick?.(),M(!1)},children:[e.icon&&(0,u.jsx)(`span`,{className:`cs-menu-icon`,children:e.icon}),e.label]},t))})]})]}),(0,u.jsxs)(`div`,{className:`cs-body`,children:[(0,u.jsxs)(`div`,{className:`cs-top`,children:[S&&(0,u.jsx)(`span`,{className:`cs-icon`,children:S}),(0,u.jsx)(`h3`,{className:`cs-title`,children:n})]}),a&&(0,u.jsx)(`p`,{className:`cs-desc`,children:a}),h!==void 0&&(0,u.jsxs)(`div`,{className:`cs-rating`,children:[(0,u.jsx)(s.n,{value:Math.round(h),size:`sm`,color:`warning`,readOnly:!0,className:`cs-stars`}),(0,u.jsx)(`span`,{className:`cs-rating-value`,children:h.toFixed(1)}),g!==void 0&&(0,u.jsxs)(`span`,{className:`cs-review-count`,children:[`(`,g,`)`]})]}),w&&(0,u.jsxs)(`div`,{className:`cs-leader`,children:[(0,u.jsx)(`span`,{className:`cs-avatar-sm`,title:w.name,children:w.avatar?(0,u.jsx)(`img`,{src:w.avatar,alt:w.name}):(0,u.jsx)(`span`,{children:w.name[0]?.toUpperCase()})}),(0,u.jsx)(`span`,{className:`cs-leader-name`,children:w.name})]}),e===`course`&&T&&(0,u.jsxs)(`div`,{className:`cs-participants`,children:[(0,u.jsx)(v,{people:T}),E&&(0,u.jsxs)(`span`,{className:`cs-spots`,children:[T.length,`/`,E]})]}),(0,u.jsxs)(`div`,{className:`cs-meta`,children:[d&&(0,u.jsxs)(`span`,{className:`cs-tag`,children:[(0,u.jsx)(t.t,{}),d]}),V&&(0,u.jsx)(`span`,{className:i.t(`cs-tag`,f===!1&&`unavailable`),children:V})]})]}),(0,u.jsxs)(`div`,{className:`cs-footer`,children:[o!==void 0&&(0,u.jsxs)(`span`,{className:`cs-price`,children:[typeof o==`number`?o.toFixed(2):o,` `,(0,u.jsx)(`span`,{className:`cs-currency`,children:c})]}),(0,u.jsxs)(`div`,{className:`cs-actions`,children:[e===`product`&&x&&(0,u.jsxs)(`div`,{className:`cs-qty`,children:[(0,u.jsx)(`button`,{className:`cs-qty-btn`,onClick:()=>B(R-1),"aria-label":`Decrease`,children:(0,u.jsx)(r.Q,{})}),(0,u.jsx)(`span`,{className:`cs-qty-value`,children:R}),(0,u.jsx)(`button`,{className:`cs-qty-btn`,onClick:()=>B(R+1),"aria-label":`Increase`,children:(0,u.jsx)(r.$,{})})]}),x&&(0,u.jsx)(`button`,{className:`cs-cart-btn`,onClick:()=>x(R),disabled:f===!1,children:`Add to cart`})]})]})]})}function b(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r}function x({items:t,renderCard:n,searchable:a=!1,searchKeys:s,searchPlaceholder:d=`Search...`,filterable:f=!1,filterKeys:p=[],sortable:m=!1,sortKeys:h=[],defaultSort:g,columns:_=3,emptyMessage:v=`No results found.`,className:y,style:x,...S}){let[C,w]=(0,l.useState)(``),[T,E]=(0,l.useState)({}),[D,O]=(0,l.useState)(g?.key??null),[k,A]=(0,l.useState)(g?.direction??`asc`),[j,M]=(0,l.useState)(!1),[N,P]=(0,l.useState)(!1),F=(0,l.useRef)(null),I=(0,l.useRef)(null);(0,l.useEffect)(()=>{function e(e){F.current&&!F.current.contains(e.target)&&M(!1),I.current&&!I.current.contains(e.target)&&P(!1)}return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[]);let L=(0,l.useMemo)(()=>{let e=[...t];if(C&&s&&s.length>0){let t=C.toLowerCase();e=e.filter(e=>s.some(n=>{let r=b(e,n);return r!=null&&String(r).toLowerCase().includes(t)}))}for(let[t,n]of Object.entries(T))n.size!==0&&(e=e.filter(e=>{let r=b(e,t);return r!=null&&n.has(String(r))}));return D&&e.sort((e,t)=>{let n=b(e,D),r=b(t,D);if(n==null&&r==null)return 0;if(n==null)return 1;if(r==null)return-1;let i=String(n).localeCompare(String(r),void 0,{numeric:!0});return k===`asc`?i:-i}),e},[t,C,s,T,D,k]);function R(e,t){E(n=>{let r=new Set(n[e]??[]);return r.has(t)?r.delete(t):r.add(t),{...n,[e]:r}})}let z=(0,l.useMemo)(()=>{let e={};for(let n of p){if(n.options){e[n.key]=n.options;continue}let r=new Set;for(let e of t){let t=b(e,n.key);t!=null&&r.add(String(t))}e[n.key]=Array.from(r).sort()}return e},[t,p]),B=h.find(e=>e.key===D);return(0,u.jsxs)(`div`,{className:i.t(`card-grid`,y),style:x,...S,children:[(a||f||m)&&(0,u.jsxs)(`div`,{className:`card-grid-toolbar`,children:[a&&(0,u.jsx)(c.t,{className:`card-grid-search`,size:`sm`,fullWidth:!0,placeholder:d,value:C,onChange:e=>w(e.target.value),onClear:()=>w(``)}),(0,u.jsxs)(`div`,{className:`card-grid-actions`,children:[f&&p.length>0&&(0,u.jsxs)(`div`,{className:`card-grid-dropdown-wrap`,ref:F,children:[(0,u.jsxs)(`button`,{type:`button`,className:`card-grid-toolbar-button`,"aria-expanded":j,onClick:()=>{M(!j),P(!1)},children:[(0,u.jsx)(r.J,{className:`card-grid-button-icon`}),`Filter`]}),j&&(0,u.jsx)(`div`,{className:`card-grid-dropdown`,children:p.map(e=>(0,u.jsxs)(`div`,{className:`card-grid-filter-group`,children:[(0,u.jsx)(`span`,{className:`card-grid-filter-label`,children:e.label}),(z[e.key]??[]).map(t=>(0,u.jsx)(`div`,{className:`card-grid-filter-option`,children:(0,u.jsx)(o.t,{size:`sm`,clickEffect:`none`,checked:T[e.key]?.has(t)??!1,onChange:()=>R(e.key,t),label:t})},t))]},e.key))})]}),m&&h.length>0&&(0,u.jsxs)(`div`,{className:`card-grid-dropdown-wrap`,ref:I,children:[(0,u.jsxs)(`button`,{type:`button`,className:`card-grid-toolbar-button`,"aria-expanded":N,onClick:()=>{P(!N),M(!1)},children:[D?k===`asc`?(0,u.jsx)(e.n,{className:`card-grid-button-icon`}):(0,u.jsx)(e.t,{className:`card-grid-button-icon`}):(0,u.jsx)(r.q,{className:`card-grid-button-icon`}),B?`Sort: ${B.label}`:`Sort`]}),N&&(0,u.jsx)(`div`,{className:`card-grid-dropdown`,children:h.map(t=>(0,u.jsxs)(`button`,{type:`button`,className:i.t(`card-grid-sort-item`,D===t.key&&`active`),onClick:()=>{D===t.key?A(k===`asc`?`desc`:`asc`):(O(t.key),A(`asc`)),P(!1)},children:[t.label,D===t.key&&(0,u.jsx)(`span`,{className:`card-grid-sort-dir`,children:k===`asc`?(0,u.jsx)(e.n,{className:`card-grid-sort-icon`}):(0,u.jsx)(e.t,{className:`card-grid-sort-icon`})})]},t.key))})]})]})]}),L.length>0?(0,u.jsx)(`div`,{className:`card-grid-items`,style:{gridTemplateColumns:`repeat(${_}, 1fr)`},children:L.map((e,t)=>n(e,t))}):(0,u.jsx)(`div`,{className:`card-grid-empty`,children:v})]})}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return x}});
|
|
2
|
+
//# sourceMappingURL=CardGrid-Dvu64wUg.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CardGrid-Cm0qx9ue.cjs","names":[],"sources":["../src/components/cards/CardPayment/CardPayment.tsx","../src/components/cards/CardBusiness/CardBusiness.tsx","../src/components/cards/CardService/CardService.tsx","../src/components/cards/CardGrid/CardGrid.tsx"],"sourcesContent":["import type {CardPaymentProps} from './CardPayment.types'\nimport {cn} from '../../../utils/cn'\nimport {detectCardBrand} from '../../../utils/creditCards'\nimport './CardPayment.css'\n\nfunction maskNumber(raw: string): string {\n const digits = raw.replace(/\\D/g, '')\n if (digits.length <= 4) return digits\n const last4 = digits.slice(-4)\n return `\\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 ${last4}`\n}\n\n// Display-only payment card with balance, masked number, holder name and brand badge.\nexport function CardPayment({\n holder,\n number,\n expiry,\n brand,\n brandIcon,\n balance,\n balanceLabel = 'Current balance',\n color,\n className,\n ...rest\n}: CardPaymentProps) {\n const detected = brand ?? detectCardBrand(number).brand\n const masked = maskNumber(number)\n const brandLabel = detectCardBrand(number).iconLabel\n\n return (\n <div className={cn('card-payment', className)} {...rest}>\n {balance !== undefined && (\n <div>\n <p className=\"cp-balance-label\">{balanceLabel}</p>\n <p className=\"cp-balance\">{balance}</p>\n </div>\n )}\n\n <div className=\"cp-row\">\n <span className={cn('cp-brand', !brandIcon && detected)}>{brandIcon ?? brandLabel}</span>\n <span className=\"cp-number\">{masked}</span>\n </div>\n\n <div className=\"cp-details\">\n <div>\n <p className=\"cp-field-label\">Card holder</p>\n <p className=\"cp-field-value\">{holder}</p>\n </div>\n <div>\n <p className=\"cp-field-label\">Expiration date</p>\n <p className=\"cp-field-value\">{expiry}</p>\n </div>\n </div>\n </div>\n )\n}\n","import type {CardBusinessProps} from './CardBusiness.types'\nimport {cn} from '../../../utils/cn'\nimport {QrCode} from '../../display'\nimport {\n DiscordIcon,\n FacebookIcon,\n FigmaIcon,\n GitHubIcon,\n GlobeIcon,\n GoogleIcon,\n InstagramIcon,\n LinkedInIcon,\n MailIcon,\n PhoneIcon,\n PinterestIcon,\n PinIcon,\n SlackIcon,\n SpotifyIcon,\n TumblrIcon,\n VimeoIcon,\n VkIcon,\n XIcon,\n YouTubeIcon,\n} from '../../../icons'\nimport './CardBusiness.css'\n\n// Build a short avatar fallback from the visible name.\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .slice(0, 2)\n .map((word) => word[0]?.toUpperCase() ?? '')\n .join('')\n}\n\n// Join available address fields into one readable line.\nfunction formatAddress(address: CardBusinessProps['address']): string | null {\n if (!address) return null\n\n return [address.street, [address.zip, address.city].filter(Boolean).join(' '), address.country]\n .filter(Boolean)\n .join(', ')\n}\n\nfunction normalizePlatform(platform: string): string {\n return platform.trim().toLowerCase().replace(/[\\s._-]+/g, '')\n}\n\nfunction getSocialIcon(platform: string) {\n switch (normalizePlatform(platform)) {\n case 'github':\n return <GitHubIcon />\n case 'linkedin':\n return <LinkedInIcon />\n case 'x':\n case 'twitter':\n return <XIcon />\n case 'instagram':\n return <InstagramIcon />\n case 'facebook':\n return <FacebookIcon />\n case 'youtube':\n return <YouTubeIcon />\n case 'discord':\n return <DiscordIcon />\n case 'figma':\n return <FigmaIcon />\n case 'slack':\n return <SlackIcon />\n case 'google':\n return <GoogleIcon />\n case 'spotify':\n return <SpotifyIcon />\n case 'pinterest':\n return <PinterestIcon />\n case 'tumblr':\n return <TumblrIcon />\n case 'vimeo':\n return <VimeoIcon />\n case 'vk':\n case 'vkontakte':\n return <VkIcon />\n default:\n return null\n }\n}\n\n// Render a compact business card for a person or a company profile.\nexport function CardBusiness({\n variant = 'user',\n name,\n title,\n avatar,\n address,\n contact,\n socials,\n online,\n lastActive,\n qrCode,\n qrValue,\n color = 'primary',\n className,\n ...rest\n}: CardBusinessProps) {\n const addr = formatAddress(address)\n\n return (\n <div className={cn('card-business', variant, color, className)} {...rest}>\n <div className=\"cb-header\">\n <div className=\"cb-avatar-wrap\">\n {avatar ? (\n <img src={avatar} alt={name} className={cn('cb-avatar', variant)} />\n ) : (\n <span className={cn('cb-avatar', 'cb-initials', variant)}>{initials(name)}</span>\n )}\n {online !== undefined && <span className={cn('cb-status', online ? 'online' : 'offline')} />}\n </div>\n\n <div className=\"cb-info\">\n <h3 className=\"cb-name\">{name}</h3>\n {title && <p className=\"cb-title\">{title}</p>}\n {lastActive && <p className=\"cb-last-active\">{lastActive}</p>}\n </div>\n\n {(qrValue || qrCode) && (\n <div className=\"cb-qr\">\n {qrValue ? (\n <QrCode value={qrValue} size={56} padding={3} className=\"cb-qr-code\" />\n ) : (\n <img src={qrCode} alt=\"QR\" className=\"cb-qr-img\" />\n )}\n </div>\n )}\n </div>\n\n {(contact || addr) && (\n <div className=\"cb-details\">\n {contact?.email && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">\n <MailIcon />\n </span>\n <a href={`mailto:${contact.email}`} className=\"cb-detail-value\">\n {contact.email}\n </a>\n </div>\n )}\n {contact?.phone && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">\n <PhoneIcon />\n </span>\n <a href={`tel:${contact.phone}`} className=\"cb-detail-value\">\n {contact.phone}\n </a>\n </div>\n )}\n {contact?.website && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">\n <GlobeIcon />\n </span>\n <a\n href={contact.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cb-detail-value\"\n >\n {contact.website.replace(/^https?:\\/\\//, '')}\n </a>\n </div>\n )}\n {addr && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">\n <PinIcon />\n </span>\n <span className=\"cb-detail-value\">{addr}</span>\n </div>\n )}\n </div>\n )}\n\n {socials && socials.length > 0 && (\n <div className=\"cb-socials\">\n {socials.map((item) => (\n <a\n key={item.platform}\n href={item.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cb-social\"\n title={item.platform}\n aria-label={item.platform}\n >\n {item.icon ?? getSocialIcon(item.platform) ?? <span className=\"cb-social-text\">{item.platform}</span>}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useEffect} from 'react'\nimport type {CardServiceProps} from './CardService.types'\nimport {cn} from '../../../utils/cn'\nimport {\n ClockIcon,\n EllipsisVerticalIcon,\n HeartFillIcon,\n HeartIcon,\n MinusIcon,\n PlusIcon,\n} from '../../../icons'\nimport {Rating} from '../../display'\nimport './CardService.css'\n\nfunction AvatarStack({people, max = 4}: {people: CardServiceProps['participants']; max?: number}) {\n if (!people || people.length === 0) return null\n const visible = people.slice(0, max)\n const overflow = people.length - max\n\n return (\n <div className=\"cs-avatars\">\n {visible.map((p, i) => (\n <span key={i} className=\"cs-avatar-sm\" title={p.name}>\n {p.avatar ? <img src={p.avatar} alt={p.name} /> : <span>{p.name[0]?.toUpperCase()}</span>}\n </span>\n ))}\n {overflow > 0 && <span className=\"cs-avatar-sm cs-overflow\">+{overflow}</span>}\n </div>\n )\n}\n\n// Card for services, courses or products with rating, gallery, cart and participant display.\nexport function CardService({\n variant = 'service',\n title,\n description,\n price,\n currency = 'PLN',\n duration,\n available,\n image,\n gallery,\n rating,\n reviewCount,\n favorite,\n onFavorite,\n menuItems,\n onAddToCart,\n icon,\n color = 'primary',\n leader,\n participants,\n maxParticipants,\n quantity: controlledQty,\n onQuantityChange,\n className,\n ...rest\n}: CardServiceProps) {\n const [menuOpen, setMenuOpen] = useState(false)\n const [galleryIdx, setGalleryIdx] = useState(0)\n const [internalQty, setInternalQty] = useState(1)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const qty = controlledQty ?? internalQty\n const images = gallery && gallery.length > 0 ? gallery : image ? [image] : []\n\n useEffect(() => {\n if (!menuOpen) return\n function close(e: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) setMenuOpen(false)\n }\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [menuOpen])\n\n function changeQty(next: number) {\n const val = Math.max(1, next)\n if (onQuantityChange) onQuantityChange(val)\n else setInternalQty(val)\n }\n\n const availLabel =\n available === true\n ? 'Available'\n : available === false\n ? 'Unavailable'\n : typeof available === 'number'\n ? `${available} spots`\n : null\n\n return (\n <div className={cn('card-service', variant, color, className)} {...rest}>\n {images.length > 0 && (\n <div className=\"cs-gallery\">\n <img src={images[galleryIdx]} alt={title} className=\"cs-image\" />\n {images.length > 1 && (\n <div className=\"cs-gallery-dots\">\n {images.map((_, i) => (\n <button\n key={i}\n className={cn('cs-dot', i === galleryIdx && 'active')}\n onClick={() => setGalleryIdx(i)}\n aria-label={`Image ${i + 1}`}\n />\n ))}\n </div>\n )}\n\n {onFavorite && (\n <button\n className={cn('cs-fav', favorite && 'active')}\n onClick={onFavorite}\n aria-label={favorite ? 'Remove from favorites' : 'Add to favorites'}\n >\n {favorite ? <HeartFillIcon /> : <HeartIcon />}\n </button>\n )}\n\n {menuItems && menuItems.length > 0 && (\n <div className=\"cs-menu-wrap\" ref={menuRef}>\n <button\n className=\"cs-menu-btn\"\n onClick={() => setMenuOpen(!menuOpen)}\n aria-label=\"More options\"\n >\n <EllipsisVerticalIcon />\n </button>\n {menuOpen && (\n <div className=\"cs-menu\">\n {menuItems.map((item, i) => (\n <button\n key={i}\n className={cn('cs-menu-item', item.danger && 'danger')}\n onClick={() => {\n item.onClick?.()\n setMenuOpen(false)\n }}\n >\n {item.icon && <span className=\"cs-menu-icon\">{item.icon}</span>}\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"cs-body\">\n <div className=\"cs-top\">\n {icon && <span className=\"cs-icon\">{icon}</span>}\n <h3 className=\"cs-title\">{title}</h3>\n </div>\n\n {description && <p className=\"cs-desc\">{description}</p>}\n\n {rating !== undefined && (\n <div className=\"cs-rating\">\n <Rating value={Math.round(rating)} size=\"sm\" color=\"warning\" readOnly className=\"cs-stars\" />\n <span className=\"cs-rating-value\">{rating.toFixed(1)}</span>\n {reviewCount !== undefined && <span className=\"cs-review-count\">({reviewCount})</span>}\n </div>\n )}\n\n {leader && (\n <div className=\"cs-leader\">\n <span className=\"cs-avatar-sm\" title={leader.name}>\n {leader.avatar ? (\n <img src={leader.avatar} alt={leader.name} />\n ) : (\n <span>{leader.name[0]?.toUpperCase()}</span>\n )}\n </span>\n <span className=\"cs-leader-name\">{leader.name}</span>\n </div>\n )}\n\n {variant === 'course' && participants && (\n <div className=\"cs-participants\">\n <AvatarStack people={participants} />\n {maxParticipants && (\n <span className=\"cs-spots\">\n {participants.length}/{maxParticipants}\n </span>\n )}\n </div>\n )}\n\n <div className=\"cs-meta\">\n {duration && (\n <span className=\"cs-tag\">\n <ClockIcon />\n {duration}\n </span>\n )}\n {availLabel && (\n <span className={cn('cs-tag', available === false && 'unavailable')}>{availLabel}</span>\n )}\n </div>\n </div>\n\n <div className=\"cs-footer\">\n {price !== undefined && (\n <span className=\"cs-price\">\n {typeof price === 'number' ? price.toFixed(2) : price}{' '}\n <span className=\"cs-currency\">{currency}</span>\n </span>\n )}\n\n <div className=\"cs-actions\">\n {variant === 'product' && onAddToCart && (\n <div className=\"cs-qty\">\n <button className=\"cs-qty-btn\" onClick={() => changeQty(qty - 1)} aria-label=\"Decrease\">\n <MinusIcon />\n </button>\n <span className=\"cs-qty-value\">{qty}</span>\n <button className=\"cs-qty-btn\" onClick={() => changeQty(qty + 1)} aria-label=\"Increase\">\n <PlusIcon />\n </button>\n </div>\n )}\n {onAddToCart && (\n <button className=\"cs-cart-btn\" onClick={() => onAddToCart(qty)} disabled={available === false}>\n Add to cart\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import {useState, useMemo, useRef, useEffect} from 'react'\nimport type {CardGridProps} from './CardGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {Checkbox} from '../../controls'\nimport {InputSearch} from '../../inputs'\nimport {ArrowDownIcon, ArrowUpIcon, FilterIcon, SortIcon} from '../../../icons'\nimport './CardGrid.css'\n\nfunction getNestedValue(obj: unknown, key: string): unknown {\n const parts = key.split('.')\n let val: unknown = obj\n\n for (const p of parts) {\n if (val == null || typeof val !== 'object') return undefined\n val = (val as Record<string, unknown>)[p]\n }\n\n return val\n}\n\nexport function CardGrid<T extends Record<string, unknown>>({\n items,\n renderCard,\n searchable = false,\n searchKeys,\n searchPlaceholder = 'Search...',\n filterable = false,\n filterKeys = [],\n sortable = false,\n sortKeys = [],\n defaultSort,\n columns = 3,\n emptyMessage = 'No results found.',\n className,\n style,\n ...rest\n}: CardGridProps<T>) {\n const [search, setSearch] = useState('')\n const [filters, setFilters] = useState<Record<string, Set<string>>>({})\n const [sortKey, setSortKey] = useState<string | null>(defaultSort?.key ?? null)\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>(defaultSort?.direction ?? 'asc')\n const [filterOpen, setFilterOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n const filterRef = useRef<HTMLDivElement>(null)\n const sortRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n function close(event: MouseEvent) {\n if (filterRef.current && !filterRef.current.contains(event.target as Node)) {\n setFilterOpen(false)\n }\n\n if (sortRef.current && !sortRef.current.contains(event.target as Node)) {\n setSortOpen(false)\n }\n }\n\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [])\n\n const processed = useMemo(() => {\n let result = [...items]\n\n if (search && searchKeys && searchKeys.length > 0) {\n const query = search.toLowerCase()\n result = result.filter((item) =>\n searchKeys.some((key) => {\n const value = getNestedValue(item, key)\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }\n\n for (const [key, selected] of Object.entries(filters)) {\n if (selected.size === 0) continue\n\n result = result.filter((item) => {\n const value = getNestedValue(item, key)\n return value != null && selected.has(String(value))\n })\n }\n\n if (sortKey) {\n result.sort((a, b) => {\n const av = getNestedValue(a, sortKey)\n const bv = getNestedValue(b, sortKey)\n\n if (av == null && bv == null) return 0\n if (av == null) return 1\n if (bv == null) return -1\n\n const compare = String(av).localeCompare(String(bv), undefined, {numeric: true})\n return sortDir === 'asc' ? compare : -compare\n })\n }\n\n return result\n }, [items, search, searchKeys, filters, sortKey, sortDir])\n\n function toggleFilter(key: string, value: string) {\n setFilters((prev) => {\n const next = new Set(prev[key] ?? [])\n\n if (next.has(value)) next.delete(value)\n else next.add(value)\n\n return {...prev, [key]: next}\n })\n }\n\n const filterOptions = useMemo(() => {\n const map: Record<string, string[]> = {}\n\n for (const filterKey of filterKeys) {\n if (filterKey.options) {\n map[filterKey.key] = filterKey.options\n continue\n }\n\n const values = new Set<string>()\n\n for (const item of items) {\n const value = getNestedValue(item, filterKey.key)\n if (value != null) values.add(String(value))\n }\n\n map[filterKey.key] = Array.from(values).sort()\n }\n\n return map\n }, [items, filterKeys])\n\n const activeSort = sortKeys.find((item) => item.key === sortKey)\n\n return (\n <div className={cn('card grid', className)} style={style} {...rest}>\n {(searchable || filterable || sortable) && (\n <div className=\"card grid toolbar\">\n {searchable && (\n <InputSearch\n className=\"card grid search\"\n size=\"sm\"\n fullWidth\n placeholder={searchPlaceholder}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onClear={() => setSearch('')}\n />\n )}\n\n <div className=\"card grid actions\">\n {filterable && filterKeys.length > 0 && (\n <div className=\"card grid dropdown wrap\" ref={filterRef}>\n <button\n type=\"button\"\n className=\"card grid toolbar button\"\n aria-expanded={filterOpen}\n onClick={() => {\n setFilterOpen(!filterOpen)\n setSortOpen(false)\n }}\n >\n <FilterIcon className=\"card grid button icon\" />\n Filter\n </button>\n {filterOpen && (\n <div className=\"card grid dropdown\">\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"card grid filter group\">\n <span className=\"card grid filter label\">{filterKey.label}</span>\n {(filterOptions[filterKey.key] ?? []).map((option) => (\n <div key={option} className=\"card grid filter option\">\n <Checkbox\n size=\"sm\"\n clickEffect=\"none\"\n checked={filters[filterKey.key]?.has(option) ?? false}\n onChange={() => toggleFilter(filterKey.key, option)}\n label={option}\n />\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {sortable && sortKeys.length > 0 && (\n <div className=\"card grid dropdown wrap\" ref={sortRef}>\n <button\n type=\"button\"\n className=\"card grid toolbar button\"\n aria-expanded={sortOpen}\n onClick={() => {\n setSortOpen(!sortOpen)\n setFilterOpen(false)\n }}\n >\n {sortKey ? (\n sortDir === 'asc' ? (\n <ArrowUpIcon className=\"card grid button icon\" />\n ) : (\n <ArrowDownIcon className=\"card grid button icon\" />\n )\n ) : (\n <SortIcon className=\"card grid button icon\" />\n )}\n {activeSort ? `Sort: ${activeSort.label}` : 'Sort'}\n </button>\n {sortOpen && (\n <div className=\"card grid dropdown\">\n {sortKeys.map((sortItem) => (\n <button\n key={sortItem.key}\n type=\"button\"\n className={cn('card grid sort item', sortKey === sortItem.key && 'active')}\n onClick={() => {\n if (sortKey === sortItem.key) {\n setSortDir(sortDir === 'asc' ? 'desc' : 'asc')\n } else {\n setSortKey(sortItem.key)\n setSortDir('asc')\n }\n\n setSortOpen(false)\n }}\n >\n {sortItem.label}\n {sortKey === sortItem.key && (\n <span className=\"card grid sort dir\">\n {sortDir === 'asc' ? (\n <ArrowUpIcon className=\"card grid sort icon\" />\n ) : (\n <ArrowDownIcon className=\"card grid sort icon\" />\n )}\n </span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {processed.length > 0 ? (\n <div\n className=\"card grid items\"\n style={{\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n }}\n >\n {processed.map((item, index) => renderCard(item, index))}\n </div>\n ) : (\n <div className=\"card grid empty\">{emptyMessage}</div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CardGrid-Dvu64wUg.cjs","names":[],"sources":["../src/components/cards/CardPayment/CardPayment.tsx","../src/components/cards/CardBusiness/CardBusiness.tsx","../src/components/cards/CardService/CardService.tsx","../src/components/cards/CardGrid/CardGrid.tsx"],"sourcesContent":["import type {CardPaymentProps} from './CardPayment.types'\nimport {cn} from '../../../utils/cn'\nimport {detectCardBrand} from '../../../utils/creditCards'\nimport './CardPayment.css'\n\nfunction maskNumber(raw: string): string {\n const digits = raw.replace(/\\D/g, '')\n if (digits.length <= 4) return digits\n const last4 = digits.slice(-4)\n return `\\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 ${last4}`\n}\n\n// Display-only payment card with balance, masked number, holder name and brand badge.\nexport function CardPayment({\n holder,\n number,\n expiry,\n brand,\n brandIcon,\n balance,\n balanceLabel = 'Current balance',\n color,\n className,\n ...rest\n}: CardPaymentProps) {\n const detected = brand ?? detectCardBrand(number).brand\n const masked = maskNumber(number)\n const brandLabel = detectCardBrand(number).iconLabel\n\n return (\n <div className={cn('card-payment', className)} {...rest}>\n {balance !== undefined && (\n <div>\n <p className=\"cp-balance-label\">{balanceLabel}</p>\n <p className=\"cp-balance\">{balance}</p>\n </div>\n )}\n\n <div className=\"cp-row\">\n <span className={cn('cp-brand', !brandIcon && detected)}>{brandIcon ?? brandLabel}</span>\n <span className=\"cp-number\">{masked}</span>\n </div>\n\n <div className=\"cp-details\">\n <div>\n <p className=\"cp-field-label\">Card holder</p>\n <p className=\"cp-field-value\">{holder}</p>\n </div>\n <div>\n <p className=\"cp-field-label\">Expiration date</p>\n <p className=\"cp-field-value\">{expiry}</p>\n </div>\n </div>\n </div>\n )\n}\n","import type {CardBusinessProps} from './CardBusiness.types'\nimport {cn} from '../../../utils/cn'\nimport {QrCode} from '../../display'\nimport {\n DiscordIcon,\n FacebookIcon,\n FigmaIcon,\n GitHubIcon,\n GlobeIcon,\n GoogleIcon,\n InstagramIcon,\n LinkedInIcon,\n MailIcon,\n PhoneIcon,\n PinterestIcon,\n PinIcon,\n SlackIcon,\n SpotifyIcon,\n TumblrIcon,\n VimeoIcon,\n VkIcon,\n XIcon,\n YouTubeIcon,\n} from '../../../icons'\nimport './CardBusiness.css'\n\n// Build a short avatar fallback from the visible name.\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .slice(0, 2)\n .map((word) => word[0]?.toUpperCase() ?? '')\n .join('')\n}\n\n// Join available address fields into one readable line.\nfunction formatAddress(address: CardBusinessProps['address']): string | null {\n if (!address) return null\n\n return [address.street, [address.zip, address.city].filter(Boolean).join(' '), address.country]\n .filter(Boolean)\n .join(', ')\n}\n\nfunction normalizePlatform(platform: string): string {\n return platform.trim().toLowerCase().replace(/[\\s._-]+/g, '')\n}\n\nfunction getSocialIcon(platform: string) {\n switch (normalizePlatform(platform)) {\n case 'github':\n return <GitHubIcon />\n case 'linkedin':\n return <LinkedInIcon />\n case 'x':\n case 'twitter':\n return <XIcon />\n case 'instagram':\n return <InstagramIcon />\n case 'facebook':\n return <FacebookIcon />\n case 'youtube':\n return <YouTubeIcon />\n case 'discord':\n return <DiscordIcon />\n case 'figma':\n return <FigmaIcon />\n case 'slack':\n return <SlackIcon />\n case 'google':\n return <GoogleIcon />\n case 'spotify':\n return <SpotifyIcon />\n case 'pinterest':\n return <PinterestIcon />\n case 'tumblr':\n return <TumblrIcon />\n case 'vimeo':\n return <VimeoIcon />\n case 'vk':\n case 'vkontakte':\n return <VkIcon />\n default:\n return null\n }\n}\n\n// Render a compact business card for a person or a company profile.\nexport function CardBusiness({\n variant = 'user',\n name,\n title,\n avatar,\n address,\n contact,\n socials,\n online,\n lastActive,\n qrCode,\n qrValue,\n color = 'primary',\n className,\n ...rest\n}: CardBusinessProps) {\n const addr = formatAddress(address)\n\n return (\n <div className={cn('card-business', variant, color, className)} {...rest}>\n <div className=\"cb-header\">\n <div className=\"cb-avatar-wrap\">\n {avatar ? (\n <img src={avatar} alt={name} className={cn('cb-avatar', variant)} />\n ) : (\n <span className={cn('cb-avatar', 'cb-initials', variant)}>{initials(name)}</span>\n )}\n {online !== undefined && <span className={cn('cb-status', online ? 'online' : 'offline')} />}\n </div>\n\n <div className=\"cb-info\">\n <h3 className=\"cb-name\">{name}</h3>\n {title && <p className=\"cb-title\">{title}</p>}\n {lastActive && <p className=\"cb-last-active\">{lastActive}</p>}\n </div>\n\n {(qrValue || qrCode) && (\n <div className=\"cb-qr\">\n {qrValue ? (\n <QrCode value={qrValue} size={56} padding={3} className=\"cb-qr-code\" />\n ) : (\n <img src={qrCode} alt=\"QR\" className=\"cb-qr-img\" />\n )}\n </div>\n )}\n </div>\n\n {(contact || addr) && (\n <div className=\"cb-details\">\n {contact?.email && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">\n <MailIcon />\n </span>\n <a href={`mailto:${contact.email}`} className=\"cb-detail-value\">\n {contact.email}\n </a>\n </div>\n )}\n {contact?.phone && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">\n <PhoneIcon />\n </span>\n <a href={`tel:${contact.phone}`} className=\"cb-detail-value\">\n {contact.phone}\n </a>\n </div>\n )}\n {contact?.website && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">\n <GlobeIcon />\n </span>\n <a\n href={contact.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cb-detail-value\"\n >\n {contact.website.replace(/^https?:\\/\\//, '')}\n </a>\n </div>\n )}\n {addr && (\n <div className=\"cb-detail\">\n <span className=\"cb-detail-icon\">\n <PinIcon />\n </span>\n <span className=\"cb-detail-value\">{addr}</span>\n </div>\n )}\n </div>\n )}\n\n {socials && socials.length > 0 && (\n <div className=\"cb-socials\">\n {socials.map((item) => (\n <a\n key={item.platform}\n href={item.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cb-social\"\n title={item.platform}\n aria-label={item.platform}\n >\n {item.icon ?? getSocialIcon(item.platform) ?? <span className=\"cb-social-text\">{item.platform}</span>}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useEffect} from 'react'\nimport type {CardServiceProps} from './CardService.types'\nimport {cn} from '../../../utils/cn'\nimport {\n ClockIcon,\n EllipsisVerticalIcon,\n HeartFillIcon,\n HeartIcon,\n MinusIcon,\n PlusIcon,\n} from '../../../icons'\nimport {Rating} from '../../display'\nimport './CardService.css'\n\nfunction AvatarStack({people, max = 4}: {people: CardServiceProps['participants']; max?: number}) {\n if (!people || people.length === 0) return null\n const visible = people.slice(0, max)\n const overflow = people.length - max\n\n return (\n <div className=\"cs-avatars\">\n {visible.map((p, i) => (\n <span key={i} className=\"cs-avatar-sm\" title={p.name}>\n {p.avatar ? <img src={p.avatar} alt={p.name} /> : <span>{p.name[0]?.toUpperCase()}</span>}\n </span>\n ))}\n {overflow > 0 && <span className=\"cs-avatar-sm cs-overflow\">+{overflow}</span>}\n </div>\n )\n}\n\n// Card for services, courses or products with rating, gallery, cart and participant display.\nexport function CardService({\n variant = 'service',\n title,\n description,\n price,\n currency = 'PLN',\n duration,\n available,\n image,\n gallery,\n rating,\n reviewCount,\n favorite,\n onFavorite,\n menuItems,\n onAddToCart,\n icon,\n color = 'primary',\n leader,\n participants,\n maxParticipants,\n quantity: controlledQty,\n onQuantityChange,\n className,\n ...rest\n}: CardServiceProps) {\n const [menuOpen, setMenuOpen] = useState(false)\n const [galleryIdx, setGalleryIdx] = useState(0)\n const [internalQty, setInternalQty] = useState(1)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const qty = controlledQty ?? internalQty\n const images = gallery && gallery.length > 0 ? gallery : image ? [image] : []\n\n useEffect(() => {\n if (!menuOpen) return\n function close(e: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) setMenuOpen(false)\n }\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [menuOpen])\n\n function changeQty(next: number) {\n const val = Math.max(1, next)\n if (onQuantityChange) onQuantityChange(val)\n else setInternalQty(val)\n }\n\n const availLabel =\n available === true\n ? 'Available'\n : available === false\n ? 'Unavailable'\n : typeof available === 'number'\n ? `${available} spots`\n : null\n\n return (\n <div className={cn('card-service', variant, color, className)} {...rest}>\n {images.length > 0 && (\n <div className=\"cs-gallery\">\n <img src={images[galleryIdx]} alt={title} className=\"cs-image\" />\n {images.length > 1 && (\n <div className=\"cs-gallery-dots\">\n {images.map((_, i) => (\n <button\n key={i}\n className={cn('cs-dot', i === galleryIdx && 'active')}\n onClick={() => setGalleryIdx(i)}\n aria-label={`Image ${i + 1}`}\n />\n ))}\n </div>\n )}\n\n {onFavorite && (\n <button\n className={cn('cs-fav', favorite && 'active')}\n onClick={onFavorite}\n aria-label={favorite ? 'Remove from favorites' : 'Add to favorites'}\n >\n {favorite ? <HeartFillIcon /> : <HeartIcon />}\n </button>\n )}\n\n {menuItems && menuItems.length > 0 && (\n <div className=\"cs-menu-wrap\" ref={menuRef}>\n <button\n className=\"cs-menu-btn\"\n onClick={() => setMenuOpen(!menuOpen)}\n aria-label=\"More options\"\n >\n <EllipsisVerticalIcon />\n </button>\n {menuOpen && (\n <div className=\"cs-menu\">\n {menuItems.map((item, i) => (\n <button\n key={i}\n className={cn('cs-menu-item', item.danger && 'danger')}\n onClick={() => {\n item.onClick?.()\n setMenuOpen(false)\n }}\n >\n {item.icon && <span className=\"cs-menu-icon\">{item.icon}</span>}\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"cs-body\">\n <div className=\"cs-top\">\n {icon && <span className=\"cs-icon\">{icon}</span>}\n <h3 className=\"cs-title\">{title}</h3>\n </div>\n\n {description && <p className=\"cs-desc\">{description}</p>}\n\n {rating !== undefined && (\n <div className=\"cs-rating\">\n <Rating value={Math.round(rating)} size=\"sm\" color=\"warning\" readOnly className=\"cs-stars\" />\n <span className=\"cs-rating-value\">{rating.toFixed(1)}</span>\n {reviewCount !== undefined && <span className=\"cs-review-count\">({reviewCount})</span>}\n </div>\n )}\n\n {leader && (\n <div className=\"cs-leader\">\n <span className=\"cs-avatar-sm\" title={leader.name}>\n {leader.avatar ? (\n <img src={leader.avatar} alt={leader.name} />\n ) : (\n <span>{leader.name[0]?.toUpperCase()}</span>\n )}\n </span>\n <span className=\"cs-leader-name\">{leader.name}</span>\n </div>\n )}\n\n {variant === 'course' && participants && (\n <div className=\"cs-participants\">\n <AvatarStack people={participants} />\n {maxParticipants && (\n <span className=\"cs-spots\">\n {participants.length}/{maxParticipants}\n </span>\n )}\n </div>\n )}\n\n <div className=\"cs-meta\">\n {duration && (\n <span className=\"cs-tag\">\n <ClockIcon />\n {duration}\n </span>\n )}\n {availLabel && (\n <span className={cn('cs-tag', available === false && 'unavailable')}>{availLabel}</span>\n )}\n </div>\n </div>\n\n <div className=\"cs-footer\">\n {price !== undefined && (\n <span className=\"cs-price\">\n {typeof price === 'number' ? price.toFixed(2) : price}{' '}\n <span className=\"cs-currency\">{currency}</span>\n </span>\n )}\n\n <div className=\"cs-actions\">\n {variant === 'product' && onAddToCart && (\n <div className=\"cs-qty\">\n <button className=\"cs-qty-btn\" onClick={() => changeQty(qty - 1)} aria-label=\"Decrease\">\n <MinusIcon />\n </button>\n <span className=\"cs-qty-value\">{qty}</span>\n <button className=\"cs-qty-btn\" onClick={() => changeQty(qty + 1)} aria-label=\"Increase\">\n <PlusIcon />\n </button>\n </div>\n )}\n {onAddToCart && (\n <button className=\"cs-cart-btn\" onClick={() => onAddToCart(qty)} disabled={available === false}>\n Add to cart\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import {useState, useMemo, useRef, useEffect} from 'react'\nimport type {CardGridProps} from './CardGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {Checkbox} from '../../controls'\nimport {InputSearch} from '../../inputs'\nimport {ArrowDownIcon, ArrowUpIcon, FilterIcon, SortIcon} from '../../../icons'\nimport './CardGrid.css'\n\nfunction getNestedValue(obj: unknown, key: string): unknown {\n const parts = key.split('.')\n let val: unknown = obj\n\n for (const p of parts) {\n if (val == null || typeof val !== 'object') return undefined\n val = (val as Record<string, unknown>)[p]\n }\n\n return val\n}\n\nexport function CardGrid<T extends Record<string, unknown>>({\n items,\n renderCard,\n searchable = false,\n searchKeys,\n searchPlaceholder = 'Search...',\n filterable = false,\n filterKeys = [],\n sortable = false,\n sortKeys = [],\n defaultSort,\n columns = 3,\n emptyMessage = 'No results found.',\n className,\n style,\n ...rest\n}: CardGridProps<T>) {\n const [search, setSearch] = useState('')\n const [filters, setFilters] = useState<Record<string, Set<string>>>({})\n const [sortKey, setSortKey] = useState<string | null>(defaultSort?.key ?? null)\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>(defaultSort?.direction ?? 'asc')\n const [filterOpen, setFilterOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n const filterRef = useRef<HTMLDivElement>(null)\n const sortRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n function close(event: MouseEvent) {\n if (filterRef.current && !filterRef.current.contains(event.target as Node)) {\n setFilterOpen(false)\n }\n\n if (sortRef.current && !sortRef.current.contains(event.target as Node)) {\n setSortOpen(false)\n }\n }\n\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [])\n\n const processed = useMemo(() => {\n let result = [...items]\n\n if (search && searchKeys && searchKeys.length > 0) {\n const query = search.toLowerCase()\n result = result.filter((item) =>\n searchKeys.some((key) => {\n const value = getNestedValue(item, key)\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }\n\n for (const [key, selected] of Object.entries(filters)) {\n if (selected.size === 0) continue\n\n result = result.filter((item) => {\n const value = getNestedValue(item, key)\n return value != null && selected.has(String(value))\n })\n }\n\n if (sortKey) {\n result.sort((a, b) => {\n const av = getNestedValue(a, sortKey)\n const bv = getNestedValue(b, sortKey)\n\n if (av == null && bv == null) return 0\n if (av == null) return 1\n if (bv == null) return -1\n\n const compare = String(av).localeCompare(String(bv), undefined, {numeric: true})\n return sortDir === 'asc' ? compare : -compare\n })\n }\n\n return result\n }, [items, search, searchKeys, filters, sortKey, sortDir])\n\n function toggleFilter(key: string, value: string) {\n setFilters((prev) => {\n const next = new Set(prev[key] ?? [])\n\n if (next.has(value)) next.delete(value)\n else next.add(value)\n\n return {...prev, [key]: next}\n })\n }\n\n const filterOptions = useMemo(() => {\n const map: Record<string, string[]> = {}\n\n for (const filterKey of filterKeys) {\n if (filterKey.options) {\n map[filterKey.key] = filterKey.options\n continue\n }\n\n const values = new Set<string>()\n\n for (const item of items) {\n const value = getNestedValue(item, filterKey.key)\n if (value != null) values.add(String(value))\n }\n\n map[filterKey.key] = Array.from(values).sort()\n }\n\n return map\n }, [items, filterKeys])\n\n const activeSort = sortKeys.find((item) => item.key === sortKey)\n\n return (\n <div className={cn('card-grid', className)} style={style} {...rest}>\n {(searchable || filterable || sortable) && (\n <div className=\"card-grid-toolbar\">\n {searchable && (\n <InputSearch\n className=\"card-grid-search\"\n size=\"sm\"\n fullWidth\n placeholder={searchPlaceholder}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onClear={() => setSearch('')}\n />\n )}\n\n <div className=\"card-grid-actions\">\n {filterable && filterKeys.length > 0 && (\n <div className=\"card-grid-dropdown-wrap\" ref={filterRef}>\n <button\n type=\"button\"\n className=\"card-grid-toolbar-button\"\n aria-expanded={filterOpen}\n onClick={() => {\n setFilterOpen(!filterOpen)\n setSortOpen(false)\n }}\n >\n <FilterIcon className=\"card-grid-button-icon\" />\n Filter\n </button>\n {filterOpen && (\n <div className=\"card-grid-dropdown\">\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"card-grid-filter-group\">\n <span className=\"card-grid-filter-label\">{filterKey.label}</span>\n {(filterOptions[filterKey.key] ?? []).map((option) => (\n <div key={option} className=\"card-grid-filter-option\">\n <Checkbox\n size=\"sm\"\n clickEffect=\"none\"\n checked={filters[filterKey.key]?.has(option) ?? false}\n onChange={() => toggleFilter(filterKey.key, option)}\n label={option}\n />\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {sortable && sortKeys.length > 0 && (\n <div className=\"card-grid-dropdown-wrap\" ref={sortRef}>\n <button\n type=\"button\"\n className=\"card-grid-toolbar-button\"\n aria-expanded={sortOpen}\n onClick={() => {\n setSortOpen(!sortOpen)\n setFilterOpen(false)\n }}\n >\n {sortKey ? (\n sortDir === 'asc' ? (\n <ArrowUpIcon className=\"card-grid-button-icon\" />\n ) : (\n <ArrowDownIcon className=\"card-grid-button-icon\" />\n )\n ) : (\n <SortIcon className=\"card-grid-button-icon\" />\n )}\n {activeSort ? `Sort: ${activeSort.label}` : 'Sort'}\n </button>\n {sortOpen && (\n <div className=\"card-grid-dropdown\">\n {sortKeys.map((sortItem) => (\n <button\n key={sortItem.key}\n type=\"button\"\n className={cn('card-grid-sort-item', sortKey === sortItem.key && 'active')}\n onClick={() => {\n if (sortKey === sortItem.key) {\n setSortDir(sortDir === 'asc' ? 'desc' : 'asc')\n } else {\n setSortKey(sortItem.key)\n setSortDir('asc')\n }\n\n setSortOpen(false)\n }}\n >\n {sortItem.label}\n {sortKey === sortItem.key && (\n <span className=\"card-grid-sort-dir\">\n {sortDir === 'asc' ? (\n <ArrowUpIcon className=\"card-grid-sort-icon\" />\n ) : (\n <ArrowDownIcon className=\"card-grid-sort-icon\" />\n )}\n </span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {processed.length > 0 ? (\n <div\n className=\"card-grid-items\"\n style={{\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n }}\n >\n {processed.map((item, index) => renderCard(item, index))}\n </div>\n ) : (\n <div className=\"card-grid-empty\">{emptyMessage}</div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -493,13 +493,13 @@ function Z({ items: n, renderCard: r, searchable: i = !1, searchKeys: a, searchP
|
|
|
493
493
|
return e;
|
|
494
494
|
}, [n, c]), G = u.find((e) => e.key === S);
|
|
495
495
|
return /* @__PURE__ */ B("div", {
|
|
496
|
-
className: k("card
|
|
496
|
+
className: k("card-grid", h),
|
|
497
497
|
style: g,
|
|
498
498
|
..._,
|
|
499
499
|
children: [(i || s || l) && /* @__PURE__ */ B("div", {
|
|
500
|
-
className: "card
|
|
500
|
+
className: "card-grid-toolbar",
|
|
501
501
|
children: [i && /* @__PURE__ */ z(P, {
|
|
502
|
-
className: "card
|
|
502
|
+
className: "card-grid-search",
|
|
503
503
|
size: "sm",
|
|
504
504
|
fullWidth: !0,
|
|
505
505
|
placeholder: o,
|
|
@@ -507,27 +507,27 @@ function Z({ items: n, renderCard: r, searchable: i = !1, searchKeys: a, searchP
|
|
|
507
507
|
onChange: (e) => y(e.target.value),
|
|
508
508
|
onClear: () => y("")
|
|
509
509
|
}), /* @__PURE__ */ B("div", {
|
|
510
|
-
className: "card
|
|
510
|
+
className: "card-grid-actions",
|
|
511
511
|
children: [s && c.length > 0 && /* @__PURE__ */ B("div", {
|
|
512
|
-
className: "card
|
|
512
|
+
className: "card-grid-dropdown-wrap",
|
|
513
513
|
ref: N,
|
|
514
514
|
children: [/* @__PURE__ */ B("button", {
|
|
515
515
|
type: "button",
|
|
516
|
-
className: "card
|
|
516
|
+
className: "card-grid-toolbar-button",
|
|
517
517
|
"aria-expanded": D,
|
|
518
518
|
onClick: () => {
|
|
519
519
|
O(!D), M(!1);
|
|
520
520
|
},
|
|
521
|
-
children: [/* @__PURE__ */ z(d, { className: "card
|
|
521
|
+
children: [/* @__PURE__ */ z(d, { className: "card-grid-button-icon" }), "Filter"]
|
|
522
522
|
}), D && /* @__PURE__ */ z("div", {
|
|
523
|
-
className: "card
|
|
523
|
+
className: "card-grid-dropdown",
|
|
524
524
|
children: c.map((e) => /* @__PURE__ */ B("div", {
|
|
525
|
-
className: "card
|
|
525
|
+
className: "card-grid-filter-group",
|
|
526
526
|
children: [/* @__PURE__ */ z("span", {
|
|
527
|
-
className: "card
|
|
527
|
+
className: "card-grid-filter-label",
|
|
528
528
|
children: e.label
|
|
529
529
|
}), (W[e.key] ?? []).map((t) => /* @__PURE__ */ z("div", {
|
|
530
|
-
className: "card
|
|
530
|
+
className: "card-grid-filter-option",
|
|
531
531
|
children: /* @__PURE__ */ z(j, {
|
|
532
532
|
size: "sm",
|
|
533
533
|
clickEffect: "none",
|
|
@@ -539,38 +539,38 @@ function Z({ items: n, renderCard: r, searchable: i = !1, searchKeys: a, searchP
|
|
|
539
539
|
}, e.key))
|
|
540
540
|
})]
|
|
541
541
|
}), l && u.length > 0 && /* @__PURE__ */ B("div", {
|
|
542
|
-
className: "card
|
|
542
|
+
className: "card-grid-dropdown-wrap",
|
|
543
543
|
ref: V,
|
|
544
544
|
children: [/* @__PURE__ */ B("button", {
|
|
545
545
|
type: "button",
|
|
546
|
-
className: "card
|
|
546
|
+
className: "card-grid-toolbar-button",
|
|
547
547
|
"aria-expanded": A,
|
|
548
548
|
onClick: () => {
|
|
549
549
|
M(!A), O(!1);
|
|
550
550
|
},
|
|
551
|
-
children: [z(S ? w === "asc" ? e : t : E, { className: "card
|
|
551
|
+
children: [z(S ? w === "asc" ? e : t : E, { className: "card-grid-button-icon" }), G ? `Sort: ${G.label}` : "Sort"]
|
|
552
552
|
}), A && /* @__PURE__ */ z("div", {
|
|
553
|
-
className: "card
|
|
553
|
+
className: "card-grid-dropdown",
|
|
554
554
|
children: u.map((n) => /* @__PURE__ */ B("button", {
|
|
555
555
|
type: "button",
|
|
556
|
-
className: k("card
|
|
556
|
+
className: k("card-grid-sort-item", S === n.key && "active"),
|
|
557
557
|
onClick: () => {
|
|
558
558
|
S === n.key ? T(w === "asc" ? "desc" : "asc") : (C(n.key), T("asc")), M(!1);
|
|
559
559
|
},
|
|
560
560
|
children: [n.label, S === n.key && /* @__PURE__ */ z("span", {
|
|
561
|
-
className: "card
|
|
562
|
-
children: z(w === "asc" ? e : t, { className: "card
|
|
561
|
+
className: "card-grid-sort-dir",
|
|
562
|
+
children: z(w === "asc" ? e : t, { className: "card-grid-sort-icon" })
|
|
563
563
|
})]
|
|
564
564
|
}, n.key))
|
|
565
565
|
})]
|
|
566
566
|
})]
|
|
567
567
|
})]
|
|
568
568
|
}), H.length > 0 ? /* @__PURE__ */ z("div", {
|
|
569
|
-
className: "card
|
|
569
|
+
className: "card-grid-items",
|
|
570
570
|
style: { gridTemplateColumns: `repeat(${p}, 1fr)` },
|
|
571
571
|
children: H.map((e, t) => r(e, t))
|
|
572
572
|
}) : /* @__PURE__ */ z("div", {
|
|
573
|
-
className: "card
|
|
573
|
+
className: "card-grid-empty",
|
|
574
574
|
children: m
|
|
575
575
|
})]
|
|
576
576
|
});
|
|
@@ -578,4 +578,4 @@ function Z({ items: n, renderCard: r, searchable: i = !1, searchKeys: a, searchP
|
|
|
578
578
|
//#endregion
|
|
579
579
|
export { H as i, Y as n, q as r, Z as t };
|
|
580
580
|
|
|
581
|
-
//# sourceMappingURL=CardGrid-
|
|
581
|
+
//# sourceMappingURL=CardGrid-mHLkd1pL.js.map
|