@bloomkit/react 0.1.6 → 0.2.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 +97 -6
- package/dist/index.cjs +214 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.cts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +213 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -206,4 +206,29 @@ type SkeletonVariants = Parameters<typeof skeletonVariants>[0];
|
|
|
206
206
|
type SkeletonProps = HTMLAttributes<HTMLDivElement> & SkeletonVariants;
|
|
207
207
|
declare const Skeleton: react.ForwardRefExoticComponent<SkeletonProps & react.RefAttributes<HTMLDivElement>>;
|
|
208
208
|
|
|
209
|
-
|
|
209
|
+
type ColorMode = "light" | "dark" | "system";
|
|
210
|
+
interface BloomPalette {
|
|
211
|
+
name: string;
|
|
212
|
+
light?: Record<string, string>;
|
|
213
|
+
dark?: Record<string, string>;
|
|
214
|
+
}
|
|
215
|
+
interface ThemeContextValue {
|
|
216
|
+
colorMode: ColorMode;
|
|
217
|
+
resolvedMode: "light" | "dark";
|
|
218
|
+
setColorMode: (mode: ColorMode) => void;
|
|
219
|
+
toggleColorMode: () => void;
|
|
220
|
+
palette: string;
|
|
221
|
+
setPalette: (name: string) => void;
|
|
222
|
+
palettes: string[];
|
|
223
|
+
}
|
|
224
|
+
declare function useTheme(): ThemeContextValue;
|
|
225
|
+
interface ThemeProviderProps {
|
|
226
|
+
children: ReactNode;
|
|
227
|
+
defaultColorMode?: ColorMode;
|
|
228
|
+
defaultPalette?: string;
|
|
229
|
+
palettes?: BloomPalette[];
|
|
230
|
+
storageKey?: string;
|
|
231
|
+
}
|
|
232
|
+
declare function ThemeProvider({ children, defaultColorMode, defaultPalette, palettes, storageKey, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
|
|
233
|
+
|
|
234
|
+
export { Alert, AlertDescription, type AlertProps, AlertTitle, type AlertVariants, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarVariants, Badge, type BadgeProps, type BadgeVariants, type BloomPalette, Button, type ButtonProps, type ButtonVariants, Card, CardContent, CardDescription, CardFooter, CardHeader, type CardProps, CardTitle, type CardVariants, DatePicker, type DatePickerProps, Dropdown, DropdownItem, type DropdownItemProps, type DropdownProps, DropdownSeparator, type DropdownSeparatorProps, Input, type InputProps, Modal, type ModalProps, Progress, ProgressCircular, type ProgressCircularProps, type ProgressProps, Skeleton, type SkeletonProps, type SkeletonVariants, Slider, type SliderProps, Tabs, TabsContent, TabsList, type TabsListProps, type TabsListVariants, TabsTrigger, Textarea, type TextareaProps, ThemeProvider, type ThemeProviderProps, ToastProvider, type ToastVariants, Toggle, type ToggleProps, Tooltip, type TooltipProps, TooltipProvider, alertVariants, avatarVariants, badgeVariants, bloomSpring, bloomTransition, bloomTransitionFast, bloomTransitionSlow, buttonVariants, cardHoverLift, cardVariants, cn, fadeIn, hoverLift, inputVariants, progressFillVariants, progressTrackVariants, skeletonVariants, slideUp, tabsListVariants, toastVariants, useBreathing, useReducedMotion, useTheme, useToast };
|
package/dist/index.js
CHANGED
|
@@ -577,13 +577,13 @@ var progressTrackVariants = cva7([
|
|
|
577
577
|
"relative w-full overflow-hidden",
|
|
578
578
|
"rounded-[var(--bloom-radius-pill)]",
|
|
579
579
|
"bg-[var(--bloom-surface2)]",
|
|
580
|
-
"h-[
|
|
580
|
+
"h-[8px]"
|
|
581
581
|
]);
|
|
582
582
|
var progressFillVariants = cva7([
|
|
583
583
|
"h-full rounded-[var(--bloom-radius-pill)]",
|
|
584
|
-
"transition-
|
|
585
|
-
"bg-
|
|
586
|
-
"
|
|
584
|
+
"transition-[width] duration-[var(--bloom-duration-slow)] ease-[var(--bloom-ease)]",
|
|
585
|
+
"bg-[var(--bloom-accent1-deep)]",
|
|
586
|
+
"relative"
|
|
587
587
|
]);
|
|
588
588
|
|
|
589
589
|
// src/components/progress/progress.tsx
|
|
@@ -605,7 +605,19 @@ var Progress = forwardRef8(
|
|
|
605
605
|
"div",
|
|
606
606
|
{
|
|
607
607
|
className: progressFillVariants(),
|
|
608
|
-
style: { width: `${clampedValue}%` }
|
|
608
|
+
style: { width: `${clampedValue}%` },
|
|
609
|
+
children: /* @__PURE__ */ jsx9(
|
|
610
|
+
"div",
|
|
611
|
+
{
|
|
612
|
+
className: "absolute inset-0 rounded-[var(--bloom-radius-pill)] overflow-hidden",
|
|
613
|
+
children: /* @__PURE__ */ jsx9(
|
|
614
|
+
"div",
|
|
615
|
+
{
|
|
616
|
+
className: "absolute inset-y-0 w-[60%] bg-gradient-to-r from-transparent via-white/25 to-transparent animate-[bloom-sweep_2.5s_ease-in-out_infinite]"
|
|
617
|
+
}
|
|
618
|
+
)
|
|
619
|
+
}
|
|
620
|
+
)
|
|
609
621
|
}
|
|
610
622
|
)
|
|
611
623
|
}
|
|
@@ -630,6 +642,49 @@ var ProgressCircular = forwardRef8(
|
|
|
630
642
|
className: cn("inline-flex", className),
|
|
631
643
|
...props,
|
|
632
644
|
children: /* @__PURE__ */ jsxs6("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
|
|
645
|
+
/* @__PURE__ */ jsxs6("defs", { children: [
|
|
646
|
+
/* @__PURE__ */ jsxs6(
|
|
647
|
+
"linearGradient",
|
|
648
|
+
{
|
|
649
|
+
id: `bloom-sweep-grad-${size}`,
|
|
650
|
+
gradientUnits: "userSpaceOnUse",
|
|
651
|
+
x1: size / 2,
|
|
652
|
+
y1: "0",
|
|
653
|
+
x2: size / 2,
|
|
654
|
+
y2: size,
|
|
655
|
+
children: [
|
|
656
|
+
/* @__PURE__ */ jsx9("stop", { offset: "0%", stopColor: "white", stopOpacity: "0" }),
|
|
657
|
+
/* @__PURE__ */ jsx9("stop", { offset: "50%", stopColor: "white", stopOpacity: "0.3" }),
|
|
658
|
+
/* @__PURE__ */ jsx9("stop", { offset: "100%", stopColor: "white", stopOpacity: "0" }),
|
|
659
|
+
/* @__PURE__ */ jsx9(
|
|
660
|
+
"animateTransform",
|
|
661
|
+
{
|
|
662
|
+
attributeName: "gradientTransform",
|
|
663
|
+
type: "rotate",
|
|
664
|
+
values: `0 ${size / 2} ${size / 2};360 ${size / 2} ${size / 2}`,
|
|
665
|
+
dur: "2.5s",
|
|
666
|
+
repeatCount: "indefinite"
|
|
667
|
+
}
|
|
668
|
+
)
|
|
669
|
+
]
|
|
670
|
+
}
|
|
671
|
+
),
|
|
672
|
+
/* @__PURE__ */ jsx9("mask", { id: `bloom-sweep-mask-${size}`, children: /* @__PURE__ */ jsx9(
|
|
673
|
+
"circle",
|
|
674
|
+
{
|
|
675
|
+
cx: size / 2,
|
|
676
|
+
cy: size / 2,
|
|
677
|
+
r: radius,
|
|
678
|
+
fill: "none",
|
|
679
|
+
stroke: "white",
|
|
680
|
+
strokeWidth,
|
|
681
|
+
strokeLinecap: "round",
|
|
682
|
+
strokeDasharray: circumference,
|
|
683
|
+
strokeDashoffset: offset,
|
|
684
|
+
transform: `rotate(-90 ${size / 2} ${size / 2})`
|
|
685
|
+
}
|
|
686
|
+
) })
|
|
687
|
+
] }),
|
|
633
688
|
/* @__PURE__ */ jsx9(
|
|
634
689
|
"circle",
|
|
635
690
|
{
|
|
@@ -655,9 +710,21 @@ var ProgressCircular = forwardRef8(
|
|
|
655
710
|
strokeDashoffset: offset,
|
|
656
711
|
transform: `rotate(-90 ${size / 2} ${size / 2})`,
|
|
657
712
|
style: {
|
|
658
|
-
transition: `stroke-dashoffset var(--bloom-duration) var(--bloom-ease)`
|
|
713
|
+
transition: `stroke-dashoffset var(--bloom-duration-slow) var(--bloom-ease)`
|
|
659
714
|
}
|
|
660
715
|
}
|
|
716
|
+
),
|
|
717
|
+
/* @__PURE__ */ jsx9(
|
|
718
|
+
"circle",
|
|
719
|
+
{
|
|
720
|
+
cx: size / 2,
|
|
721
|
+
cy: size / 2,
|
|
722
|
+
r: radius,
|
|
723
|
+
fill: "none",
|
|
724
|
+
stroke: `url(#bloom-sweep-grad-${size})`,
|
|
725
|
+
strokeWidth,
|
|
726
|
+
mask: `url(#bloom-sweep-mask-${size})`
|
|
727
|
+
}
|
|
661
728
|
)
|
|
662
729
|
] })
|
|
663
730
|
}
|
|
@@ -1213,6 +1280,144 @@ var Skeleton = forwardRef11(
|
|
|
1213
1280
|
)
|
|
1214
1281
|
);
|
|
1215
1282
|
Skeleton.displayName = "Skeleton";
|
|
1283
|
+
|
|
1284
|
+
// src/components/theme/theme.tsx
|
|
1285
|
+
import {
|
|
1286
|
+
createContext as createContext2,
|
|
1287
|
+
useContext as useContext2,
|
|
1288
|
+
useState as useState5,
|
|
1289
|
+
useEffect as useEffect3,
|
|
1290
|
+
useCallback as useCallback2,
|
|
1291
|
+
useRef
|
|
1292
|
+
} from "react";
|
|
1293
|
+
import { jsx as jsx17 } from "react/jsx-runtime";
|
|
1294
|
+
var ThemeContext = createContext2(null);
|
|
1295
|
+
function useTheme() {
|
|
1296
|
+
const ctx = useContext2(ThemeContext);
|
|
1297
|
+
if (!ctx) throw new Error("useTheme must be used within <ThemeProvider>");
|
|
1298
|
+
return ctx;
|
|
1299
|
+
}
|
|
1300
|
+
function getSystemPreference() {
|
|
1301
|
+
if (typeof window === "undefined") return "light";
|
|
1302
|
+
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
1303
|
+
}
|
|
1304
|
+
function resolveMode(mode) {
|
|
1305
|
+
if (mode === "system") return getSystemPreference();
|
|
1306
|
+
return mode;
|
|
1307
|
+
}
|
|
1308
|
+
function ThemeProvider({
|
|
1309
|
+
children,
|
|
1310
|
+
defaultColorMode = "system",
|
|
1311
|
+
defaultPalette = "bloom",
|
|
1312
|
+
palettes = [],
|
|
1313
|
+
storageKey = "bloom-theme"
|
|
1314
|
+
}) {
|
|
1315
|
+
const paletteMap = useRef(
|
|
1316
|
+
new Map([
|
|
1317
|
+
["bloom", { name: "bloom" }],
|
|
1318
|
+
...palettes.map((p) => [p.name, p])
|
|
1319
|
+
])
|
|
1320
|
+
);
|
|
1321
|
+
const [colorMode, setColorModeState] = useState5(() => {
|
|
1322
|
+
if (typeof window === "undefined") return defaultColorMode;
|
|
1323
|
+
const stored = localStorage.getItem(`${storageKey}-mode`);
|
|
1324
|
+
if (stored === "light" || stored === "dark" || stored === "system") return stored;
|
|
1325
|
+
return defaultColorMode;
|
|
1326
|
+
});
|
|
1327
|
+
const [palette, setPaletteState] = useState5(() => {
|
|
1328
|
+
if (typeof window === "undefined") return defaultPalette;
|
|
1329
|
+
const stored = localStorage.getItem(`${storageKey}-palette`);
|
|
1330
|
+
if (stored && paletteMap.current.has(stored)) return stored;
|
|
1331
|
+
return defaultPalette;
|
|
1332
|
+
});
|
|
1333
|
+
const [resolvedMode, setResolvedMode] = useState5(
|
|
1334
|
+
() => resolveMode(colorMode)
|
|
1335
|
+
);
|
|
1336
|
+
const setColorMode = useCallback2(
|
|
1337
|
+
(mode) => {
|
|
1338
|
+
setColorModeState(mode);
|
|
1339
|
+
localStorage.setItem(`${storageKey}-mode`, mode);
|
|
1340
|
+
},
|
|
1341
|
+
[storageKey]
|
|
1342
|
+
);
|
|
1343
|
+
const setPalette = useCallback2(
|
|
1344
|
+
(name) => {
|
|
1345
|
+
if (!paletteMap.current.has(name)) return;
|
|
1346
|
+
setPaletteState(name);
|
|
1347
|
+
localStorage.setItem(`${storageKey}-palette`, name);
|
|
1348
|
+
},
|
|
1349
|
+
[storageKey]
|
|
1350
|
+
);
|
|
1351
|
+
const toggleColorMode = useCallback2(() => {
|
|
1352
|
+
setColorMode(resolvedMode === "light" ? "dark" : "light");
|
|
1353
|
+
}, [resolvedMode, setColorMode]);
|
|
1354
|
+
useEffect3(() => {
|
|
1355
|
+
const root = document.documentElement;
|
|
1356
|
+
const resolved = resolveMode(colorMode);
|
|
1357
|
+
setResolvedMode(resolved);
|
|
1358
|
+
root.classList.remove("light", "dark");
|
|
1359
|
+
root.classList.add(resolved);
|
|
1360
|
+
const allKeys = /* @__PURE__ */ new Set();
|
|
1361
|
+
paletteMap.current.forEach((p) => {
|
|
1362
|
+
if (p.light) Object.keys(p.light).forEach((k) => allKeys.add(k));
|
|
1363
|
+
if (p.dark) Object.keys(p.dark).forEach((k) => allKeys.add(k));
|
|
1364
|
+
});
|
|
1365
|
+
allKeys.forEach((key) => root.style.removeProperty(key));
|
|
1366
|
+
const currentPalette = paletteMap.current.get(palette);
|
|
1367
|
+
if (currentPalette) {
|
|
1368
|
+
const vars = resolved === "dark" ? currentPalette.dark : currentPalette.light;
|
|
1369
|
+
if (vars) {
|
|
1370
|
+
Object.entries(vars).forEach(([key, value]) => {
|
|
1371
|
+
root.style.setProperty(key, value);
|
|
1372
|
+
});
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
}, [colorMode, palette]);
|
|
1376
|
+
useEffect3(() => {
|
|
1377
|
+
if (colorMode !== "system") return;
|
|
1378
|
+
const mq = window.matchMedia("(prefers-color-scheme: dark)");
|
|
1379
|
+
const handler = () => {
|
|
1380
|
+
const resolved = resolveMode("system");
|
|
1381
|
+
setResolvedMode(resolved);
|
|
1382
|
+
const root = document.documentElement;
|
|
1383
|
+
root.classList.remove("light", "dark");
|
|
1384
|
+
root.classList.add(resolved);
|
|
1385
|
+
const allKeys = /* @__PURE__ */ new Set();
|
|
1386
|
+
paletteMap.current.forEach((p) => {
|
|
1387
|
+
if (p.light) Object.keys(p.light).forEach((k) => allKeys.add(k));
|
|
1388
|
+
if (p.dark) Object.keys(p.dark).forEach((k) => allKeys.add(k));
|
|
1389
|
+
});
|
|
1390
|
+
allKeys.forEach((key) => root.style.removeProperty(key));
|
|
1391
|
+
const currentPalette = paletteMap.current.get(palette);
|
|
1392
|
+
if (currentPalette) {
|
|
1393
|
+
const vars = resolved === "dark" ? currentPalette.dark : currentPalette.light;
|
|
1394
|
+
if (vars) {
|
|
1395
|
+
Object.entries(vars).forEach(([key, value]) => {
|
|
1396
|
+
root.style.setProperty(key, value);
|
|
1397
|
+
});
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
};
|
|
1401
|
+
mq.addEventListener("change", handler);
|
|
1402
|
+
return () => mq.removeEventListener("change", handler);
|
|
1403
|
+
}, [colorMode, palette]);
|
|
1404
|
+
const paletteNames = Array.from(paletteMap.current.keys());
|
|
1405
|
+
return /* @__PURE__ */ jsx17(
|
|
1406
|
+
ThemeContext.Provider,
|
|
1407
|
+
{
|
|
1408
|
+
value: {
|
|
1409
|
+
colorMode,
|
|
1410
|
+
resolvedMode,
|
|
1411
|
+
setColorMode,
|
|
1412
|
+
toggleColorMode,
|
|
1413
|
+
palette,
|
|
1414
|
+
setPalette,
|
|
1415
|
+
palettes: paletteNames
|
|
1416
|
+
},
|
|
1417
|
+
children
|
|
1418
|
+
}
|
|
1419
|
+
);
|
|
1420
|
+
}
|
|
1216
1421
|
export {
|
|
1217
1422
|
Alert,
|
|
1218
1423
|
AlertDescription,
|
|
@@ -1242,6 +1447,7 @@ export {
|
|
|
1242
1447
|
TabsList,
|
|
1243
1448
|
TabsTrigger,
|
|
1244
1449
|
Textarea,
|
|
1450
|
+
ThemeProvider,
|
|
1245
1451
|
ToastProvider,
|
|
1246
1452
|
Toggle,
|
|
1247
1453
|
Tooltip,
|
|
@@ -1268,6 +1474,7 @@ export {
|
|
|
1268
1474
|
toastVariants,
|
|
1269
1475
|
useBreathing,
|
|
1270
1476
|
useReducedMotion,
|
|
1477
|
+
useTheme,
|
|
1271
1478
|
useToast
|
|
1272
1479
|
};
|
|
1273
1480
|
//# sourceMappingURL=index.js.map
|