@avenue-ticketing/ui 0.10.0 → 0.12.0-beta.1
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 +47 -0
- package/dist/badge-types-B67wcd4m.d.ts +22 -0
- package/dist/react/app-store-buttons-outline.d.ts +17 -0
- package/dist/react/app-store-buttons-outline.js +582 -0
- package/dist/react/app-store-buttons-outline.js.map +1 -0
- package/dist/react/app-store-buttons.d.ts +20 -0
- package/dist/react/app-store-buttons.js +817 -0
- package/dist/react/app-store-buttons.js.map +1 -0
- package/dist/react/avatar-label-group.d.ts +14 -0
- package/dist/react/avatar-label-group.js +183 -0
- package/dist/react/avatar-label-group.js.map +1 -0
- package/dist/react/avatar-profile-photo.d.ts +9 -0
- package/dist/react/avatar-profile-photo.js +202 -0
- package/dist/react/avatar-profile-photo.js.map +1 -0
- package/dist/react/avatar.d.ts +66 -40
- package/dist/react/avatar.js +159 -149
- package/dist/react/avatar.js.map +1 -1
- package/dist/react/badge-groups.d.ts +25 -0
- package/dist/react/badge-groups.js +162 -0
- package/dist/react/badge-groups.js.map +1 -0
- package/dist/react/badge.d.ts +123 -59
- package/dist/react/badge.js +314 -86
- package/dist/react/badge.js.map +1 -1
- package/dist/react/button-group.d.ts +43 -0
- package/dist/react/button-group.js +108 -0
- package/dist/react/button-group.js.map +1 -0
- package/dist/react/button-utility.d.ts +47 -0
- package/dist/react/button-utility.js +158 -0
- package/dist/react/button-utility.js.map +1 -0
- package/dist/react/button.d.ts +112 -37
- package/dist/react/button.js +270 -55
- package/dist/react/button.js.map +1 -1
- package/dist/react/checkbox.d.ts +25 -8
- package/dist/react/checkbox.js +112 -110
- package/dist/react/checkbox.js.map +1 -1
- package/dist/react/close-button.d.ts +25 -0
- package/dist/react/close-button.js +54 -0
- package/dist/react/close-button.js.map +1 -0
- package/dist/react/combobox.d.ts +17 -0
- package/dist/react/combobox.js +322 -0
- package/dist/react/combobox.js.map +1 -0
- package/dist/react/dialog.d.ts +15 -15
- package/dist/react/dialog.js +43 -108
- package/dist/react/dialog.js.map +1 -1
- package/dist/react/dropdown-account-breadcrumb.d.ts +5 -0
- package/dist/react/dropdown-account-breadcrumb.js +319 -0
- package/dist/react/dropdown-account-breadcrumb.js.map +1 -0
- package/dist/react/dropdown-account-button.d.ts +5 -0
- package/dist/react/dropdown-account-button.js +773 -0
- package/dist/react/dropdown-account-button.js.map +1 -0
- package/dist/react/dropdown-account-card-md.d.ts +5 -0
- package/dist/react/dropdown-account-card-md.js +549 -0
- package/dist/react/dropdown-account-card-md.js.map +1 -0
- package/dist/react/dropdown-account-card-sm.d.ts +5 -0
- package/dist/react/dropdown-account-card-sm.js +527 -0
- package/dist/react/dropdown-account-card-sm.js.map +1 -0
- package/dist/react/dropdown-account-card-xs.d.ts +5 -0
- package/dist/react/dropdown-account-card-xs.js +507 -0
- package/dist/react/dropdown-account-card-xs.js.map +1 -0
- package/dist/react/dropdown-avatar.d.ts +5 -0
- package/dist/react/dropdown-avatar.js +790 -0
- package/dist/react/dropdown-avatar.js.map +1 -0
- package/dist/react/dropdown-button-advanced.d.ts +5 -0
- package/dist/react/dropdown-button-advanced.js +799 -0
- package/dist/react/dropdown-button-advanced.js.map +1 -0
- package/dist/react/dropdown-button-link.d.ts +5 -0
- package/dist/react/dropdown-button-link.js +501 -0
- package/dist/react/dropdown-button-link.js.map +1 -0
- package/dist/react/dropdown-button-simple.d.ts +5 -0
- package/dist/react/dropdown-button-simple.js +754 -0
- package/dist/react/dropdown-button-simple.js.map +1 -0
- package/dist/react/dropdown-icon-advanced.d.ts +5 -0
- package/dist/react/dropdown-icon-advanced.js +543 -0
- package/dist/react/dropdown-icon-advanced.js.map +1 -0
- package/dist/react/dropdown-icon-simple.d.ts +5 -0
- package/dist/react/dropdown-icon-simple.js +505 -0
- package/dist/react/dropdown-icon-simple.js.map +1 -0
- package/dist/react/dropdown-integration.d.ts +5 -0
- package/dist/react/dropdown-integration.js +1325 -0
- package/dist/react/dropdown-integration.js.map +1 -0
- package/dist/react/dropdown-search-advanced.d.ts +5 -0
- package/dist/react/dropdown-search-advanced.js +998 -0
- package/dist/react/dropdown-search-advanced.js.map +1 -0
- package/dist/react/dropdown-search-simple.d.ts +5 -0
- package/dist/react/dropdown-search-simple.js +960 -0
- package/dist/react/dropdown-search-simple.js.map +1 -0
- package/dist/react/dropdown.d.ts +32 -133
- package/dist/react/dropdown.js +404 -1351
- package/dist/react/dropdown.js.map +1 -1
- package/dist/react/file-upload-trigger.d.ts +34 -0
- package/dist/react/file-upload-trigger.js +39 -0
- package/dist/react/file-upload-trigger.js.map +1 -0
- package/dist/react/form.d.ts +10 -0
- package/dist/react/form.js +11 -0
- package/dist/react/form.js.map +1 -0
- package/dist/react/hint-text.d.ts +17 -0
- package/dist/react/hint-text.js +36 -0
- package/dist/react/hint-text.js.map +1 -0
- package/dist/react/hook-form.d.ts +35 -0
- package/dist/react/hook-form.js +50 -0
- package/dist/react/hook-form.js.map +1 -0
- package/dist/react/input-date.d.ts +43 -0
- package/dist/react/input-date.js +306 -0
- package/dist/react/input-date.js.map +1 -0
- package/dist/react/input-file.d.ts +45 -0
- package/dist/react/input-file.js +748 -0
- package/dist/react/input-file.js.map +1 -0
- package/dist/react/input-group.d.ts +37 -0
- package/dist/react/input-group.js +251 -0
- package/dist/react/input-group.js.map +1 -0
- package/dist/react/input-number.d.ts +32 -0
- package/dist/react/input-number.js +553 -0
- package/dist/react/input-number.js.map +1 -0
- package/dist/react/input-payment.d.ts +16 -0
- package/dist/react/input-payment.js +593 -0
- package/dist/react/input-payment.js.map +1 -0
- package/dist/react/input-tags-outer.d.ts +53 -0
- package/dist/react/input-tags-outer.js +607 -0
- package/dist/react/input-tags-outer.js.map +1 -0
- package/dist/react/input-tags.d.ts +53 -0
- package/dist/react/input-tags.js +565 -0
- package/dist/react/input-tags.js.map +1 -0
- package/dist/react/input.d.ts +71 -22
- package/dist/react/input.js +332 -45
- package/dist/react/input.js.map +1 -1
- package/dist/react/label.d.ts +18 -0
- package/dist/react/label.js +112 -0
- package/dist/react/label.js.map +1 -0
- package/dist/react/multi-select.d.ts +89 -0
- package/dist/react/multi-select.js +1036 -0
- package/dist/react/multi-select.js.map +1 -0
- package/dist/react/pin-input.d.ts +59 -0
- package/dist/react/pin-input.js +229 -0
- package/dist/react/pin-input.js.map +1 -0
- package/dist/react/popover.d.ts +7 -73
- package/dist/react/popover.js +23 -569
- package/dist/react/popover.js.map +1 -1
- package/dist/react/progress-circle.d.ts +9 -0
- package/dist/react/progress-circle.js +36 -0
- package/dist/react/progress-circle.js.map +1 -0
- package/dist/react/progress-circles.d.ts +14 -0
- package/dist/react/progress-circles.js +160 -0
- package/dist/react/progress-circles.js.map +1 -0
- package/dist/react/progress-indicators.d.ts +52 -0
- package/dist/react/progress-indicators.js +78 -0
- package/dist/react/progress-indicators.js.map +1 -0
- package/dist/react/radio-buttons.d.ts +35 -0
- package/dist/react/radio-buttons.js +116 -0
- package/dist/react/radio-buttons.js.map +1 -0
- package/dist/react/scroll-header.d.ts +6 -0
- package/dist/react/scroll-header.js +42 -61
- package/dist/react/scroll-header.js.map +1 -1
- package/dist/react/scroll-wheel.d.ts +4 -5
- package/dist/react/scroll-wheel.js +19 -15
- package/dist/react/scroll-wheel.js.map +1 -1
- package/dist/react/select-item.d.ts +13 -0
- package/dist/react/select-item.js +336 -0
- package/dist/react/select-item.js.map +1 -0
- package/dist/react/select-native.d.ts +17 -0
- package/dist/react/select-native.js +203 -0
- package/dist/react/select-native.js.map +1 -0
- package/dist/react/select.d.ts +18 -61
- package/dist/react/select.js +625 -923
- package/dist/react/select.js.map +1 -1
- package/dist/react/sheet.d.ts +19 -19
- package/dist/react/sheet.js +97 -219
- package/dist/react/sheet.js.map +1 -1
- package/dist/react/slider.d.ts +15 -0
- package/dist/react/slider.js +66 -0
- package/dist/react/slider.js.map +1 -0
- package/dist/react/social-button.d.ts +55 -0
- package/dist/react/social-button.js +263 -0
- package/dist/react/social-button.js.map +1 -0
- package/dist/react/social-logos.d.ts +20 -0
- package/dist/react/social-logos.js +131 -0
- package/dist/react/social-logos.js.map +1 -0
- package/dist/react/switch.d.ts +21 -36
- package/dist/react/switch.js +121 -109
- package/dist/react/switch.js.map +1 -1
- package/dist/react/tag-select.d.ts +44 -0
- package/dist/react/tag-select.js +1062 -0
- package/dist/react/tag-select.js.map +1 -0
- package/dist/react/tags.d.ts +30 -0
- package/dist/react/tags.js +228 -0
- package/dist/react/tags.js.map +1 -0
- package/dist/react/textarea.d.ts +40 -4
- package/dist/react/textarea.js +193 -27
- package/dist/react/textarea.js.map +1 -1
- package/dist/react/tooltip.d.ts +30 -43
- package/dist/react/tooltip.js +65 -521
- package/dist/react/tooltip.js.map +1 -1
- package/dist/select-shared-B3Y5SMXU.d.ts +62 -0
- package/package.json +28 -21
- package/source.css +2 -12
- package/theme.css +883 -79
- package/dist/react/calendar.d.ts +0 -13
- package/dist/react/calendar.js +0 -4639
- package/dist/react/calendar.js.map +0 -1
- package/dist/react/card.d.ts +0 -11
- package/dist/react/card.js +0 -113
- package/dist/react/card.js.map +0 -1
- package/dist/react/datetime-picker.d.ts +0 -21
- package/dist/react/datetime-picker.js +0 -6142
- package/dist/react/datetime-picker.js.map +0 -1
- package/dist/react/pagination.d.ts +0 -28
- package/dist/react/pagination.js +0 -262
- package/dist/react/pagination.js.map +0 -1
- package/dist/react/table-pagination.d.ts +0 -15
- package/dist/react/table-pagination.js +0 -1247
- package/dist/react/table-pagination.js.map +0 -1
- package/dist/react/table-view/column-menu.d.ts +0 -15
- package/dist/react/table-view/column-menu.js +0 -1049
- package/dist/react/table-view/column-menu.js.map +0 -1
- package/dist/react/table-view/index.d.ts +0 -70
- package/dist/react/table-view/index.js +0 -2284
- package/dist/react/table-view/index.js.map +0 -1
- package/dist/react/table.d.ts +0 -86
- package/dist/react/table.js +0 -414
- package/dist/react/table.js.map +0 -1
- package/dist/react/tabs.d.ts +0 -34
- package/dist/react/tabs.js +0 -423
- package/dist/react/tabs.js.map +0 -1
- package/dist/react/time-picker.d.ts +0 -22
- package/dist/react/time-picker.js +0 -856
- package/dist/react/time-picker.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/popover.tsx"],"names":[],"mappings":"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","file":"popover.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\n\n/** Mobile popover as bottom sheet — same cutoff and motion as {@link DropdownContent}. */\nconst POPOVER_MOBILE_SHEET_MAX_PX = 1024;\nconst POPOVER_MOBILE_SHEET_MOTION_MS = 175;\nconst POPOVER_MOBILE_SHEET_ENTRY_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst POPOVER_MOBILE_SHEET_EXIT_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\nconst POPOVER_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX = 120;\n/** Shrink on the preferred side until space drops below ~2 rows; then allow flip. */\nconst POPOVER_FLIP_MIN_SPACE_PX = 100;\n\nfunction preventPopoverWheelChain(panel: HTMLElement, e: WheelEvent) {\n let el: HTMLElement | null = e.target as HTMLElement | null;\n while (el && panel.contains(el)) {\n const oy = getComputedStyle(el).overflowY;\n if (\n (oy === \"auto\" || oy === \"scroll\") &&\n el.scrollHeight > el.clientHeight\n ) {\n const atTop = el.scrollTop <= 0;\n const atBottom =\n el.scrollTop + el.clientHeight >= el.scrollHeight;\n if ((e.deltaY < 0 && !atTop) || (e.deltaY > 0 && !atBottom)) return;\n break;\n }\n el = el.parentElement;\n }\n e.preventDefault();\n}\n\nfunction usePopoverIsMobile(breakpoint = 1025): boolean {\n const [isMobile, setIsMobile] = useState(false);\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n setIsMobile(mq.matches);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, [breakpoint]);\n return isMobile;\n}\n\n//////////////////////////////////////////////// Context\n\ntype PopoverContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n};\n\nconst PopoverContext = React.createContext<PopoverContextValue | undefined>(\n undefined,\n);\n\nfunction usePopover() {\n const context = React.useContext(PopoverContext);\n if (!context) {\n throw new Error(\"Popover components must be used within a <Popover />\");\n }\n return context;\n}\n\n//////////////////////////////////////////////// Main\n\nexport const Popover: React.FC<{\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}> = ({ children, open: controlledOpen, onOpenChange }) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n const triggerRef = useRef<HTMLElement | null>(null);\n\n const setOpen = useCallback(\n (value: boolean) => {\n if (!isControlled) setInternalOpen(value);\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange],\n );\n\n return (\n <PopoverContext.Provider value={{ open, setOpen, triggerRef }}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\n//////////////////////////////////////////////// Trigger\n\nexport const PopoverTrigger: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { open, setOpen, triggerRef } = usePopover();\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n setOpen(!open);\n };\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n ref?: React.Ref<unknown>;\n }>;\n return React.cloneElement(child, {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref: (el: HTMLElement) => {\n triggerRef.current = el;\n },\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick(e);\n },\n } as Partial<typeof child.props>);\n }\n\n return (\n <button\n type=\"button\"\n ref={(el) => {\n triggerRef.current = el;\n }}\n onClick={handleClick}\n >\n {children}\n </button>\n );\n};\n\n//////////////////////////////////////////////// Close\n\nexport const PopoverClose: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = usePopover();\n const handleClick = () => setOpen(false);\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick();\n },\n } as Partial<typeof child.props>);\n }\n\n return (\n <button type=\"button\" onClick={handleClick}>\n {children}\n </button>\n );\n};\n\n//////////////////////////////////////////////// Mobile sheet (popover-specific; mirrors dropdown behavior)\n\n/**\n * Narrow-viewport (≤1024px) bottom-sheet options for {@link PopoverContent}.\n * `className` merges onto the sheet panel root (after base sheet styles).\n */\nexport interface PopoverMobileSheetOptions {\n /** When `true`, use a bottom sheet on narrow viewports. Default `false`. */\n sheet?: boolean;\n title?: string;\n className?: string;\n contentClassName?: string;\n}\n\nfunction resolvePopoverMobileSheet(\n mobileOptions: PopoverMobileSheetOptions | undefined,\n) {\n return {\n sheet: mobileOptions?.sheet ?? false,\n title: mobileOptions?.title,\n sheetExtraClassName: mobileOptions?.className,\n contentClassName: mobileOptions?.contentClassName,\n };\n}\n\nexport interface PopoverMobileCloseProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * Dismiss control for the mobile bottom-sheet popover. Styling matches\n * {@link DialogCloseButton} (circular hit target, X icon).\n */\nexport const PopoverMobileClose = React.forwardRef<\n HTMLButtonElement,\n PopoverMobileCloseProps\n>(({ className, type = \"button\", ...props }, ref) => {\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n \"z-100 flex size-12 shrink-0 cursor-pointer items-center justify-center rounded-full transition-all hover:bg-secondary-background active:scale-[0.96]\",\n className,\n )}\n {...props}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n );\n});\nPopoverMobileClose.displayName = \"PopoverMobileClose\";\n\ninterface PopoverMobileBottomSheetPortalProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"ref\"\n> {\n children: React.ReactNode;\n open: boolean;\n isAnimating: boolean;\n slideEntrance: boolean;\n slideOffsetPx: number;\n sheetTitle?: string;\n sheetExtraClassName?: string;\n contentClassName?: string;\n onRequestClose: () => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n /** When `false`, scrim taps do not close (matches `closeOnClickOutside={false}`). */\n dismissOnBackdropPress?: boolean;\n}\n\nfunction PopoverMobileBottomSheetPortal({\n open,\n isAnimating,\n slideEntrance,\n slideOffsetPx,\n sheetTitle,\n sheetExtraClassName,\n contentClassName,\n onRequestClose,\n menuRef,\n dismissOnBackdropPress = true,\n children,\n className,\n style,\n ...panelProps\n}: PopoverMobileBottomSheetPortalProps) {\n const sheetMotion = open\n ? POPOVER_MOBILE_SHEET_ENTRY_EASING\n : POPOVER_MOBILE_SHEET_EXIT_EASING;\n const sheetHiddenTransform = slideEntrance\n ? `translateY(${slideOffsetPx}px)`\n : \"translateY(100%)\";\n\n return createPortal(\n <div className=\"fixed inset-0 z-50 flex items-end justify-center p-0\">\n <div\n className={cn(\n \"fixed inset-0 bg-black/40 dark:bg-primary/4\",\n isAnimating ? \"opacity-100\" : \"opacity-0\",\n )}\n style={{\n transitionProperty: \"opacity\",\n transitionDuration: `${POPOVER_MOBILE_SHEET_MOTION_MS}ms`,\n transitionTimingFunction: sheetMotion,\n }}\n onClick={dismissOnBackdropPress ? onRequestClose : undefined}\n aria-hidden\n />\n <div\n {...panelProps}\n ref={menuRef}\n className={cn(\n // Panel chrome + padding rhythm matches `DropdownMobileBottomSheetPortal`.\n \"bg-background border-primary/10 relative z-10 flex w-full max-h-[min(90dvh,calc(100dvh-env(safe-area-inset-bottom,0px)))] flex-col overflow-hidden shadow-2xl outline-none\",\n \"rounded-t-2xl rounded-b-none border-x-0 border-b-0 border-t\",\n sheetExtraClassName,\n className,\n )}\n style={{\n transform: isAnimating ? \"translateY(0)\" : sheetHiddenTransform,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${POPOVER_MOBILE_SHEET_MOTION_MS}ms`,\n transitionTimingFunction: sheetMotion,\n ...style,\n }}\n >\n <div\n className={cn(\n \"flex w-full shrink-0 items-center py-2 pl-4 pr-2\",\n sheetTitle ? \"justify-between gap-3\" : \"justify-end\",\n )}\n >\n {sheetTitle ? (\n <p className=\"text-foreground min-w-0 flex-1 truncate text-base font-semibold\">\n {sheetTitle}\n </p>\n ) : null}\n <PopoverMobileClose\n onClick={(e) => {\n e.stopPropagation();\n onRequestClose();\n }}\n />\n </div>\n <div\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto px-4 pt-3\",\n contentClassName,\n \"pb-[calc(5rem+env(safe-area-inset-bottom,0px))]\",\n )}\n >\n {children}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\n//////////////////////////////////////////////// Content\n\ntype Side = \"top\" | \"right\" | \"bottom\" | \"left\";\ntype Align = \"start\" | \"center\" | \"end\";\n\ninterface PopoverContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Which side of the trigger to render on */\n side?: Side;\n /** Alignment along the cross-axis */\n align?: Align;\n /** Gap between trigger and popover in px */\n offset?: number;\n /** Show a small arrow pointing to the trigger */\n showArrow?: boolean;\n /** Close when clicking outside */\n closeOnClickOutside?: boolean;\n /** Close when Escape key is pressed */\n closeOnEscape?: boolean;\n /** Animation duration in ms */\n duration?: number;\n /** Minimum distance from the viewport edge in px */\n viewportPadding?: number;\n /** Portal container – defaults to document.body */\n container?: HTMLElement | null;\n /** Width of the popover. 'trigger' matches the trigger width. */\n width?: \"auto\" | \"trigger\" | number;\n /**\n * Narrow-viewport (≤1024px) bottom sheet — same options as dropdown\n * `mobileOptions`, except `sheet` defaults to `false`.\n */\n mobileOptions?: PopoverMobileSheetOptions;\n /**\n * Mobile bottom sheet only. When `true` (default), panel motion matches Dialog\n * `slideEntrance`; when `false`, uses full `translateY(100%)`.\n */\n slideEntrance?: boolean;\n /** Mobile sheet only; defaults to 120px (same as dropdown / dialog full sheet). */\n slideEntranceOffsetPx?: number;\n}\n\ninterface Position {\n top: number;\n left: number;\n side: Side;\n maxHeight?: number;\n}\n\nfunction computePosition(\n trigger: HTMLElement,\n popover: HTMLElement,\n side: Side,\n align: Align,\n offset: number,\n viewportPadding: number,\n): Position {\n const triggerRect = trigger.getBoundingClientRect();\n /** Layout box — not affected by exit/enter `transform: scale()`, unlike `getBoundingClientRect()`. */\n const pw = popover.offsetWidth;\n const ph = popover.offsetHeight;\n const contentHeight = popover.scrollHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const pad = viewportPadding;\n\n let top = 0;\n let left = 0;\n let effectiveSide: Side = side;\n let maxHeight: number | undefined;\n\n /** Viewport-space coords — pairs with `position: fixed` on the portal root. */\n const placeVertical = (s: Side, height: number) => {\n if (s === \"bottom\") top = triggerRect.bottom + offset;\n else top = triggerRect.top - height - offset;\n if (align === \"start\") left = triggerRect.left;\n else if (align === \"end\") left = triggerRect.right - pw;\n else left = triggerRect.left + triggerRect.width / 2 - pw / 2;\n };\n\n const place = (s: Side, height = contentHeight) => {\n switch (s) {\n case \"bottom\":\n case \"top\":\n placeVertical(s, height);\n break;\n case \"right\":\n left = triggerRect.right + offset;\n top =\n align === \"start\"\n ? triggerRect.top\n : align === \"end\"\n ? triggerRect.bottom - ph\n : triggerRect.top + triggerRect.height / 2 - ph / 2;\n break;\n case \"left\":\n left = triggerRect.left - pw - offset;\n top =\n align === \"start\"\n ? triggerRect.top\n : align === \"end\"\n ? triggerRect.bottom - ph\n : triggerRect.top + triggerRect.height / 2 - ph / 2;\n break;\n }\n };\n\n place(side);\n\n const spaceBelow = Math.max(0, vh - pad - triggerRect.bottom - offset);\n const spaceAbove = Math.max(0, triggerRect.top - offset - pad);\n\n if (side === \"bottom\" || side === \"top\") {\n const primarySpace = side === \"bottom\" ? spaceBelow : spaceAbove;\n const alternateSpace = side === \"bottom\" ? spaceAbove : spaceBelow;\n const alternateSide: Side = side === \"bottom\" ? \"top\" : \"bottom\";\n\n if (contentHeight > primarySpace) {\n maxHeight = Math.min(contentHeight, primarySpace);\n place(side, maxHeight);\n }\n\n if (\n contentHeight > primarySpace &&\n primarySpace < POPOVER_FLIP_MIN_SPACE_PX &&\n alternateSpace > primarySpace\n ) {\n effectiveSide = alternateSide;\n maxHeight = Math.min(contentHeight, alternateSpace);\n place(alternateSide, maxHeight);\n }\n } else if (side === \"right\" && left + pw > vw - pad) {\n const flippedLeft = triggerRect.left - pw - offset;\n if (flippedLeft >= pad) {\n effectiveSide = \"left\";\n left = flippedLeft;\n }\n } else if (side === \"left\" && left < pad) {\n const flippedLeft = triggerRect.right + offset;\n if (flippedLeft + pw <= vw - pad) {\n effectiveSide = \"right\";\n left = flippedLeft;\n }\n }\n\n return { top, left, side: effectiveSide, maxHeight };\n}\n\nconst ARROW_SIZE = 6;\n\nexport const PopoverContent: React.FC<PopoverContentProps> = ({\n children,\n side = \"bottom\",\n align = \"center\",\n offset = 10,\n showArrow = false,\n closeOnClickOutside = true,\n closeOnEscape = true,\n duration = 80,\n viewportPadding = 8,\n container,\n width = \"auto\",\n mobileOptions,\n slideEntrance = true,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n className,\n style,\n ...props\n}) => {\n const { open, setOpen, triggerRef } = usePopover();\n const isMobile = usePopoverIsMobile(POPOVER_MOBILE_SHEET_MAX_PX + 1);\n const resolvedMobile = useMemo(\n () => resolvePopoverMobileSheet(mobileOptions),\n [mobileOptions],\n );\n const sheetMode = isMobile && resolvedMobile.sheet;\n const slideOffsetPx = useMemo(\n () =>\n slideEntranceOffsetPxProp ??\n POPOVER_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX,\n [slideEntranceOffsetPxProp],\n );\n const closeDuration = sheetMode\n ? POPOVER_MOBILE_SHEET_MOTION_MS\n : duration;\n\n const [shouldRender, setShouldRender] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\n const [position, setPosition] = useState<Position>({\n top: -9999,\n left: -9999,\n side,\n });\n const [triggerWidth, setTriggerWidth] = useState<number>(0);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const closePopover = useCallback(() => setOpen(false), [setOpen]);\n\n /** Same open/close sequencing as dropdown mobile sheet / `DialogContent`. */\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(() => setShouldRender(false), closeDuration);\n return () => clearTimeout(timer);\n }\n }, [open, closeDuration]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n // Position calculation – runs after render so the popover has dimensions.\n // Skip while `open` is false: panel still mounts for the exit animation, but\n // `getBoundingClientRect` on the root would reflect `scale()` and re-trigger a jump.\n useLayoutEffect(() => {\n if (\n !shouldRender ||\n !open ||\n sheetMode ||\n !triggerRef.current ||\n !popoverRef.current\n )\n return;\n\n const update = () => {\n if (!triggerRef.current || !popoverRef.current) return;\n setTriggerWidth(triggerRef.current.getBoundingClientRect().width);\n const pos = computePosition(\n triggerRef.current,\n popoverRef.current,\n side,\n align,\n offset,\n viewportPadding,\n );\n setPosition(pos);\n };\n\n update();\n window.addEventListener(\"resize\", update);\n window.addEventListener(\"scroll\", update, true);\n return () => {\n window.removeEventListener(\"resize\", update);\n window.removeEventListener(\"scroll\", update, true);\n };\n }, [shouldRender, open, sheetMode, side, align, offset, viewportPadding]);\n\n useEffect(() => {\n if (!shouldRender || !open || sheetMode || position.maxHeight == null) return;\n const panel = popoverRef.current;\n if (!panel) return;\n const onWheel = (e: WheelEvent) => preventPopoverWheelChain(panel, e);\n panel.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => panel.removeEventListener(\"wheel\", onWheel);\n }, [shouldRender, open, sheetMode, position.maxHeight]);\n\n // Body scroll lock (mobile sheet)\n useEffect(() => {\n if (open && sheetMode) {\n document.body.style.overflow = \"hidden\";\n }\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [open, sheetMode]);\n\n // Close on outside click (floating only — sheet uses scrim `dismissOnBackdropPress`)\n useEffect(() => {\n if (!open || !closeOnClickOutside || sheetMode) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n popoverRef.current?.contains(target) ||\n triggerRef.current?.contains(target)\n )\n return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, closeOnClickOutside, sheetMode, setOpen, triggerRef]);\n\n // Close on Escape\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, closeOnEscape, setOpen]);\n\n if (!shouldRender) return null;\n\n if (sheetMode && typeof document !== \"undefined\") {\n return (\n <PopoverMobileBottomSheetPortal\n {...props}\n open={open}\n isAnimating={isAnimating}\n slideEntrance={slideEntrance}\n slideOffsetPx={slideOffsetPx}\n sheetTitle={resolvedMobile.title}\n sheetExtraClassName={resolvedMobile.sheetExtraClassName}\n contentClassName={cn(resolvedMobile.contentClassName, className)}\n onRequestClose={closePopover}\n dismissOnBackdropPress={closeOnClickOutside}\n menuRef={popoverRef}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n className={undefined}\n style={style}\n data-slot=\"popover-content\"\n >\n {children}\n </PopoverMobileBottomSheetPortal>\n );\n }\n\n // Animation direction by side\n const transformOrigin: Record<Side, string> = {\n bottom: \"top center\",\n top: \"bottom center\",\n left: \"right center\",\n right: \"left center\",\n };\n\n const hiddenTransform: Record<Side, string> = {\n bottom: \"translateY(-6px) scale(0.97)\",\n top: \"translateY(6px) scale(0.97)\",\n left: \"translateX(6px) scale(0.97)\",\n right: \"translateX(-6px) scale(0.97)\",\n };\n\n const resolvedWidth =\n width === \"trigger\" ? triggerWidth : width === \"auto\" ? undefined : width;\n\n // Arrow position relative to popover\n const arrowStyles = (): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: \"absolute\",\n width: 0,\n height: 0,\n pointerEvents: \"none\",\n };\n switch (position.side) {\n case \"bottom\":\n return {\n ...base,\n top: -ARROW_SIZE,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid var(--border)`,\n };\n case \"top\":\n return {\n ...base,\n bottom: -ARROW_SIZE,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderTop: `${ARROW_SIZE}px solid var(--border)`,\n };\n case \"right\":\n return {\n ...base,\n left: -ARROW_SIZE,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid var(--border)`,\n };\n case \"left\":\n return {\n ...base,\n right: -ARROW_SIZE,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderLeft: `${ARROW_SIZE}px solid var(--border)`,\n };\n }\n };\n\n const resolvedContainer =\n container !== undefined\n ? container\n : typeof document !== \"undefined\"\n ? document.body\n : null;\n\n if (!resolvedContainer) return null;\n\n return createPortal(\n <div\n {...props}\n ref={popoverRef}\n className={cn(\n \"bg-background border-primary/10 fixed z-50 rounded-xl border shadow-xl outline-none\",\n className,\n position.maxHeight != null ? \"overflow-y-auto overscroll-contain\" : \"overflow-hidden\",\n )}\n data-slot=\"popover-content\"\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n width: resolvedWidth,\n maxHeight: position.maxHeight,\n transformOrigin: transformOrigin[position.side],\n transform: isAnimating ? \"none\" : hiddenTransform[position.side],\n opacity: isAnimating ? 1 : 0,\n transition: `opacity ${duration}ms ease, transform ${duration}ms ease`,\n ...style,\n }}\n >\n {showArrow && <div style={arrowStyles()} />}\n {children}\n </div>,\n resolvedContainer,\n );\n};\n\n//////////////////////////////////////////////// Sub-components\n\nexport const PopoverHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n className,\n ...props\n}) => (\n <div\n className={cn(\n \"border-primary/10 flex flex-col space-y-1 border-b px-4 py-3\",\n className,\n )}\n {...props}\n />\n);\n\nexport const PopoverFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n className,\n ...props\n}) => (\n <div\n className={cn(\n \"border-primary/10 flex flex-row justify-end gap-2 border-t px-4 py-3\",\n className,\n )}\n {...props}\n />\n);\n\nexport const PopoverTitle: React.FC<\n React.HTMLAttributes<HTMLHeadingElement>\n> = ({ className, ...props }) => (\n <h4\n className={cn(\"text-primary text-sm leading-none font-semibold\", className)}\n {...props}\n />\n);\n\nexport const PopoverDescription: React.FC<\n React.HTMLAttributes<HTMLParagraphElement>\n> = ({ className, ...props }) => (\n <p className={cn(\"text-muted-foreground text-xs\", className)} {...props} />\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../utils/cx.ts","../../../../components/base/select/popover.tsx"],"names":["AriaPopover"],"mappings":";;;;AAEA,IAAM,UAAU,mBAAA,CAAoB;AAAA,EAChC,MAAA,EAAQ;AAAA,IACJ,KAAA,EAAO;AAAA,MACH,MAAM,CAAC,YAAA,EAAc,cAAc,YAAA,EAAc,YAAA,EAAc,cAAc,aAAa;AAAA;AAC9F;AAER,CAAC,CAAA;AAMM,IAAM,EAAA,GAAK,OAAA;ACDX,IAAM,OAAA,GAAU,CAAC,KAAA,KAAwB;AAC5C,EAAA,uBACI,GAAA;AAAA,IAACA,SAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAU,QAAA;AAAA,MACV,gBAAA,EAAkB,CAAA;AAAA,MAClB,MAAA,EAAQ,CAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,KAAA,KACR,EAAA;AAAA,QACI,2LAAA;AAAA,QAEA,MAAM,UAAA,IACF,+JAAA;AAAA,QACJ,MAAM,SAAA,IACF,6JAAA;AAAA,QAEJ,KAAA,CAAM,SAAS,IAAA,IAAQ,WAAA;AAAA,QACvB,KAAA,CAAM,SAAS,IAAA,IAAQ,WAAA;AAAA,QACvB,KAAA,CAAM,SAAS,IAAA,IAAQ,WAAA;AAAA,QAEvB,OAAO,MAAM,SAAA,KAAc,UAAA,GAAa,MAAM,SAAA,CAAU,KAAK,IAAI,KAAA,CAAM;AAAA;AAC3E;AAAA,GAER;AAER","file":"popover.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n text: [\"display-xs\", \"display-sm\", \"display-md\", \"display-lg\", \"display-xl\", \"display-2xl\"],\n },\n },\n});\n\n/**\n * This function is a wrapper around the twMerge function.\n * It is used to merge the classes inside style objects.\n */\nexport const cx = twMerge;\n\n/**\n * This function does nothing besides helping us to be able to\n * sort the classes inside style objects which is not supported\n * by the Tailwind IntelliSense by default.\n */\nexport function sortCx<T extends Record<string, string | number | Record<string, string | number | Record<string, string | number>>>>(classes: T): T {\n return classes;\n}\n","\"use client\";\n\n/** Figma: Select menu popover (11132:11643) — floating menu border + shadow. */\n\nimport type { RefAttributes } from \"react\";\nimport type { PopoverProps as AriaPopoverProps } from \"react-aria-components\";\nimport { Popover as AriaPopover } from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\n\ninterface PopoverProps extends AriaPopoverProps, RefAttributes<HTMLElement> {\n size: \"sm\" | \"md\" | \"lg\";\n}\n\nexport const Popover = (props: PopoverProps) => {\n return (\n <AriaPopover\n placement=\"bottom\"\n containerPadding={0}\n offset={4}\n {...props}\n className={(state) =>\n cx(\n \"w-(--trigger-width) origin-(--trigger-anchor-point) overflow-x-hidden overflow-y-auto rounded-lg bg-primary py-1 shadow-lg ring-1 ring-secondary_alt outline-hidden will-change-transform\",\n\n state.isEntering &&\n \"duration-150 ease-out animate-in fade-in placement-right:slide-in-from-left-0.5 placement-top:slide-in-from-bottom-0.5 placement-bottom:slide-in-from-top-0.5\",\n state.isExiting &&\n \"duration-100 ease-in animate-out fade-out placement-right:slide-out-to-left-0.5 placement-top:slide-out-to-bottom-0.5 placement-bottom:slide-out-to-top-0.5\",\n\n props.size === \"sm\" && \"max-h-56!\",\n props.size === \"md\" && \"max-h-64!\",\n props.size === \"lg\" && \"max-h-80!\",\n\n typeof props.className === \"function\" ? props.className(state) : props.className,\n )\n }\n />\n );\n};\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
var CircleProgressBar = (props) => {
|
|
4
|
+
const { value, min = 0, max = 100 } = props;
|
|
5
|
+
const percentage = (value - min) * 100 / (max - min);
|
|
6
|
+
return /* @__PURE__ */ jsxs("div", { role: "progressbar", "aria-valuenow": value, "aria-valuemin": min, "aria-valuemax": max, className: "relative flex w-max items-center justify-center", children: [
|
|
7
|
+
/* @__PURE__ */ jsxs("span", { className: "absolute text-sm font-medium text-primary", children: [
|
|
8
|
+
percentage,
|
|
9
|
+
"%"
|
|
10
|
+
] }),
|
|
11
|
+
/* @__PURE__ */ jsxs("svg", { className: "size-16 -rotate-90", viewBox: "0 0 60 60", children: [
|
|
12
|
+
/* @__PURE__ */ jsx("circle", { className: "stroke-bg-quaternary", cx: "30", cy: "30", r: "26", fill: "none", strokeWidth: "6" }),
|
|
13
|
+
/* @__PURE__ */ jsx(
|
|
14
|
+
"circle",
|
|
15
|
+
{
|
|
16
|
+
className: "stroke-fg-brand-primary",
|
|
17
|
+
style: {
|
|
18
|
+
strokeDashoffset: `calc(100 - ${percentage})`
|
|
19
|
+
},
|
|
20
|
+
cx: "30",
|
|
21
|
+
cy: "30",
|
|
22
|
+
r: "26",
|
|
23
|
+
fill: "none",
|
|
24
|
+
strokeWidth: "6",
|
|
25
|
+
strokeDasharray: "100",
|
|
26
|
+
pathLength: "100",
|
|
27
|
+
strokeLinecap: "round"
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
] })
|
|
31
|
+
] });
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { CircleProgressBar };
|
|
35
|
+
//# sourceMappingURL=progress-circle.js.map
|
|
36
|
+
//# sourceMappingURL=progress-circle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../components/base/progress-indicators/simple-circle.tsx"],"names":[],"mappings":";;AAEO,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAAiD;AAC/E,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,KAAI,GAAI,KAAA;AACtC,EAAA,MAAM,UAAA,GAAA,CAAe,KAAA,GAAQ,GAAA,IAAO,GAAA,IAAQ,GAAA,GAAM,GAAA,CAAA;AAElD,EAAA,uBACI,IAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,aAAA,EAAc,eAAA,EAAe,KAAA,EAAO,eAAA,EAAe,GAAA,EAAK,eAAA,EAAe,GAAA,EAAK,SAAA,EAAU,iDAAA,EAC5F,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2CAAA,EAA6C,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MAAW;AAAA,KAAA,EAAC,CAAA;AAAA,oBACzE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,SAAQ,WAAA,EACxC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,sBAAA,EAAuB,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,IAAA,EAAK,MAAA,EAAO,WAAA,EAAY,GAAA,EAAI,CAAA;AAAA,sBAC5F,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACG,SAAA,EAAU,yBAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACH,gBAAA,EAAkB,cAAc,UAAU,CAAA,CAAA;AAAA,WAC9C;AAAA,UACA,EAAA,EAAG,IAAA;AAAA,UACH,EAAA,EAAG,IAAA;AAAA,UACH,CAAA,EAAE,IAAA;AAAA,UACF,IAAA,EAAK,MAAA;AAAA,UACL,WAAA,EAAY,GAAA;AAAA,UACZ,eAAA,EAAgB,KAAA;AAAA,UAChB,UAAA,EAAW,KAAA;AAAA,UACX,aAAA,EAAc;AAAA;AAAA;AAClB,KAAA,EACJ;AAAA,GAAA,EACJ,CAAA;AAER","file":"progress-circle.js","sourcesContent":["\"use client\";\n\nexport const CircleProgressBar = (props: { value: number; min?: 0; max?: 100 }) => {\n const { value, min = 0, max = 100 } = props;\n const percentage = ((value - min) * 100) / (max - min);\n\n return (\n <div role=\"progressbar\" aria-valuenow={value} aria-valuemin={min} aria-valuemax={max} className=\"relative flex w-max items-center justify-center\">\n <span className=\"absolute text-sm font-medium text-primary\">{percentage}%</span>\n <svg className=\"size-16 -rotate-90\" viewBox=\"0 0 60 60\">\n <circle className=\"stroke-bg-quaternary\" cx=\"30\" cy=\"30\" r=\"26\" fill=\"none\" strokeWidth=\"6\" />\n <circle\n className=\"stroke-fg-brand-primary\"\n style={{\n strokeDashoffset: `calc(100 - ${percentage})`,\n }}\n cx=\"30\"\n cy=\"30\"\n r=\"26\"\n fill=\"none\"\n strokeWidth=\"6\"\n strokeDasharray=\"100\"\n pathLength=\"100\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
|
|
3
|
+
interface ProgressBarProps {
|
|
4
|
+
value: number;
|
|
5
|
+
min?: number;
|
|
6
|
+
max?: number;
|
|
7
|
+
size: "xxs" | "xs" | "sm" | "md" | "lg";
|
|
8
|
+
label?: string;
|
|
9
|
+
valueFormatter?: (value: number, valueInPercentage: number) => string | number;
|
|
10
|
+
}
|
|
11
|
+
declare const ProgressBarCircle: ({ value, min, max, size, label, valueFormatter }: ProgressBarProps) => react.JSX.Element;
|
|
12
|
+
declare const ProgressBarHalfCircle: ({ value, min, max, size, label, valueFormatter }: ProgressBarProps) => react.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { ProgressBarCircle, ProgressBarHalfCircle };
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { extendTailwindMerge } from 'tailwind-merge';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
var twMerge = extendTailwindMerge({
|
|
5
|
+
extend: {
|
|
6
|
+
theme: {
|
|
7
|
+
text: ["display-xs", "display-sm", "display-md", "display-lg", "display-xl", "display-2xl"]
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var cx = twMerge;
|
|
12
|
+
function sortCx(classes) {
|
|
13
|
+
return classes;
|
|
14
|
+
}
|
|
15
|
+
var sizes = sortCx({
|
|
16
|
+
xxs: {
|
|
17
|
+
strokeWidth: 6,
|
|
18
|
+
radius: 29,
|
|
19
|
+
valueClass: "text-sm font-semibold text-primary",
|
|
20
|
+
labelClass: "text-xs font-medium text-tertiary",
|
|
21
|
+
halfCircleTextPosition: "absolute bottom-0.5 text-center"
|
|
22
|
+
},
|
|
23
|
+
xs: {
|
|
24
|
+
strokeWidth: 16,
|
|
25
|
+
radius: 72,
|
|
26
|
+
valueClass: "text-display-xs font-semibold text-primary",
|
|
27
|
+
labelClass: "text-xs font-medium text-tertiary",
|
|
28
|
+
halfCircleTextPosition: "absolute bottom-0.5 text-center"
|
|
29
|
+
},
|
|
30
|
+
sm: {
|
|
31
|
+
strokeWidth: 20,
|
|
32
|
+
radius: 90,
|
|
33
|
+
valueClass: "text-display-sm font-semibold text-primary",
|
|
34
|
+
labelClass: "text-xs font-medium text-tertiary",
|
|
35
|
+
halfCircleTextPosition: "absolute bottom-2 text-center"
|
|
36
|
+
},
|
|
37
|
+
md: {
|
|
38
|
+
strokeWidth: 24,
|
|
39
|
+
radius: 108,
|
|
40
|
+
valueClass: "text-display-md font-semibold text-primary",
|
|
41
|
+
labelClass: "text-sm font-medium text-tertiary",
|
|
42
|
+
halfCircleTextPosition: "absolute bottom-1 text-center"
|
|
43
|
+
},
|
|
44
|
+
lg: {
|
|
45
|
+
strokeWidth: 28,
|
|
46
|
+
radius: 126,
|
|
47
|
+
valueClass: "text-display-lg font-semibold text-primary",
|
|
48
|
+
labelClass: "text-sm font-medium text-tertiary",
|
|
49
|
+
halfCircleTextPosition: "absolute bottom-0 text-center"
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
var ProgressBarCircle = ({ value, min = 0, max = 100, size, label, valueFormatter }) => {
|
|
53
|
+
const percentage = Math.round((value - min) * 100 / (max - min));
|
|
54
|
+
const sizeConfig = sizes[size];
|
|
55
|
+
const { strokeWidth, radius, valueClass, labelClass } = sizeConfig;
|
|
56
|
+
const diameter = 2 * (radius + strokeWidth / 2);
|
|
57
|
+
const width = diameter;
|
|
58
|
+
const height = diameter;
|
|
59
|
+
const viewBox = `0 0 ${width} ${height}`;
|
|
60
|
+
const cx2 = diameter / 2;
|
|
61
|
+
const cy = diameter / 2;
|
|
62
|
+
const textPosition = label ? "absolute text-center" : "absolute text-primary";
|
|
63
|
+
const strokeDashoffset = 100 - percentage;
|
|
64
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-0.5", children: [
|
|
65
|
+
/* @__PURE__ */ jsxs("div", { role: "progressbar", "aria-valuenow": value, "aria-valuemin": min, "aria-valuemax": max, className: "relative flex w-max items-center justify-center", children: [
|
|
66
|
+
/* @__PURE__ */ jsxs("svg", { className: "-rotate-90", width, height, viewBox, children: [
|
|
67
|
+
/* @__PURE__ */ jsx(
|
|
68
|
+
"circle",
|
|
69
|
+
{
|
|
70
|
+
className: "stroke-bg-quaternary",
|
|
71
|
+
cx: cx2,
|
|
72
|
+
cy,
|
|
73
|
+
r: radius,
|
|
74
|
+
fill: "none",
|
|
75
|
+
strokeWidth,
|
|
76
|
+
pathLength: "100",
|
|
77
|
+
strokeDasharray: "100",
|
|
78
|
+
strokeLinecap: "round"
|
|
79
|
+
}
|
|
80
|
+
),
|
|
81
|
+
/* @__PURE__ */ jsx(
|
|
82
|
+
"circle",
|
|
83
|
+
{
|
|
84
|
+
className: "stroke-fg-brand-primary",
|
|
85
|
+
cx: cx2,
|
|
86
|
+
cy,
|
|
87
|
+
r: radius,
|
|
88
|
+
fill: "none",
|
|
89
|
+
strokeWidth,
|
|
90
|
+
pathLength: "100",
|
|
91
|
+
strokeDasharray: "100",
|
|
92
|
+
strokeLinecap: "round",
|
|
93
|
+
strokeDashoffset
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
] }),
|
|
97
|
+
label && size !== "xxs" ? /* @__PURE__ */ jsxs("div", { className: "absolute text-center", children: [
|
|
98
|
+
/* @__PURE__ */ jsx("div", { className: labelClass, children: label }),
|
|
99
|
+
/* @__PURE__ */ jsx("div", { className: valueClass, children: valueFormatter ? valueFormatter(value, percentage) : `${percentage}%` })
|
|
100
|
+
] }) : /* @__PURE__ */ jsx("span", { className: cx(textPosition, valueClass), children: valueFormatter ? valueFormatter(value, percentage) : `${percentage}%` })
|
|
101
|
+
] }),
|
|
102
|
+
label && size === "xxs" && /* @__PURE__ */ jsx("div", { className: labelClass, children: label })
|
|
103
|
+
] });
|
|
104
|
+
};
|
|
105
|
+
var ProgressBarHalfCircle = ({ value, min = 0, max = 100, size, label, valueFormatter }) => {
|
|
106
|
+
const percentage = Math.round((value - min) * 100 / (max - min));
|
|
107
|
+
const sizeConfig = sizes[size];
|
|
108
|
+
const { strokeWidth, radius, valueClass, labelClass, halfCircleTextPosition } = sizeConfig;
|
|
109
|
+
const width = 2 * (radius + strokeWidth / 2);
|
|
110
|
+
const height = radius + strokeWidth;
|
|
111
|
+
const viewBox = `0 0 ${width} ${height}`;
|
|
112
|
+
const cx2 = "50%";
|
|
113
|
+
const cy = radius + strokeWidth / 2;
|
|
114
|
+
const strokeDashoffset = -50 - (100 - percentage) / 2;
|
|
115
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-0.5", children: [
|
|
116
|
+
/* @__PURE__ */ jsxs("div", { role: "progressbar", "aria-valuenow": value, "aria-valuemin": min, "aria-valuemax": max, className: "relative flex w-max items-center justify-center", children: [
|
|
117
|
+
/* @__PURE__ */ jsxs("svg", { width, height, viewBox, children: [
|
|
118
|
+
/* @__PURE__ */ jsx(
|
|
119
|
+
"circle",
|
|
120
|
+
{
|
|
121
|
+
className: "stroke-bg-quaternary",
|
|
122
|
+
cx: cx2,
|
|
123
|
+
cy,
|
|
124
|
+
r: radius,
|
|
125
|
+
fill: "none",
|
|
126
|
+
strokeWidth,
|
|
127
|
+
pathLength: "100",
|
|
128
|
+
strokeDasharray: "100",
|
|
129
|
+
strokeDashoffset: "-50",
|
|
130
|
+
strokeLinecap: "round"
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
/* @__PURE__ */ jsx(
|
|
134
|
+
"circle",
|
|
135
|
+
{
|
|
136
|
+
className: "origin-center -scale-x-100 stroke-fg-brand-primary",
|
|
137
|
+
cx: cx2,
|
|
138
|
+
cy,
|
|
139
|
+
r: radius,
|
|
140
|
+
fill: "none",
|
|
141
|
+
strokeWidth,
|
|
142
|
+
pathLength: "100",
|
|
143
|
+
strokeDasharray: "100",
|
|
144
|
+
strokeDashoffset,
|
|
145
|
+
strokeLinecap: "round"
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
] }),
|
|
149
|
+
label && size !== "xxs" ? /* @__PURE__ */ jsxs("div", { className: halfCircleTextPosition, children: [
|
|
150
|
+
/* @__PURE__ */ jsx("div", { className: labelClass, children: label }),
|
|
151
|
+
/* @__PURE__ */ jsx("div", { className: valueClass, children: valueFormatter ? valueFormatter(value, percentage) : `${percentage}%` })
|
|
152
|
+
] }) : /* @__PURE__ */ jsx("span", { className: cx(halfCircleTextPosition, valueClass), children: valueFormatter ? valueFormatter(value, percentage) : `${percentage}%` })
|
|
153
|
+
] }),
|
|
154
|
+
label && size === "xxs" && /* @__PURE__ */ jsx("div", { className: labelClass, children: label })
|
|
155
|
+
] });
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
export { ProgressBarCircle, ProgressBarHalfCircle };
|
|
159
|
+
//# sourceMappingURL=progress-circles.js.map
|
|
160
|
+
//# sourceMappingURL=progress-circles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../utils/cx.ts","../../../../components/base/progress-indicators/progress-circles.tsx"],"names":["cx"],"mappings":"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","file":"progress-circles.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n text: [\"display-xs\", \"display-sm\", \"display-md\", \"display-lg\", \"display-xl\", \"display-2xl\"],\n },\n },\n});\n\n/**\n * This function is a wrapper around the twMerge function.\n * It is used to merge the classes inside style objects.\n */\nexport const cx = twMerge;\n\n/**\n * This function does nothing besides helping us to be able to\n * sort the classes inside style objects which is not supported\n * by the Tailwind IntelliSense by default.\n */\nexport function sortCx<T extends Record<string, string | number | Record<string, string | number | Record<string, string | number>>>>(classes: T): T {\n return classes;\n}\n","\"use client\";\n\nimport { cx as clx, sortCx } from \"@/utils/cx\";\n\ninterface ProgressBarProps {\n value: number;\n min?: number;\n max?: number;\n size: \"xxs\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\n label?: string;\n valueFormatter?: (value: number, valueInPercentage: number) => string | number;\n}\n\nconst sizes = sortCx({\n xxs: {\n strokeWidth: 6,\n radius: 29,\n valueClass: \"text-sm font-semibold text-primary\",\n labelClass: \"text-xs font-medium text-tertiary\",\n halfCircleTextPosition: \"absolute bottom-0.5 text-center\",\n },\n xs: {\n strokeWidth: 16,\n radius: 72,\n valueClass: \"text-display-xs font-semibold text-primary\",\n labelClass: \"text-xs font-medium text-tertiary\",\n halfCircleTextPosition: \"absolute bottom-0.5 text-center\",\n },\n sm: {\n strokeWidth: 20,\n radius: 90,\n valueClass: \"text-display-sm font-semibold text-primary\",\n labelClass: \"text-xs font-medium text-tertiary\",\n halfCircleTextPosition: \"absolute bottom-2 text-center\",\n },\n md: {\n strokeWidth: 24,\n radius: 108,\n valueClass: \"text-display-md font-semibold text-primary\",\n labelClass: \"text-sm font-medium text-tertiary\",\n halfCircleTextPosition: \"absolute bottom-1 text-center\",\n },\n lg: {\n strokeWidth: 28,\n radius: 126,\n valueClass: \"text-display-lg font-semibold text-primary\",\n labelClass: \"text-sm font-medium text-tertiary\",\n halfCircleTextPosition: \"absolute bottom-0 text-center\",\n },\n});\n\nexport const ProgressBarCircle = ({ value, min = 0, max = 100, size, label, valueFormatter }: ProgressBarProps) => {\n const percentage = Math.round(((value - min) * 100) / (max - min));\n\n const sizeConfig = sizes[size];\n\n const { strokeWidth, radius, valueClass, labelClass } = sizeConfig;\n\n const diameter = 2 * (radius + strokeWidth / 2);\n const width = diameter;\n const height = diameter;\n const viewBox = `0 0 ${width} ${height}`;\n const cx = diameter / 2;\n const cy = diameter / 2;\n\n const textPosition = label ? \"absolute text-center\" : \"absolute text-primary\";\n const strokeDashoffset = 100 - percentage;\n\n return (\n <div className=\"flex flex-col items-center gap-0.5\">\n <div role=\"progressbar\" aria-valuenow={value} aria-valuemin={min} aria-valuemax={max} className=\"relative flex w-max items-center justify-center\">\n <svg className=\"-rotate-90\" width={width} height={height} viewBox={viewBox}>\n {/* Background circle */}\n <circle\n className=\"stroke-bg-quaternary\"\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n pathLength=\"100\"\n strokeDasharray=\"100\"\n strokeLinecap=\"round\"\n />\n\n {/* Foreground circle */}\n <circle\n className=\"stroke-fg-brand-primary\"\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n pathLength=\"100\"\n strokeDasharray=\"100\"\n strokeLinecap=\"round\"\n strokeDashoffset={strokeDashoffset}\n />\n </svg>\n {label && size !== \"xxs\" ? (\n <div className=\"absolute text-center\">\n <div className={labelClass}>{label}</div>\n <div className={valueClass}>{valueFormatter ? valueFormatter(value, percentage) : `${percentage}%`}</div>\n </div>\n ) : (\n <span className={clx(textPosition, valueClass)}>{valueFormatter ? valueFormatter(value, percentage) : `${percentage}%`}</span>\n )}\n </div>\n\n {label && size === \"xxs\" && <div className={labelClass}>{label}</div>}\n </div>\n );\n};\n\nexport const ProgressBarHalfCircle = ({ value, min = 0, max = 100, size, label, valueFormatter }: ProgressBarProps) => {\n const percentage = Math.round(((value - min) * 100) / (max - min));\n\n const sizeConfig = sizes[size];\n\n const { strokeWidth, radius, valueClass, labelClass, halfCircleTextPosition } = sizeConfig;\n\n const width = 2 * (radius + strokeWidth / 2);\n const height = radius + strokeWidth;\n const viewBox = `0 0 ${width} ${height}`;\n const cx = \"50%\";\n const cy = radius + strokeWidth / 2;\n\n const strokeDashoffset = -50 - (100 - percentage) / 2;\n\n return (\n <div className=\"flex flex-col items-center gap-0.5\">\n <div role=\"progressbar\" aria-valuenow={value} aria-valuemin={min} aria-valuemax={max} className=\"relative flex w-max items-center justify-center\">\n <svg width={width} height={height} viewBox={viewBox}>\n {/* Background half-circle */}\n <circle\n className=\"stroke-bg-quaternary\"\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n pathLength=\"100\"\n strokeDasharray=\"100\"\n strokeDashoffset=\"-50\"\n strokeLinecap=\"round\"\n />\n\n {/* Foreground half-circle */}\n <circle\n className=\"origin-center -scale-x-100 stroke-fg-brand-primary\"\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n pathLength=\"100\"\n strokeDasharray=\"100\"\n strokeDashoffset={strokeDashoffset}\n strokeLinecap=\"round\"\n />\n </svg>\n\n {label && size !== \"xxs\" ? (\n <div className={halfCircleTextPosition}>\n <div className={labelClass}>{label}</div>\n <div className={valueClass}>{valueFormatter ? valueFormatter(value, percentage) : `${percentage}%`}</div>\n </div>\n ) : (\n <span className={clx(halfCircleTextPosition, valueClass)}>{valueFormatter ? valueFormatter(value, percentage) : `${percentage}%`}</span>\n )}\n </div>\n\n {label && size === \"xxs\" && <div className={labelClass}>{label}</div>}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
|
|
3
|
+
interface ProgressBarProps {
|
|
4
|
+
/**
|
|
5
|
+
* The current value of the progress bar.
|
|
6
|
+
*/
|
|
7
|
+
value: number;
|
|
8
|
+
/**
|
|
9
|
+
* The minimum value of the progress bar.
|
|
10
|
+
* @default 0
|
|
11
|
+
*/
|
|
12
|
+
min?: number;
|
|
13
|
+
/**
|
|
14
|
+
* The maximum value of the progress bar.
|
|
15
|
+
* @default 100
|
|
16
|
+
*/
|
|
17
|
+
max?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Optional additional CSS class names for the progress bar container.
|
|
20
|
+
*/
|
|
21
|
+
className?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Optional additional CSS class names for the progress bar indicator element.
|
|
24
|
+
*/
|
|
25
|
+
progressClassName?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Optional function to format the displayed value.
|
|
28
|
+
* It receives the raw value and the calculated percentage.
|
|
29
|
+
*/
|
|
30
|
+
valueFormatter?: (value: number, valueInPercentage: number) => string | number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A basic progress bar component.
|
|
34
|
+
*/
|
|
35
|
+
declare const ProgressBarBase: ({ value, min, max, className, progressClassName }: ProgressBarProps) => react.JSX.Element;
|
|
36
|
+
type ProgressBarLabelPosition = "right" | "bottom" | "top-floating" | "bottom-floating";
|
|
37
|
+
interface ProgressIndicatorWithTextProps extends ProgressBarProps {
|
|
38
|
+
/**
|
|
39
|
+
* Specifies the layout of the text relative to the progress bar.
|
|
40
|
+
* - `right`: Text is displayed to the right of the progress bar.
|
|
41
|
+
* - `bottom`: Text is displayed below the progress bar, aligned to the right.
|
|
42
|
+
* - `top-floating`: Text is displayed in a floating tooltip above the progress indicator.
|
|
43
|
+
* - `bottom-floating`: Text is displayed in a floating tooltip below the progress indicator.
|
|
44
|
+
*/
|
|
45
|
+
labelPosition?: ProgressBarLabelPosition;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A progress bar component that displays the value text in various configurable layouts.
|
|
49
|
+
*/
|
|
50
|
+
declare const ProgressBar: ({ value, min, max, valueFormatter, labelPosition, className, progressClassName }: ProgressIndicatorWithTextProps) => react.JSX.Element;
|
|
51
|
+
|
|
52
|
+
export { ProgressBar, ProgressBarBase, type ProgressBarProps, type ProgressIndicatorWithTextProps };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { extendTailwindMerge } from 'tailwind-merge';
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
var twMerge = extendTailwindMerge({
|
|
5
|
+
extend: {
|
|
6
|
+
theme: {
|
|
7
|
+
text: ["display-xs", "display-sm", "display-md", "display-lg", "display-xl", "display-2xl"]
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var cx = twMerge;
|
|
12
|
+
var ProgressBarBase = ({ value, min = 0, max = 100, className, progressClassName }) => {
|
|
13
|
+
const percentage = (value - min) * 100 / (max - min);
|
|
14
|
+
return /* @__PURE__ */ jsx(
|
|
15
|
+
"div",
|
|
16
|
+
{
|
|
17
|
+
role: "progressbar",
|
|
18
|
+
"aria-valuenow": value,
|
|
19
|
+
"aria-valuemin": min,
|
|
20
|
+
"aria-valuemax": max,
|
|
21
|
+
className: cx("h-2 w-full overflow-hidden rounded-md bg-quaternary", className),
|
|
22
|
+
children: /* @__PURE__ */ jsx(
|
|
23
|
+
"div",
|
|
24
|
+
{
|
|
25
|
+
style: { transform: `translateX(-${100 - percentage}%)` },
|
|
26
|
+
className: cx("size-full rounded-md bg-fg-brand-primary transition duration-75 ease-linear", progressClassName)
|
|
27
|
+
}
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
var ProgressBar = ({ value, min = 0, max = 100, valueFormatter, labelPosition, className, progressClassName }) => {
|
|
33
|
+
const percentage = (value - min) * 100 / (max - min);
|
|
34
|
+
const formattedValue = valueFormatter ? valueFormatter(value, percentage) : `${percentage.toFixed(0)}%`;
|
|
35
|
+
const baseProgressBar = /* @__PURE__ */ jsx(ProgressBarBase, { min, max, value, className, progressClassName });
|
|
36
|
+
switch (labelPosition) {
|
|
37
|
+
case "right":
|
|
38
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
39
|
+
baseProgressBar,
|
|
40
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-sm font-medium text-secondary tabular-nums", children: formattedValue })
|
|
41
|
+
] });
|
|
42
|
+
case "bottom":
|
|
43
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-end gap-2", children: [
|
|
44
|
+
baseProgressBar,
|
|
45
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-secondary tabular-nums", children: formattedValue })
|
|
46
|
+
] });
|
|
47
|
+
case "top-floating":
|
|
48
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col items-end gap-2", children: [
|
|
49
|
+
baseProgressBar,
|
|
50
|
+
/* @__PURE__ */ jsx(
|
|
51
|
+
"div",
|
|
52
|
+
{
|
|
53
|
+
style: { left: `${percentage}%` },
|
|
54
|
+
className: "absolute -top-2 -translate-x-1/2 -translate-y-full rounded-lg bg-primary_alt px-3 py-2 shadow-lg ring-1 ring-secondary_alt",
|
|
55
|
+
children: /* @__PURE__ */ jsx("div", { className: "text-xs font-semibold text-secondary tabular-nums", children: formattedValue })
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
] });
|
|
59
|
+
case "bottom-floating":
|
|
60
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col items-end gap-2", children: [
|
|
61
|
+
baseProgressBar,
|
|
62
|
+
/* @__PURE__ */ jsx(
|
|
63
|
+
"div",
|
|
64
|
+
{
|
|
65
|
+
style: { left: `${percentage}%` },
|
|
66
|
+
className: "absolute -bottom-2 -translate-x-1/2 translate-y-full rounded-lg bg-primary_alt px-3 py-2 shadow-lg ring-1 ring-secondary_alt",
|
|
67
|
+
children: /* @__PURE__ */ jsx("div", { className: "text-xs font-semibold text-secondary", children: formattedValue })
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
] });
|
|
71
|
+
default:
|
|
72
|
+
return baseProgressBar;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export { ProgressBar, ProgressBarBase };
|
|
77
|
+
//# sourceMappingURL=progress-indicators.js.map
|
|
78
|
+
//# sourceMappingURL=progress-indicators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../utils/cx.ts","../../../../components/base/progress-indicators/progress-indicators.tsx"],"names":[],"mappings":"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","file":"progress-indicators.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n text: [\"display-xs\", \"display-sm\", \"display-md\", \"display-lg\", \"display-xl\", \"display-2xl\"],\n },\n },\n});\n\n/**\n * This function is a wrapper around the twMerge function.\n * It is used to merge the classes inside style objects.\n */\nexport const cx = twMerge;\n\n/**\n * This function does nothing besides helping us to be able to\n * sort the classes inside style objects which is not supported\n * by the Tailwind IntelliSense by default.\n */\nexport function sortCx<T extends Record<string, string | number | Record<string, string | number | Record<string, string | number>>>>(classes: T): T {\n return classes;\n}\n","\"use client\";\n\n/** Figma: Progress indicators (1154:89940) */\n\nimport { cx } from \"@/utils/cx\";\n\nexport interface ProgressBarProps {\n /**\n * The current value of the progress bar.\n */\n value: number;\n /**\n * The minimum value of the progress bar.\n * @default 0\n */\n min?: number;\n /**\n * The maximum value of the progress bar.\n * @default 100\n */\n max?: number;\n /**\n * Optional additional CSS class names for the progress bar container.\n */\n className?: string;\n /**\n * Optional additional CSS class names for the progress bar indicator element.\n */\n progressClassName?: string;\n /**\n * Optional function to format the displayed value.\n * It receives the raw value and the calculated percentage.\n */\n valueFormatter?: (value: number, valueInPercentage: number) => string | number;\n}\n\n/**\n * A basic progress bar component.\n */\nexport const ProgressBarBase = ({ value, min = 0, max = 100, className, progressClassName }: ProgressBarProps) => {\n const percentage = ((value - min) * 100) / (max - min);\n\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n className={cx(\"h-2 w-full overflow-hidden rounded-md bg-quaternary\", className)}\n >\n <div\n // Use transform instead of width to avoid layout thrashing (and for smoother animation)\n style={{ transform: `translateX(-${100 - percentage}%)` }}\n className={cx(\"size-full rounded-md bg-fg-brand-primary transition duration-75 ease-linear\", progressClassName)}\n />\n </div>\n );\n};\n\ntype ProgressBarLabelPosition = \"right\" | \"bottom\" | \"top-floating\" | \"bottom-floating\";\n\nexport interface ProgressIndicatorWithTextProps extends ProgressBarProps {\n /**\n * Specifies the layout of the text relative to the progress bar.\n * - `right`: Text is displayed to the right of the progress bar.\n * - `bottom`: Text is displayed below the progress bar, aligned to the right.\n * - `top-floating`: Text is displayed in a floating tooltip above the progress indicator.\n * - `bottom-floating`: Text is displayed in a floating tooltip below the progress indicator.\n */\n labelPosition?: ProgressBarLabelPosition;\n}\n\n/**\n * A progress bar component that displays the value text in various configurable layouts.\n */\nexport const ProgressBar = ({ value, min = 0, max = 100, valueFormatter, labelPosition, className, progressClassName }: ProgressIndicatorWithTextProps) => {\n const percentage = ((value - min) * 100) / (max - min);\n const formattedValue = valueFormatter ? valueFormatter(value, percentage) : `${percentage.toFixed(0)}%`; // Default to rounded percentage\n\n const baseProgressBar = <ProgressBarBase min={min} max={max} value={value} className={className} progressClassName={progressClassName} />;\n\n switch (labelPosition) {\n case \"right\":\n return (\n <div className=\"flex items-center gap-3\">\n {baseProgressBar}\n <span className=\"shrink-0 text-sm font-medium text-secondary tabular-nums\">{formattedValue}</span>\n </div>\n );\n case \"bottom\":\n return (\n <div className=\"flex flex-col items-end gap-2\">\n {baseProgressBar}\n <span className=\"text-sm font-medium text-secondary tabular-nums\">{formattedValue}</span>\n </div>\n );\n case \"top-floating\":\n return (\n <div className=\"relative flex flex-col items-end gap-2\">\n {baseProgressBar}\n <div\n style={{ left: `${percentage}%` }}\n className=\"absolute -top-2 -translate-x-1/2 -translate-y-full rounded-lg bg-primary_alt px-3 py-2 shadow-lg ring-1 ring-secondary_alt\"\n >\n <div className=\"text-xs font-semibold text-secondary tabular-nums\">{formattedValue}</div>\n </div>\n </div>\n );\n case \"bottom-floating\":\n return (\n <div className=\"relative flex flex-col items-end gap-2\">\n {baseProgressBar}\n <div\n style={{ left: `${percentage}%` }}\n className=\"absolute -bottom-2 -translate-x-1/2 translate-y-full rounded-lg bg-primary_alt px-3 py-2 shadow-lg ring-1 ring-secondary_alt\"\n >\n <div className=\"text-xs font-semibold text-secondary\">{formattedValue}</div>\n </div>\n </div>\n );\n default:\n // Fallback or default case, could render the basic progress bar or throw an error\n return baseProgressBar;\n }\n};\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, Ref } from 'react';
|
|
3
|
+
import { RadioProps, RadioGroupProps as RadioGroupProps$1 } from 'react-aria-components';
|
|
4
|
+
|
|
5
|
+
interface RadioGroupContextType {
|
|
6
|
+
size?: "sm" | "md";
|
|
7
|
+
}
|
|
8
|
+
interface RadioButtonBaseProps {
|
|
9
|
+
size?: "sm" | "md";
|
|
10
|
+
className?: string;
|
|
11
|
+
isFocusVisible?: boolean;
|
|
12
|
+
isSelected?: boolean;
|
|
13
|
+
isDisabled?: boolean;
|
|
14
|
+
}
|
|
15
|
+
declare const RadioButtonBase: {
|
|
16
|
+
({ className, isFocusVisible, isSelected, isDisabled, size }: RadioButtonBaseProps): react.JSX.Element;
|
|
17
|
+
displayName: string;
|
|
18
|
+
};
|
|
19
|
+
interface RadioButtonProps extends RadioProps {
|
|
20
|
+
size?: "sm" | "md";
|
|
21
|
+
label?: ReactNode;
|
|
22
|
+
hint?: ReactNode;
|
|
23
|
+
ref?: Ref<HTMLLabelElement>;
|
|
24
|
+
}
|
|
25
|
+
declare const RadioButton: {
|
|
26
|
+
({ label, hint, className, size, ...ariaRadioProps }: RadioButtonProps): react.JSX.Element;
|
|
27
|
+
displayName: string;
|
|
28
|
+
};
|
|
29
|
+
interface RadioGroupProps extends RadioGroupContextType, RadioGroupProps$1 {
|
|
30
|
+
children: ReactNode;
|
|
31
|
+
className?: string;
|
|
32
|
+
}
|
|
33
|
+
declare const RadioGroup: ({ children, className, size, ...props }: RadioGroupProps) => react.JSX.Element;
|
|
34
|
+
|
|
35
|
+
export { RadioButton, RadioButtonBase, type RadioButtonBaseProps, RadioGroup, type RadioGroupContextType };
|