bynana-ui 1.6.2 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action-search-bar/index.js +17 -0
- package/dist/action-search-bar/index.js.map +1 -0
- package/dist/action-search-bar/index.mjs +17 -0
- package/dist/action-search-bar/index.mjs.map +1 -0
- package/dist/ai-bar/index.js +19 -0
- package/dist/ai-bar/index.js.map +1 -0
- package/dist/ai-bar/index.mjs +19 -0
- package/dist/ai-bar/index.mjs.map +1 -0
- package/dist/ai-loading/index.js +2 -0
- package/dist/ai-loading/index.js.map +1 -0
- package/dist/ai-loading/index.mjs +2 -0
- package/dist/ai-loading/index.mjs.map +1 -0
- package/dist/ai-prompt/index.js +17 -0
- package/dist/ai-prompt/index.js.map +1 -0
- package/dist/ai-prompt/index.mjs +17 -0
- package/dist/ai-prompt/index.mjs.map +1 -0
- package/dist/ai-text-loading/index.js +2 -0
- package/dist/ai-text-loading/index.js.map +1 -0
- package/dist/ai-text-loading/index.mjs +2 -0
- package/dist/ai-text-loading/index.mjs.map +1 -0
- package/dist/ai-voice/index.js +3 -0
- package/dist/ai-voice/index.js.map +1 -0
- package/dist/ai-voice/index.mjs +3 -0
- package/dist/ai-voice/index.mjs.map +1 -0
- package/dist/aurora/index.js +2 -0
- package/dist/aurora/index.js.map +1 -0
- package/dist/aurora/index.mjs +2 -0
- package/dist/aurora/index.mjs.map +1 -0
- package/dist/background-paths/index.js +2 -0
- package/dist/background-paths/index.js.map +1 -0
- package/dist/background-paths/index.mjs +2 -0
- package/dist/background-paths/index.mjs.map +1 -0
- package/dist/elastic-search/index.js +17 -0
- package/dist/elastic-search/index.js.map +1 -0
- package/dist/elastic-search/index.mjs +17 -0
- package/dist/elastic-search/index.mjs.map +1 -0
- package/dist/faqs-accordion/index.js +16 -0
- package/dist/faqs-accordion/index.js.map +1 -0
- package/dist/faqs-accordion/index.mjs +16 -0
- package/dist/faqs-accordion/index.mjs.map +1 -0
- package/dist/faqs-grid/index.js +2 -0
- package/dist/faqs-grid/index.js.map +1 -0
- package/dist/faqs-grid/index.mjs +2 -0
- package/dist/faqs-grid/index.mjs.map +1 -0
- package/dist/floating-paths/index.js +2 -0
- package/dist/floating-paths/index.js.map +1 -0
- package/dist/floating-paths/index.mjs +2 -0
- package/dist/floating-paths/index.mjs.map +1 -0
- package/dist/folder/index.js +2 -0
- package/dist/folder/index.js.map +1 -0
- package/dist/folder/index.mjs +2 -0
- package/dist/folder/index.mjs.map +1 -0
- package/dist/footer-complex/index.js +2 -0
- package/dist/footer-complex/index.js.map +1 -0
- package/dist/footer-complex/index.mjs +2 -0
- package/dist/footer-complex/index.mjs.map +1 -0
- package/dist/footer-simple/index.js +2 -0
- package/dist/footer-simple/index.js.map +1 -0
- package/dist/footer-simple/index.mjs +2 -0
- package/dist/footer-simple/index.mjs.map +1 -0
- package/dist/glare-hover/index.js +32 -0
- package/dist/glare-hover/index.js.map +1 -0
- package/dist/glare-hover/index.mjs +32 -0
- package/dist/glare-hover/index.mjs.map +1 -0
- package/dist/hero-grid/index.js +16 -0
- package/dist/hero-grid/index.js.map +1 -0
- package/dist/hero-grid/index.mjs +16 -0
- package/dist/hero-grid/index.mjs.map +1 -0
- package/dist/hero-showcase/index.js +17 -0
- package/dist/hero-showcase/index.js.map +1 -0
- package/dist/hero-showcase/index.mjs +17 -0
- package/dist/hero-showcase/index.mjs.map +1 -0
- package/dist/index.js +85 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +85 -13
- package/dist/index.mjs.map +1 -1
- package/dist/job-listing/index.js +19 -0
- package/dist/job-listing/index.js.map +1 -0
- package/dist/job-listing/index.mjs +19 -0
- package/dist/job-listing/index.mjs.map +1 -0
- package/dist/logo-cloud/index.js +14 -0
- package/dist/logo-cloud/index.js.map +1 -0
- package/dist/logo-cloud/index.mjs +14 -0
- package/dist/logo-cloud/index.mjs.map +1 -0
- package/dist/logo-loop/index.js +2 -0
- package/dist/logo-loop/index.js.map +1 -0
- package/dist/logo-loop/index.mjs +2 -0
- package/dist/logo-loop/index.mjs.map +1 -0
- package/dist/magnet/index.js +2 -0
- package/dist/magnet/index.js.map +1 -0
- package/dist/magnet/index.mjs +2 -0
- package/dist/magnet/index.mjs.map +1 -0
- package/dist/magnet-lines/index.js +2 -0
- package/dist/magnet-lines/index.js.map +1 -0
- package/dist/magnet-lines/index.mjs +2 -0
- package/dist/magnet-lines/index.mjs.map +1 -0
- package/dist/pricing-modern/index.js +16 -0
- package/dist/pricing-modern/index.js.map +1 -0
- package/dist/pricing-modern/index.mjs +16 -0
- package/dist/pricing-modern/index.mjs.map +1 -0
- package/dist/scroll-float/index.js +2 -0
- package/dist/scroll-float/index.js.map +1 -0
- package/dist/scroll-float/index.mjs +2 -0
- package/dist/scroll-float/index.mjs.map +1 -0
- package/dist/scroll-reveal/index.js +2 -0
- package/dist/scroll-reveal/index.js.map +1 -0
- package/dist/scroll-reveal/index.mjs +2 -0
- package/dist/scroll-reveal/index.mjs.map +1 -0
- package/dist/scroll-stack/index.js +2 -0
- package/dist/scroll-stack/index.js.map +1 -0
- package/dist/scroll-stack/index.mjs +2 -0
- package/dist/scroll-stack/index.mjs.map +1 -0
- package/dist/squares/index.js +2 -0
- package/dist/squares/index.js.map +1 -0
- package/dist/squares/index.mjs +2 -0
- package/dist/squares/index.mjs.map +1 -0
- package/dist/team-carousel/index.js +17 -0
- package/dist/team-carousel/index.js.map +1 -0
- package/dist/team-carousel/index.mjs +17 -0
- package/dist/team-carousel/index.mjs.map +1 -0
- package/dist/team-selector/index.js +3 -0
- package/dist/team-selector/index.js.map +1 -0
- package/dist/team-selector/index.mjs +3 -0
- package/dist/team-selector/index.mjs.map +1 -0
- package/dist/testimonials-grid/index.js +17 -0
- package/dist/testimonials-grid/index.js.map +1 -0
- package/dist/testimonials-grid/index.mjs +17 -0
- package/dist/testimonials-grid/index.mjs.map +1 -0
- package/dist/testimonials-simple/index.js +3 -0
- package/dist/testimonials-simple/index.js.map +1 -0
- package/dist/testimonials-simple/index.mjs +3 -0
- package/dist/testimonials-simple/index.mjs.map +1 -0
- package/dist/testimonials-stars/index.js +3 -0
- package/dist/testimonials-stars/index.js.map +1 -0
- package/dist/testimonials-stars/index.mjs +3 -0
- package/dist/testimonials-stars/index.mjs.map +1 -0
- package/dist/text-type/index.js +2 -0
- package/dist/text-type/index.js.map +1 -0
- package/dist/text-type/index.mjs +2 -0
- package/dist/text-type/index.mjs.map +1 -0
- package/dist/threads/index.js +2 -0
- package/dist/threads/index.js.map +1 -0
- package/dist/threads/index.mjs +2 -0
- package/dist/threads/index.mjs.map +1 -0
- package/dist/tooltip-interactive/index.js +2 -0
- package/dist/tooltip-interactive/index.js.map +1 -0
- package/dist/tooltip-interactive/index.mjs +2 -0
- package/dist/tooltip-interactive/index.mjs.map +1 -0
- package/dist/tooltip-magnetic/index.js +2 -0
- package/dist/tooltip-magnetic/index.js.map +1 -0
- package/dist/tooltip-magnetic/index.mjs +2 -0
- package/dist/tooltip-magnetic/index.mjs.map +1 -0
- package/dist/tooltip-rich/index.js +2 -0
- package/dist/tooltip-rich/index.js.map +1 -0
- package/dist/tooltip-rich/index.mjs +2 -0
- package/dist/tooltip-rich/index.mjs.map +1 -0
- package/dist/waves/index.js +2 -0
- package/dist/waves/index.js.map +1 -0
- package/dist/waves/index.mjs +2 -0
- package/dist/waves/index.mjs.map +1 -0
- package/package.json +41 -2
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),jsxRuntime=require('react/jsx-runtime');var I=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),A=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(a,t,d)=>d?d.toUpperCase():t.toLowerCase()),L=e=>{let a=A(e);return a.charAt(0).toUpperCase()+a.slice(1)},p=(...e)=>e.filter((a,t,d)=>!!a&&a.trim()!==""&&d.indexOf(a)===t).join(" ").trim(),x=e=>{for(let a in e)if(a.startsWith("aria-")||a==="role"||a==="title")return true};var C={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var h=react.forwardRef(({color:e="currentColor",size:a=24,strokeWidth:t=2,absoluteStrokeWidth:d,className:u="",children:f,iconNode:g,...m},k)=>react.createElement("svg",{ref:k,...C,width:a,height:a,stroke:e,strokeWidth:d?Number(t)*24/Number(a):t,className:p("lucide",u),...!f&&!x(m)&&{"aria-hidden":"true"},...m},[...g.map(([w,P])=>react.createElement(w,P)),...Array.isArray(f)?f:[f]]));var r=(e,a)=>{let t=react.forwardRef(({className:d,...u},f)=>react.createElement(h,{ref:f,iconNode:a,className:p(`lucide-${I(L(e))}`,`lucide-${e}`,d),...u}));return t.displayName=L(e),t};var M=[["path",{d:"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16",key:"jecpp"}],["rect",{width:"20",height:"14",x:"2",y:"6",rx:"2",key:"i6l2r4"}]],s=r("briefcase",M);var R=[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],i=r("clock",R);var T=[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]],c=r("dollar-sign",T);var q=[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]],n=r("map-pin",q);function y({title:e="Open Positions",description:a="Join our team and help build the future of UI development.",jobs:t=[{title:"Senior Frontend Engineer",department:"Engineering",location:"Remote",type:"Full-time",salary:"$120k - $180k",url:"#"},{title:"Product Designer",department:"Design",location:"San Francisco, CA",type:"Full-time",salary:"$100k - $150k",url:"#"},{title:"Developer Advocate",department:"Marketing",location:"Remote",type:"Full-time",salary:"$90k - $130k",url:"#"}],className:d=""}){return jsxRuntime.jsx("section",{className:`py-20 ${d}`,children:jsxRuntime.jsxs("div",{className:"mx-auto max-w-4xl px-6",children:[jsxRuntime.jsxs("div",{className:"text-center mb-12",children:[jsxRuntime.jsx("h2",{className:"mb-4 text-3xl font-bold lg:text-4xl",children:e}),jsxRuntime.jsx("p",{className:"text-muted-foreground text-lg max-w-2xl mx-auto",children:a})]}),jsxRuntime.jsx("div",{className:"space-y-4",children:t.map((u,f)=>jsxRuntime.jsx("a",{href:u.url,className:"block rounded-xl border p-6 transition-all hover:border-primary/50 hover:shadow-md",children:jsxRuntime.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("h3",{className:"text-xl font-semibold",children:u.title}),jsxRuntime.jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-4 text-sm text-muted-foreground",children:[jsxRuntime.jsxs("span",{className:"flex items-center gap-1",children:[jsxRuntime.jsx(s,{className:"h-4 w-4"}),u.department]}),jsxRuntime.jsxs("span",{className:"flex items-center gap-1",children:[jsxRuntime.jsx(n,{className:"h-4 w-4"}),u.location]}),jsxRuntime.jsxs("span",{className:"flex items-center gap-1",children:[jsxRuntime.jsx(i,{className:"h-4 w-4"}),u.type]}),u.salary&&jsxRuntime.jsxs("span",{className:"flex items-center gap-1",children:[jsxRuntime.jsx(c,{className:"h-4 w-4"}),u.salary]})]})]}),jsxRuntime.jsx("button",{className:"bg-primary text-primary-foreground hover:bg-primary/90 rounded-md px-4 py-2 text-sm font-medium",children:"Apply Now"})]})},f))})]})})}var oa=y;/*! Bundled license information:
|
|
2
|
+
|
|
3
|
+
lucide-react/dist/esm/shared/src/utils.js:
|
|
4
|
+
lucide-react/dist/esm/defaultAttributes.js:
|
|
5
|
+
lucide-react/dist/esm/Icon.js:
|
|
6
|
+
lucide-react/dist/esm/createLucideIcon.js:
|
|
7
|
+
lucide-react/dist/esm/icons/briefcase.js:
|
|
8
|
+
lucide-react/dist/esm/icons/clock.js:
|
|
9
|
+
lucide-react/dist/esm/icons/dollar-sign.js:
|
|
10
|
+
lucide-react/dist/esm/icons/map-pin.js:
|
|
11
|
+
lucide-react/dist/esm/lucide-react.js:
|
|
12
|
+
(**
|
|
13
|
+
* @license lucide-react v0.545.0 - ISC
|
|
14
|
+
*
|
|
15
|
+
* This source code is licensed under the ISC license.
|
|
16
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
17
|
+
*)
|
|
18
|
+
*/exports.JobListing=y;exports.default=oa;//# sourceMappingURL=index.js.map
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/shared/src/utils.ts","../../../../node_modules/lucide-react/src/defaultAttributes.ts","../../../../node_modules/lucide-react/src/Icon.ts","../../../../node_modules/lucide-react/src/createLucideIcon.ts","../../../../node_modules/lucide-react/src/icons/briefcase.ts","../../../../node_modules/lucide-react/src/icons/clock.ts","../../../../node_modules/lucide-react/src/icons/dollar-sign.ts","../../../../node_modules/lucide-react/src/icons/map-pin.ts","../../src/job-listing/index.tsx"],"names":["toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","props","prop","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Briefcase","Clock","DollarSign","MapPin","JobListing","title","description","jobs","jsx","jsxs","job","job_listing_default"],"mappings":"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","file":"index.js","sourcesContent":["import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16', key: 'jecpp' }],\n ['rect', { width: '20', height: '14', x: '2', y: '6', rx: '2', key: 'i6l2r4' }],\n];\n\n/**\n * @component @name Briefcase\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/briefcase\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Briefcase = createLucideIcon('briefcase', __iconNode);\n\nexport default Briefcase;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 6v6l4 2', key: 'mmk7yg' }],\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n];\n\n/**\n * @component @name Clock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/clock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Clock = createLucideIcon('clock', __iconNode);\n\nexport default Clock;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['line', { x1: '12', x2: '12', y1: '2', y2: '22', key: '7eqyqh' }],\n ['path', { d: 'M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6', key: '1b0p4s' }],\n];\n\n/**\n * @component @name DollarSign\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/dollar-sign\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst DollarSign = createLucideIcon('dollar-sign', __iconNode);\n\nexport default DollarSign;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0',\n key: '1r0f0z',\n },\n ],\n ['circle', { cx: '12', cy: '10', r: '3', key: 'ilqhr7' }],\n];\n\n/**\n * @component @name MapPin\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/map-pin\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MapPin = createLucideIcon('map-pin', __iconNode);\n\nexport default MapPin;\n","\"use client\";\r\n\r\nimport { MapPin, Clock, DollarSign, Briefcase } from \"lucide-react\";\r\n\r\ninterface Job {\r\n title: string;\r\n department: string;\r\n location: string;\r\n type: string;\r\n salary?: string;\r\n url?: string;\r\n}\r\n\r\ninterface JobListingProps {\r\n title?: string;\r\n description?: string;\r\n jobs?: Job[];\r\n className?: string;\r\n}\r\n\r\nexport function JobListing({\r\n title = \"Open Positions\",\r\n description = \"Join our team and help build the future of UI development.\",\r\n jobs = [\r\n {\r\n title: \"Senior Frontend Engineer\",\r\n department: \"Engineering\",\r\n location: \"Remote\",\r\n type: \"Full-time\",\r\n salary: \"$120k - $180k\",\r\n url: \"#\",\r\n },\r\n {\r\n title: \"Product Designer\",\r\n department: \"Design\",\r\n location: \"San Francisco, CA\",\r\n type: \"Full-time\",\r\n salary: \"$100k - $150k\",\r\n url: \"#\",\r\n },\r\n {\r\n title: \"Developer Advocate\",\r\n department: \"Marketing\",\r\n location: \"Remote\",\r\n type: \"Full-time\",\r\n salary: \"$90k - $130k\",\r\n url: \"#\",\r\n },\r\n ],\r\n className = \"\",\r\n}: JobListingProps) {\r\n return (\r\n <section className={`py-20 ${className}`}>\r\n <div className=\"mx-auto max-w-4xl px-6\">\r\n <div className=\"text-center mb-12\">\r\n <h2 className=\"mb-4 text-3xl font-bold lg:text-4xl\">{title}</h2>\r\n <p className=\"text-muted-foreground text-lg max-w-2xl mx-auto\">{description}</p>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n {jobs.map((job, index) => (\r\n <a\r\n key={index}\r\n href={job.url}\r\n className=\"block rounded-xl border p-6 transition-all hover:border-primary/50 hover:shadow-md\"\r\n >\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h3 className=\"text-xl font-semibold\">{job.title}</h3>\r\n <div className=\"mt-2 flex flex-wrap items-center gap-4 text-sm text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\">\r\n <Briefcase className=\"h-4 w-4\" />\r\n {job.department}\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <MapPin className=\"h-4 w-4\" />\r\n {job.location}\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n {job.type}\r\n </span>\r\n {job.salary && (\r\n <span className=\"flex items-center gap-1\">\r\n <DollarSign className=\"h-4 w-4\" />\r\n {job.salary}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <button className=\"bg-primary text-primary-foreground hover:bg-primary/90 rounded-md px-4 py-2 text-sm font-medium\">\r\n Apply Now\r\n </button>\r\n </div>\r\n </a>\r\n ))}\r\n </div>\r\n </div>\r\n </section>\r\n );\r\n}\r\n\r\nexport default JobListing;\r\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {forwardRef,createElement}from'react';import {jsx,jsxs}from'react/jsx-runtime';var I=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),A=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(a,t,d)=>d?d.toUpperCase():t.toLowerCase()),L=e=>{let a=A(e);return a.charAt(0).toUpperCase()+a.slice(1)},p=(...e)=>e.filter((a,t,d)=>!!a&&a.trim()!==""&&d.indexOf(a)===t).join(" ").trim(),x=e=>{for(let a in e)if(a.startsWith("aria-")||a==="role"||a==="title")return true};var C={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var h=forwardRef(({color:e="currentColor",size:a=24,strokeWidth:t=2,absoluteStrokeWidth:d,className:u="",children:f,iconNode:g,...m},k)=>createElement("svg",{ref:k,...C,width:a,height:a,stroke:e,strokeWidth:d?Number(t)*24/Number(a):t,className:p("lucide",u),...!f&&!x(m)&&{"aria-hidden":"true"},...m},[...g.map(([w,P])=>createElement(w,P)),...Array.isArray(f)?f:[f]]));var r=(e,a)=>{let t=forwardRef(({className:d,...u},f)=>createElement(h,{ref:f,iconNode:a,className:p(`lucide-${I(L(e))}`,`lucide-${e}`,d),...u}));return t.displayName=L(e),t};var M=[["path",{d:"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16",key:"jecpp"}],["rect",{width:"20",height:"14",x:"2",y:"6",rx:"2",key:"i6l2r4"}]],s=r("briefcase",M);var R=[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],i=r("clock",R);var T=[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]],c=r("dollar-sign",T);var q=[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]],n=r("map-pin",q);function y({title:e="Open Positions",description:a="Join our team and help build the future of UI development.",jobs:t=[{title:"Senior Frontend Engineer",department:"Engineering",location:"Remote",type:"Full-time",salary:"$120k - $180k",url:"#"},{title:"Product Designer",department:"Design",location:"San Francisco, CA",type:"Full-time",salary:"$100k - $150k",url:"#"},{title:"Developer Advocate",department:"Marketing",location:"Remote",type:"Full-time",salary:"$90k - $130k",url:"#"}],className:d=""}){return jsx("section",{className:`py-20 ${d}`,children:jsxs("div",{className:"mx-auto max-w-4xl px-6",children:[jsxs("div",{className:"text-center mb-12",children:[jsx("h2",{className:"mb-4 text-3xl font-bold lg:text-4xl",children:e}),jsx("p",{className:"text-muted-foreground text-lg max-w-2xl mx-auto",children:a})]}),jsx("div",{className:"space-y-4",children:t.map((u,f)=>jsx("a",{href:u.url,className:"block rounded-xl border p-6 transition-all hover:border-primary/50 hover:shadow-md",children:jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[jsxs("div",{children:[jsx("h3",{className:"text-xl font-semibold",children:u.title}),jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-4 text-sm text-muted-foreground",children:[jsxs("span",{className:"flex items-center gap-1",children:[jsx(s,{className:"h-4 w-4"}),u.department]}),jsxs("span",{className:"flex items-center gap-1",children:[jsx(n,{className:"h-4 w-4"}),u.location]}),jsxs("span",{className:"flex items-center gap-1",children:[jsx(i,{className:"h-4 w-4"}),u.type]}),u.salary&&jsxs("span",{className:"flex items-center gap-1",children:[jsx(c,{className:"h-4 w-4"}),u.salary]})]})]}),jsx("button",{className:"bg-primary text-primary-foreground hover:bg-primary/90 rounded-md px-4 py-2 text-sm font-medium",children:"Apply Now"})]})},f))})]})})}var oa=y;/*! Bundled license information:
|
|
2
|
+
|
|
3
|
+
lucide-react/dist/esm/shared/src/utils.js:
|
|
4
|
+
lucide-react/dist/esm/defaultAttributes.js:
|
|
5
|
+
lucide-react/dist/esm/Icon.js:
|
|
6
|
+
lucide-react/dist/esm/createLucideIcon.js:
|
|
7
|
+
lucide-react/dist/esm/icons/briefcase.js:
|
|
8
|
+
lucide-react/dist/esm/icons/clock.js:
|
|
9
|
+
lucide-react/dist/esm/icons/dollar-sign.js:
|
|
10
|
+
lucide-react/dist/esm/icons/map-pin.js:
|
|
11
|
+
lucide-react/dist/esm/lucide-react.js:
|
|
12
|
+
(**
|
|
13
|
+
* @license lucide-react v0.545.0 - ISC
|
|
14
|
+
*
|
|
15
|
+
* This source code is licensed under the ISC license.
|
|
16
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
17
|
+
*)
|
|
18
|
+
*/export{y as JobListing,oa as default};//# sourceMappingURL=index.mjs.map
|
|
19
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/shared/src/utils.ts","../../../../node_modules/lucide-react/src/defaultAttributes.ts","../../../../node_modules/lucide-react/src/Icon.ts","../../../../node_modules/lucide-react/src/createLucideIcon.ts","../../../../node_modules/lucide-react/src/icons/briefcase.ts","../../../../node_modules/lucide-react/src/icons/clock.ts","../../../../node_modules/lucide-react/src/icons/dollar-sign.ts","../../../../node_modules/lucide-react/src/icons/map-pin.ts","../../src/job-listing/index.tsx"],"names":["toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","props","prop","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Briefcase","Clock","DollarSign","MapPin","JobListing","title","description","jobs","jsx","jsxs","job","job_listing_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16', key: 'jecpp' }],\n ['rect', { width: '20', height: '14', x: '2', y: '6', rx: '2', key: 'i6l2r4' }],\n];\n\n/**\n * @component @name Briefcase\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/briefcase\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Briefcase = createLucideIcon('briefcase', __iconNode);\n\nexport default Briefcase;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 6v6l4 2', key: 'mmk7yg' }],\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n];\n\n/**\n * @component @name Clock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/clock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Clock = createLucideIcon('clock', __iconNode);\n\nexport default Clock;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['line', { x1: '12', x2: '12', y1: '2', y2: '22', key: '7eqyqh' }],\n ['path', { d: 'M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6', key: '1b0p4s' }],\n];\n\n/**\n * @component @name DollarSign\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/dollar-sign\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst DollarSign = createLucideIcon('dollar-sign', __iconNode);\n\nexport default DollarSign;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0',\n key: '1r0f0z',\n },\n ],\n ['circle', { cx: '12', cy: '10', r: '3', key: 'ilqhr7' }],\n];\n\n/**\n * @component @name MapPin\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/map-pin\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MapPin = createLucideIcon('map-pin', __iconNode);\n\nexport default MapPin;\n","\"use client\";\r\n\r\nimport { MapPin, Clock, DollarSign, Briefcase } from \"lucide-react\";\r\n\r\ninterface Job {\r\n title: string;\r\n department: string;\r\n location: string;\r\n type: string;\r\n salary?: string;\r\n url?: string;\r\n}\r\n\r\ninterface JobListingProps {\r\n title?: string;\r\n description?: string;\r\n jobs?: Job[];\r\n className?: string;\r\n}\r\n\r\nexport function JobListing({\r\n title = \"Open Positions\",\r\n description = \"Join our team and help build the future of UI development.\",\r\n jobs = [\r\n {\r\n title: \"Senior Frontend Engineer\",\r\n department: \"Engineering\",\r\n location: \"Remote\",\r\n type: \"Full-time\",\r\n salary: \"$120k - $180k\",\r\n url: \"#\",\r\n },\r\n {\r\n title: \"Product Designer\",\r\n department: \"Design\",\r\n location: \"San Francisco, CA\",\r\n type: \"Full-time\",\r\n salary: \"$100k - $150k\",\r\n url: \"#\",\r\n },\r\n {\r\n title: \"Developer Advocate\",\r\n department: \"Marketing\",\r\n location: \"Remote\",\r\n type: \"Full-time\",\r\n salary: \"$90k - $130k\",\r\n url: \"#\",\r\n },\r\n ],\r\n className = \"\",\r\n}: JobListingProps) {\r\n return (\r\n <section className={`py-20 ${className}`}>\r\n <div className=\"mx-auto max-w-4xl px-6\">\r\n <div className=\"text-center mb-12\">\r\n <h2 className=\"mb-4 text-3xl font-bold lg:text-4xl\">{title}</h2>\r\n <p className=\"text-muted-foreground text-lg max-w-2xl mx-auto\">{description}</p>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n {jobs.map((job, index) => (\r\n <a\r\n key={index}\r\n href={job.url}\r\n className=\"block rounded-xl border p-6 transition-all hover:border-primary/50 hover:shadow-md\"\r\n >\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h3 className=\"text-xl font-semibold\">{job.title}</h3>\r\n <div className=\"mt-2 flex flex-wrap items-center gap-4 text-sm text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\">\r\n <Briefcase className=\"h-4 w-4\" />\r\n {job.department}\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <MapPin className=\"h-4 w-4\" />\r\n {job.location}\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n {job.type}\r\n </span>\r\n {job.salary && (\r\n <span className=\"flex items-center gap-1\">\r\n <DollarSign className=\"h-4 w-4\" />\r\n {job.salary}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <button className=\"bg-primary text-primary-foreground hover:bg-primary/90 rounded-md px-4 py-2 text-sm font-medium\">\r\n Apply Now\r\n </button>\r\n </div>\r\n </a>\r\n ))}\r\n </div>\r\n </div>\r\n </section>\r\n );\r\n}\r\n\r\nexport default JobListing;\r\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var jsxRuntime=require('react/jsx-runtime');function o({title:s="Trusted by the world's most innovative teams",description:l="Join thousands of developers building with us",logos:t=[],className:n=""}){return jsxRuntime.jsxs("div",{className:`overflow-hidden py-20 ${n}`,children:[jsxRuntime.jsxs("div",{className:"mx-auto max-w-7xl px-6",children:[jsxRuntime.jsxs("div",{className:"mb-16 text-center",children:[jsxRuntime.jsx("h2",{className:"mb-4 text-2xl font-bold lg:text-3xl",children:s}),jsxRuntime.jsx("p",{className:"text-muted-foreground text-lg",children:l})]}),jsxRuntime.jsx("div",{className:"relative overflow-hidden",style:{maskImage:"linear-gradient(to right, transparent, black 20%, black 80%, transparent)",WebkitMaskImage:"linear-gradient(to right, transparent, black 20%, black 80%, transparent)"},children:jsxRuntime.jsx("div",{className:"flex animate-scroll gap-8",children:[...t,...t,...t].map((a,i)=>jsxRuntime.jsx("a",{href:a.url,target:"_blank",rel:"noopener noreferrer",className:"flex flex-shrink-0 items-center justify-center p-6 transition-all hover:scale-105",children:jsxRuntime.jsx("div",{className:"text-4xl hover:scale-110 transition-transform",children:a.logo})},`${a.name}-${i}`))})})]}),jsxRuntime.jsx("style",{jsx:true,children:`
|
|
2
|
+
@keyframes scroll {
|
|
3
|
+
0% {
|
|
4
|
+
transform: translateX(0);
|
|
5
|
+
}
|
|
6
|
+
100% {
|
|
7
|
+
transform: translateX(-33.333%);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
.animate-scroll {
|
|
11
|
+
animation: scroll 25s linear infinite;
|
|
12
|
+
}
|
|
13
|
+
`})]})}var d=o;exports.LogoCloud=o;exports.default=d;//# sourceMappingURL=index.js.map
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/logo-cloud/index.tsx"],"names":["LogoCloud","title","description","logos","className","jsxs","jsx","logo","index","logo_cloud_default"],"mappings":"kHAeO,SAASA,CAAAA,CAAU,CACxB,KAAA,CAAAC,CAAAA,CAAQ,8CAAA,CACR,WAAA,CAAAC,CAAAA,CAAc,gDACd,KAAA,CAAAC,CAAAA,CAAQ,EAAC,CACT,SAAA,CAAAC,CAAAA,CAAY,EACd,CAAA,CAAmB,CACjB,OACEC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,sBAAA,EAAyBD,CAAS,CAAA,CAAA,CAChD,QAAA,CAAA,CAAAC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,qCAAA,CAAuC,QAAA,CAAAL,CAAAA,CAAM,CAAA,CAC3DK,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAiC,QAAA,CAAAJ,CAAAA,CAAY,CAAA,CAAA,CAC5D,CAAA,CAEAI,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,2BACV,KAAA,CAAO,CACL,SAAA,CACE,2EAAA,CACF,eAAA,CACE,2EACJ,CAAA,CAEA,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAA,CAAC,GAAGH,EAAO,GAAGA,CAAAA,CAAO,GAAGA,CAAK,CAAA,CAAE,GAAA,CAAI,CAACI,CAAAA,CAAMC,CAAAA,GACzCF,cAAAA,CAAC,GAAA,CAAA,CAEC,IAAA,CAAMC,CAAAA,CAAK,GAAA,CACX,OAAO,QAAA,CACP,GAAA,CAAI,qBAAA,CACJ,SAAA,CAAU,mFAAA,CAEV,QAAA,CAAAD,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CAAiD,QAAA,CAAAC,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAA,CANrE,CAAA,EAAGA,CAAAA,CAAK,IAAI,CAAA,CAAA,EAAIC,CAAK,CAAA,CAO5B,CACD,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEAF,cAAAA,CAAC,OAAA,CAAA,CAAM,GAAA,CAAG,IAAA,CAAE,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,CAYV,CAAA,CAAA,CACJ,CAEJ,CAEA,IAAOG,CAAAA,CAAQT","file":"index.js","sourcesContent":["\"use client\";\r\n\r\nimport { ReactNode } from \"react\";\r\n\r\ninterface LogoCloudProps {\r\n title?: string;\r\n description?: string;\r\n logos?: Array<{\r\n name: string;\r\n logo: ReactNode;\r\n url?: string;\r\n }>;\r\n className?: string;\r\n}\r\n\r\nexport function LogoCloud({\r\n title = \"Trusted by the world's most innovative teams\",\r\n description = \"Join thousands of developers building with us\",\r\n logos = [],\r\n className = \"\",\r\n}: LogoCloudProps) {\r\n return (\r\n <div className={`overflow-hidden py-20 ${className}`}>\r\n <div className=\"mx-auto max-w-7xl px-6\">\r\n <div className=\"mb-16 text-center\">\r\n <h2 className=\"mb-4 text-2xl font-bold lg:text-3xl\">{title}</h2>\r\n <p className=\"text-muted-foreground text-lg\">{description}</p>\r\n </div>\r\n\r\n <div\r\n className=\"relative overflow-hidden\"\r\n style={{\r\n maskImage:\r\n \"linear-gradient(to right, transparent, black 20%, black 80%, transparent)\",\r\n WebkitMaskImage:\r\n \"linear-gradient(to right, transparent, black 20%, black 80%, transparent)\",\r\n }}\r\n >\r\n <div className=\"flex animate-scroll gap-8\">\r\n {[...logos, ...logos, ...logos].map((logo, index) => (\r\n <a\r\n key={`${logo.name}-${index}`}\r\n href={logo.url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"flex flex-shrink-0 items-center justify-center p-6 transition-all hover:scale-105\"\r\n >\r\n <div className=\"text-4xl hover:scale-110 transition-transform\">{logo.logo}</div>\r\n </a>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <style jsx>{`\r\n @keyframes scroll {\r\n 0% {\r\n transform: translateX(0);\r\n }\r\n 100% {\r\n transform: translateX(-33.333%);\r\n }\r\n }\r\n .animate-scroll {\r\n animation: scroll 25s linear infinite;\r\n }\r\n `}</style>\r\n </div>\r\n );\r\n}\r\n\r\nexport default LogoCloud;\r\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';function o({title:s="Trusted by the world's most innovative teams",description:l="Join thousands of developers building with us",logos:t=[],className:n=""}){return jsxs("div",{className:`overflow-hidden py-20 ${n}`,children:[jsxs("div",{className:"mx-auto max-w-7xl px-6",children:[jsxs("div",{className:"mb-16 text-center",children:[jsx("h2",{className:"mb-4 text-2xl font-bold lg:text-3xl",children:s}),jsx("p",{className:"text-muted-foreground text-lg",children:l})]}),jsx("div",{className:"relative overflow-hidden",style:{maskImage:"linear-gradient(to right, transparent, black 20%, black 80%, transparent)",WebkitMaskImage:"linear-gradient(to right, transparent, black 20%, black 80%, transparent)"},children:jsx("div",{className:"flex animate-scroll gap-8",children:[...t,...t,...t].map((a,i)=>jsx("a",{href:a.url,target:"_blank",rel:"noopener noreferrer",className:"flex flex-shrink-0 items-center justify-center p-6 transition-all hover:scale-105",children:jsx("div",{className:"text-4xl hover:scale-110 transition-transform",children:a.logo})},`${a.name}-${i}`))})})]}),jsx("style",{jsx:true,children:`
|
|
2
|
+
@keyframes scroll {
|
|
3
|
+
0% {
|
|
4
|
+
transform: translateX(0);
|
|
5
|
+
}
|
|
6
|
+
100% {
|
|
7
|
+
transform: translateX(-33.333%);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
.animate-scroll {
|
|
11
|
+
animation: scroll 25s linear infinite;
|
|
12
|
+
}
|
|
13
|
+
`})]})}var d=o;export{o as LogoCloud,d as default};//# sourceMappingURL=index.mjs.map
|
|
14
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/logo-cloud/index.tsx"],"names":["LogoCloud","title","description","logos","className","jsxs","jsx","logo","index","logo_cloud_default"],"mappings":"yCAeO,SAASA,CAAAA,CAAU,CACxB,KAAA,CAAAC,CAAAA,CAAQ,8CAAA,CACR,WAAA,CAAAC,CAAAA,CAAc,gDACd,KAAA,CAAAC,CAAAA,CAAQ,EAAC,CACT,SAAA,CAAAC,CAAAA,CAAY,EACd,CAAA,CAAmB,CACjB,OACEC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,sBAAA,EAAyBD,CAAS,CAAA,CAAA,CAChD,QAAA,CAAA,CAAAC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,qCAAA,CAAuC,QAAA,CAAAL,CAAAA,CAAM,CAAA,CAC3DK,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAiC,QAAA,CAAAJ,CAAAA,CAAY,CAAA,CAAA,CAC5D,CAAA,CAEAI,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,2BACV,KAAA,CAAO,CACL,SAAA,CACE,2EAAA,CACF,eAAA,CACE,2EACJ,CAAA,CAEA,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAA,CAAC,GAAGH,EAAO,GAAGA,CAAAA,CAAO,GAAGA,CAAK,CAAA,CAAE,GAAA,CAAI,CAACI,CAAAA,CAAMC,CAAAA,GACzCF,GAAAA,CAAC,GAAA,CAAA,CAEC,IAAA,CAAMC,CAAAA,CAAK,GAAA,CACX,OAAO,QAAA,CACP,GAAA,CAAI,qBAAA,CACJ,SAAA,CAAU,mFAAA,CAEV,QAAA,CAAAD,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CAAiD,QAAA,CAAAC,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAA,CANrE,CAAA,EAAGA,CAAAA,CAAK,IAAI,CAAA,CAAA,EAAIC,CAAK,CAAA,CAO5B,CACD,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEAF,GAAAA,CAAC,OAAA,CAAA,CAAM,GAAA,CAAG,IAAA,CAAE,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,CAYV,CAAA,CAAA,CACJ,CAEJ,CAEA,IAAOG,CAAAA,CAAQT","file":"index.mjs","sourcesContent":["\"use client\";\r\n\r\nimport { ReactNode } from \"react\";\r\n\r\ninterface LogoCloudProps {\r\n title?: string;\r\n description?: string;\r\n logos?: Array<{\r\n name: string;\r\n logo: ReactNode;\r\n url?: string;\r\n }>;\r\n className?: string;\r\n}\r\n\r\nexport function LogoCloud({\r\n title = \"Trusted by the world's most innovative teams\",\r\n description = \"Join thousands of developers building with us\",\r\n logos = [],\r\n className = \"\",\r\n}: LogoCloudProps) {\r\n return (\r\n <div className={`overflow-hidden py-20 ${className}`}>\r\n <div className=\"mx-auto max-w-7xl px-6\">\r\n <div className=\"mb-16 text-center\">\r\n <h2 className=\"mb-4 text-2xl font-bold lg:text-3xl\">{title}</h2>\r\n <p className=\"text-muted-foreground text-lg\">{description}</p>\r\n </div>\r\n\r\n <div\r\n className=\"relative overflow-hidden\"\r\n style={{\r\n maskImage:\r\n \"linear-gradient(to right, transparent, black 20%, black 80%, transparent)\",\r\n WebkitMaskImage:\r\n \"linear-gradient(to right, transparent, black 20%, black 80%, transparent)\",\r\n }}\r\n >\r\n <div className=\"flex animate-scroll gap-8\">\r\n {[...logos, ...logos, ...logos].map((logo, index) => (\r\n <a\r\n key={`${logo.name}-${index}`}\r\n href={logo.url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"flex flex-shrink-0 items-center justify-center p-6 transition-all hover:scale-105\"\r\n >\r\n <div className=\"text-4xl hover:scale-110 transition-transform\">{logo.logo}</div>\r\n </a>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <style jsx>{`\r\n @keyframes scroll {\r\n 0% {\r\n transform: translateX(0);\r\n }\r\n 100% {\r\n transform: translateX(-33.333%);\r\n }\r\n }\r\n .animate-scroll {\r\n animation: scroll 25s linear infinite;\r\n }\r\n `}</style>\r\n </div>\r\n );\r\n}\r\n\r\nexport default LogoCloud;\r\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function h(...i){return tailwindMerge.twMerge(clsx.clsx(i))}var L={SMOOTH_TAU:.25,MIN_COPIES:2,COPY_HEADROOM:2},P=react.memo(({logos:i,speed:p=120,direction:O="left",width:u="100%",logoHeight:c=28,gap:d=32,pauseOnHover:f=true,fadeOut:q=false,fadeOutColor:Z,scaleOnHover:M=false,ariaLabel:$="Partner logos",className:D,style:R})=>{let v=react.useRef(null),S=react.useRef(null),m=react.useRef(null),[o,F]=react.useState(0),[k,W]=react.useState(L.MIN_COPIES),[z,A]=react.useState(false),T=react.useMemo(()=>{let e=Math.abs(p),t=O==="left"?1:-1,r=p<0?-1:1;return e*t*r},[p,O]),s=react.useCallback(()=>{let e=v.current?.clientWidth??0,t=m.current?.getBoundingClientRect?.()?.width??0;if(t>0){F(Math.ceil(t));let r=Math.ceil(e/t)+L.COPY_HEADROOM;W(Math.max(L.MIN_COPIES,r));}},[]);react.useEffect(()=>{if(!window.ResizeObserver){let t=()=>s();return window.addEventListener("resize",t),s(),()=>window.removeEventListener("resize",t)}let e=[];return [v,m].forEach(t=>{if(t.current){let r=new ResizeObserver(s);r.observe(t.current),e.push(r);}}),s(),()=>{e.forEach(t=>t.disconnect());}},[s,i,d,c]),react.useEffect(()=>{let e=m.current?.querySelectorAll("img")??[];if(e.length===0){s();return}let t=e.length,r=()=>{t-=1,t===0&&s();};return e.forEach(n=>{let a=n;a.complete?r():(a.addEventListener("load",r,{once:true}),a.addEventListener("error",r,{once:true}));}),()=>{e.forEach(n=>{n.removeEventListener("load",r),n.removeEventListener("error",r);});}},[i,d,c,s]),react.useEffect(()=>{let e=S.current;if(!e)return;let t=null,r=null,n=0,a=0;o>0&&(n=(n%o+o)%o,e.style.transform=`translate3d(${-n}px, 0, 0)`);let b=E=>{r===null&&(r=E);let _=Math.max(0,E-r)/1e3;r=E;let G=f&&z?0:T,H=1-Math.exp(-_/L.SMOOTH_TAU);if(a+=(G-a)*H,o>0){let w=n+a*_;w=(w%o+o)%o,n=w;let X=-n;e.style.transform=`translate3d(${X}px, 0, 0)`;}t=requestAnimationFrame(b);};return t=requestAnimationFrame(b),()=>{t!==null&&cancelAnimationFrame(t);}},[T,o,z,f]);let U=react.useCallback(()=>{f&&A(true);},[f]),V=react.useCallback(()=>{f&&A(false);},[f]),x=react.useCallback((e,t)=>{let r="node"in e&&e.node,n=r?jsxRuntime.jsx("span",{"aria-hidden":!!e.href&&!e.ariaLabel,children:e.node}):jsxRuntime.jsx("img",{src:e.src,srcSet:e.srcSet,sizes:e.sizes,width:e.width,height:e.height,alt:e.alt??"",title:e.title,loading:"lazy",decoding:"async",draggable:false,style:{height:c,width:"auto"}}),a=r?e.ariaLabel??e.title:e.alt??e.title,b=e.href?jsxRuntime.jsx("a",{href:e.href,"aria-label":a||"logo link",target:"_blank",rel:"noreferrer noopener",className:h(M&&"transition-transform hover:scale-110"),children:n}):jsxRuntime.jsx("span",{className:h(M&&"transition-transform hover:scale-110"),children:n});return jsxRuntime.jsx("li",{role:"listitem",className:"flex-shrink-0",style:{marginRight:d},children:b},t)},[d,c,M]),Y=react.useMemo(()=>Array.from({length:k},(e,t)=>jsxRuntime.jsx("ul",{role:"list","aria-hidden":t>0,ref:t===0?m:void 0,className:"flex items-center",style:{height:c},children:i.map((r,n)=>x(r,`${t}-${n}`))},`copy-${t}`)),[k,i,x,c]),B=react.useMemo(()=>({width:typeof u=="number"?`${u}px`:u,...R}),[u,R]);return jsxRuntime.jsx("div",{ref:v,className:h("relative overflow-hidden",q&&"before:absolute before:left-0 before:top-0 before:bottom-0 before:w-24 before:bg-gradient-to-r before:from-white before:to-transparent before:z-10 after:absolute after:right-0 after:top-0 after:bottom-0 after:w-24 after:bg-gradient-to-l after:from-white after:to-transparent after:z-10 dark:before:from-black dark:after:from-black",D),style:B,role:"region","aria-label":$,onMouseEnter:U,onMouseLeave:V,children:jsxRuntime.jsx("div",{ref:S,className:"flex will-change-transform",children:Y})})});P.displayName="LogoLoop";var oe=P;exports.LogoLoop=P;exports.default=oe;//# sourceMappingURL=index.js.map
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/logo-loop/index.tsx"],"names":["cn","inputs","twMerge","clsx","ANIMATION_CONFIG","LogoLoop","memo","logos","speed","direction","width","logoHeight","gap","pauseOnHover","fadeOut","fadeOutColor","scaleOnHover","ariaLabel","className","style","containerRef","useRef","trackRef","seqRef","seqWidth","setSeqWidth","useState","copyCount","setCopyCount","isHovered","setIsHovered","targetVelocity","useMemo","magnitude","directionMultiplier","speedMultiplier","updateDimensions","useCallback","containerWidth","sequenceWidth","copiesNeeded","useEffect","handleResize","observers","ref","observer","images","remainingImages","handleImageLoad","img","htmlImg","track","rafId","lastTimestamp","offset","velocity","animate","timestamp","deltaTime","target","easingFactor","nextOffset","translateX","handleMouseEnter","handleMouseLeave","renderLogoItem","item","key","isNodeItem","content","jsx","itemAriaLabel","itemContent","logoLists","_","copyIndex","itemIndex","containerStyle","logo_loop_default"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n memo,\r\n} from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nconst ANIMATION_CONFIG = {\r\n SMOOTH_TAU: 0.25,\r\n MIN_COPIES: 2,\r\n COPY_HEADROOM: 2,\r\n};\r\n\r\ninterface LogoItem {\r\n node?: React.ReactNode;\r\n src?: string;\r\n srcSet?: string;\r\n sizes?: string;\r\n width?: number;\r\n height?: number;\r\n alt?: string;\r\n title?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\ninterface LogoLoopProps {\r\n logos: LogoItem[];\r\n speed?: number;\r\n direction?: \"left\" | \"right\";\r\n width?: string | number;\r\n logoHeight?: number;\r\n gap?: number;\r\n pauseOnHover?: boolean;\r\n fadeOut?: boolean;\r\n fadeOutColor?: string;\r\n scaleOnHover?: boolean;\r\n ariaLabel?: string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const LogoLoop = memo<LogoLoopProps>(\r\n ({\r\n logos,\r\n speed = 120,\r\n direction = \"left\",\r\n width = \"100%\",\r\n logoHeight = 28,\r\n gap = 32,\r\n pauseOnHover = true,\r\n fadeOut = false,\r\n fadeOutColor,\r\n scaleOnHover = false,\r\n ariaLabel = \"Partner logos\",\r\n className,\r\n style,\r\n }) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const trackRef = useRef<HTMLDivElement>(null);\r\n const seqRef = useRef<HTMLUListElement>(null);\r\n\r\n const [seqWidth, setSeqWidth] = useState<number>(0);\r\n const [copyCount, setCopyCount] = useState<number>(ANIMATION_CONFIG.MIN_COPIES);\r\n const [isHovered, setIsHovered] = useState<boolean>(false);\r\n\r\n const targetVelocity = useMemo(() => {\r\n const magnitude = Math.abs(speed);\r\n const directionMultiplier = direction === \"left\" ? 1 : -1;\r\n const speedMultiplier = speed < 0 ? -1 : 1;\r\n return magnitude * directionMultiplier * speedMultiplier;\r\n }, [speed, direction]);\r\n\r\n const updateDimensions = useCallback(() => {\r\n const containerWidth = containerRef.current?.clientWidth ?? 0;\r\n const sequenceWidth = seqRef.current?.getBoundingClientRect?.()?.width ?? 0;\r\n\r\n if (sequenceWidth > 0) {\r\n setSeqWidth(Math.ceil(sequenceWidth));\r\n const copiesNeeded =\r\n Math.ceil(containerWidth / sequenceWidth) + ANIMATION_CONFIG.COPY_HEADROOM;\r\n setCopyCount(Math.max(ANIMATION_CONFIG.MIN_COPIES, copiesNeeded));\r\n }\r\n }, []);\r\n\r\n // Resize observer\r\n useEffect(() => {\r\n if (!window.ResizeObserver) {\r\n const handleResize = () => updateDimensions();\r\n window.addEventListener(\"resize\", handleResize);\r\n updateDimensions();\r\n return () => window.removeEventListener(\"resize\", handleResize);\r\n }\r\n\r\n const observers: ResizeObserver[] = [];\r\n [containerRef, seqRef].forEach((ref) => {\r\n if (ref.current) {\r\n const observer = new ResizeObserver(updateDimensions);\r\n observer.observe(ref.current);\r\n observers.push(observer);\r\n }\r\n });\r\n\r\n updateDimensions();\r\n\r\n return () => {\r\n observers.forEach((observer) => observer.disconnect());\r\n };\r\n }, [updateDimensions, logos, gap, logoHeight]);\r\n\r\n // Image loader\r\n useEffect(() => {\r\n const images = seqRef.current?.querySelectorAll(\"img\") ?? [];\r\n\r\n if (images.length === 0) {\r\n updateDimensions();\r\n return;\r\n }\r\n\r\n let remainingImages = images.length;\r\n const handleImageLoad = () => {\r\n remainingImages -= 1;\r\n if (remainingImages === 0) {\r\n updateDimensions();\r\n }\r\n };\r\n\r\n images.forEach((img) => {\r\n const htmlImg = img as HTMLImageElement;\r\n if (htmlImg.complete) {\r\n handleImageLoad();\r\n } else {\r\n htmlImg.addEventListener(\"load\", handleImageLoad, { once: true });\r\n htmlImg.addEventListener(\"error\", handleImageLoad, { once: true });\r\n }\r\n });\r\n\r\n return () => {\r\n images.forEach((img) => {\r\n img.removeEventListener(\"load\", handleImageLoad);\r\n img.removeEventListener(\"error\", handleImageLoad);\r\n });\r\n };\r\n }, [logos, gap, logoHeight, updateDimensions]);\r\n\r\n // Animation loop\r\n useEffect(() => {\r\n const track = trackRef.current;\r\n if (!track) return;\r\n\r\n let rafId: number | null = null;\r\n let lastTimestamp: number | null = null;\r\n let offset = 0;\r\n let velocity = 0;\r\n\r\n if (seqWidth > 0) {\r\n offset = ((offset % seqWidth) + seqWidth) % seqWidth;\r\n track.style.transform = `translate3d(${-offset}px, 0, 0)`;\r\n }\r\n\r\n const animate = (timestamp: number) => {\r\n if (lastTimestamp === null) {\r\n lastTimestamp = timestamp;\r\n }\r\n\r\n const deltaTime = Math.max(0, timestamp - lastTimestamp) / 1000;\r\n lastTimestamp = timestamp;\r\n\r\n const target = pauseOnHover && isHovered ? 0 : targetVelocity;\r\n\r\n const easingFactor = 1 - Math.exp(-deltaTime / ANIMATION_CONFIG.SMOOTH_TAU);\r\n velocity += (target - velocity) * easingFactor;\r\n\r\n if (seqWidth > 0) {\r\n let nextOffset = offset + velocity * deltaTime;\r\n nextOffset = ((nextOffset % seqWidth) + seqWidth) % seqWidth;\r\n offset = nextOffset;\r\n\r\n const translateX = -offset;\r\n track.style.transform = `translate3d(${translateX}px, 0, 0)`;\r\n }\r\n\r\n rafId = requestAnimationFrame(animate);\r\n };\r\n\r\n rafId = requestAnimationFrame(animate);\r\n\r\n return () => {\r\n if (rafId !== null) {\r\n cancelAnimationFrame(rafId);\r\n }\r\n };\r\n }, [targetVelocity, seqWidth, isHovered, pauseOnHover]);\r\n\r\n const handleMouseEnter = useCallback(() => {\r\n if (pauseOnHover) setIsHovered(true);\r\n }, [pauseOnHover]);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n if (pauseOnHover) setIsHovered(false);\r\n }, [pauseOnHover]);\r\n\r\n const renderLogoItem = useCallback((item: LogoItem, key: string) => {\r\n const isNodeItem = \"node\" in item && item.node;\r\n\r\n const content = isNodeItem ? (\r\n <span aria-hidden={!!item.href && !item.ariaLabel}>{item.node}</span>\r\n ) : (\r\n <img\r\n src={item.src}\r\n srcSet={item.srcSet}\r\n sizes={item.sizes}\r\n width={item.width}\r\n height={item.height}\r\n alt={item.alt ?? \"\"}\r\n title={item.title}\r\n loading=\"lazy\"\r\n decoding=\"async\"\r\n draggable={false}\r\n style={{ height: logoHeight, width: \"auto\" }}\r\n />\r\n );\r\n\r\n const itemAriaLabel = isNodeItem\r\n ? item.ariaLabel ?? item.title\r\n : item.alt ?? item.title;\r\n\r\n const itemContent = item.href ? (\r\n <a\r\n href={item.href}\r\n aria-label={itemAriaLabel || \"logo link\"}\r\n target=\"_blank\"\r\n rel=\"noreferrer noopener\"\r\n className={cn(scaleOnHover && \"transition-transform hover:scale-110\")}\r\n >\r\n {content}\r\n </a>\r\n ) : (\r\n <span className={cn(scaleOnHover && \"transition-transform hover:scale-110\")}>\r\n {content}\r\n </span>\r\n );\r\n\r\n return (\r\n <li\r\n key={key}\r\n role=\"listitem\"\r\n className=\"flex-shrink-0\"\r\n style={{ marginRight: gap }}\r\n >\r\n {itemContent}\r\n </li>\r\n );\r\n }, [gap, logoHeight, scaleOnHover]);\r\n\r\n const logoLists = useMemo(\r\n () =>\r\n Array.from({ length: copyCount }, (_, copyIndex) => (\r\n <ul\r\n key={`copy-${copyIndex}`}\r\n role=\"list\"\r\n aria-hidden={copyIndex > 0}\r\n ref={copyIndex === 0 ? seqRef : undefined}\r\n className=\"flex items-center\"\r\n style={{ height: logoHeight }}\r\n >\r\n {logos.map((item, itemIndex) =>\r\n renderLogoItem(item, `${copyIndex}-${itemIndex}`)\r\n )}\r\n </ul>\r\n )),\r\n [copyCount, logos, renderLogoItem, logoHeight]\r\n );\r\n\r\n const containerStyle = useMemo(\r\n () => ({\r\n width: typeof width === \"number\" ? `${width}px` : width,\r\n ...style,\r\n }),\r\n [width, style]\r\n );\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={cn(\r\n \"relative overflow-hidden\",\r\n fadeOut &&\r\n \"before:absolute before:left-0 before:top-0 before:bottom-0 before:w-24 before:bg-gradient-to-r before:from-white before:to-transparent before:z-10 after:absolute after:right-0 after:top-0 after:bottom-0 after:w-24 after:bg-gradient-to-l after:from-white after:to-transparent after:z-10 dark:before:from-black dark:after:from-black\",\r\n className\r\n )}\r\n style={containerStyle}\r\n role=\"region\"\r\n aria-label={ariaLabel}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n <div ref={trackRef} className=\"flex will-change-transform\">\r\n {logoLists}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nLogoLoop.displayName = \"LogoLoop\";\r\n\r\nexport default LogoLoop;\r\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {memo,useRef,useState,useMemo,useCallback,useEffect}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx}from'react/jsx-runtime';function h(...i){return twMerge(clsx(i))}var L={SMOOTH_TAU:.25,MIN_COPIES:2,COPY_HEADROOM:2},P=memo(({logos:i,speed:p=120,direction:O="left",width:u="100%",logoHeight:c=28,gap:d=32,pauseOnHover:f=true,fadeOut:q=false,fadeOutColor:Z,scaleOnHover:M=false,ariaLabel:$="Partner logos",className:D,style:R})=>{let v=useRef(null),S=useRef(null),m=useRef(null),[o,F]=useState(0),[k,W]=useState(L.MIN_COPIES),[z,A]=useState(false),T=useMemo(()=>{let e=Math.abs(p),t=O==="left"?1:-1,r=p<0?-1:1;return e*t*r},[p,O]),s=useCallback(()=>{let e=v.current?.clientWidth??0,t=m.current?.getBoundingClientRect?.()?.width??0;if(t>0){F(Math.ceil(t));let r=Math.ceil(e/t)+L.COPY_HEADROOM;W(Math.max(L.MIN_COPIES,r));}},[]);useEffect(()=>{if(!window.ResizeObserver){let t=()=>s();return window.addEventListener("resize",t),s(),()=>window.removeEventListener("resize",t)}let e=[];return [v,m].forEach(t=>{if(t.current){let r=new ResizeObserver(s);r.observe(t.current),e.push(r);}}),s(),()=>{e.forEach(t=>t.disconnect());}},[s,i,d,c]),useEffect(()=>{let e=m.current?.querySelectorAll("img")??[];if(e.length===0){s();return}let t=e.length,r=()=>{t-=1,t===0&&s();};return e.forEach(n=>{let a=n;a.complete?r():(a.addEventListener("load",r,{once:true}),a.addEventListener("error",r,{once:true}));}),()=>{e.forEach(n=>{n.removeEventListener("load",r),n.removeEventListener("error",r);});}},[i,d,c,s]),useEffect(()=>{let e=S.current;if(!e)return;let t=null,r=null,n=0,a=0;o>0&&(n=(n%o+o)%o,e.style.transform=`translate3d(${-n}px, 0, 0)`);let b=E=>{r===null&&(r=E);let _=Math.max(0,E-r)/1e3;r=E;let G=f&&z?0:T,H=1-Math.exp(-_/L.SMOOTH_TAU);if(a+=(G-a)*H,o>0){let w=n+a*_;w=(w%o+o)%o,n=w;let X=-n;e.style.transform=`translate3d(${X}px, 0, 0)`;}t=requestAnimationFrame(b);};return t=requestAnimationFrame(b),()=>{t!==null&&cancelAnimationFrame(t);}},[T,o,z,f]);let U=useCallback(()=>{f&&A(true);},[f]),V=useCallback(()=>{f&&A(false);},[f]),x=useCallback((e,t)=>{let r="node"in e&&e.node,n=r?jsx("span",{"aria-hidden":!!e.href&&!e.ariaLabel,children:e.node}):jsx("img",{src:e.src,srcSet:e.srcSet,sizes:e.sizes,width:e.width,height:e.height,alt:e.alt??"",title:e.title,loading:"lazy",decoding:"async",draggable:false,style:{height:c,width:"auto"}}),a=r?e.ariaLabel??e.title:e.alt??e.title,b=e.href?jsx("a",{href:e.href,"aria-label":a||"logo link",target:"_blank",rel:"noreferrer noopener",className:h(M&&"transition-transform hover:scale-110"),children:n}):jsx("span",{className:h(M&&"transition-transform hover:scale-110"),children:n});return jsx("li",{role:"listitem",className:"flex-shrink-0",style:{marginRight:d},children:b},t)},[d,c,M]),Y=useMemo(()=>Array.from({length:k},(e,t)=>jsx("ul",{role:"list","aria-hidden":t>0,ref:t===0?m:void 0,className:"flex items-center",style:{height:c},children:i.map((r,n)=>x(r,`${t}-${n}`))},`copy-${t}`)),[k,i,x,c]),B=useMemo(()=>({width:typeof u=="number"?`${u}px`:u,...R}),[u,R]);return jsx("div",{ref:v,className:h("relative overflow-hidden",q&&"before:absolute before:left-0 before:top-0 before:bottom-0 before:w-24 before:bg-gradient-to-r before:from-white before:to-transparent before:z-10 after:absolute after:right-0 after:top-0 after:bottom-0 after:w-24 after:bg-gradient-to-l after:from-white after:to-transparent after:z-10 dark:before:from-black dark:after:from-black",D),style:B,role:"region","aria-label":$,onMouseEnter:U,onMouseLeave:V,children:jsx("div",{ref:S,className:"flex will-change-transform",children:Y})})});P.displayName="LogoLoop";var oe=P;export{P as LogoLoop,oe as default};//# sourceMappingURL=index.mjs.map
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/logo-loop/index.tsx"],"names":["cn","inputs","twMerge","clsx","ANIMATION_CONFIG","LogoLoop","memo","logos","speed","direction","width","logoHeight","gap","pauseOnHover","fadeOut","fadeOutColor","scaleOnHover","ariaLabel","className","style","containerRef","useRef","trackRef","seqRef","seqWidth","setSeqWidth","useState","copyCount","setCopyCount","isHovered","setIsHovered","targetVelocity","useMemo","magnitude","directionMultiplier","speedMultiplier","updateDimensions","useCallback","containerWidth","sequenceWidth","copiesNeeded","useEffect","handleResize","observers","ref","observer","images","remainingImages","handleImageLoad","img","htmlImg","track","rafId","lastTimestamp","offset","velocity","animate","timestamp","deltaTime","target","easingFactor","nextOffset","translateX","handleMouseEnter","handleMouseLeave","renderLogoItem","item","key","isNodeItem","content","jsx","itemAriaLabel","itemContent","logoLists","_","copyIndex","itemIndex","containerStyle","logo_loop_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n memo,\r\n} from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nconst ANIMATION_CONFIG = {\r\n SMOOTH_TAU: 0.25,\r\n MIN_COPIES: 2,\r\n COPY_HEADROOM: 2,\r\n};\r\n\r\ninterface LogoItem {\r\n node?: React.ReactNode;\r\n src?: string;\r\n srcSet?: string;\r\n sizes?: string;\r\n width?: number;\r\n height?: number;\r\n alt?: string;\r\n title?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\ninterface LogoLoopProps {\r\n logos: LogoItem[];\r\n speed?: number;\r\n direction?: \"left\" | \"right\";\r\n width?: string | number;\r\n logoHeight?: number;\r\n gap?: number;\r\n pauseOnHover?: boolean;\r\n fadeOut?: boolean;\r\n fadeOutColor?: string;\r\n scaleOnHover?: boolean;\r\n ariaLabel?: string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const LogoLoop = memo<LogoLoopProps>(\r\n ({\r\n logos,\r\n speed = 120,\r\n direction = \"left\",\r\n width = \"100%\",\r\n logoHeight = 28,\r\n gap = 32,\r\n pauseOnHover = true,\r\n fadeOut = false,\r\n fadeOutColor,\r\n scaleOnHover = false,\r\n ariaLabel = \"Partner logos\",\r\n className,\r\n style,\r\n }) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const trackRef = useRef<HTMLDivElement>(null);\r\n const seqRef = useRef<HTMLUListElement>(null);\r\n\r\n const [seqWidth, setSeqWidth] = useState<number>(0);\r\n const [copyCount, setCopyCount] = useState<number>(ANIMATION_CONFIG.MIN_COPIES);\r\n const [isHovered, setIsHovered] = useState<boolean>(false);\r\n\r\n const targetVelocity = useMemo(() => {\r\n const magnitude = Math.abs(speed);\r\n const directionMultiplier = direction === \"left\" ? 1 : -1;\r\n const speedMultiplier = speed < 0 ? -1 : 1;\r\n return magnitude * directionMultiplier * speedMultiplier;\r\n }, [speed, direction]);\r\n\r\n const updateDimensions = useCallback(() => {\r\n const containerWidth = containerRef.current?.clientWidth ?? 0;\r\n const sequenceWidth = seqRef.current?.getBoundingClientRect?.()?.width ?? 0;\r\n\r\n if (sequenceWidth > 0) {\r\n setSeqWidth(Math.ceil(sequenceWidth));\r\n const copiesNeeded =\r\n Math.ceil(containerWidth / sequenceWidth) + ANIMATION_CONFIG.COPY_HEADROOM;\r\n setCopyCount(Math.max(ANIMATION_CONFIG.MIN_COPIES, copiesNeeded));\r\n }\r\n }, []);\r\n\r\n // Resize observer\r\n useEffect(() => {\r\n if (!window.ResizeObserver) {\r\n const handleResize = () => updateDimensions();\r\n window.addEventListener(\"resize\", handleResize);\r\n updateDimensions();\r\n return () => window.removeEventListener(\"resize\", handleResize);\r\n }\r\n\r\n const observers: ResizeObserver[] = [];\r\n [containerRef, seqRef].forEach((ref) => {\r\n if (ref.current) {\r\n const observer = new ResizeObserver(updateDimensions);\r\n observer.observe(ref.current);\r\n observers.push(observer);\r\n }\r\n });\r\n\r\n updateDimensions();\r\n\r\n return () => {\r\n observers.forEach((observer) => observer.disconnect());\r\n };\r\n }, [updateDimensions, logos, gap, logoHeight]);\r\n\r\n // Image loader\r\n useEffect(() => {\r\n const images = seqRef.current?.querySelectorAll(\"img\") ?? [];\r\n\r\n if (images.length === 0) {\r\n updateDimensions();\r\n return;\r\n }\r\n\r\n let remainingImages = images.length;\r\n const handleImageLoad = () => {\r\n remainingImages -= 1;\r\n if (remainingImages === 0) {\r\n updateDimensions();\r\n }\r\n };\r\n\r\n images.forEach((img) => {\r\n const htmlImg = img as HTMLImageElement;\r\n if (htmlImg.complete) {\r\n handleImageLoad();\r\n } else {\r\n htmlImg.addEventListener(\"load\", handleImageLoad, { once: true });\r\n htmlImg.addEventListener(\"error\", handleImageLoad, { once: true });\r\n }\r\n });\r\n\r\n return () => {\r\n images.forEach((img) => {\r\n img.removeEventListener(\"load\", handleImageLoad);\r\n img.removeEventListener(\"error\", handleImageLoad);\r\n });\r\n };\r\n }, [logos, gap, logoHeight, updateDimensions]);\r\n\r\n // Animation loop\r\n useEffect(() => {\r\n const track = trackRef.current;\r\n if (!track) return;\r\n\r\n let rafId: number | null = null;\r\n let lastTimestamp: number | null = null;\r\n let offset = 0;\r\n let velocity = 0;\r\n\r\n if (seqWidth > 0) {\r\n offset = ((offset % seqWidth) + seqWidth) % seqWidth;\r\n track.style.transform = `translate3d(${-offset}px, 0, 0)`;\r\n }\r\n\r\n const animate = (timestamp: number) => {\r\n if (lastTimestamp === null) {\r\n lastTimestamp = timestamp;\r\n }\r\n\r\n const deltaTime = Math.max(0, timestamp - lastTimestamp) / 1000;\r\n lastTimestamp = timestamp;\r\n\r\n const target = pauseOnHover && isHovered ? 0 : targetVelocity;\r\n\r\n const easingFactor = 1 - Math.exp(-deltaTime / ANIMATION_CONFIG.SMOOTH_TAU);\r\n velocity += (target - velocity) * easingFactor;\r\n\r\n if (seqWidth > 0) {\r\n let nextOffset = offset + velocity * deltaTime;\r\n nextOffset = ((nextOffset % seqWidth) + seqWidth) % seqWidth;\r\n offset = nextOffset;\r\n\r\n const translateX = -offset;\r\n track.style.transform = `translate3d(${translateX}px, 0, 0)`;\r\n }\r\n\r\n rafId = requestAnimationFrame(animate);\r\n };\r\n\r\n rafId = requestAnimationFrame(animate);\r\n\r\n return () => {\r\n if (rafId !== null) {\r\n cancelAnimationFrame(rafId);\r\n }\r\n };\r\n }, [targetVelocity, seqWidth, isHovered, pauseOnHover]);\r\n\r\n const handleMouseEnter = useCallback(() => {\r\n if (pauseOnHover) setIsHovered(true);\r\n }, [pauseOnHover]);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n if (pauseOnHover) setIsHovered(false);\r\n }, [pauseOnHover]);\r\n\r\n const renderLogoItem = useCallback((item: LogoItem, key: string) => {\r\n const isNodeItem = \"node\" in item && item.node;\r\n\r\n const content = isNodeItem ? (\r\n <span aria-hidden={!!item.href && !item.ariaLabel}>{item.node}</span>\r\n ) : (\r\n <img\r\n src={item.src}\r\n srcSet={item.srcSet}\r\n sizes={item.sizes}\r\n width={item.width}\r\n height={item.height}\r\n alt={item.alt ?? \"\"}\r\n title={item.title}\r\n loading=\"lazy\"\r\n decoding=\"async\"\r\n draggable={false}\r\n style={{ height: logoHeight, width: \"auto\" }}\r\n />\r\n );\r\n\r\n const itemAriaLabel = isNodeItem\r\n ? item.ariaLabel ?? item.title\r\n : item.alt ?? item.title;\r\n\r\n const itemContent = item.href ? (\r\n <a\r\n href={item.href}\r\n aria-label={itemAriaLabel || \"logo link\"}\r\n target=\"_blank\"\r\n rel=\"noreferrer noopener\"\r\n className={cn(scaleOnHover && \"transition-transform hover:scale-110\")}\r\n >\r\n {content}\r\n </a>\r\n ) : (\r\n <span className={cn(scaleOnHover && \"transition-transform hover:scale-110\")}>\r\n {content}\r\n </span>\r\n );\r\n\r\n return (\r\n <li\r\n key={key}\r\n role=\"listitem\"\r\n className=\"flex-shrink-0\"\r\n style={{ marginRight: gap }}\r\n >\r\n {itemContent}\r\n </li>\r\n );\r\n }, [gap, logoHeight, scaleOnHover]);\r\n\r\n const logoLists = useMemo(\r\n () =>\r\n Array.from({ length: copyCount }, (_, copyIndex) => (\r\n <ul\r\n key={`copy-${copyIndex}`}\r\n role=\"list\"\r\n aria-hidden={copyIndex > 0}\r\n ref={copyIndex === 0 ? seqRef : undefined}\r\n className=\"flex items-center\"\r\n style={{ height: logoHeight }}\r\n >\r\n {logos.map((item, itemIndex) =>\r\n renderLogoItem(item, `${copyIndex}-${itemIndex}`)\r\n )}\r\n </ul>\r\n )),\r\n [copyCount, logos, renderLogoItem, logoHeight]\r\n );\r\n\r\n const containerStyle = useMemo(\r\n () => ({\r\n width: typeof width === \"number\" ? `${width}px` : width,\r\n ...style,\r\n }),\r\n [width, style]\r\n );\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={cn(\r\n \"relative overflow-hidden\",\r\n fadeOut &&\r\n \"before:absolute before:left-0 before:top-0 before:bottom-0 before:w-24 before:bg-gradient-to-r before:from-white before:to-transparent before:z-10 after:absolute after:right-0 after:top-0 after:bottom-0 after:w-24 after:bg-gradient-to-l after:from-white after:to-transparent after:z-10 dark:before:from-black dark:after:from-black\",\r\n className\r\n )}\r\n style={containerStyle}\r\n role=\"region\"\r\n aria-label={ariaLabel}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n <div ref={trackRef} className=\"flex will-change-transform\">\r\n {logoLists}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nLogoLoop.displayName = \"LogoLoop\";\r\n\r\nexport default LogoLoop;\r\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),jsxRuntime=require('react/jsx-runtime');function A({children:p,padding:t=100,disabled:o=false,magnetStrength:n=8,activeTransition:M="transform 0.8s ease-out",inactiveTransition:g="transform 1.2s ease-in-out",wrapperClassName:y="",innerClassName:x="",...b}){let[h,r]=react.useState(false),[a,s]=react.useState({x:0,y:0}),i=react.useRef(null);react.useEffect(()=>{if(o){s({x:0,y:0});return}let c=e=>{if(!i.current)return;let{left:E,top:R,width:l,height:f}=i.current.getBoundingClientRect(),u=E+l/2,m=R+f/2,L=Math.abs(u-e.clientX),N=Math.abs(m-e.clientY);if(L<l/2+t&&N<f/2+t){r(true);let T=(e.clientX-u)/n,X=(e.clientY-m)/n;s({x:T,y:X});}else r(false),s({x:0,y:0});};return window.addEventListener("mousemove",c),()=>{window.removeEventListener("mousemove",c);}},[t,o,n]);let w=h?M:g;return jsxRuntime.jsx("div",{ref:i,className:y,style:{position:"relative",display:"inline-block"},...b,children:jsxRuntime.jsx("div",{className:x,style:{transform:`translate3d(${a.x}px, ${a.y}px, 0)`,transition:w,willChange:"transform"},children:p})})}var P=A;exports.Magnet=A;exports.default=P;//# sourceMappingURL=index.js.map
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/magnet/index.tsx"],"names":["Magnet","children","padding","disabled","magnetStrength","activeTransition","inactiveTransition","wrapperClassName","innerClassName","props","isActive","setIsActive","useState","position","setPosition","magnetRef","useRef","useEffect","handleMouseMove","left","top","width","height","centerX","centerY","distX","distY","offsetX","offsetY","transitionStyle","jsx","magnet_default"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\r\n\r\nimport { useState, useEffect, useRef } from \"react\";\r\n\r\ninterface MagnetProps {\r\n children: React.ReactNode;\r\n padding?: number;\r\n disabled?: boolean;\r\n magnetStrength?: number;\r\n activeTransition?: string;\r\n inactiveTransition?: string;\r\n wrapperClassName?: string;\r\n innerClassName?: string;\r\n}\r\n\r\nexport function Magnet({\r\n children,\r\n padding = 100,\r\n disabled = false,\r\n magnetStrength = 8,\r\n activeTransition = \"transform 0.8s ease-out\",\r\n inactiveTransition = \"transform 1.2s ease-in-out\",\r\n wrapperClassName = \"\",\r\n innerClassName = \"\",\r\n ...props\r\n}: MagnetProps & React.HTMLAttributes<HTMLDivElement>) {\r\n const [isActive, setIsActive] = useState(false);\r\n const [position, setPosition] = useState({ x: 0, y: 0 });\r\n const magnetRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (disabled) {\r\n setPosition({ x: 0, y: 0 });\r\n return;\r\n }\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (!magnetRef.current) return;\r\n\r\n const { left, top, width, height } =\r\n magnetRef.current.getBoundingClientRect();\r\n const centerX = left + width / 2;\r\n const centerY = top + height / 2;\r\n\r\n const distX = Math.abs(centerX - e.clientX);\r\n const distY = Math.abs(centerY - e.clientY);\r\n\r\n if (distX < width / 2 + padding && distY < height / 2 + padding) {\r\n setIsActive(true);\r\n\r\n const offsetX = (e.clientX - centerX) / magnetStrength;\r\n const offsetY = (e.clientY - centerY) / magnetStrength;\r\n setPosition({ x: offsetX, y: offsetY });\r\n } else {\r\n setIsActive(false);\r\n setPosition({ x: 0, y: 0 });\r\n }\r\n };\r\n\r\n window.addEventListener(\"mousemove\", handleMouseMove);\r\n return () => {\r\n window.removeEventListener(\"mousemove\", handleMouseMove);\r\n };\r\n }, [padding, disabled, magnetStrength]);\r\n\r\n const transitionStyle = isActive ? activeTransition : inactiveTransition;\r\n\r\n return (\r\n <div\r\n ref={magnetRef}\r\n className={wrapperClassName}\r\n style={{ position: \"relative\", display: \"inline-block\" }}\r\n {...props}\r\n >\r\n <div\r\n className={innerClassName}\r\n style={{\r\n transform: `translate3d(${position.x}px, ${position.y}px, 0)`,\r\n transition: transitionStyle,\r\n willChange: \"transform\",\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Magnet;\r\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {useState,useRef,useEffect}from'react';import {jsx}from'react/jsx-runtime';function A({children:p,padding:t=100,disabled:o=false,magnetStrength:n=8,activeTransition:M="transform 0.8s ease-out",inactiveTransition:g="transform 1.2s ease-in-out",wrapperClassName:y="",innerClassName:x="",...b}){let[h,r]=useState(false),[a,s]=useState({x:0,y:0}),i=useRef(null);useEffect(()=>{if(o){s({x:0,y:0});return}let c=e=>{if(!i.current)return;let{left:E,top:R,width:l,height:f}=i.current.getBoundingClientRect(),u=E+l/2,m=R+f/2,L=Math.abs(u-e.clientX),N=Math.abs(m-e.clientY);if(L<l/2+t&&N<f/2+t){r(true);let T=(e.clientX-u)/n,X=(e.clientY-m)/n;s({x:T,y:X});}else r(false),s({x:0,y:0});};return window.addEventListener("mousemove",c),()=>{window.removeEventListener("mousemove",c);}},[t,o,n]);let w=h?M:g;return jsx("div",{ref:i,className:y,style:{position:"relative",display:"inline-block"},...b,children:jsx("div",{className:x,style:{transform:`translate3d(${a.x}px, ${a.y}px, 0)`,transition:w,willChange:"transform"},children:p})})}var P=A;export{A as Magnet,P as default};//# sourceMappingURL=index.mjs.map
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/magnet/index.tsx"],"names":["Magnet","children","padding","disabled","magnetStrength","activeTransition","inactiveTransition","wrapperClassName","innerClassName","props","isActive","setIsActive","useState","position","setPosition","magnetRef","useRef","useEffect","handleMouseMove","left","top","width","height","centerX","centerY","distX","distY","offsetX","offsetY","transitionStyle","jsx","magnet_default"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\r\n\r\nimport { useState, useEffect, useRef } from \"react\";\r\n\r\ninterface MagnetProps {\r\n children: React.ReactNode;\r\n padding?: number;\r\n disabled?: boolean;\r\n magnetStrength?: number;\r\n activeTransition?: string;\r\n inactiveTransition?: string;\r\n wrapperClassName?: string;\r\n innerClassName?: string;\r\n}\r\n\r\nexport function Magnet({\r\n children,\r\n padding = 100,\r\n disabled = false,\r\n magnetStrength = 8,\r\n activeTransition = \"transform 0.8s ease-out\",\r\n inactiveTransition = \"transform 1.2s ease-in-out\",\r\n wrapperClassName = \"\",\r\n innerClassName = \"\",\r\n ...props\r\n}: MagnetProps & React.HTMLAttributes<HTMLDivElement>) {\r\n const [isActive, setIsActive] = useState(false);\r\n const [position, setPosition] = useState({ x: 0, y: 0 });\r\n const magnetRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (disabled) {\r\n setPosition({ x: 0, y: 0 });\r\n return;\r\n }\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (!magnetRef.current) return;\r\n\r\n const { left, top, width, height } =\r\n magnetRef.current.getBoundingClientRect();\r\n const centerX = left + width / 2;\r\n const centerY = top + height / 2;\r\n\r\n const distX = Math.abs(centerX - e.clientX);\r\n const distY = Math.abs(centerY - e.clientY);\r\n\r\n if (distX < width / 2 + padding && distY < height / 2 + padding) {\r\n setIsActive(true);\r\n\r\n const offsetX = (e.clientX - centerX) / magnetStrength;\r\n const offsetY = (e.clientY - centerY) / magnetStrength;\r\n setPosition({ x: offsetX, y: offsetY });\r\n } else {\r\n setIsActive(false);\r\n setPosition({ x: 0, y: 0 });\r\n }\r\n };\r\n\r\n window.addEventListener(\"mousemove\", handleMouseMove);\r\n return () => {\r\n window.removeEventListener(\"mousemove\", handleMouseMove);\r\n };\r\n }, [padding, disabled, magnetStrength]);\r\n\r\n const transitionStyle = isActive ? activeTransition : inactiveTransition;\r\n\r\n return (\r\n <div\r\n ref={magnetRef}\r\n className={wrapperClassName}\r\n style={{ position: \"relative\", display: \"inline-block\" }}\r\n {...props}\r\n >\r\n <div\r\n className={innerClassName}\r\n style={{\r\n transform: `translate3d(${position.x}px, ${position.y}px, 0)`,\r\n transition: transitionStyle,\r\n willChange: \"transform\",\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Magnet;\r\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function u(...r){return tailwindMerge.twMerge(clsx.clsx(r))}function A({rows:r=9,columns:a=9,containerSize:c="60vmin",lineColor:h="#a1a1aa",lineWidth:y="0.8vmin",lineHeight:v="5vmin",baseAngle:x=0,className:M="",style:b={}}){let l=react.useRef(null);react.useEffect(()=>{let s=l.current;if(!s)return;let t=s.querySelectorAll("span"),m=e=>{t.forEach(n=>{let o=n.getBoundingClientRect(),P=o.x+o.width/2,d=o.y+o.height/2,i=e.x-P,p=e.y-d,R=Math.sqrt(p*p+i*i)||1,E=Math.acos(i/R)*180/Math.PI*(e.y>d?1:-1);n.style.setProperty("--rotate",`${E}deg`);});},g=e=>{m({x:e.clientX,y:e.clientY});};if(window.addEventListener("pointermove",g),t.length){let e=Math.floor(t.length/2),n=t[e].getBoundingClientRect();m({x:n.x,y:n.y});}return ()=>window.removeEventListener("pointermove",g)},[]);let w=r*a,C=Array.from({length:w},(s,t)=>jsxRuntime.jsx("span",{style:{"--rotate":`${x}deg`,backgroundColor:h,width:y,height:v,transform:"rotate(var(--rotate))",transition:"transform 0.3s ease",borderRadius:"9999px"}},t));return jsxRuntime.jsx("div",{ref:l,className:u("place-items-center",M),style:{display:"grid",gridTemplateColumns:`repeat(${a}, 1fr)`,gridTemplateRows:`repeat(${r}, 1fr)`,width:c,height:c,...b},children:C})}var N=A;exports.MagnetLines=A;exports.default=N;//# sourceMappingURL=index.js.map
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/magnet-lines/index.tsx"],"names":["cn","inputs","twMerge","clsx","MagnetLines","rows","columns","containerSize","lineColor","lineWidth","lineHeight","baseAngle","className","style","containerRef","useRef","useEffect","container","items","onPointerMove","pointer","item","rect","centerX","centerY","b","a","c","r","handlePointerMove","middleIndex","total","spans","_","i","jsx","magnet_lines_default"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport { useRef, useEffect } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nexport interface MagnetLinesProps {\r\n rows?: number;\r\n columns?: number;\r\n containerSize?: string;\r\n lineColor?: string;\r\n lineWidth?: string;\r\n lineHeight?: string;\r\n baseAngle?: number;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport function MagnetLines({\r\n rows = 9,\r\n columns = 9,\r\n containerSize = \"60vmin\",\r\n lineColor = \"#a1a1aa\",\r\n lineWidth = \"0.8vmin\",\r\n lineHeight = \"5vmin\",\r\n baseAngle = 0,\r\n className = \"\",\r\n style = {},\r\n}: MagnetLinesProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const items = container.querySelectorAll(\"span\");\r\n\r\n const onPointerMove = (pointer: { x: number; y: number }) => {\r\n items.forEach((item) => {\r\n const rect = item.getBoundingClientRect();\r\n const centerX = rect.x + rect.width / 2;\r\n const centerY = rect.y + rect.height / 2;\r\n\r\n const b = pointer.x - centerX;\r\n const a = pointer.y - centerY;\r\n const c = Math.sqrt(a * a + b * b) || 1;\r\n const r = ((Math.acos(b / c) * 180) / Math.PI) * (pointer.y > centerY ? 1 : -1);\r\n\r\n (item as HTMLElement).style.setProperty(\"--rotate\", `${r}deg`);\r\n });\r\n };\r\n\r\n const handlePointerMove = (e: PointerEvent) => {\r\n onPointerMove({ x: e.clientX, y: e.clientY });\r\n };\r\n\r\n window.addEventListener(\"pointermove\", handlePointerMove);\r\n\r\n if (items.length) {\r\n const middleIndex = Math.floor(items.length / 2);\r\n const rect = items[middleIndex].getBoundingClientRect();\r\n onPointerMove({ x: rect.x, y: rect.y });\r\n }\r\n\r\n return () => window.removeEventListener(\"pointermove\", handlePointerMove);\r\n }, []);\r\n\r\n const total = rows * columns;\r\n const spans = Array.from({ length: total }, (_, i) => (\r\n <span\r\n key={i}\r\n style={{\r\n \"--rotate\": `${baseAngle}deg`,\r\n backgroundColor: lineColor,\r\n width: lineWidth,\r\n height: lineHeight,\r\n transform: \"rotate(var(--rotate))\",\r\n transition: \"transform 0.3s ease\",\r\n borderRadius: \"9999px\",\r\n } as React.CSSProperties}\r\n />\r\n ));\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={cn(\"place-items-center\", className)}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\r\n gridTemplateRows: `repeat(${rows}, 1fr)`,\r\n width: containerSize,\r\n height: containerSize,\r\n ...style,\r\n }}\r\n >\r\n {spans}\r\n </div>\r\n );\r\n}\r\n\r\nexport default MagnetLines;\r\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {useRef,useEffect}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx}from'react/jsx-runtime';function u(...r){return twMerge(clsx(r))}function A({rows:r=9,columns:a=9,containerSize:c="60vmin",lineColor:h="#a1a1aa",lineWidth:y="0.8vmin",lineHeight:v="5vmin",baseAngle:x=0,className:M="",style:b={}}){let l=useRef(null);useEffect(()=>{let s=l.current;if(!s)return;let t=s.querySelectorAll("span"),m=e=>{t.forEach(n=>{let o=n.getBoundingClientRect(),P=o.x+o.width/2,d=o.y+o.height/2,i=e.x-P,p=e.y-d,R=Math.sqrt(p*p+i*i)||1,E=Math.acos(i/R)*180/Math.PI*(e.y>d?1:-1);n.style.setProperty("--rotate",`${E}deg`);});},g=e=>{m({x:e.clientX,y:e.clientY});};if(window.addEventListener("pointermove",g),t.length){let e=Math.floor(t.length/2),n=t[e].getBoundingClientRect();m({x:n.x,y:n.y});}return ()=>window.removeEventListener("pointermove",g)},[]);let w=r*a,C=Array.from({length:w},(s,t)=>jsx("span",{style:{"--rotate":`${x}deg`,backgroundColor:h,width:y,height:v,transform:"rotate(var(--rotate))",transition:"transform 0.3s ease",borderRadius:"9999px"}},t));return jsx("div",{ref:l,className:u("place-items-center",M),style:{display:"grid",gridTemplateColumns:`repeat(${a}, 1fr)`,gridTemplateRows:`repeat(${r}, 1fr)`,width:c,height:c,...b},children:C})}var N=A;export{A as MagnetLines,N as default};//# sourceMappingURL=index.mjs.map
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/magnet-lines/index.tsx"],"names":["cn","inputs","twMerge","clsx","MagnetLines","rows","columns","containerSize","lineColor","lineWidth","lineHeight","baseAngle","className","style","containerRef","useRef","useEffect","container","items","onPointerMove","pointer","item","rect","centerX","centerY","b","a","c","r","handlePointerMove","middleIndex","total","spans","_","i","jsx","magnet_lines_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport { useRef, useEffect } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nexport interface MagnetLinesProps {\r\n rows?: number;\r\n columns?: number;\r\n containerSize?: string;\r\n lineColor?: string;\r\n lineWidth?: string;\r\n lineHeight?: string;\r\n baseAngle?: number;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport function MagnetLines({\r\n rows = 9,\r\n columns = 9,\r\n containerSize = \"60vmin\",\r\n lineColor = \"#a1a1aa\",\r\n lineWidth = \"0.8vmin\",\r\n lineHeight = \"5vmin\",\r\n baseAngle = 0,\r\n className = \"\",\r\n style = {},\r\n}: MagnetLinesProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const items = container.querySelectorAll(\"span\");\r\n\r\n const onPointerMove = (pointer: { x: number; y: number }) => {\r\n items.forEach((item) => {\r\n const rect = item.getBoundingClientRect();\r\n const centerX = rect.x + rect.width / 2;\r\n const centerY = rect.y + rect.height / 2;\r\n\r\n const b = pointer.x - centerX;\r\n const a = pointer.y - centerY;\r\n const c = Math.sqrt(a * a + b * b) || 1;\r\n const r = ((Math.acos(b / c) * 180) / Math.PI) * (pointer.y > centerY ? 1 : -1);\r\n\r\n (item as HTMLElement).style.setProperty(\"--rotate\", `${r}deg`);\r\n });\r\n };\r\n\r\n const handlePointerMove = (e: PointerEvent) => {\r\n onPointerMove({ x: e.clientX, y: e.clientY });\r\n };\r\n\r\n window.addEventListener(\"pointermove\", handlePointerMove);\r\n\r\n if (items.length) {\r\n const middleIndex = Math.floor(items.length / 2);\r\n const rect = items[middleIndex].getBoundingClientRect();\r\n onPointerMove({ x: rect.x, y: rect.y });\r\n }\r\n\r\n return () => window.removeEventListener(\"pointermove\", handlePointerMove);\r\n }, []);\r\n\r\n const total = rows * columns;\r\n const spans = Array.from({ length: total }, (_, i) => (\r\n <span\r\n key={i}\r\n style={{\r\n \"--rotate\": `${baseAngle}deg`,\r\n backgroundColor: lineColor,\r\n width: lineWidth,\r\n height: lineHeight,\r\n transform: \"rotate(var(--rotate))\",\r\n transition: \"transform 0.3s ease\",\r\n borderRadius: \"9999px\",\r\n } as React.CSSProperties}\r\n />\r\n ));\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={cn(\"place-items-center\", className)}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\r\n gridTemplateRows: `repeat(${rows}, 1fr)`,\r\n width: containerSize,\r\n height: containerSize,\r\n ...style,\r\n }}\r\n >\r\n {spans}\r\n </div>\r\n );\r\n}\r\n\r\nexport default MagnetLines;\r\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),jsxRuntime=require('react/jsx-runtime');var p=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),P=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(a,o,d)=>d?d.toUpperCase():o.toLowerCase()),n=e=>{let a=P(e);return a.charAt(0).toUpperCase()+a.slice(1)},c=(...e)=>e.filter((a,o,d)=>!!a&&a.trim()!==""&&d.indexOf(a)===o).join(" ").trim(),m=e=>{for(let a in e)if(a.startsWith("aria-")||a==="role"||a==="title")return true};var L={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var x=react.forwardRef(({color:e="currentColor",size:a=24,strokeWidth:o=2,absoluteStrokeWidth:d,className:f="",children:l,iconNode:u,...s},S)=>react.createElement("svg",{ref:S,...L,width:a,height:a,stroke:e,strokeWidth:d?Number(o)*24/Number(a):o,className:c("lucide",f),...!l&&!m(s)&&{"aria-hidden":"true"},...s},[...u.map(([g,h])=>react.createElement(g,h)),...Array.isArray(l)?l:[l]]));var C=(e,a)=>{let o=react.forwardRef(({className:d,...f},l)=>react.createElement(x,{ref:l,iconNode:a,className:c(`lucide-${p(n(e))}`,`lucide-${e}`,d),...f}));return o.displayName=n(e),o};var B=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],i=C("check",B);function M({title:e="Choose your perfect plan",description:a="Modern pricing plans designed for teams of all sizes.",plans:o=[{name:"Basic",price:{monthly:15,annually:10},description:"Perfect for startups",features:["1 Project","Email Support","Core Features","Basic Analytics"]},{name:"Pro",price:{monthly:35,annually:25},description:"Best for teams",features:["Unlimited Projects","Priority Support","Team Collaboration","Advanced Analytics"],featured:true},{name:"Enterprise",price:"custom",description:"Tailored solutions",features:["Everything in Pro","Dedicated Manager","Custom Integrations","SLA & Support"],buttonText:"Contact Sales"}],className:d=""}){let[f,l]=react.useState(true);return jsxRuntime.jsx("section",{className:`py-16 md:py-32 ${d}`,children:jsxRuntime.jsxs("div",{className:"mx-auto max-w-5xl px-6",children:[jsxRuntime.jsxs("div",{className:"mx-auto max-w-2xl text-center",children:[jsxRuntime.jsx("h2",{className:"text-3xl font-bold md:text-4xl lg:text-5xl",children:e}),jsxRuntime.jsx("p",{className:"text-muted-foreground mx-auto mt-4 max-w-xl text-lg",children:a}),jsxRuntime.jsx("div",{className:"my-12",children:jsxRuntime.jsxs("div",{className:"relative mx-auto grid w-fit grid-cols-2 rounded-full border p-1",children:[jsxRuntime.jsx("div",{className:`pointer-events-none absolute inset-1 w-1/2 rounded-full bg-primary transition-transform duration-500 ${f?"translate-x-full":"translate-x-0"}`}),jsxRuntime.jsx("button",{onClick:()=>l(false),className:`relative h-8 w-24 rounded-full text-sm ${f?"":"text-primary-foreground font-medium"}`,children:"Monthly"}),jsxRuntime.jsx("button",{onClick:()=>l(true),className:`relative h-8 w-24 rounded-full text-sm ${f?"text-primary-foreground font-medium":""}`,children:"Annually"})]})})]}),jsxRuntime.jsx("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-3",children:o.map(u=>jsxRuntime.jsxs("div",{className:`relative flex flex-col rounded-2xl border p-8 ${u.featured?"border-2 border-primary":""}`,children:[u.featured&&jsxRuntime.jsx("div",{className:"absolute top-0 right-0 bg-primary text-primary-foreground rounded-full px-2 py-1 text-xs font-bold m-4",children:"Most Popular"}),jsxRuntime.jsx("h3",{className:"mb-4 text-2xl font-bold",children:u.name}),jsxRuntime.jsxs("div",{className:"mb-6",children:[jsxRuntime.jsx("span",{className:"text-3xl font-semibold",children:u.price==="custom"?"Custom":`${f?u.price.annually:u.price.monthly}\u20AC`}),jsxRuntime.jsx("span",{className:"text-muted-foreground mx-2",children:"\u2022"}),jsxRuntime.jsx("span",{className:"text-muted-foreground",children:u.description})]}),jsxRuntime.jsx("button",{className:"bg-primary text-primary-foreground hover:bg-primary/90 mb-6 h-10 w-full rounded-md px-4 py-2 text-sm font-medium",children:u.buttonText||"Get Started"}),jsxRuntime.jsx("ul",{className:"space-y-3",children:u.features.map(s=>jsxRuntime.jsxs("li",{className:"flex items-center gap-3 text-sm",children:[jsxRuntime.jsx("div",{className:"flex h-4 w-4 items-center justify-center rounded-full bg-primary",children:jsxRuntime.jsx(i,{className:"h-2 w-2 text-primary-foreground"})}),s]},s))})]},u.name))})]})})}var N=M;/*! Bundled license information:
|
|
2
|
+
|
|
3
|
+
lucide-react/dist/esm/shared/src/utils.js:
|
|
4
|
+
lucide-react/dist/esm/defaultAttributes.js:
|
|
5
|
+
lucide-react/dist/esm/Icon.js:
|
|
6
|
+
lucide-react/dist/esm/createLucideIcon.js:
|
|
7
|
+
lucide-react/dist/esm/icons/check.js:
|
|
8
|
+
lucide-react/dist/esm/lucide-react.js:
|
|
9
|
+
(**
|
|
10
|
+
* @license lucide-react v0.545.0 - ISC
|
|
11
|
+
*
|
|
12
|
+
* This source code is licensed under the ISC license.
|
|
13
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
14
|
+
*)
|
|
15
|
+
*/exports.PricingModern=M;exports.default=N;//# sourceMappingURL=index.js.map
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/shared/src/utils.ts","../../../../node_modules/lucide-react/src/defaultAttributes.ts","../../../../node_modules/lucide-react/src/Icon.ts","../../../../node_modules/lucide-react/src/createLucideIcon.ts","../../../../node_modules/lucide-react/src/icons/check.ts","../../src/pricing-modern/index.tsx"],"names":["toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","props","prop","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Check","PricingModern","title","description","plans","isAnnual","setIsAnnual","useState","jsx","jsxs","plan","feature","pricing_modern_default"],"mappings":"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","file":"index.js","sourcesContent":["import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]];\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon('check', __iconNode);\n\nexport default Check;\n","\"use client\";\r\n\r\nimport { useState } from \"react\";\r\nimport { Check } from \"lucide-react\";\r\n\r\ninterface PricingPlan {\r\n name: string;\r\n price: { monthly: number; annually: number } | \"custom\";\r\n description: string;\r\n features: string[];\r\n featured?: boolean;\r\n buttonText?: string;\r\n}\r\n\r\ninterface PricingModernProps {\r\n title?: string;\r\n description?: string;\r\n plans?: PricingPlan[];\r\n className?: string;\r\n}\r\n\r\nexport function PricingModern({\r\n title = \"Choose your perfect plan\",\r\n description = \"Modern pricing plans designed for teams of all sizes.\",\r\n plans = [\r\n {\r\n name: \"Basic\",\r\n price: { monthly: 15, annually: 10 },\r\n description: \"Perfect for startups\",\r\n features: [\"1 Project\", \"Email Support\", \"Core Features\", \"Basic Analytics\"],\r\n },\r\n {\r\n name: \"Pro\",\r\n price: { monthly: 35, annually: 25 },\r\n description: \"Best for teams\",\r\n features: [\"Unlimited Projects\", \"Priority Support\", \"Team Collaboration\", \"Advanced Analytics\"],\r\n featured: true,\r\n },\r\n {\r\n name: \"Enterprise\",\r\n price: \"custom\",\r\n description: \"Tailored solutions\",\r\n features: [\"Everything in Pro\", \"Dedicated Manager\", \"Custom Integrations\", \"SLA & Support\"],\r\n buttonText: \"Contact Sales\",\r\n },\r\n ],\r\n className = \"\",\r\n}: PricingModernProps) {\r\n const [isAnnual, setIsAnnual] = useState(true);\r\n\r\n return (\r\n <section className={`py-16 md:py-32 ${className}`}>\r\n <div className=\"mx-auto max-w-5xl px-6\">\r\n <div className=\"mx-auto max-w-2xl text-center\">\r\n <h2 className=\"text-3xl font-bold md:text-4xl lg:text-5xl\">{title}</h2>\r\n <p className=\"text-muted-foreground mx-auto mt-4 max-w-xl text-lg\">{description}</p>\r\n\r\n <div className=\"my-12\">\r\n <div className=\"relative mx-auto grid w-fit grid-cols-2 rounded-full border p-1\">\r\n <div\r\n className={`pointer-events-none absolute inset-1 w-1/2 rounded-full bg-primary transition-transform duration-500 ${\r\n isAnnual ? \"translate-x-full\" : \"translate-x-0\"\r\n }`}\r\n />\r\n <button\r\n onClick={() => setIsAnnual(false)}\r\n className={`relative h-8 w-24 rounded-full text-sm ${!isAnnual ? \"text-primary-foreground font-medium\" : \"\"}`}\r\n >\r\n Monthly\r\n </button>\r\n <button\r\n onClick={() => setIsAnnual(true)}\r\n className={`relative h-8 w-24 rounded-full text-sm ${isAnnual ? \"text-primary-foreground font-medium\" : \"\"}`}\r\n >\r\n Annually\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-3\">\r\n {plans.map((plan) => (\r\n <div\r\n key={plan.name}\r\n className={`relative flex flex-col rounded-2xl border p-8 ${\r\n plan.featured ? \"border-2 border-primary\" : \"\"\r\n }`}\r\n >\r\n {plan.featured && (\r\n <div className=\"absolute top-0 right-0 bg-primary text-primary-foreground rounded-full px-2 py-1 text-xs font-bold m-4\">\r\n Most Popular\r\n </div>\r\n )}\r\n\r\n <h3 className=\"mb-4 text-2xl font-bold\">{plan.name}</h3>\r\n\r\n <div className=\"mb-6\">\r\n <span className=\"text-3xl font-semibold\">\r\n {plan.price === \"custom\"\r\n ? \"Custom\"\r\n : `${isAnnual ? plan.price.annually : plan.price.monthly}€`}\r\n </span>\r\n <span className=\"text-muted-foreground mx-2\">•</span>\r\n <span className=\"text-muted-foreground\">{plan.description}</span>\r\n </div>\r\n\r\n <button className=\"bg-primary text-primary-foreground hover:bg-primary/90 mb-6 h-10 w-full rounded-md px-4 py-2 text-sm font-medium\">\r\n {plan.buttonText || \"Get Started\"}\r\n </button>\r\n\r\n <ul className=\"space-y-3\">\r\n {plan.features.map((feature) => (\r\n <li key={feature} className=\"flex items-center gap-3 text-sm\">\r\n <div className=\"flex h-4 w-4 items-center justify-center rounded-full bg-primary\">\r\n <Check className=\"h-2 w-2 text-primary-foreground\" />\r\n </div>\r\n {feature}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </section>\r\n );\r\n}\r\n\r\nexport default PricingModern;\r\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {forwardRef,createElement,useState}from'react';import {jsx,jsxs}from'react/jsx-runtime';var p=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),P=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(a,o,d)=>d?d.toUpperCase():o.toLowerCase()),n=e=>{let a=P(e);return a.charAt(0).toUpperCase()+a.slice(1)},c=(...e)=>e.filter((a,o,d)=>!!a&&a.trim()!==""&&d.indexOf(a)===o).join(" ").trim(),m=e=>{for(let a in e)if(a.startsWith("aria-")||a==="role"||a==="title")return true};var L={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var x=forwardRef(({color:e="currentColor",size:a=24,strokeWidth:o=2,absoluteStrokeWidth:d,className:f="",children:l,iconNode:u,...s},S)=>createElement("svg",{ref:S,...L,width:a,height:a,stroke:e,strokeWidth:d?Number(o)*24/Number(a):o,className:c("lucide",f),...!l&&!m(s)&&{"aria-hidden":"true"},...s},[...u.map(([g,h])=>createElement(g,h)),...Array.isArray(l)?l:[l]]));var C=(e,a)=>{let o=forwardRef(({className:d,...f},l)=>createElement(x,{ref:l,iconNode:a,className:c(`lucide-${p(n(e))}`,`lucide-${e}`,d),...f}));return o.displayName=n(e),o};var B=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],i=C("check",B);function M({title:e="Choose your perfect plan",description:a="Modern pricing plans designed for teams of all sizes.",plans:o=[{name:"Basic",price:{monthly:15,annually:10},description:"Perfect for startups",features:["1 Project","Email Support","Core Features","Basic Analytics"]},{name:"Pro",price:{monthly:35,annually:25},description:"Best for teams",features:["Unlimited Projects","Priority Support","Team Collaboration","Advanced Analytics"],featured:true},{name:"Enterprise",price:"custom",description:"Tailored solutions",features:["Everything in Pro","Dedicated Manager","Custom Integrations","SLA & Support"],buttonText:"Contact Sales"}],className:d=""}){let[f,l]=useState(true);return jsx("section",{className:`py-16 md:py-32 ${d}`,children:jsxs("div",{className:"mx-auto max-w-5xl px-6",children:[jsxs("div",{className:"mx-auto max-w-2xl text-center",children:[jsx("h2",{className:"text-3xl font-bold md:text-4xl lg:text-5xl",children:e}),jsx("p",{className:"text-muted-foreground mx-auto mt-4 max-w-xl text-lg",children:a}),jsx("div",{className:"my-12",children:jsxs("div",{className:"relative mx-auto grid w-fit grid-cols-2 rounded-full border p-1",children:[jsx("div",{className:`pointer-events-none absolute inset-1 w-1/2 rounded-full bg-primary transition-transform duration-500 ${f?"translate-x-full":"translate-x-0"}`}),jsx("button",{onClick:()=>l(false),className:`relative h-8 w-24 rounded-full text-sm ${f?"":"text-primary-foreground font-medium"}`,children:"Monthly"}),jsx("button",{onClick:()=>l(true),className:`relative h-8 w-24 rounded-full text-sm ${f?"text-primary-foreground font-medium":""}`,children:"Annually"})]})})]}),jsx("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-3",children:o.map(u=>jsxs("div",{className:`relative flex flex-col rounded-2xl border p-8 ${u.featured?"border-2 border-primary":""}`,children:[u.featured&&jsx("div",{className:"absolute top-0 right-0 bg-primary text-primary-foreground rounded-full px-2 py-1 text-xs font-bold m-4",children:"Most Popular"}),jsx("h3",{className:"mb-4 text-2xl font-bold",children:u.name}),jsxs("div",{className:"mb-6",children:[jsx("span",{className:"text-3xl font-semibold",children:u.price==="custom"?"Custom":`${f?u.price.annually:u.price.monthly}\u20AC`}),jsx("span",{className:"text-muted-foreground mx-2",children:"\u2022"}),jsx("span",{className:"text-muted-foreground",children:u.description})]}),jsx("button",{className:"bg-primary text-primary-foreground hover:bg-primary/90 mb-6 h-10 w-full rounded-md px-4 py-2 text-sm font-medium",children:u.buttonText||"Get Started"}),jsx("ul",{className:"space-y-3",children:u.features.map(s=>jsxs("li",{className:"flex items-center gap-3 text-sm",children:[jsx("div",{className:"flex h-4 w-4 items-center justify-center rounded-full bg-primary",children:jsx(i,{className:"h-2 w-2 text-primary-foreground"})}),s]},s))})]},u.name))})]})})}var N=M;/*! Bundled license information:
|
|
2
|
+
|
|
3
|
+
lucide-react/dist/esm/shared/src/utils.js:
|
|
4
|
+
lucide-react/dist/esm/defaultAttributes.js:
|
|
5
|
+
lucide-react/dist/esm/Icon.js:
|
|
6
|
+
lucide-react/dist/esm/createLucideIcon.js:
|
|
7
|
+
lucide-react/dist/esm/icons/check.js:
|
|
8
|
+
lucide-react/dist/esm/lucide-react.js:
|
|
9
|
+
(**
|
|
10
|
+
* @license lucide-react v0.545.0 - ISC
|
|
11
|
+
*
|
|
12
|
+
* This source code is licensed under the ISC license.
|
|
13
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
14
|
+
*)
|
|
15
|
+
*/export{M as PricingModern,N as default};//# sourceMappingURL=index.mjs.map
|
|
16
|
+
//# sourceMappingURL=index.mjs.map
|