UNPKG

@sikka/hawa

Version:

Modern UI Kit made with Tailwind

1 lines • 11.5 kB
{"version":3,"sources":["../../layout/navbar/Navbar.tsx","../../util/index.ts","../../elements/collapsible/Collapsible.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { cn } from \"@util/index\";\n\nimport {\n CollapsibleTrigger,\n CollapsibleContent,\n Collapsible,\n} from \"@elements/collapsible\";\n\ntype NavigationMenuItem = {\n label: string;\n action: () => void;\n trigger?: any;\n};\n\ntype NavbarType = {\n logo?: any;\n buttons?: any;\n menuItems?: NavigationMenuItem[];\n handleLogoClick?: () => void;\n backgroundColor?: string;\n};\n\nexport const Navbar: React.FC<NavbarType> = ({\n backgroundColor,\n logo,\n handleLogoClick,\n ...props\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n return (\n <nav className=\"hawa-sticky hawa-top-2 hawa-transition-all\">\n <Collapsible\n className={\"hawa-relative hawa-m-2 hawa-rounded hawa-p-2\"}\n style={{ backgroundColor: backgroundColor || \"#1f2937\" }}\n >\n <div className=\"hawa-flex hawa-items-center hawa-justify-between hawa-px-3\">\n <div className=\"hawa-flex hawa-items-center\">\n <div\n className=\"hawa-p-1.5 hawa-text-xl hawa-font-bold hawa-text-white\"\n onClick={() => {\n if (handleLogoClick) {\n handleLogoClick();\n }\n }}\n >\n {logo}\n </div>\n </div>\n\n <div className=\"hawa-hidden md:hawa-flex\">\n {props.menuItems?.map((item, i) => (\n <div\n key={i}\n onClick={item.action}\n className=\"hawa-cursor-pointer hawa-rounded hawa-p-1.5 hawa-px-2 hawa-text-center hawa-text-sm hawa-text-white hawa-transition-all hover:hawa-bg-gray-300 hover:hawa-text-black\"\n >\n {item.label}\n </div>\n ))}\n </div>\n <div className=\"hawa-m-0 hawa-flex hawa-h-fit hawa-p-0 md:hawa-hidden\">\n <CollapsibleTrigger\n onClick={() => setIsOpen(!isOpen)}\n className=\"hawa-h-full hawa-text-white selection:hawa-p-0\"\n aria-label=\"Toggle menu\"\n >\n <svg\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 className={cn(\n \"hawa-fixed hawa-h-6 hawa-w-6\",\n isOpen ? \"hawa-invisible\" : \"hawa-visible\",\n )}\n >\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\n </svg>\n\n <svg\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 className={cn(\n \"hawa-h-6 hawa-w-6\",\n !isOpen ? \"hawa-invisible\" : \"hawa-visible\",\n )}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </CollapsibleTrigger>\n </div>\n </div>\n\n <CollapsibleContent\n className={cn(\n \"data-[state=closed]:hawa-opacity-0\",\n \"data-[state=open]:hawa-animate-in\",\n \"data-[state=open]:hawa-fade-in-90\",\n \"hawa-absolute hawa-left-0 hawa-top-[60px] hawa-flex hawa-flex-col hawa-rounded hawa-border hawa-bg-gray-200 hawa-p-1 hawa-transition-all\",\n // \"hawa-transition-all hawa-bg-gray-400 hawa-fixed hawa-left-0 hawa-top-[72px] hawa-w-full hawa-flex hawa-flex-col\"\n )}\n style={{\n width: \"calc(100%)\",\n zIndex: -100,\n }}\n >\n {props.menuItems?.map((item, i) => (\n <div\n key={i}\n onClick={item.action}\n className=\"hawa-cursor-pointer hawa-rounded hawa-p-2 hawa-px-10 hawa-text-center hawa-text-black hawa-transition-all hover:hawa-bg-gray-300\"\n >\n {item.label}\n </div>\n ))}\n </CollapsibleContent>\n </Collapsible>\n </nav>\n );\n};\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\ntype Palette = {\n name: string;\n colors: {\n [key: number]: string;\n };\n};\ntype Rgb = {\n r: number;\n g: number;\n b: number;\n};\nfunction hexToRgb(hex: string): Rgb | null {\n const sanitizedHex = hex.replaceAll(\"##\", \"#\");\n const colorParts = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(\n sanitizedHex\n );\n\n if (!colorParts) {\n return null;\n }\n\n const [, r, g, b] = colorParts;\n\n return {\n r: parseInt(r, 16),\n g: parseInt(g, 16),\n b: parseInt(b, 16)\n } as Rgb;\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n const toHex = (c: number) => `0${c.toString(16)}`.slice(-2);\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nexport function getTextColor(color: string): \"#FFF\" | \"#333\" {\n const rgbColor = hexToRgb(color);\n\n if (!rgbColor) {\n return \"#333\";\n }\n\n const { r, g, b } = rgbColor;\n const luma = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n\n return luma < 120 ? \"#FFF\" : \"#333\";\n}\n\nfunction lighten(hex: string, intensity: number): string {\n const color = hexToRgb(`#${hex}`);\n\n if (!color) {\n return \"\";\n }\n\n const r = Math.round(color.r + (255 - color.r) * intensity);\n const g = Math.round(color.g + (255 - color.g) * intensity);\n const b = Math.round(color.b + (255 - color.b) * intensity);\n\n return rgbToHex(r, g, b);\n}\n\nfunction darken(hex: string, intensity: number): string {\n const color = hexToRgb(hex);\n\n if (!color) {\n return \"\";\n }\n\n const r = Math.round(color.r * intensity);\n const g = Math.round(color.g * intensity);\n const b = Math.round(color.b * intensity);\n\n return rgbToHex(r, g, b);\n}\nconst parseColor = (color: any) => {\n if (color.startsWith(\"#\")) {\n // Convert hex to RGB\n let r = parseInt(color.slice(1, 3), 16);\n let g = parseInt(color.slice(3, 5), 16);\n let b = parseInt(color.slice(5, 7), 16);\n return [r, g, b];\n } else if (color.startsWith(\"rgb\")) {\n // Extract RGB values from rgb() format\n return color.match(/\\d+/g).map(Number);\n }\n // Default to white if format is unrecognized\n return [255, 255, 255];\n};\nexport const calculateLuminance = (color: any) => {\n const [r, g, b] = parseColor(color)?.map((c: any) => {\n c /= 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nfunction getPallette(baseColor: string): Palette {\n const name = baseColor;\n\n const response: Palette = {\n name,\n colors: {\n 500: `#${baseColor}`.replace(\"##\", \"#\")\n }\n };\n\n const intensityMap: {\n [key: number]: number;\n } = {\n 50: 0.95,\n 100: 0.9,\n 200: 0.75,\n 300: 0.6,\n 400: 0.3,\n 600: 0.9,\n 700: 0.75,\n 800: 0.6,\n 900: 0.49\n };\n\n [50, 100, 200, 300, 400].forEach((level) => {\n response.colors[level] = lighten(baseColor, intensityMap[level]);\n });\n [600, 700, 800, 900].forEach((level) => {\n response.colors[level] = darken(baseColor, intensityMap[level]);\n });\n\n return response as Palette;\n}\n\nexport { getPallette };\n\n// const hexToRgb = (hex) => {\n// let d = hex?.split(\"#\")[1];\n// var aRgbHex = d?.match(/.{1,2}/g);\n// var aRgb = [\n// parseInt(aRgbHex[0], 16),\n// parseInt(aRgbHex[1], 16),\n// parseInt(aRgbHex[2], 16)\n// ];\n// return aRgb;\n// };\n// const getTextColor = (backColor) => {\n// let rgbArray = hexToRgb(backColor);\n// if (rgbArray[0] * 0.299 + rgbArray[1] * 0.587 + rgbArray[2] * 0.114 > 186) {\n// return \"#000000\";\n// } else {\n// return \"#ffffff\";\n// }\n// };\n// const replaceAt = function (string, index, replacement) {\n// // if (replacement == \"\" || replacement == \" \") {\n// // return (\n// // string.substring(0, index) +\n// // string.substring(index + replacement.length )\n// // );\n// // }\n// const replaced = string.substring(0, index) + replacement + string.substring(index + 1)\n// return replaced\n// };\n\n// export { hexToRgb, getTextColor, replaceAt };\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\nconst Collapsible = CollapsiblePrimitive.Root;\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"],"mappings":";;;AAAA,OAAO,SAAS,gBAAgB;;;ACAhC,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACLA,YAAY,0BAA0B;AAEtC,IAAM,cAAmC;AAEzC,IAAMA,sBAA0C;AAEhD,IAAMC,sBAA0C;;;AFkBzC,IAAM,SAA+B,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AA7BN;AA8BE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,SACE,oCAAC,SAAI,WAAU,gDACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,OAAO,EAAE,iBAAiB,mBAAmB,UAAU;AAAA;AAAA,IAEvD,oCAAC,SAAI,WAAU,gEACb,oCAAC,SAAI,WAAU,iCACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM;AACb,cAAI,iBAAiB;AACnB,4BAAgB;AAAA,UAClB;AAAA,QACF;AAAA;AAAA,MAEC;AAAA,IACH,CACF,GAEA,oCAAC,SAAI,WAAU,+BACZ,WAAM,cAAN,mBAAiB,IAAI,CAAC,MAAM,MAC3B;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,SAAS,KAAK;AAAA,QACd,WAAU;AAAA;AAAA,MAET,KAAK;AAAA,IACR,EAEJ,GACA,oCAAC,SAAI,WAAU,2DACb;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SAAS,MAAM,UAAU,CAAC,MAAM;AAAA,QAChC,WAAU;AAAA,QACV,cAAW;AAAA;AAAA,MAEX;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAM;AAAA,UACN,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,WAAW;AAAA,YACT;AAAA,YACA,SAAS,mBAAmB;AAAA,UAC9B;AAAA;AAAA,QAEA,oCAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,QACrC,oCAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,QACnC,oCAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,MACvC;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAM;AAAA,UACN,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,WAAW;AAAA,YACT;AAAA,YACA,CAAC,SAAS,mBAAmB;AAAA,UAC/B;AAAA;AAAA,QAEA,oCAAC,UAAK,GAAE,cAAa;AAAA,QACrB,oCAAC,UAAK,GAAE,cAAa;AAAA,MACvB;AAAA,IACF,CACF,CACF;AAAA,IAEA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QAEF;AAAA,QACA,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA;AAAA,OAEC,WAAM,cAAN,mBAAiB,IAAI,CAAC,MAAM,MAC3B;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,SAAS,KAAK;AAAA,UACd,WAAU;AAAA;AAAA,QAET,KAAK;AAAA,MACR;AAAA,IAEJ;AAAA,EACF,CACF;AAEJ;","names":["CollapsibleTrigger","CollapsibleContent","CollapsibleTrigger","CollapsibleContent"]}