@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/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
- export { Alert, AlertDescription, type AlertProps, AlertTitle, type AlertVariants, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarVariants, Badge, type BadgeProps, type BadgeVariants, 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, 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, useToast };
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-[6px]"
580
+ "h-[8px]"
581
581
  ]);
582
582
  var progressFillVariants = cva7([
583
583
  "h-full rounded-[var(--bloom-radius-pill)]",
584
- "transition-all duration-[var(--bloom-duration)] ease-[var(--bloom-ease)]",
585
- "bg-gradient-to-r from-[var(--bloom-accent1-deep)] to-[var(--bloom-accent1)]",
586
- "bg-[length:200%_100%] animate-[bloom-shimmer_3s_ease-in-out_infinite]"
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