@mdigital_ui/ui 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +258 -662
- package/dist/anchor/index.js +4 -0
- package/dist/anchor/index.js.map +1 -0
- package/dist/autocomplete/index.js +6 -0
- package/dist/autocomplete/index.js.map +1 -0
- package/dist/breadcrumbs/index.js +3 -3
- package/dist/calendar/index.js +4 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/chunk-3Z7RLVWD.js +258 -0
- package/dist/chunk-3Z7RLVWD.js.map +1 -0
- package/dist/chunk-5YEC6FDN.js +263 -0
- package/dist/chunk-5YEC6FDN.js.map +1 -0
- package/dist/{chunk-GOBUFGGJ.js → chunk-6NXZWLSM.js} +3 -3
- package/dist/{chunk-GOBUFGGJ.js.map → chunk-6NXZWLSM.js.map} +1 -1
- package/dist/{chunk-FU5Q4WVX.js → chunk-6ROGWFQ2.js} +3 -3
- package/dist/{chunk-FU5Q4WVX.js.map → chunk-6ROGWFQ2.js.map} +1 -1
- package/dist/{chunk-LJOQ2C5W.js → chunk-6RZEJRTC.js} +3 -3
- package/dist/{chunk-LJOQ2C5W.js.map → chunk-6RZEJRTC.js.map} +1 -1
- package/dist/chunk-74AF6PO2.js +374 -0
- package/dist/chunk-74AF6PO2.js.map +1 -0
- package/dist/chunk-75N6T3IS.js +77 -0
- package/dist/chunk-75N6T3IS.js.map +1 -0
- package/dist/{chunk-BKLJDEUX.js → chunk-DBPLQZJ2.js} +38 -14
- package/dist/chunk-DBPLQZJ2.js.map +1 -0
- package/dist/chunk-ED4CQZ72.js +343 -0
- package/dist/chunk-ED4CQZ72.js.map +1 -0
- package/dist/{chunk-4ZXHLPRS.js → chunk-FY2TZ2NT.js} +4 -4
- package/dist/{chunk-4ZXHLPRS.js.map → chunk-FY2TZ2NT.js.map} +1 -1
- package/dist/{chunk-I5AD247M.js → chunk-HKQOAEFY.js} +13 -3
- package/dist/chunk-HKQOAEFY.js.map +1 -0
- package/dist/chunk-JWYBDNC6.js +307 -0
- package/dist/chunk-JWYBDNC6.js.map +1 -0
- package/dist/{chunk-W5VLFE4U.js → chunk-LHZJ2GJU.js} +32 -6
- package/dist/chunk-LHZJ2GJU.js.map +1 -0
- package/dist/{chunk-253JZOYG.js → chunk-NB66D6A5.js} +3 -2
- package/dist/chunk-NB66D6A5.js.map +1 -0
- package/dist/{chunk-BGMYX7L5.js → chunk-NF6JUJBE.js} +9 -7
- package/dist/chunk-NF6JUJBE.js.map +1 -0
- package/dist/chunk-NPK4ESMA.js +281 -0
- package/dist/chunk-NPK4ESMA.js.map +1 -0
- package/dist/{chunk-X7MF3TIF.js → chunk-PD3O6ZH4.js} +12 -5
- package/dist/chunk-PD3O6ZH4.js.map +1 -0
- package/dist/{chunk-XOEEAMMY.js → chunk-Q46WXJVW.js} +21 -21
- package/dist/chunk-Q46WXJVW.js.map +1 -0
- package/dist/chunk-QEYNOLRC.js +157 -0
- package/dist/chunk-QEYNOLRC.js.map +1 -0
- package/dist/chunk-RNG7HR6U.js +174 -0
- package/dist/chunk-RNG7HR6U.js.map +1 -0
- package/dist/{chunk-HJITFPBT.js → chunk-SZMIHNCZ.js} +13 -7
- package/dist/chunk-SZMIHNCZ.js.map +1 -0
- package/dist/chunk-TDPJYCNI.js +96 -0
- package/dist/chunk-TDPJYCNI.js.map +1 -0
- package/dist/chunk-UFYG3HKL.js +374 -0
- package/dist/chunk-UFYG3HKL.js.map +1 -0
- package/dist/chunk-VNH6R5EU.js +211 -0
- package/dist/chunk-VNH6R5EU.js.map +1 -0
- package/dist/{chunk-SFP77VS3.js → chunk-X7JN7WPF.js} +5 -2
- package/dist/chunk-X7JN7WPF.js.map +1 -0
- package/dist/chunk-YRSHBAUQ.js +201 -0
- package/dist/chunk-YRSHBAUQ.js.map +1 -0
- package/dist/chunk-YUACN5GJ.js +303 -0
- package/dist/chunk-YUACN5GJ.js.map +1 -0
- package/dist/{chunk-HVHQA34X.js → chunk-ZNGKUG2N.js} +11 -6
- package/dist/chunk-ZNGKUG2N.js.map +1 -0
- package/dist/color-picker/index.js +6 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/date-picker/RangePicker.d.ts.map +1 -1
- package/dist/date-picker/index.d.ts.map +1 -1
- package/dist/date-picker/index.js +1 -1
- package/dist/date-picker/shared.d.ts +5 -0
- package/dist/date-picker/shared.d.ts.map +1 -1
- package/dist/dropdown/index.js +2 -2
- package/dist/float-button/index.js +5 -0
- package/dist/float-button/index.js.map +1 -0
- package/dist/index.js +51 -2996
- package/dist/index.js.map +1 -1
- package/dist/input/index.d.ts.map +1 -1
- package/dist/input/index.js +1 -1
- package/dist/input-password/index.js +2 -2
- package/dist/mentions/index.js +4 -0
- package/dist/mentions/index.js.map +1 -0
- package/dist/menubar/index.d.ts +3 -3
- package/dist/menubar/index.d.ts.map +1 -1
- package/dist/menubar/index.js +1 -1
- package/dist/multi-select/index.d.ts.map +1 -1
- package/dist/multi-select/index.js +3 -3
- package/dist/number-input/index.d.ts.map +1 -1
- package/dist/number-input/index.js +1 -1
- package/dist/qr-code/index.js +5 -0
- package/dist/qr-code/index.js.map +1 -0
- package/dist/resizable/index.js +4 -0
- package/dist/resizable/index.js.map +1 -0
- package/dist/result/index.js +4 -0
- package/dist/result/index.js.map +1 -0
- package/dist/select/index.d.ts.map +1 -1
- package/dist/select/index.js +3 -3
- package/dist/shared/useSelectBase.d.ts.map +1 -1
- package/dist/skeleton/index.d.ts.map +1 -1
- package/dist/skeleton/index.js +1 -1
- package/dist/table/index.js +4 -4
- package/dist/tabs/index.d.ts.map +1 -1
- package/dist/tabs/index.js +1 -1
- package/dist/tags-input/index.js +5 -0
- package/dist/tags-input/index.js.map +1 -0
- package/dist/toast/index.d.ts.map +1 -1
- package/dist/toast/index.js +1 -1
- package/dist/tooltip/index.d.ts.map +1 -1
- package/dist/tooltip/index.js +1 -1
- package/dist/tour/index.js +5 -0
- package/dist/tour/index.js.map +1 -0
- package/dist/typography/index.js +4 -0
- package/dist/typography/index.js.map +1 -0
- package/dist/watermark/index.js +4 -0
- package/dist/watermark/index.js.map +1 -0
- package/package.json +59 -11
- package/styles/global.css +498 -6016
- package/dist/chunk-253JZOYG.js.map +0 -1
- package/dist/chunk-BGMYX7L5.js.map +0 -1
- package/dist/chunk-BKLJDEUX.js.map +0 -1
- package/dist/chunk-BS4PZPY6.js +0 -322
- package/dist/chunk-BS4PZPY6.js.map +0 -1
- package/dist/chunk-HJITFPBT.js.map +0 -1
- package/dist/chunk-HVHQA34X.js.map +0 -1
- package/dist/chunk-I5AD247M.js.map +0 -1
- package/dist/chunk-SFP77VS3.js.map +0 -1
- package/dist/chunk-W5VLFE4U.js.map +0 -1
- package/dist/chunk-X7MF3TIF.js.map +0 -1
- package/dist/chunk-XOEEAMMY.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dropdown/index.tsx"],"names":[],"mappings":"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","file":"chunk-GOBUFGGJ.js","sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport React, {\n useCallback,\n useRef,\n useId,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\n\nimport { useRipple, RippleContainer } from \"../hooks/useRipple\";\nimport { useMenuNavigation } from \"../hooks/useMenuNavigation\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { cn } from \"../utils\";\nimport { colorVars } from \"../variants\";\nimport type { DropdownProps } from \"./types\";\n\nconst dropdownItemVariants = cva(\n \"cursor-pointer select-none text-text-primary transition-colors flex items-center gap-2 rounded-sm outline-none\",\n {\n variants: {\n size: {\n xs: \"px-2 py-1 text-xs\",\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-5 py-2.5 text-lg\",\n },\n disabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"md\",\n disabled: false,\n },\n },\n);\n\nconst DropdownItemDiv: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n children: React.ReactNode;\n disabled?: boolean;\n ref?: React.Ref<HTMLDivElement>;\n}> = ({\n children,\n disabled,\n className,\n onKeyDown: externalOnKeyDown,\n ref,\n ...props\n}) => {\n const {\n ripples,\n onPointerDown,\n onKeyDown: rippleOnKeyDown,\n onAnimationEnd,\n } = useRipple(!disabled);\n return (\n <div\n ref={ref}\n className={cn(className, \"relative overflow-hidden\")}\n onPointerDown={onPointerDown}\n onKeyDown={(e) => {\n rippleOnKeyDown(e);\n externalOnKeyDown?.(e);\n }}\n {...props}\n >\n {children}\n <RippleContainer ripples={ripples} onAnimationEnd={onAnimationEnd} />\n </div>\n );\n};\n\nconst Dropdown = React.memo<DropdownProps>(\n ({\n children,\n items,\n render,\n color = \"default\",\n size = \"md\",\n position = \"left\",\n maxHeight = 300,\n disabled = false,\n fullWidth = false,\n hover = false,\n className,\n classNames,\n onItemClick,\n ref,\n }) => {\n const [isOpen, setIsOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n const uniqueId = useId();\n const menuId = `dropdown-menu-${uniqueId}`;\n const triggerId = `dropdown-trigger-${uniqueId}`;\n\n const enabledIndices = useMemo(\n () =>\n items\n ?.map((item, i) => (!item.disabled ? i : -1))\n .filter((i) => i !== -1) || [],\n [items],\n );\n\n const handleItemClick = useCallback(\n (item: NonNullable<typeof items>[0]) => {\n if (!item.disabled) {\n item.onClick?.();\n if (item.value !== undefined) {\n onItemClick?.(item.value);\n }\n setIsOpen(false);\n }\n },\n [onItemClick],\n );\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const handleOpen = useCallback(() => {\n if (!disabled) {\n setIsOpen(true);\n }\n }, [disabled]);\n\n const handleToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => !prev);\n }\n }, [disabled]);\n\n const onMenuSelect = useCallback(\n (index: number) => {\n if (items?.[index]) handleItemClick(items[index]);\n },\n [items, handleItemClick],\n );\n\n const {\n highlightedIndex,\n setHighlightedIndex,\n handleKeyDown,\n } = useMenuNavigation({\n enabledIndices,\n isOpen,\n onClose: handleClose,\n onSelect: onMenuSelect,\n onOpen: handleOpen,\n });\n\n // Scroll highlighted item into view\n useEffect(() => {\n if (highlightedIndex >= 0 && itemRefs.current[highlightedIndex]) {\n itemRefs.current[highlightedIndex]?.scrollIntoView({\n block: \"nearest\",\n });\n }\n }, [highlightedIndex]);\n\n const wrappedKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled || !items?.length) return;\n handleKeyDown(e);\n },\n [disabled, items, handleKeyDown],\n );\n\n return (\n <div\n ref={ref}\n data-slot=\"dropdown\"\n className={cn(\n \"dropdown_root relative\",\n fullWidth ? \"w-full\" : \"inline-block\",\n className,\n classNames?.root,\n )}\n onMouseEnter={hover ? handleOpen : undefined}\n onMouseLeave={hover ? handleClose : undefined}\n >\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <div\n id={triggerId}\n data-slot=\"dropdown-trigger\"\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? menuId : undefined}\n aria-disabled={disabled}\n onClick={hover ? undefined : handleToggle}\n onKeyDown={wrappedKeyDown}\n className={cn(\n \"dropdown_trigger flex outline-none\",\n !hover && \"cursor-pointer\",\n fullWidth && \"w-full\",\n disabled && \"opacity-50 cursor-not-allowed\",\n classNames?.trigger,\n )}\n >\n {children}\n </div>\n </PopoverTrigger>\n\n <PopoverContent\n className=\"p-0 min-w-[140px]\"\n align={position === \"left\" ? \"start\" : \"end\"}\n sideOffset={4}\n color={color}\n style={{ maxHeight }}\n onOpenAutoFocus={(e: Event) => e.preventDefault()}\n >\n <div\n ref={menuRef}\n id={menuId}\n data-slot=\"dropdown-menu\"\n role=\"menu\"\n aria-labelledby={triggerId}\n className={cn(\"dropdown_menu overflow-auto\", colorVars[color], classNames?.menu)}\n style={{ maxHeight }}\n onKeyDown={wrappedKeyDown}\n >\n {render\n ? render({ close: handleClose })\n : items?.map((item, idx) => (\n <DropdownItemDiv\n key={`${item.value}-${idx}`}\n ref={(el: HTMLDivElement | null) => {\n itemRefs.current[idx] = el;\n }}\n data-slot=\"dropdown-item\"\n role=\"menuitem\"\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n disabled={!!item.disabled}\n className={cn(\n \"dropdown_item\",\n dropdownItemVariants({\n size,\n disabled: !!item.disabled,\n }),\n !item.disabled && 'hover:bg-slot-10 hover:text-slot focus-visible:bg-slot-10 focus-visible:text-slot',\n highlightedIndex === idx &&\n !item.disabled &&\n 'bg-slot-10 text-slot',\n classNames?.item,\n )}\n onClick={() => handleItemClick(item)}\n onMouseEnter={() => !item.disabled && setHighlightedIndex(idx)}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleItemClick(item);\n }\n }}\n >\n {item.icon && (\n <span\n data-slot=\"dropdown-item-icon\"\n className={cn(\n \"dropdown_itemIcon shrink-0\",\n classNames?.itemIcon,\n )}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n )}\n <span\n data-slot=\"dropdown-item-label\"\n className={cn(\n \"dropdown_itemLabel flex-1\",\n classNames?.itemLabel,\n )}\n >\n {item.label}\n </span>\n </DropdownItemDiv>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n },\n);\n\nDropdown.displayName = \"Dropdown\";\n\nexport type * from \"./types\";\nexport default Dropdown;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dropdown/index.tsx"],"names":[],"mappings":";;;;;;;;;AAmBA,IAAM,oBAAA,GAAuB,GAAA;AAAA,EAC3B,gHAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,mBAAA;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,+BAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,IAAA;AAAA,MACN,QAAA,EAAU;AAAA;AACZ;AAEJ,CAAA;AAEA,IAAM,kBAID,CAAC;AAAA,EACJ,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,EAAW,iBAAA;AAAA,EACX,GAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA,EAAW,eAAA;AAAA,IACX;AAAA,GACF,GAAI,SAAA,CAAU,CAAC,QAAQ,CAAA;AACvB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,0BAA0B,CAAA;AAAA,MACnD,aAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,eAAA,CAAgB,CAAC,CAAA;AACjB,QAAA,iBAAA,GAAoB,CAAC,CAAA;AAAA,MACvB,CAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,GAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAkB,cAAA,EAAgC;AAAA;AAAA;AAAA,GACrE;AAEJ,CAAA;AAEA,IAAM,WAAW,KAAA,CAAM,IAAA;AAAA,EACrB,CAAC;AAAA,IACC,QAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,GAAQ,SAAA;AAAA,IACR,IAAA,GAAO,IAAA;AAAA,IACP,QAAA,GAAW,MAAA;AAAA,IACX,SAAA,GAAY,GAAA;AAAA,IACZ,QAAA,GAAW,KAAA;AAAA,IACX,SAAA,GAAY,KAAA;AAAA,IACZ,KAAA,GAAQ,KAAA;AAAA,IACR,SAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF,KAAM;AACJ,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAA,CAAkC,EAAE,CAAA;AAErD,IAAA,MAAM,WAAW,KAAA,EAAM;AACvB,IAAA,MAAM,MAAA,GAAS,iBAAiB,QAAQ,CAAA,CAAA;AACxC,IAAA,MAAM,SAAA,GAAY,oBAAoB,QAAQ,CAAA,CAAA;AAE9C,IAAA,MAAM,cAAA,GAAiB,OAAA;AAAA,MACrB,MACE,KAAA,EACI,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAO,CAAC,IAAA,CAAK,QAAA,GAAW,CAAA,GAAI,EAAG,EAC3C,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,EAAE,KAAK,EAAC;AAAA,MACjC,CAAC,KAAK;AAAA,KACR;AAEA,IAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,MACtB,CAAC,IAAA,KAAuC;AACtC,QAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,UAAA,IAAA,CAAK,OAAA,IAAU;AACf,UAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,YAAA,WAAA,GAAc,KAAK,KAAK,CAAA;AAAA,UAC1B;AACA,UAAA,SAAA,CAAU,KAAK,CAAA;AAAA,QACjB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,UAAA,GAAa,YAAY,MAAM;AACnC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,IAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,IAAA,MAAM,YAAA,GAAe,WAAA;AAAA,MACnB,CAAC,KAAA,KAAkB;AACjB,QAAA,IAAI,QAAQ,KAAK,CAAA,EAAG,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MAClD,CAAA;AAAA,MACA,CAAC,OAAO,eAAe;AAAA,KACzB;AAEA,IAAA,MAAM;AAAA,MACJ,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,QACE,iBAAA,CAAkB;AAAA,MACpB,cAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAU,YAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACT,CAAA;AAGD,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,gBAAA,IAAoB,CAAA,IAAK,QAAA,CAAS,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC/D,QAAA,QAAA,CAAS,OAAA,CAAQ,gBAAgB,CAAA,EAAG,cAAA,CAAe;AAAA,UACjD,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,IAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,MACrB,CAAC,CAAA,KAA2B;AAC1B,QAAA,IAAI,QAAA,IAAY,CAAC,KAAA,EAAO,MAAA,EAAQ;AAChC,QAAA,aAAA,CAAc,CAAC,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,QAAA,EAAU,KAAA,EAAO,aAAa;AAAA,KACjC;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,UAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,wBAAA;AAAA,UACA,YAAY,QAAA,GAAW,cAAA;AAAA,UACvB,SAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACd;AAAA,QACA,YAAA,EAAc,QAAQ,UAAA,GAAa,MAAA;AAAA,QACnC,YAAA,EAAc,QAAQ,WAAA,GAAc,MAAA;AAAA,QAEpC,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,cAAc,SAAA,EACnC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,SAAA;AAAA,cACJ,WAAA,EAAU,kBAAA;AAAA,cACV,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,cAC1B,eAAA,EAAc,MAAA;AAAA,cACd,eAAA,EAAe,MAAA;AAAA,cACf,eAAA,EAAe,SAAS,MAAA,GAAS,MAAA;AAAA,cACjC,eAAA,EAAe,QAAA;AAAA,cACf,OAAA,EAAS,QAAQ,MAAA,GAAY,YAAA;AAAA,cAC7B,SAAA,EAAW,cAAA;AAAA,cACX,SAAA,EAAW,EAAA;AAAA,gBACT,oCAAA;AAAA,gBACA,CAAC,KAAA,IAAS,gBAAA;AAAA,gBACV,SAAA,IAAa,QAAA;AAAA,gBACb,QAAA,IAAY,+BAAA;AAAA,gBACZ,UAAA,EAAY;AAAA,eACd;AAAA,cAEC;AAAA;AAAA,WACH,EACF,CAAA;AAAA,0BAEA,GAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO,QAAA,KAAa,MAAA,GAAS,OAAA,GAAU,KAAA;AAAA,cACvC,UAAA,EAAY,CAAA;AAAA,cACZ,KAAA;AAAA,cACA,KAAA,EAAO,EAAE,SAAA,EAAU;AAAA,cACnB,eAAA,EAAiB,CAAC,CAAA,KAAa,CAAA,CAAE,cAAA,EAAe;AAAA,cAEhD,QAAA,kBAAA,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,OAAA;AAAA,kBACL,EAAA,EAAI,MAAA;AAAA,kBACJ,WAAA,EAAU,eAAA;AAAA,kBACV,IAAA,EAAK,MAAA;AAAA,kBACL,iBAAA,EAAiB,SAAA;AAAA,kBACjB,WAAW,EAAA,CAAG,6BAAA,EAA+B,UAAU,KAAK,CAAA,EAAG,YAAY,IAAI,CAAA;AAAA,kBAC/E,KAAA,EAAO,EAAE,SAAA,EAAU;AAAA,kBACnB,SAAA,EAAW,cAAA;AAAA,kBAEV,QAAA,EAAA,MAAA,GACG,MAAA,CAAO,EAAE,KAAA,EAAO,WAAA,EAAa,CAAA,GAC7B,KAAA,EAAO,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,qBAChB,IAAA;AAAA,oBAAC,eAAA;AAAA,oBAAA;AAAA,sBAEC,GAAA,EAAK,CAAC,EAAA,KAA8B;AAClC,wBAAA,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,GAAI,EAAA;AAAA,sBAC1B,CAAA;AAAA,sBACA,WAAA,EAAU,eAAA;AAAA,sBACV,IAAA,EAAK,UAAA;AAAA,sBACL,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,EAAA,GAAK,CAAA;AAAA,sBAC/B,iBAAe,IAAA,CAAK,QAAA;AAAA,sBACpB,QAAA,EAAU,CAAC,CAAC,IAAA,CAAK,QAAA;AAAA,sBACjB,SAAA,EAAW,EAAA;AAAA,wBACT,eAAA;AAAA,wBACA,oBAAA,CAAqB;AAAA,0BACnB,IAAA;AAAA,0BACA,QAAA,EAAU,CAAC,CAAC,IAAA,CAAK;AAAA,yBAClB,CAAA;AAAA,wBACD,CAAC,KAAK,QAAA,IAAY,mFAAA;AAAA,wBAClB,gBAAA,KAAqB,GAAA,IACnB,CAAC,IAAA,CAAK,QAAA,IACN,sBAAA;AAAA,wBACF,UAAA,EAAY;AAAA,uBACd;AAAA,sBACA,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,sBACnC,cAAc,MAAM,CAAC,IAAA,CAAK,QAAA,IAAY,oBAAoB,GAAG,CAAA;AAAA,sBAC7D,SAAA,EAAW,CAAC,CAAA,KAA2C;AACrD,wBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,0BAAA,CAAA,CAAE,cAAA,EAAe;AACjB,0BAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,wBACtB;AAAA,sBACF,CAAA;AAAA,sBAEC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAK,IAAA,oBACJ,GAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,WAAA,EAAU,oBAAA;AAAA,4BACV,SAAA,EAAW,EAAA;AAAA,8BACT,4BAAA;AAAA,8BACA,UAAA,EAAY;AAAA,6BACd;AAAA,4BACA,aAAA,EAAY,MAAA;AAAA,4BAEX,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,yBACR;AAAA,wCAEF,GAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,WAAA,EAAU,qBAAA;AAAA,4BACV,SAAA,EAAW,EAAA;AAAA,8BACT,2BAAA;AAAA,8BACA,UAAA,EAAY;AAAA,6BACd;AAAA,4BAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR;AAAA,qBAAA;AAAA,oBAlDK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,mBAoD5B;AAAA;AAAA;AACP;AAAA;AACF,SAAA,EACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;AAGvB,IAAO,gBAAA,GAAQ","file":"chunk-6NXZWLSM.js","sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport React, {\n useCallback,\n useRef,\n useId,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\n\nimport { useRipple, RippleContainer } from \"../hooks/useRipple\";\nimport { useMenuNavigation } from \"../hooks/useMenuNavigation\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { cn } from \"../utils\";\nimport { colorVars } from \"../variants\";\nimport type { DropdownProps } from \"./types\";\n\nconst dropdownItemVariants = cva(\n \"cursor-pointer select-none text-text-primary transition-colors flex items-center gap-2 rounded-sm outline-none\",\n {\n variants: {\n size: {\n xs: \"px-2 py-1 text-xs\",\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-5 py-2.5 text-lg\",\n },\n disabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"md\",\n disabled: false,\n },\n },\n);\n\nconst DropdownItemDiv: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n children: React.ReactNode;\n disabled?: boolean;\n ref?: React.Ref<HTMLDivElement>;\n}> = ({\n children,\n disabled,\n className,\n onKeyDown: externalOnKeyDown,\n ref,\n ...props\n}) => {\n const {\n ripples,\n onPointerDown,\n onKeyDown: rippleOnKeyDown,\n onAnimationEnd,\n } = useRipple(!disabled);\n return (\n <div\n ref={ref}\n className={cn(className, \"relative overflow-hidden\")}\n onPointerDown={onPointerDown}\n onKeyDown={(e) => {\n rippleOnKeyDown(e);\n externalOnKeyDown?.(e);\n }}\n {...props}\n >\n {children}\n <RippleContainer ripples={ripples} onAnimationEnd={onAnimationEnd} />\n </div>\n );\n};\n\nconst Dropdown = React.memo<DropdownProps>(\n ({\n children,\n items,\n render,\n color = \"default\",\n size = \"md\",\n position = \"left\",\n maxHeight = 300,\n disabled = false,\n fullWidth = false,\n hover = false,\n className,\n classNames,\n onItemClick,\n ref,\n }) => {\n const [isOpen, setIsOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n const uniqueId = useId();\n const menuId = `dropdown-menu-${uniqueId}`;\n const triggerId = `dropdown-trigger-${uniqueId}`;\n\n const enabledIndices = useMemo(\n () =>\n items\n ?.map((item, i) => (!item.disabled ? i : -1))\n .filter((i) => i !== -1) || [],\n [items],\n );\n\n const handleItemClick = useCallback(\n (item: NonNullable<typeof items>[0]) => {\n if (!item.disabled) {\n item.onClick?.();\n if (item.value !== undefined) {\n onItemClick?.(item.value);\n }\n setIsOpen(false);\n }\n },\n [onItemClick],\n );\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const handleOpen = useCallback(() => {\n if (!disabled) {\n setIsOpen(true);\n }\n }, [disabled]);\n\n const handleToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => !prev);\n }\n }, [disabled]);\n\n const onMenuSelect = useCallback(\n (index: number) => {\n if (items?.[index]) handleItemClick(items[index]);\n },\n [items, handleItemClick],\n );\n\n const {\n highlightedIndex,\n setHighlightedIndex,\n handleKeyDown,\n } = useMenuNavigation({\n enabledIndices,\n isOpen,\n onClose: handleClose,\n onSelect: onMenuSelect,\n onOpen: handleOpen,\n });\n\n // Scroll highlighted item into view\n useEffect(() => {\n if (highlightedIndex >= 0 && itemRefs.current[highlightedIndex]) {\n itemRefs.current[highlightedIndex]?.scrollIntoView({\n block: \"nearest\",\n });\n }\n }, [highlightedIndex]);\n\n const wrappedKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled || !items?.length) return;\n handleKeyDown(e);\n },\n [disabled, items, handleKeyDown],\n );\n\n return (\n <div\n ref={ref}\n data-slot=\"dropdown\"\n className={cn(\n \"dropdown_root relative\",\n fullWidth ? \"w-full\" : \"inline-block\",\n className,\n classNames?.root,\n )}\n onMouseEnter={hover ? handleOpen : undefined}\n onMouseLeave={hover ? handleClose : undefined}\n >\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <div\n id={triggerId}\n data-slot=\"dropdown-trigger\"\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? menuId : undefined}\n aria-disabled={disabled}\n onClick={hover ? undefined : handleToggle}\n onKeyDown={wrappedKeyDown}\n className={cn(\n \"dropdown_trigger flex outline-none\",\n !hover && \"cursor-pointer\",\n fullWidth && \"w-full\",\n disabled && \"opacity-50 cursor-not-allowed\",\n classNames?.trigger,\n )}\n >\n {children}\n </div>\n </PopoverTrigger>\n\n <PopoverContent\n className=\"p-0 min-w-[140px]\"\n align={position === \"left\" ? \"start\" : \"end\"}\n sideOffset={4}\n color={color}\n style={{ maxHeight }}\n onOpenAutoFocus={(e: Event) => e.preventDefault()}\n >\n <div\n ref={menuRef}\n id={menuId}\n data-slot=\"dropdown-menu\"\n role=\"menu\"\n aria-labelledby={triggerId}\n className={cn(\"dropdown_menu overflow-auto\", colorVars[color], classNames?.menu)}\n style={{ maxHeight }}\n onKeyDown={wrappedKeyDown}\n >\n {render\n ? render({ close: handleClose })\n : items?.map((item, idx) => (\n <DropdownItemDiv\n key={`${item.value}-${idx}`}\n ref={(el: HTMLDivElement | null) => {\n itemRefs.current[idx] = el;\n }}\n data-slot=\"dropdown-item\"\n role=\"menuitem\"\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n disabled={!!item.disabled}\n className={cn(\n \"dropdown_item\",\n dropdownItemVariants({\n size,\n disabled: !!item.disabled,\n }),\n !item.disabled && 'hover:bg-slot-10 hover:text-slot focus-visible:bg-slot-10 focus-visible:text-slot',\n highlightedIndex === idx &&\n !item.disabled &&\n 'bg-slot-10 text-slot',\n classNames?.item,\n )}\n onClick={() => handleItemClick(item)}\n onMouseEnter={() => !item.disabled && setHighlightedIndex(idx)}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleItemClick(item);\n }\n }}\n >\n {item.icon && (\n <span\n data-slot=\"dropdown-item-icon\"\n className={cn(\n \"dropdown_itemIcon shrink-0\",\n classNames?.itemIcon,\n )}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n )}\n <span\n data-slot=\"dropdown-item-label\"\n className={cn(\n \"dropdown_itemLabel flex-1\",\n classNames?.itemLabel,\n )}\n >\n {item.label}\n </span>\n </DropdownItemDiv>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n },\n);\n\nDropdown.displayName = \"Dropdown\";\n\nexport type * from \"./types\";\nexport default Dropdown;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { dropdown_default } from './chunk-
|
|
1
|
+
import { dropdown_default } from './chunk-6NXZWLSM.js';
|
|
2
2
|
import { colorVars } from './chunk-G6QIIWKU.js';
|
|
3
3
|
import { cn, iconSizes } from './chunk-RAS6HUEI.js';
|
|
4
4
|
import { cva } from 'class-variance-authority';
|
|
@@ -278,5 +278,5 @@ BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
|
|
|
278
278
|
var breadcrumbs_default = Breadcrumb;
|
|
279
279
|
|
|
280
280
|
export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, breadcrumbs_default };
|
|
281
|
-
//# sourceMappingURL=chunk-
|
|
282
|
-
//# sourceMappingURL=chunk-
|
|
281
|
+
//# sourceMappingURL=chunk-6ROGWFQ2.js.map
|
|
282
|
+
//# sourceMappingURL=chunk-6ROGWFQ2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/breadcrumbs/index.tsx"],"names":[],"mappings":"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","file":"chunk-FU5Q4WVX.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { ChevronRight, MoreHorizontal, MoreVertical } from 'lucide-react'\n\nimport Dropdown from '../dropdown'\nimport { cn, iconSizes } from '../utils'\nimport { colorVars } from '../variants'\nimport type {\n BreadcrumbEllipsisProps,\n BreadcrumbItemProps,\n BreadcrumbLinkProps,\n BreadcrumbListProps,\n BreadcrumbPageProps,\n BreadcrumbProps,\n BreadcrumbsColor,\n BreadcrumbSeparatorProps,\n BreadcrumbsSize,\n} from './types'\n\nexport type { BreadcrumbItemData } from './types'\n\ninterface BreadcrumbContextValue {\n color?: BreadcrumbsColor\n size?: BreadcrumbsSize\n classNames?: {\n list?: string\n item?: string\n link?: string\n separator?: string\n current?: string\n }\n}\n\nconst BreadcrumbContext = React.createContext<BreadcrumbContextValue>({})\n\nconst breadcrumbVariants = cva('', {\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nconst Breadcrumb = React.memo<BreadcrumbProps>(\n ({\n children,\n items,\n color = 'default',\n size = 'md',\n separator,\n className,\n classNames,\n }) => {\n const content = items?.length ? (\n <BreadcrumbList>\n {items.map((item, index) => {\n const isLast = index === items.length - 1\n return (\n <React.Fragment key={index}>\n <BreadcrumbItem>\n {item.ellipsis ? (\n <BreadcrumbEllipsis\n orientation={item.ellipsisOrientation || 'horizontal'}\n items={item.ellipsisItems || []}\n size={size}\n />\n ) : isLast ? (\n <BreadcrumbPage\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbPage>\n ) : (\n <BreadcrumbLink\n href={item.href || ''}\n onClick={item.onClick}\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && (\n <BreadcrumbSeparator size={size}>\n {separator}\n </BreadcrumbSeparator>\n )}\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n ) : (\n children\n )\n\n return (\n <BreadcrumbContext.Provider value={{ color, size, classNames }}>\n <nav\n data-slot=\"root\"\n aria-label=\"breadcrumb\"\n className={cn(\n 'breadcrumbs_root',\n breadcrumbVariants({ size }),\n colorVars[color],\n 'text-slot',\n classNames?.root,\n className,\n )}\n >\n {content}\n </nav>\n </BreadcrumbContext.Provider>\n )\n },\n)\n\nBreadcrumb.displayName = 'Breadcrumb'\n\nexport const BreadcrumbList = React.memo<BreadcrumbListProps>(\n ({ children, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <ol\n className={cn(\n 'breadcrumbs_list',\n 'flex items-center gap-1.5',\n classNames?.list,\n className,\n )}\n >\n {children}\n </ol>\n )\n },\n)\n\nBreadcrumbList.displayName = 'BreadcrumbList'\n\nexport const BreadcrumbItem = React.memo<BreadcrumbItemProps>(\n ({ children, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <li\n className={cn(\n 'breadcrumbs_item',\n 'inline-flex items-center gap-1.5',\n classNames?.item,\n className,\n )}\n >\n {children}\n </li>\n )\n },\n)\n\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\nexport const BreadcrumbLink = React.memo<BreadcrumbLinkProps>(\n ({ children, href, onClick, leftIcon, rightIcon, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault()\n onClick()\n }\n }\n\n const content = (\n <>\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </>\n )\n\n const linkClasses = cn(\n 'breadcrumbs_link',\n 'inline-flex items-center gap-1.5 transition-colors hover:underline cursor-pointer',\n classNames?.link,\n className,\n )\n\n if (href) {\n return (\n <a\n href={href}\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </button>\n )\n }\n\n return (\n <span\n className={cn(\n 'breadcrumbs_link',\n 'inline-flex items-center gap-1.5',\n classNames?.link,\n className,\n )}\n >\n {content}\n </span>\n )\n },\n)\n\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\nexport const BreadcrumbPage = React.memo<BreadcrumbPageProps>(\n ({ children, leftIcon, rightIcon, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <span\n aria-current=\"page\"\n className={cn(\n 'breadcrumbs_current',\n 'inline-flex items-center gap-1.5 font-medium',\n classNames?.current,\n className,\n )}\n >\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </span>\n )\n },\n)\n\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\nexport const BreadcrumbSeparator = React.memo<BreadcrumbSeparatorProps>(\n ({ children, className, size = 'md' }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'breadcrumbs_separator',\n 'text-text-secondary',\n classNames?.separator,\n className,\n )}\n >\n {children ?? <ChevronRight className={iconSizes[size]} />}\n </span>\n )\n },\n)\n\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\n/**\n * Validates URL to prevent open redirect vulnerabilities\n * Only allows relative URLs or same-origin URLs\n */\nconst isValidNavigationUrl = (href: string): boolean => {\n // Allow relative URLs starting with / or #\n if (href.startsWith('/') || href.startsWith('#') || href.startsWith('?')) {\n return true\n }\n\n // Block javascript: and other dangerous protocols\n const dangerousProtocols = ['javascript:', 'data:', 'vbscript:']\n const lowerHref = href.toLowerCase()\n if (dangerousProtocols.some(protocol => lowerHref.startsWith(protocol))) {\n return false\n }\n\n // For absolute URLs, verify same origin\n if (typeof window !== 'undefined') {\n try {\n const url = new URL(href, window.location.origin)\n return url.origin === window.location.origin\n } catch {\n // If URL parsing fails, allow it (likely a relative URL)\n return true\n }\n }\n\n // SSR fallback - allow relative-looking URLs\n return true\n}\n\nexport const BreadcrumbEllipsis = React.memo<BreadcrumbEllipsisProps>(\n ({ orientation = 'horizontal', items, children, className, size = 'md' }) => {\n const Icon = orientation === 'horizontal' ? MoreHorizontal : MoreVertical\n const isInteractive = !!(items?.length || children)\n\n const ellipsisButton = (\n <span\n {...(isInteractive && {\n role: 'button',\n 'aria-label': 'Show more breadcrumbs',\n tabIndex: 0,\n })}\n {...(!isInteractive && {\n 'aria-hidden': true,\n })}\n className={cn(\n 'flex items-center justify-center',\n isInteractive && 'cursor-pointer',\n className,\n )}\n >\n <Icon className={iconSizes[size]} />\n <span className=\"sr-only\">More</span>\n </span>\n )\n\n // If items or children are provided, wrap in Dropdown\n if (items || children) {\n const dropdownItems = (items || []).map((item) => ({\n label: item.label || '',\n value: item.label || '',\n onClick:\n item.onClick ||\n (() => {\n // Validate URL before navigation to prevent open redirect\n if (item.href && isValidNavigationUrl(item.href)) {\n window.location.href = item.href\n }\n }),\n }))\n\n return <Dropdown items={dropdownItems}>{ellipsisButton}</Dropdown>\n }\n\n return ellipsisButton\n },\n)\n\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis'\n\nexport type * from './types'\nexport default Breadcrumb\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/breadcrumbs/index.tsx"],"names":[],"mappings":"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","file":"chunk-6ROGWFQ2.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { ChevronRight, MoreHorizontal, MoreVertical } from 'lucide-react'\n\nimport Dropdown from '../dropdown'\nimport { cn, iconSizes } from '../utils'\nimport { colorVars } from '../variants'\nimport type {\n BreadcrumbEllipsisProps,\n BreadcrumbItemProps,\n BreadcrumbLinkProps,\n BreadcrumbListProps,\n BreadcrumbPageProps,\n BreadcrumbProps,\n BreadcrumbsColor,\n BreadcrumbSeparatorProps,\n BreadcrumbsSize,\n} from './types'\n\nexport type { BreadcrumbItemData } from './types'\n\ninterface BreadcrumbContextValue {\n color?: BreadcrumbsColor\n size?: BreadcrumbsSize\n classNames?: {\n list?: string\n item?: string\n link?: string\n separator?: string\n current?: string\n }\n}\n\nconst BreadcrumbContext = React.createContext<BreadcrumbContextValue>({})\n\nconst breadcrumbVariants = cva('', {\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nconst Breadcrumb = React.memo<BreadcrumbProps>(\n ({\n children,\n items,\n color = 'default',\n size = 'md',\n separator,\n className,\n classNames,\n }) => {\n const content = items?.length ? (\n <BreadcrumbList>\n {items.map((item, index) => {\n const isLast = index === items.length - 1\n return (\n <React.Fragment key={index}>\n <BreadcrumbItem>\n {item.ellipsis ? (\n <BreadcrumbEllipsis\n orientation={item.ellipsisOrientation || 'horizontal'}\n items={item.ellipsisItems || []}\n size={size}\n />\n ) : isLast ? (\n <BreadcrumbPage\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbPage>\n ) : (\n <BreadcrumbLink\n href={item.href || ''}\n onClick={item.onClick}\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && (\n <BreadcrumbSeparator size={size}>\n {separator}\n </BreadcrumbSeparator>\n )}\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n ) : (\n children\n )\n\n return (\n <BreadcrumbContext.Provider value={{ color, size, classNames }}>\n <nav\n data-slot=\"root\"\n aria-label=\"breadcrumb\"\n className={cn(\n 'breadcrumbs_root',\n breadcrumbVariants({ size }),\n colorVars[color],\n 'text-slot',\n classNames?.root,\n className,\n )}\n >\n {content}\n </nav>\n </BreadcrumbContext.Provider>\n )\n },\n)\n\nBreadcrumb.displayName = 'Breadcrumb'\n\nexport const BreadcrumbList = React.memo<BreadcrumbListProps>(\n ({ children, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <ol\n className={cn(\n 'breadcrumbs_list',\n 'flex items-center gap-1.5',\n classNames?.list,\n className,\n )}\n >\n {children}\n </ol>\n )\n },\n)\n\nBreadcrumbList.displayName = 'BreadcrumbList'\n\nexport const BreadcrumbItem = React.memo<BreadcrumbItemProps>(\n ({ children, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <li\n className={cn(\n 'breadcrumbs_item',\n 'inline-flex items-center gap-1.5',\n classNames?.item,\n className,\n )}\n >\n {children}\n </li>\n )\n },\n)\n\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\nexport const BreadcrumbLink = React.memo<BreadcrumbLinkProps>(\n ({ children, href, onClick, leftIcon, rightIcon, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault()\n onClick()\n }\n }\n\n const content = (\n <>\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </>\n )\n\n const linkClasses = cn(\n 'breadcrumbs_link',\n 'inline-flex items-center gap-1.5 transition-colors hover:underline cursor-pointer',\n classNames?.link,\n className,\n )\n\n if (href) {\n return (\n <a\n href={href}\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </button>\n )\n }\n\n return (\n <span\n className={cn(\n 'breadcrumbs_link',\n 'inline-flex items-center gap-1.5',\n classNames?.link,\n className,\n )}\n >\n {content}\n </span>\n )\n },\n)\n\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\nexport const BreadcrumbPage = React.memo<BreadcrumbPageProps>(\n ({ children, leftIcon, rightIcon, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <span\n aria-current=\"page\"\n className={cn(\n 'breadcrumbs_current',\n 'inline-flex items-center gap-1.5 font-medium',\n classNames?.current,\n className,\n )}\n >\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </span>\n )\n },\n)\n\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\nexport const BreadcrumbSeparator = React.memo<BreadcrumbSeparatorProps>(\n ({ children, className, size = 'md' }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'breadcrumbs_separator',\n 'text-text-secondary',\n classNames?.separator,\n className,\n )}\n >\n {children ?? <ChevronRight className={iconSizes[size]} />}\n </span>\n )\n },\n)\n\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\n/**\n * Validates URL to prevent open redirect vulnerabilities\n * Only allows relative URLs or same-origin URLs\n */\nconst isValidNavigationUrl = (href: string): boolean => {\n // Allow relative URLs starting with / or #\n if (href.startsWith('/') || href.startsWith('#') || href.startsWith('?')) {\n return true\n }\n\n // Block javascript: and other dangerous protocols\n const dangerousProtocols = ['javascript:', 'data:', 'vbscript:']\n const lowerHref = href.toLowerCase()\n if (dangerousProtocols.some(protocol => lowerHref.startsWith(protocol))) {\n return false\n }\n\n // For absolute URLs, verify same origin\n if (typeof window !== 'undefined') {\n try {\n const url = new URL(href, window.location.origin)\n return url.origin === window.location.origin\n } catch {\n // If URL parsing fails, allow it (likely a relative URL)\n return true\n }\n }\n\n // SSR fallback - allow relative-looking URLs\n return true\n}\n\nexport const BreadcrumbEllipsis = React.memo<BreadcrumbEllipsisProps>(\n ({ orientation = 'horizontal', items, children, className, size = 'md' }) => {\n const Icon = orientation === 'horizontal' ? MoreHorizontal : MoreVertical\n const isInteractive = !!(items?.length || children)\n\n const ellipsisButton = (\n <span\n {...(isInteractive && {\n role: 'button',\n 'aria-label': 'Show more breadcrumbs',\n tabIndex: 0,\n })}\n {...(!isInteractive && {\n 'aria-hidden': true,\n })}\n className={cn(\n 'flex items-center justify-center',\n isInteractive && 'cursor-pointer',\n className,\n )}\n >\n <Icon className={iconSizes[size]} />\n <span className=\"sr-only\">More</span>\n </span>\n )\n\n // If items or children are provided, wrap in Dropdown\n if (items || children) {\n const dropdownItems = (items || []).map((item) => ({\n label: item.label || '',\n value: item.label || '',\n onClick:\n item.onClick ||\n (() => {\n // Validate URL before navigation to prevent open redirect\n if (item.href && isValidNavigationUrl(item.href)) {\n window.location.href = item.href\n }\n }),\n }))\n\n return <Dropdown items={dropdownItems}>{ellipsisButton}</Dropdown>\n }\n\n return ellipsisButton\n },\n)\n\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis'\n\nexport type * from './types'\nexport default Breadcrumb\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { input_default } from './chunk-
|
|
1
|
+
import { input_default } from './chunk-LHZJ2GJU.js';
|
|
2
2
|
import { cn, iconSizes } from './chunk-RAS6HUEI.js';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { Eye, EyeOff } from 'lucide-react';
|
|
@@ -77,5 +77,5 @@ PasswordInput.displayName = "PasswordInput";
|
|
|
77
77
|
var input_password_default = PasswordInput;
|
|
78
78
|
|
|
79
79
|
export { PasswordInput, input_password_default };
|
|
80
|
-
//# sourceMappingURL=chunk-
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
80
|
+
//# sourceMappingURL=chunk-6RZEJRTC.js.map
|
|
81
|
+
//# sourceMappingURL=chunk-6RZEJRTC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/input-password/index.tsx"],"names":[],"mappings":";;;;;;AAUO,IAAM,gBAAgB,KAAA,CAAM,IAAA;AAAA,EACjC,CAAC,EAAE,gBAAA,GAAmB,IAAA,EAAM,IAAA,GAAO,MAAM,GAAA,EAAK,UAAA,EAAY,GAAG,KAAA,EAAM,KAAM;AACvE,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,KAAA,CAAM,SAAS,KAAK,CAAA;AAE5D,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,WAAA,CAAY,MAAM;AAC/C,MAAA,eAAA,CAAgB,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IACjC,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,qBAAqB,KAAA,CAAM,OAAA;AAAA,MAC/B,OAAO;AAAA,QACL,IAAA,EAAM,EAAA,CAAG,oBAAA,EAAsB,UAAA,EAAY,IAAI,CAAA;AAAA,QAC/C,OAAA,EAAS,EAAA,CAAG,uBAAA,EAAyB,UAAA,EAAY,OAAO,CAAA;AAAA,QACxD,KAAA,EAAO,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,KAAK,CAAA;AAAA,QAClD,KAAA,EAAO,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,KAAK,CAAA;AAAA,QAClD,MAAA,EAAQ,EAAA,CAAG,sBAAA,EAAwB,UAAA,EAAY,MAAM,CAAA;AAAA,QACrD,KAAA,EAAO,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,KAAK;AAAA,OACpD,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,oBAAoB,KAAA,CAAM,OAAA;AAAA,MAC9B,MACE,gBAAA,mBACE,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,gBAAA;AAAA,UACT,WAAA,EAAU,cAAA;AAAA,UACV,SAAA,EAAW,EAAA;AAAA,YACT,4BAAA;AAAA,YACA,0DAAA;AAAA,YACA,UAAA,EAAY;AAAA,WACd;AAAA,UACA,YAAA,EAAY,eAAe,eAAA,GAAkB,eAAA;AAAA,UAC7C,cAAA,EAAc,YAAA;AAAA,UAGb,QAAA,EAAA,YAAA,mBACC,GAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,YAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,gBACT,0BAAA;AAAA,gBACA,UAAU,IAAI,CAAA;AAAA,gBACd,UAAA,EAAY;AAAA;AACd;AAAA,WACF,mBAEA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,YAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,gBACT,0BAAA;AAAA,gBACA,UAAU,IAAI,CAAA;AAAA,gBACd,UAAA,EAAY;AAAA;AACd;AAAA;AACF;AAAA,OAEJ,GACE,MAAA;AAAA,MACN,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,YAAA,EAAc,MAAM,UAAU;AAAA,KACrE;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,IAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA,EAAM,eAAe,MAAA,GAAS,UAAA;AAAA,QAC9B,UAAA,EAAY,kBAAA;AAAA,QACZ,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,EAEJ;AACF;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;AAG5B,IAAO,sBAAA,GAAQ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/input-password/index.tsx"],"names":[],"mappings":";;;;;;AAUO,IAAM,gBAAgB,KAAA,CAAM,IAAA;AAAA,EACjC,CAAC,EAAE,gBAAA,GAAmB,IAAA,EAAM,IAAA,GAAO,MAAM,GAAA,EAAK,UAAA,EAAY,GAAG,KAAA,EAAM,KAAM;AACvE,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,KAAA,CAAM,SAAS,KAAK,CAAA;AAE5D,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,WAAA,CAAY,MAAM;AAC/C,MAAA,eAAA,CAAgB,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IACjC,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,qBAAqB,KAAA,CAAM,OAAA;AAAA,MAC/B,OAAO;AAAA,QACL,IAAA,EAAM,EAAA,CAAG,oBAAA,EAAsB,UAAA,EAAY,IAAI,CAAA;AAAA,QAC/C,OAAA,EAAS,EAAA,CAAG,uBAAA,EAAyB,UAAA,EAAY,OAAO,CAAA;AAAA,QACxD,KAAA,EAAO,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,KAAK,CAAA;AAAA,QAClD,KAAA,EAAO,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,KAAK,CAAA;AAAA,QAClD,MAAA,EAAQ,EAAA,CAAG,sBAAA,EAAwB,UAAA,EAAY,MAAM,CAAA;AAAA,QACrD,KAAA,EAAO,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,KAAK;AAAA,OACpD,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,oBAAoB,KAAA,CAAM,OAAA;AAAA,MAC9B,MACE,gBAAA,mBACE,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,gBAAA;AAAA,UACT,WAAA,EAAU,cAAA;AAAA,UACV,SAAA,EAAW,EAAA;AAAA,YACT,4BAAA;AAAA,YACA,0DAAA;AAAA,YACA,UAAA,EAAY;AAAA,WACd;AAAA,UACA,YAAA,EAAY,eAAe,eAAA,GAAkB,eAAA;AAAA,UAC7C,cAAA,EAAc,YAAA;AAAA,UAGb,QAAA,EAAA,YAAA,mBACC,GAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,YAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,gBACT,0BAAA;AAAA,gBACA,UAAU,IAAI,CAAA;AAAA,gBACd,UAAA,EAAY;AAAA;AACd;AAAA,WACF,mBAEA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,YAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,gBACT,0BAAA;AAAA,gBACA,UAAU,IAAI,CAAA;AAAA,gBACd,UAAA,EAAY;AAAA;AACd;AAAA;AACF;AAAA,OAEJ,GACE,MAAA;AAAA,MACN,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,YAAA,EAAc,MAAM,UAAU;AAAA,KACrE;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,IAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA,EAAM,eAAe,MAAA,GAAS,UAAA;AAAA,QAC9B,UAAA,EAAY,kBAAA;AAAA,QACZ,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,EAEJ;AACF;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;AAG5B,IAAO,sBAAA,GAAQ","file":"chunk-6RZEJRTC.js","sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport { Eye, EyeOff } from 'lucide-react'\n\nimport Input from '../input'\nimport { cn, iconSizes } from '../utils'\nimport type { PasswordInputProps } from './types'\n\nexport const PasswordInput = React.memo<PasswordInputProps>(\n ({ visibilityToggle = true, size = 'md', ref, classNames, ...props }) => {\n const [showPassword, setShowPassword] = React.useState(false)\n\n const toggleVisibility = React.useCallback(() => {\n setShowPassword((prev) => !prev)\n }, [])\n\n const memoizedClassNames = React.useMemo(\n () => ({\n root: cn('inputPassword_root', classNames?.root),\n wrapper: cn('inputPassword_wrapper', classNames?.wrapper),\n label: cn('inputPassword_label', classNames?.label),\n input: cn('inputPassword_input', classNames?.input),\n helper: cn('inputPassword_helper', classNames?.helper),\n error: cn('inputPassword_error', classNames?.error),\n }),\n [classNames],\n )\n\n const memoizedRightIcon = React.useMemo(\n () =>\n visibilityToggle ? (\n <button\n type=\"button\"\n onClick={toggleVisibility}\n data-slot=\"toggleButton\"\n className={cn(\n 'inputPassword_toggleButton',\n 'cursor-pointer hover:text-text-primary transition-colors',\n classNames?.toggleButton,\n )}\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n aria-pressed={showPassword}\n // tabIndex={-1}\n >\n {showPassword ? (\n <Eye\n data-slot=\"toggleIcon\"\n className={cn(\n 'inputPassword_toggleIcon',\n iconSizes[size],\n classNames?.toggleIcon,\n )}\n />\n ) : (\n <EyeOff\n data-slot=\"toggleIcon\"\n className={cn(\n 'inputPassword_toggleIcon',\n iconSizes[size],\n classNames?.toggleIcon,\n )}\n />\n )}\n </button>\n ) : undefined,\n [visibilityToggle, toggleVisibility, showPassword, size, classNames],\n )\n\n return (\n <Input\n {...props}\n size={size}\n ref={ref}\n type={showPassword ? 'text' : 'password'}\n classNames={memoizedClassNames}\n rightIcon={memoizedRightIcon}\n />\n )\n },\n)\n\nPasswordInput.displayName = 'PasswordInput'\n\nexport type * from './types'\nexport default PasswordInput\n"]}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { colorVars } from './chunk-G6QIIWKU.js';
|
|
2
|
+
import { cn } from './chunk-RAS6HUEI.js';
|
|
3
|
+
import React, { useRef, useState, useEffect, useMemo, useCallback } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var _createFn = null;
|
|
7
|
+
async function loadQRLib() {
|
|
8
|
+
if (_createFn) return true;
|
|
9
|
+
try {
|
|
10
|
+
const mod = await import('qrcode');
|
|
11
|
+
_createFn = mod.create || mod.default?.create || null;
|
|
12
|
+
return !!_createFn;
|
|
13
|
+
} catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function createQRMatrixSync(text, errorLevel) {
|
|
18
|
+
if (!_createFn) return null;
|
|
19
|
+
try {
|
|
20
|
+
const result = _createFn(text, { errorCorrectionLevel: errorLevel });
|
|
21
|
+
return result.modules;
|
|
22
|
+
} catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function resolveColor(el, varName) {
|
|
27
|
+
if (typeof window === "undefined") return null;
|
|
28
|
+
try {
|
|
29
|
+
const raw = getComputedStyle(el).getPropertyValue(varName).trim();
|
|
30
|
+
if (!raw) return null;
|
|
31
|
+
const probe = document.createElement("div");
|
|
32
|
+
probe.style.color = raw;
|
|
33
|
+
document.body.appendChild(probe);
|
|
34
|
+
const computed = getComputedStyle(probe).color;
|
|
35
|
+
document.body.removeChild(probe);
|
|
36
|
+
return computed || null;
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function useSlotColor(rootRef, explicitColor, slotVar, fallback) {
|
|
42
|
+
const [resolved, setResolved] = useState(explicitColor || fallback);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (explicitColor) {
|
|
45
|
+
setResolved(explicitColor);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const update = () => {
|
|
49
|
+
const el = rootRef.current;
|
|
50
|
+
if (!el) return;
|
|
51
|
+
const computed = resolveColor(el, slotVar);
|
|
52
|
+
setResolved(computed || fallback);
|
|
53
|
+
};
|
|
54
|
+
update();
|
|
55
|
+
const raf = requestAnimationFrame(update);
|
|
56
|
+
const observer = new MutationObserver(update);
|
|
57
|
+
observer.observe(document.documentElement, {
|
|
58
|
+
attributes: true,
|
|
59
|
+
attributeFilter: ["class", "data-theme", "data-mode"]
|
|
60
|
+
});
|
|
61
|
+
return () => {
|
|
62
|
+
cancelAnimationFrame(raf);
|
|
63
|
+
observer.disconnect();
|
|
64
|
+
};
|
|
65
|
+
}, [explicitColor, slotVar, fallback, rootRef]);
|
|
66
|
+
return resolved;
|
|
67
|
+
}
|
|
68
|
+
function isFinderModule(row, col, size) {
|
|
69
|
+
if (row < 7 && col < 7) return true;
|
|
70
|
+
if (row < 7 && col >= size - 7) return true;
|
|
71
|
+
if (row >= size - 7 && col < 7) return true;
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
function drawCanvasQR(canvas, matrix, pixelSize, color, bgColor, moduleStyle, finderStyle, iconArea) {
|
|
75
|
+
const ctx = canvas.getContext("2d");
|
|
76
|
+
if (!ctx) return;
|
|
77
|
+
const ratio = typeof window !== "undefined" ? window.devicePixelRatio || 1 : 1;
|
|
78
|
+
canvas.width = pixelSize * ratio;
|
|
79
|
+
canvas.height = pixelSize * ratio;
|
|
80
|
+
canvas.style.width = `${pixelSize}px`;
|
|
81
|
+
canvas.style.height = `${pixelSize}px`;
|
|
82
|
+
ctx.scale(ratio, ratio);
|
|
83
|
+
const moduleCount = matrix.size;
|
|
84
|
+
const cellSize = pixelSize / moduleCount;
|
|
85
|
+
ctx.fillStyle = bgColor;
|
|
86
|
+
ctx.fillRect(0, 0, pixelSize, pixelSize);
|
|
87
|
+
ctx.fillStyle = color;
|
|
88
|
+
for (let row = 0; row < moduleCount; row++) {
|
|
89
|
+
for (let col = 0; col < moduleCount; col++) {
|
|
90
|
+
if (!matrix.get(row, col)) continue;
|
|
91
|
+
const x = col * cellSize;
|
|
92
|
+
const y = row * cellSize;
|
|
93
|
+
if (iconArea && x + cellSize > iconArea.x && x < iconArea.x + iconArea.w && y + cellSize > iconArea.y && y < iconArea.y + iconArea.h) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const isFinder = isFinderModule(row, col, moduleCount);
|
|
97
|
+
if (isFinder) {
|
|
98
|
+
drawFinderModule(ctx, x, y, cellSize, finderStyle);
|
|
99
|
+
} else {
|
|
100
|
+
drawDataModule(ctx, x, y, cellSize, moduleStyle);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function drawDataModule(ctx, x, y, size, style) {
|
|
106
|
+
const gap = size * 0.1;
|
|
107
|
+
switch (style) {
|
|
108
|
+
case "dots": {
|
|
109
|
+
const radius = (size - gap * 2) / 2;
|
|
110
|
+
ctx.beginPath();
|
|
111
|
+
ctx.arc(x + size / 2, y + size / 2, radius, 0, Math.PI * 2);
|
|
112
|
+
ctx.fill();
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case "rounded": {
|
|
116
|
+
const r = size * 0.3;
|
|
117
|
+
const s = size - gap;
|
|
118
|
+
const ox = x + gap / 2;
|
|
119
|
+
const oy = y + gap / 2;
|
|
120
|
+
ctx.beginPath();
|
|
121
|
+
ctx.moveTo(ox + r, oy);
|
|
122
|
+
ctx.arcTo(ox + s, oy, ox + s, oy + s, r);
|
|
123
|
+
ctx.arcTo(ox + s, oy + s, ox, oy + s, r);
|
|
124
|
+
ctx.arcTo(ox, oy + s, ox, oy, r);
|
|
125
|
+
ctx.arcTo(ox, oy, ox + s, oy, r);
|
|
126
|
+
ctx.closePath();
|
|
127
|
+
ctx.fill();
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case "squares":
|
|
131
|
+
default: {
|
|
132
|
+
ctx.fillRect(x + gap / 2, y + gap / 2, size - gap, size - gap);
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function drawFinderModule(ctx, x, y, size, style) {
|
|
138
|
+
switch (style) {
|
|
139
|
+
case "dot": {
|
|
140
|
+
const r = size / 2;
|
|
141
|
+
ctx.beginPath();
|
|
142
|
+
ctx.arc(x + r, y + r, r * 0.9, 0, Math.PI * 2);
|
|
143
|
+
ctx.fill();
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
case "rounded": {
|
|
147
|
+
const radius = size * 0.3;
|
|
148
|
+
ctx.beginPath();
|
|
149
|
+
ctx.moveTo(x + radius, y);
|
|
150
|
+
ctx.arcTo(x + size, y, x + size, y + size, radius);
|
|
151
|
+
ctx.arcTo(x + size, y + size, x, y + size, radius);
|
|
152
|
+
ctx.arcTo(x, y + size, x, y, radius);
|
|
153
|
+
ctx.arcTo(x, y, x + size, y, radius);
|
|
154
|
+
ctx.closePath();
|
|
155
|
+
ctx.fill();
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
case "square":
|
|
159
|
+
default:
|
|
160
|
+
ctx.fillRect(x, y, size, size);
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function buildSVGPaths(matrix, cellSize, moduleStyle, finderStyle, iconArea) {
|
|
165
|
+
const paths = [];
|
|
166
|
+
const moduleCount = matrix.size;
|
|
167
|
+
for (let row = 0; row < moduleCount; row++) {
|
|
168
|
+
for (let col = 0; col < moduleCount; col++) {
|
|
169
|
+
if (!matrix.get(row, col)) continue;
|
|
170
|
+
const x = col * cellSize;
|
|
171
|
+
const y = row * cellSize;
|
|
172
|
+
if (iconArea && x + cellSize > iconArea.x && x < iconArea.x + iconArea.w && y + cellSize > iconArea.y && y < iconArea.y + iconArea.h) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const isFinder = isFinderModule(row, col, moduleCount);
|
|
176
|
+
const style = isFinder ? finderStyle : moduleStyle;
|
|
177
|
+
const gap = cellSize * 0.1;
|
|
178
|
+
if (style === "dots" || style === "dot") {
|
|
179
|
+
const r = (cellSize - (isFinder ? 0 : gap * 2)) / 2;
|
|
180
|
+
const cx = x + cellSize / 2;
|
|
181
|
+
const cy = y + cellSize / 2;
|
|
182
|
+
paths.push(`M${cx - r},${cy}a${r},${r} 0 1,0 ${r * 2},0a${r},${r} 0 1,0 ${-r * 2},0`);
|
|
183
|
+
} else if (style === "rounded") {
|
|
184
|
+
const r = cellSize * 0.3;
|
|
185
|
+
const s = cellSize - (isFinder ? 0 : gap);
|
|
186
|
+
const ox = x + (isFinder ? 0 : gap / 2);
|
|
187
|
+
const oy = y + (isFinder ? 0 : gap / 2);
|
|
188
|
+
paths.push(
|
|
189
|
+
`M${ox + r},${oy}H${ox + s - r}Q${ox + s},${oy} ${ox + s},${oy + r}V${oy + s - r}Q${ox + s},${oy + s} ${ox + s - r},${oy + s}H${ox + r}Q${ox},${oy + s} ${ox},${oy + s - r}V${oy + r}Q${ox},${oy} ${ox + r},${oy}Z`
|
|
190
|
+
);
|
|
191
|
+
} else {
|
|
192
|
+
const g = isFinder ? 0 : gap / 2;
|
|
193
|
+
paths.push(`M${x + g},${y + g}h${cellSize - g * 2}v${cellSize - g * 2}h${-(cellSize - g * 2)}Z`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return paths.join("");
|
|
198
|
+
}
|
|
199
|
+
var QRCode = React.memo(
|
|
200
|
+
({
|
|
201
|
+
value,
|
|
202
|
+
size = 128,
|
|
203
|
+
color = "default",
|
|
204
|
+
fgColor,
|
|
205
|
+
bgColor: bgColorProp,
|
|
206
|
+
errorLevel = "M",
|
|
207
|
+
type = "canvas",
|
|
208
|
+
moduleStyle = "squares",
|
|
209
|
+
finderStyle = "square",
|
|
210
|
+
icon,
|
|
211
|
+
iconSize = 40,
|
|
212
|
+
iconBorderRadius = 4,
|
|
213
|
+
bordered = true,
|
|
214
|
+
status = "active",
|
|
215
|
+
onRefresh,
|
|
216
|
+
refreshText = "Refresh",
|
|
217
|
+
expiredText = "QR code expired",
|
|
218
|
+
className,
|
|
219
|
+
classNames
|
|
220
|
+
}) => {
|
|
221
|
+
const canvasRef = useRef(null);
|
|
222
|
+
const rootRef = useRef(null);
|
|
223
|
+
const [libLoaded, setLibLoaded] = useState(!!_createFn);
|
|
224
|
+
const resolvedFg = useSlotColor(rootRef, fgColor, "--_c", "#000000");
|
|
225
|
+
const resolvedBg = useSlotColor(rootRef, bgColorProp, "--color-background", "#ffffff");
|
|
226
|
+
useEffect(() => {
|
|
227
|
+
if (_createFn) {
|
|
228
|
+
setLibLoaded(true);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
loadQRLib().then((ok) => setLibLoaded(ok));
|
|
232
|
+
}, []);
|
|
233
|
+
const matrix = useMemo(() => {
|
|
234
|
+
if (!value || !libLoaded) return null;
|
|
235
|
+
return createQRMatrixSync(value, errorLevel);
|
|
236
|
+
}, [value, errorLevel, libLoaded]);
|
|
237
|
+
const iconArea = useMemo(() => {
|
|
238
|
+
if (!icon || !matrix) return void 0;
|
|
239
|
+
const moduleCount = matrix.size;
|
|
240
|
+
const cellSize = size / moduleCount;
|
|
241
|
+
const centerX = (size - iconSize) / 2;
|
|
242
|
+
const centerY = (size - iconSize) / 2;
|
|
243
|
+
const pad = cellSize * 2;
|
|
244
|
+
return { x: centerX - pad, y: centerY - pad, w: iconSize + pad * 2, h: iconSize + pad * 2 };
|
|
245
|
+
}, [icon, matrix, size, iconSize]);
|
|
246
|
+
const renderCanvas = useCallback(() => {
|
|
247
|
+
if (!canvasRef.current || !matrix || typeof window === "undefined") return;
|
|
248
|
+
drawCanvasQR(canvasRef.current, matrix, size, resolvedFg, resolvedBg, moduleStyle, finderStyle, iconArea);
|
|
249
|
+
}, [matrix, size, resolvedFg, resolvedBg, moduleStyle, finderStyle, iconArea]);
|
|
250
|
+
useEffect(() => {
|
|
251
|
+
if (type === "canvas") renderCanvas();
|
|
252
|
+
}, [type, renderCanvas]);
|
|
253
|
+
const svgContent = useMemo(() => {
|
|
254
|
+
if (type !== "svg" || !matrix) return null;
|
|
255
|
+
const cellSize = size / matrix.size;
|
|
256
|
+
const d = buildSVGPaths(matrix, cellSize, moduleStyle, finderStyle, iconArea);
|
|
257
|
+
return d;
|
|
258
|
+
}, [type, matrix, size, moduleStyle, finderStyle, iconArea]);
|
|
259
|
+
return /* @__PURE__ */ jsxs(
|
|
260
|
+
"div",
|
|
261
|
+
{
|
|
262
|
+
ref: rootRef,
|
|
263
|
+
"data-slot": "root",
|
|
264
|
+
className: cn(
|
|
265
|
+
"qrCode_root",
|
|
266
|
+
"relative inline-flex flex-col items-center",
|
|
267
|
+
colorVars[color],
|
|
268
|
+
bordered && "p-3 rounded-lg border border-slot bg-background",
|
|
269
|
+
classNames?.root,
|
|
270
|
+
className
|
|
271
|
+
),
|
|
272
|
+
children: [
|
|
273
|
+
type === "canvas" ? /* @__PURE__ */ jsx(
|
|
274
|
+
"canvas",
|
|
275
|
+
{
|
|
276
|
+
ref: canvasRef,
|
|
277
|
+
"data-slot": "canvas",
|
|
278
|
+
className: cn("qrCode_canvas", classNames?.canvas),
|
|
279
|
+
style: { width: size, height: size }
|
|
280
|
+
}
|
|
281
|
+
) : /* @__PURE__ */ jsxs(
|
|
282
|
+
"svg",
|
|
283
|
+
{
|
|
284
|
+
"data-slot": "svg",
|
|
285
|
+
width: size,
|
|
286
|
+
height: size,
|
|
287
|
+
viewBox: `0 0 ${size} ${size}`,
|
|
288
|
+
className: cn("qrCode_svg", classNames?.svg),
|
|
289
|
+
children: [
|
|
290
|
+
/* @__PURE__ */ jsx("rect", { width: size, height: size, fill: resolvedBg }),
|
|
291
|
+
svgContent && /* @__PURE__ */ jsx("path", { d: svgContent, fill: resolvedFg })
|
|
292
|
+
]
|
|
293
|
+
}
|
|
294
|
+
),
|
|
295
|
+
icon && status === "active" && /* @__PURE__ */ jsx(
|
|
296
|
+
"div",
|
|
297
|
+
{
|
|
298
|
+
"data-slot": "icon",
|
|
299
|
+
className: cn("qrCode_icon", "absolute", classNames?.icon),
|
|
300
|
+
style: {
|
|
301
|
+
width: iconSize,
|
|
302
|
+
height: iconSize,
|
|
303
|
+
top: `calc(50% - ${iconSize / 2}px)`,
|
|
304
|
+
left: `calc(50% - ${iconSize / 2}px)`,
|
|
305
|
+
backgroundColor: resolvedBg,
|
|
306
|
+
borderRadius: iconBorderRadius,
|
|
307
|
+
padding: 3,
|
|
308
|
+
display: "flex",
|
|
309
|
+
alignItems: "center",
|
|
310
|
+
justifyContent: "center"
|
|
311
|
+
},
|
|
312
|
+
children: /* @__PURE__ */ jsx(
|
|
313
|
+
"img",
|
|
314
|
+
{
|
|
315
|
+
src: icon,
|
|
316
|
+
alt: "",
|
|
317
|
+
style: {
|
|
318
|
+
width: "100%",
|
|
319
|
+
height: "100%",
|
|
320
|
+
objectFit: "contain",
|
|
321
|
+
borderRadius: Math.max(0, iconBorderRadius - 2)
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
)
|
|
325
|
+
}
|
|
326
|
+
),
|
|
327
|
+
status === "loading" && /* @__PURE__ */ jsx(
|
|
328
|
+
"div",
|
|
329
|
+
{
|
|
330
|
+
"data-slot": "overlay",
|
|
331
|
+
className: cn(
|
|
332
|
+
"qrCode_overlay",
|
|
333
|
+
"absolute inset-0 flex items-center justify-center bg-background/80 rounded-lg",
|
|
334
|
+
bordered && "m-3",
|
|
335
|
+
classNames?.overlay
|
|
336
|
+
),
|
|
337
|
+
children: /* @__PURE__ */ jsx("div", { className: "w-6 h-6 border-2 border-slot border-t-transparent rounded-full animate-spin" })
|
|
338
|
+
}
|
|
339
|
+
),
|
|
340
|
+
status === "expired" && /* @__PURE__ */ jsxs(
|
|
341
|
+
"div",
|
|
342
|
+
{
|
|
343
|
+
"data-slot": "overlay",
|
|
344
|
+
className: cn(
|
|
345
|
+
"qrCode_overlay",
|
|
346
|
+
"absolute inset-0 flex flex-col items-center justify-center bg-background/90 rounded-lg gap-2",
|
|
347
|
+
bordered && "m-3",
|
|
348
|
+
classNames?.overlay
|
|
349
|
+
),
|
|
350
|
+
children: [
|
|
351
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-text-secondary", children: expiredText }),
|
|
352
|
+
onRefresh && /* @__PURE__ */ jsx(
|
|
353
|
+
"button",
|
|
354
|
+
{
|
|
355
|
+
type: "button",
|
|
356
|
+
onClick: onRefresh,
|
|
357
|
+
className: "text-sm text-slot hover:opacity-80 font-medium cursor-pointer",
|
|
358
|
+
children: refreshText
|
|
359
|
+
}
|
|
360
|
+
)
|
|
361
|
+
]
|
|
362
|
+
}
|
|
363
|
+
)
|
|
364
|
+
]
|
|
365
|
+
}
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
);
|
|
369
|
+
QRCode.displayName = "QRCode";
|
|
370
|
+
var qr_code_default = QRCode;
|
|
371
|
+
|
|
372
|
+
export { qr_code_default };
|
|
373
|
+
//# sourceMappingURL=chunk-74AF6PO2.js.map
|
|
374
|
+
//# sourceMappingURL=chunk-74AF6PO2.js.map
|