UNPKG

@kobalte/core

Version:

Unstyled components and primitives for building accessible web apps and design systems with SolidJS.

197 lines (186 loc) 4.76 kB
import { Meter } from "./ER4QFELU.jsx"; import { createNumberFormatter } from "./LR7LBJN3.jsx"; import { createRegisterId } from "./JNCCF6MP.jsx"; import { __export } from "./5WXHJDCZ.jsx"; // src/progress/index.tsx var progress_exports = {}; __export(progress_exports, { Fill: () => ProgressFill, Label: () => ProgressLabel, Progress: () => Progress, Root: () => ProgressRoot, Track: () => ProgressTrack, ValueLabel: () => ProgressValueLabel, useProgressContext: () => useProgressContext }); // src/progress/progress-fill.tsx import { splitProps } from "solid-js"; import { combineStyle } from "@solid-primitives/props"; // src/progress/progress-context.tsx import { createContext, useContext } from "solid-js"; var ProgressContext = createContext(); function useProgressContext() { const context = useContext(ProgressContext); if (context === void 0) { throw new Error( "[kobalte]: `useProgressContext` must be used within a `Progress.Root` component" ); } return context; } // src/progress/progress-fill.tsx function ProgressFill(props) { const context = useProgressContext(); const [local, others] = splitProps(props, ["style"]); return <Meter.Fill style={combineStyle( { "--kb-progress-fill-width": context.progressFillWidth() }, local.style )} {...context.dataset()} {...others} />; } // src/progress/progress-label.tsx import { mergeDefaultProps } from "@kobalte/utils"; import { createEffect, onCleanup, splitProps as splitProps2 } from "solid-js"; function ProgressLabel(props) { const context = useProgressContext(); const mergedProps = mergeDefaultProps( { id: context.generateId("label") }, props ); const [local, others] = splitProps2(mergedProps, ["id"]); createEffect(() => onCleanup(context.registerLabelId(local.id))); return <Meter.Label id={local.id} {...context.dataset()} {...others} />; } // src/progress/progress-root.tsx import { clamp, createGenerateId, mergeDefaultProps as mergeDefaultProps2 } from "@kobalte/utils"; import { createMemo, createSignal, createUniqueId, splitProps as splitProps3 } from "solid-js"; function ProgressRoot(props) { const defaultId = `progress-${createUniqueId()}`; const mergedProps = mergeDefaultProps2( { id: defaultId, value: 0, minValue: 0, maxValue: 100 }, props ); const [local, others] = splitProps3(mergedProps, [ "value", "minValue", "maxValue", "indeterminate", "getValueLabel" ]); const [labelId, setLabelId] = createSignal(); const defaultFormatter = createNumberFormatter(() => ({ style: "percent" })); const value = () => { return clamp(local.value, local.minValue, local.maxValue); }; const valuePercent = () => { return (value() - local.minValue) / (local.maxValue - local.minValue); }; const valueLabel = () => { if (local.indeterminate) { return void 0; } if (local.getValueLabel) { return local.getValueLabel({ value: value(), min: local.minValue, max: local.maxValue }); } return defaultFormatter().format(valuePercent()); }; const progressFillWidth = () => { return local.indeterminate ? void 0 : `${valuePercent() * 100}%`; }; const dataset = createMemo(() => { let dataProgress = void 0; if (!local.indeterminate) { dataProgress = valuePercent() === 1 ? "complete" : "loading"; } return { "data-progress": dataProgress, "data-indeterminate": local.indeterminate ? "" : void 0 }; }); const context = { dataset, value, valuePercent, valueLabel, labelId, progressFillWidth, generateId: createGenerateId(() => others.id), registerLabelId: createRegisterId(setLabelId) }; return <ProgressContext.Provider value={context}><Meter role="progressbar" indeterminate={local.indeterminate || false} {...dataset()} {...mergedProps} /></ProgressContext.Provider>; } // src/progress/progress-track.tsx function ProgressTrack(props) { const context = useProgressContext(); return <Meter.Track {...context.dataset()} {...props} />; } // src/progress/progress-value-label.tsx function ProgressValueLabel(props) { const context = useProgressContext(); return <Meter.ValueLabel {...context.dataset()} {...props} />; } // src/progress/index.tsx var Progress = Object.assign(ProgressRoot, { Fill: ProgressFill, Label: ProgressLabel, Track: ProgressTrack, ValueLabel: ProgressValueLabel }); export { useProgressContext, ProgressFill, ProgressLabel, ProgressRoot, ProgressTrack, ProgressValueLabel, Progress, progress_exports };