UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

560 lines (556 loc) 14.7 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/components/ProgressBar/ProgressBar.tsx var ProgressBar_exports = {}; __export(ProgressBar_exports, { default: () => ProgressBar_default }); module.exports = __toCommonJS(ProgressBar_exports); // src/utils/utils.ts var import_clsx = require("clsx"); var import_tailwind_merge = require("tailwind-merge"); function cn(...inputs) { return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs)); } // src/components/Text/Text.tsx var import_jsx_runtime = require("react/jsx-runtime"); var Text = ({ children, size = "md", weight = "normal", color = "text-text-950", as, className = "", ...props }) => { let sizeClasses = ""; let weightClasses = ""; const sizeClassMap = { "2xs": "text-2xs", xs: "text-xs", sm: "text-sm", md: "text-md", lg: "text-lg", xl: "text-xl", "2xl": "text-2xl", "3xl": "text-3xl", "4xl": "text-4xl", "5xl": "text-5xl", "6xl": "text-6xl" }; sizeClasses = sizeClassMap[size] ?? sizeClassMap.md; const weightClassMap = { hairline: "font-hairline", light: "font-light", normal: "font-normal", medium: "font-medium", semibold: "font-semibold", bold: "font-bold", extrabold: "font-extrabold", black: "font-black" }; weightClasses = weightClassMap[weight] ?? weightClassMap.normal; const baseClasses = "font-primary"; const Component = as ?? "p"; return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( Component, { className: cn(baseClasses, sizeClasses, weightClasses, color, className), ...props, children } ); }; var Text_default = Text; // src/components/ProgressBar/ProgressBar.tsx var import_jsx_runtime2 = require("react/jsx-runtime"); var SIZE_CLASSES = { small: { container: "h-1", // 4px height (h-1 = 4px in Tailwind) bar: "h-1", // 4px height for the fill bar spacing: "gap-2", // 8px gap between label and progress bar layout: "flex-col", // vertical layout for small borderRadius: "rounded-full" // 9999px border radius }, medium: { container: "h-2", // 8px height (h-2 = 8px in Tailwind) bar: "h-2", // 8px height for the fill bar spacing: "gap-2", // 8px gap between progress bar and label layout: "flex-row items-center", // horizontal layout for medium borderRadius: "rounded-lg" // 8px border radius } }; var VARIANT_CLASSES = { blue: { background: "bg-background-300", // Background track color (#D5D4D4) fill: "bg-primary-700" // Blue for activity progress (#2271C4) }, green: { background: "bg-background-300", // Background track color (#D5D4D4) fill: "bg-success-200" // Green for performance (#84D3A2) } }; var calculateProgressValues = (value, max) => { const safeValue = isNaN(value) ? 0 : value; const clampedValue = Math.max(0, Math.min(safeValue, max)); const percentage = max === 0 ? 0 : clampedValue / max * 100; return { clampedValue, percentage }; }; var shouldShowHeader = (label, showPercentage, showHitCount) => { return !!(label || showPercentage || showHitCount); }; var getDisplayPriority = (showHitCount, showPercentage, label, clampedValue, max, percentage) => { if (showHitCount) { return { type: "hitCount", content: `${Math.round(clampedValue)} de ${max}`, hasMetrics: true }; } if (showPercentage) { return { type: "percentage", content: `${Math.round(percentage)}%`, hasMetrics: true }; } return { type: "label", content: label, hasMetrics: false }; }; var getCompactLayoutConfig = ({ showPercentage, showHitCount, percentage, clampedValue, max, label, percentageClassName, labelClassName }) => { const displayPriority = getDisplayPriority( showHitCount, showPercentage, label, clampedValue, max, percentage ); return { color: displayPriority.hasMetrics ? "text-primary-600" : "text-primary-700", className: displayPriority.hasMetrics ? percentageClassName : labelClassName, content: displayPriority.content }; }; var getDefaultLayoutDisplayConfig = (size, label, showPercentage) => ({ showHeader: size === "small" && !!(label || showPercentage), showPercentage: size === "medium" && showPercentage, showLabel: size === "medium" && !!label && !showPercentage // Only show label when percentage is not shown }); var renderStackedHitCountDisplay = (showHitCount, showPercentage, clampedValue, max, percentage, percentageClassName) => { if (!showHitCount && !showPercentage) return null; const displayPriority = getDisplayPriority( showHitCount, showPercentage, null, // label is not relevant for stacked layout metrics display clampedValue, max, percentage ); return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( "div", { className: cn( "text-xs font-medium leading-[14px] text-right", percentageClassName ), children: displayPriority.type === "hitCount" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-success-200", children: Math.round(clampedValue) }), /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-text-600", children: [ " de ", max ] }) ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text_default, { size: "xs", weight: "medium", className: "text-success-200", children: [ Math.round(percentage), "%" ] }) } ); }; var ProgressBarBase = ({ clampedValue, max, percentage, label, variantClasses, containerClassName, fillClassName }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)( "div", { className: cn( containerClassName, variantClasses.background, "overflow-hidden relative" ), children: [ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( "progress", { value: clampedValue, max, "aria-label": typeof label === "string" ? `${label}: ${Math.round(percentage)}% complete` : `Progress: ${Math.round(percentage)}% of ${max}`, className: "absolute inset-0 w-full h-full opacity-0" } ), /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( "div", { className: cn( fillClassName, variantClasses.fill, "transition-all duration-300 ease-out" ), style: { width: `${percentage}%` } } ) ] } ); var StackedLayout = ({ className, label, showPercentage, showHitCount, labelClassName, percentageClassName, clampedValue, max, percentage, variantClasses, dimensions }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)( "div", { className: cn( "flex flex-col items-start gap-2", dimensions.width, dimensions.height, className ), children: [ shouldShowHeader(label, showPercentage, showHitCount) && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-row justify-between items-center w-full h-[19px]", children: [ label && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( Text_default, { as: "div", size: "md", weight: "medium", className: cn("text-text-600 leading-[19px]", labelClassName), children: label } ), renderStackedHitCountDisplay( showHitCount, showPercentage, clampedValue, max, percentage, percentageClassName ) ] }), /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( ProgressBarBase, { clampedValue, max, percentage, label, variantClasses, containerClassName: "w-full h-2 rounded-lg", fillClassName: "h-2 rounded-lg shadow-hard-shadow-3" } ) ] } ); var CompactLayout = ({ className, label, showPercentage, showHitCount, labelClassName, percentageClassName, clampedValue, max, percentage, variantClasses, dimensions }) => { const { color, className: compactClassName, content } = getCompactLayoutConfig({ showPercentage, showHitCount, percentage, clampedValue, max, label, percentageClassName, labelClassName }); return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)( "div", { className: cn( "flex flex-col items-start gap-1", dimensions.width, dimensions.height, className ), children: [ shouldShowHeader(label, showPercentage, showHitCount) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( Text_default, { as: "div", size: "sm", weight: "medium", color, className: cn("leading-4 w-full", compactClassName), children: content } ), /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( ProgressBarBase, { clampedValue, max, percentage, label, variantClasses, containerClassName: "w-full h-1 rounded-full", fillClassName: "h-1 rounded-full" } ) ] } ); }; var DefaultLayout = ({ className, size, sizeClasses, variantClasses, label, showPercentage, labelClassName, percentageClassName, clampedValue, max, percentage }) => { const gapClass = size === "medium" ? "gap-2" : sizeClasses.spacing; const progressBarClass = size === "medium" ? "flex-grow" : "w-full"; const displayConfig = getDefaultLayoutDisplayConfig( size, label, showPercentage ); return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: cn("flex", sizeClasses.layout, gapClass, className), children: [ displayConfig.showHeader && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-row items-center justify-between w-full", children: [ label && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( Text_default, { as: "div", size: "xs", weight: "medium", className: cn( "text-text-950 leading-none tracking-normal text-center", labelClassName ), children: label } ), showPercentage && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)( Text_default, { size: "xs", weight: "medium", className: cn( "text-text-950 leading-none tracking-normal text-center", percentageClassName ), children: [ Math.round(percentage), "%" ] } ) ] }), /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( ProgressBarBase, { clampedValue, max, percentage, label, variantClasses, containerClassName: cn( progressBarClass, sizeClasses.container, sizeClasses.borderRadius ), fillClassName: cn( sizeClasses.bar, sizeClasses.borderRadius, "shadow-hard-shadow-3" ) } ), displayConfig.showPercentage && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)( Text_default, { size: "xs", weight: "medium", className: cn( "text-text-950 leading-none tracking-normal text-center flex-none", percentageClassName ), children: [ Math.round(percentage), "%" ] } ), displayConfig.showLabel && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( Text_default, { as: "div", size: "xs", weight: "medium", className: cn( "text-text-950 leading-none tracking-normal text-center flex-none", labelClassName ), children: label } ) ] }); }; var ProgressBar = ({ value, max = 100, size = "medium", variant = "blue", layout = "default", label, showPercentage = false, showHitCount = false, className = "", labelClassName = "", percentageClassName = "", stackedWidth, stackedHeight, compactWidth, compactHeight }) => { const { clampedValue, percentage } = calculateProgressValues(value, max); const sizeClasses = SIZE_CLASSES[size]; const variantClasses = VARIANT_CLASSES[variant]; if (layout === "stacked") { return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( StackedLayout, { className, label, showPercentage, showHitCount, labelClassName, percentageClassName, clampedValue, max, percentage, variantClasses, dimensions: { width: stackedWidth ?? "w-[380px]", height: stackedHeight ?? "h-[35px]" } } ); } if (layout === "compact") { return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( CompactLayout, { className, label, showPercentage, showHitCount, labelClassName, percentageClassName, clampedValue, max, percentage, variantClasses, dimensions: { width: compactWidth ?? "w-[131px]", height: compactHeight ?? "h-[24px]" } } ); } return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( DefaultLayout, { className, size, sizeClasses, variantClasses, label, showPercentage, labelClassName, percentageClassName, clampedValue, max, percentage } ); }; var ProgressBar_default = ProgressBar; //# sourceMappingURL=index.js.map