@rific/auto-paper 0.9.3 → 0.9.4

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.mjs CHANGED
@@ -68,20 +68,35 @@ var AppearancePicker = ({ value, onChange, showLabels = true, icons }) => {
68
68
  return /* @__PURE__ */ jsx2(SegmentedButtons, { value, onValueChange: (v) => onChange(v), buttons: APPEARANCES.map((a) => ({ value: a.value, label: showLabels ? a.label : void 0, icon: resolvedIcons[a.value], accessibilityLabel: a.label })) });
69
69
  };
70
70
 
71
- // src/components/BlurView.tsx
72
- import { useContext as useContext4 } from "react";
73
- import { StyleSheet as StyleSheet2, View as View2 } from "react-native";
74
- import { useTheme as useTheme2 } from "react-native-paper";
71
+ // src/useThemeSettings.ts
72
+ import { useContext as useContext3 } from "react";
73
+ var useThemeSettings = () => useContext3(ThemeSettingsContext);
75
74
 
76
- // src/ThemeProvider.tsx
77
- import { createContext as createContext3, useCallback as useCallback2, useContext as useContext3, useEffect as useEffect2, useRef, useState as useState2 } from "react";
78
- import { StatusBar as StatusBar2, StyleSheet, View } from "react-native";
79
- import { Provider as PaperProvider } from "react-native-paper";
75
+ // src/components/AutoAppearancePicker.tsx
76
+ import { jsx as jsx3 } from "react/jsx-runtime";
77
+ var AutoAppearancePicker = (props) => {
78
+ const { settings, set } = useThemeSettings();
79
+ return /* @__PURE__ */ jsx3(AppearancePicker, { ...props, value: settings.appearance, onChange: (appearance) => set({ appearance }) });
80
+ };
80
81
 
81
- // src/useComputedTheme.ts
82
- import { useCallback, useEffect, useState } from "react";
83
- import { Appearance } from "react-native";
84
- import { MD3DarkTheme, MD3LightTheme } from "react-native-paper";
82
+ // src/utils/resolveSeedColor.ts
83
+ var resolveSeedColor = (color) => typeof color === "string" ? color : color.primary;
84
+
85
+ // src/components/PalettePicker.tsx
86
+ import { useState as useState6 } from "react";
87
+ import { StyleSheet as StyleSheet5, TouchableOpacity as TouchableOpacity2, View as View5 } from "react-native";
88
+ import { Icon as Icon2, TouchableRipple as TouchableRipple2, useTheme as useTheme5 } from "react-native-paper";
89
+
90
+ // src/useSwatchGrid.ts
91
+ import { useState } from "react";
92
+ var SWATCH_GRID_COLUMNS = 5;
93
+ var SWATCH_GRID_GAP = 12;
94
+ function useSwatchSize(fallback) {
95
+ const [width, setWidth] = useState(0);
96
+ const onLayout = ({ nativeEvent }) => setWidth(nativeEvent.layout.width);
97
+ const size = width > 0 ? (width - SWATCH_GRID_GAP * (SWATCH_GRID_COLUMNS - 1)) / SWATCH_GRID_COLUMNS : fallback;
98
+ return { onLayout, size };
99
+ }
85
100
 
86
101
  // src/utils/colorNames.ts
87
102
  var colorNames = {
@@ -281,6 +296,25 @@ var getRgb = (value) => {
281
296
  return null;
282
297
  };
283
298
 
299
+ // src/utils/isDarkColor.ts
300
+ var isDarkColor = (value) => {
301
+ const rgb = getRgb(value);
302
+ if (!rgb) return false;
303
+ const [r, g, b] = [rgb.r / 255, rgb.g / 255, rgb.b / 255];
304
+ const [rs, gs, bs] = [r, g, b].map((c) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));
305
+ const luminance = 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
306
+ return luminance < 0.5;
307
+ };
308
+
309
+ // src/utils/getSwatchContrast.ts
310
+ var RING_WIDTH = 1;
311
+ var SELECTED_RING_WIDTH = 3;
312
+ var getContrastColor = (color) => isDarkColor(color) ? "#ffffff" : "#000000";
313
+ var getSwatchRing = (color, selected, outlineColor) => ({
314
+ borderColor: selected ? getContrastColor(color) : outlineColor,
315
+ borderWidth: selected ? SELECTED_RING_WIDTH : RING_WIDTH
316
+ });
317
+
284
318
  // src/utils/getHex.ts
285
319
  var getHex = (value) => {
286
320
  const rgb = getRgb(value);
@@ -296,92 +330,6 @@ var getHex = (value) => {
296
330
  return hexString;
297
331
  };
298
332
 
299
- // src/utils/getBlendedColor.ts
300
- var getBlendedColor = (foreground, background, alpha) => {
301
- const fg = getRgb(foreground);
302
- const bg = getRgb(background);
303
- if (!fg || !bg) return background;
304
- const safeAlpha = Math.min(1, Math.max(0, alpha));
305
- const r = Math.round(fg.r * safeAlpha + bg.r * (1 - safeAlpha));
306
- const g = Math.round(fg.g * safeAlpha + bg.g * (1 - safeAlpha));
307
- const b = Math.round(fg.b * safeAlpha + bg.b * (1 - safeAlpha));
308
- return getHex(`rgb(${r}, ${g}, ${b})`) ?? background;
309
- };
310
-
311
- // src/utils/getTonalColor.ts
312
- var getTonalColor = (color, lightness) => {
313
- const rgb = getRgb(color);
314
- if (!rgb) return color;
315
- const r = rgb.r / 255;
316
- const g = rgb.g / 255;
317
- const b = rgb.b / 255;
318
- const max = Math.max(r, g, b);
319
- const min = Math.min(r, g, b);
320
- const delta = max - min;
321
- let h = 0;
322
- if (delta !== 0) {
323
- if (max === r) h = (g - b) / delta % 6;
324
- else if (max === g) h = (b - r) / delta + 2;
325
- else h = (r - g) / delta + 4;
326
- h = (h * 60 + 360) % 360;
327
- }
328
- const l = (max + min) / 2;
329
- const s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
330
- const targetL = Math.min(1, Math.max(0, lightness));
331
- const c = (1 - Math.abs(2 * targetL - 1)) * s;
332
- const x = c * (1 - Math.abs(h / 60 % 2 - 1));
333
- const m = targetL - c / 2;
334
- let r2 = 0, g2 = 0, b2 = 0;
335
- if (h < 60) {
336
- r2 = c;
337
- g2 = x;
338
- b2 = 0;
339
- } else if (h < 120) {
340
- r2 = x;
341
- g2 = c;
342
- b2 = 0;
343
- } else if (h < 180) {
344
- r2 = 0;
345
- g2 = c;
346
- b2 = x;
347
- } else if (h < 240) {
348
- r2 = 0;
349
- g2 = x;
350
- b2 = c;
351
- } else if (h < 300) {
352
- r2 = x;
353
- g2 = 0;
354
- b2 = c;
355
- } else {
356
- r2 = c;
357
- g2 = 0;
358
- b2 = x;
359
- }
360
- const toInt = (n) => Math.round((n + m) * 255);
361
- return getHex(`rgb(${toInt(r2)}, ${toInt(g2)}, ${toInt(b2)})`) ?? color;
362
- };
363
-
364
- // src/utils/isDarkColor.ts
365
- var isDarkColor = (value) => {
366
- const rgb = getRgb(value);
367
- if (!rgb) return false;
368
- const [r, g, b] = [rgb.r / 255, rgb.g / 255, rgb.b / 255];
369
- const [rs, gs, bs] = [r, g, b].map((c) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));
370
- const luminance = 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
371
- return luminance < 0.5;
372
- };
373
-
374
- // src/utils/getColorRoles.ts
375
- var getColorRoles = (base, surface, containerAlpha = 0.15) => {
376
- const container = getBlendedColor(base, surface, containerAlpha);
377
- return {
378
- color: base,
379
- onColor: getTonalColor(base, isDarkColor(base) ? 0.95 : 0.08),
380
- container,
381
- onContainer: getTonalColor(base, isDarkColor(container) ? 0.92 : 0.12)
382
- };
383
- };
384
-
385
333
  // src/utils/getTriadicPalette.ts
386
334
  var HARMONY_OFFSETS = {
387
335
  analogous: [1 / 12, 2 / 12],
@@ -463,6 +411,103 @@ function hslToHex(h, s, l) {
463
411
  return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
464
412
  }
465
413
 
414
+ // src/components/ColorPicker.tsx
415
+ import { useState as useState5 } from "react";
416
+ import { StyleSheet as StyleSheet4, TouchableOpacity, View as View4 } from "react-native";
417
+ import { Icon, TouchableRipple, useTheme as useTheme4 } from "react-native-paper";
418
+
419
+ // src/components/Dialog.tsx
420
+ import React, { useEffect as useEffect3, useRef as useRef2, useState as useState4 } from "react";
421
+ import { Animated, BackHandler, Easing, Pressable, StyleSheet as StyleSheet3, View as View3 } from "react-native";
422
+ import { Dialog as PaperDialog, Portal, useTheme as useTheme3 } from "react-native-paper";
423
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
424
+
425
+ // src/ThemeProvider.tsx
426
+ import { createContext as createContext3, useCallback as useCallback2, useContext as useContext4, useEffect as useEffect2, useRef, useState as useState3 } from "react";
427
+ import { StatusBar as StatusBar2, StyleSheet, View } from "react-native";
428
+ import { Provider as PaperProvider } from "react-native-paper";
429
+
430
+ // src/useComputedTheme.ts
431
+ import { useCallback, useEffect, useState as useState2 } from "react";
432
+ import { Appearance } from "react-native";
433
+ import { MD3DarkTheme, MD3LightTheme } from "react-native-paper";
434
+
435
+ // src/utils/getBlendedColor.ts
436
+ var getBlendedColor = (foreground, background, alpha) => {
437
+ const fg = getRgb(foreground);
438
+ const bg = getRgb(background);
439
+ if (!fg || !bg) return background;
440
+ const safeAlpha = Math.min(1, Math.max(0, alpha));
441
+ const r = Math.round(fg.r * safeAlpha + bg.r * (1 - safeAlpha));
442
+ const g = Math.round(fg.g * safeAlpha + bg.g * (1 - safeAlpha));
443
+ const b = Math.round(fg.b * safeAlpha + bg.b * (1 - safeAlpha));
444
+ return getHex(`rgb(${r}, ${g}, ${b})`) ?? background;
445
+ };
446
+
447
+ // src/utils/getTonalColor.ts
448
+ var getTonalColor = (color, lightness) => {
449
+ const rgb = getRgb(color);
450
+ if (!rgb) return color;
451
+ const r = rgb.r / 255;
452
+ const g = rgb.g / 255;
453
+ const b = rgb.b / 255;
454
+ const max = Math.max(r, g, b);
455
+ const min = Math.min(r, g, b);
456
+ const delta = max - min;
457
+ let h = 0;
458
+ if (delta !== 0) {
459
+ if (max === r) h = (g - b) / delta % 6;
460
+ else if (max === g) h = (b - r) / delta + 2;
461
+ else h = (r - g) / delta + 4;
462
+ h = (h * 60 + 360) % 360;
463
+ }
464
+ const l = (max + min) / 2;
465
+ const s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
466
+ const targetL = Math.min(1, Math.max(0, lightness));
467
+ const c = (1 - Math.abs(2 * targetL - 1)) * s;
468
+ const x = c * (1 - Math.abs(h / 60 % 2 - 1));
469
+ const m = targetL - c / 2;
470
+ let r2 = 0, g2 = 0, b2 = 0;
471
+ if (h < 60) {
472
+ r2 = c;
473
+ g2 = x;
474
+ b2 = 0;
475
+ } else if (h < 120) {
476
+ r2 = x;
477
+ g2 = c;
478
+ b2 = 0;
479
+ } else if (h < 180) {
480
+ r2 = 0;
481
+ g2 = c;
482
+ b2 = x;
483
+ } else if (h < 240) {
484
+ r2 = 0;
485
+ g2 = x;
486
+ b2 = c;
487
+ } else if (h < 300) {
488
+ r2 = x;
489
+ g2 = 0;
490
+ b2 = c;
491
+ } else {
492
+ r2 = c;
493
+ g2 = 0;
494
+ b2 = x;
495
+ }
496
+ const toInt = (n) => Math.round((n + m) * 255);
497
+ return getHex(`rgb(${toInt(r2)}, ${toInt(g2)}, ${toInt(b2)})`) ?? color;
498
+ };
499
+
500
+ // src/utils/getColorRoles.ts
501
+ var getColorRoles = (base, surface, containerAlpha = 0.15) => {
502
+ const container = getBlendedColor(base, surface, containerAlpha);
503
+ return {
504
+ color: base,
505
+ onColor: getTonalColor(base, isDarkColor(base) ? 0.95 : 0.08),
506
+ container,
507
+ onContainer: getTonalColor(base, isDarkColor(container) ? 0.92 : 0.12)
508
+ };
509
+ };
510
+
466
511
  // src/useComputedTheme.ts
467
512
  function normalizeExplicitColor(value) {
468
513
  if (!getRgb(value)) throw new Error(`Invalid color format: ${value}`);
@@ -474,7 +519,7 @@ var SEMANTIC_BASE_COLORS = {
474
519
  danger: "#B00020"
475
520
  };
476
521
  function useComputedTheme(appearance, color, harmony = "split-complementary") {
477
- const [theme, setTheme] = useState(null);
522
+ const [theme, setTheme] = useState2(null);
478
523
  const primaryInput = typeof color === "string" ? color : color.primary;
479
524
  const secondaryInput = typeof color === "string" ? null : color.secondary;
480
525
  const tertiaryInput = typeof color === "string" ? null : color.tertiary;
@@ -551,15 +596,15 @@ function useComputedTheme(appearance, color, harmony = "split-complementary") {
551
596
  }
552
597
 
553
598
  // src/ThemeProvider.tsx
554
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
599
+ import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
555
600
  var NavBarContext = createContext3({});
556
- var useNavBarContext = () => useContext3(NavBarContext);
601
+ var useNavBarContext = () => useContext4(NavBarContext);
557
602
  var BlurModuleContext = createContext3(void 0);
558
- var useBlurModule = () => useContext3(BlurModuleContext);
603
+ var useBlurModule = () => useContext4(BlurModuleContext);
559
604
  var ReanimatedModuleContext = createContext3(void 0);
560
- var useReanimatedModule = () => useContext3(ReanimatedModuleContext);
605
+ var useReanimatedModule = () => useContext4(ReanimatedModuleContext);
561
606
  function Provider({ children, defaults, expoBlur, initialValue, navigationBar, onChange, onNavBarChange, onReady, reanimated, statusBarProps, style }) {
562
- const [settings, setSettings] = useState2(() => ({ ...defaultThemeSettings, ...initialValue }));
607
+ const [settings, setSettings] = useState3(() => ({ ...defaultThemeSettings, ...initialValue }));
563
608
  const set = useCallback2((patch) => {
564
609
  setSettings((prev) => ({ ...prev, ...patch }));
565
610
  }, []);
@@ -581,9 +626,9 @@ function Provider({ children, defaults, expoBlur, initialValue, navigationBar, o
581
626
  }
582
627
  }, [theme, onReady]);
583
628
  if (!theme) return null;
584
- return /* @__PURE__ */ jsx3(ThemeSettingsContext.Provider, { value: { settings, set }, children: /* @__PURE__ */ jsxs2(PaperProvider, { theme, children: [
585
- /* @__PURE__ */ jsx3(StatusBar2, { backgroundColor: theme.colors.background, barStyle: theme.dark ? "light-content" : "dark-content", ...statusBarProps }),
586
- /* @__PURE__ */ jsx3(PaperDefaultsContext.Provider, { value: defaults ?? {}, children: /* @__PURE__ */ jsx3(NavBarContext.Provider, { value: { navigationBar, onNavBarChange }, children: /* @__PURE__ */ jsx3(BlurModuleContext.Provider, { value: expoBlur, children: /* @__PURE__ */ jsx3(ReanimatedModuleContext.Provider, { value: reanimated, children: /* @__PURE__ */ jsx3(View, { style: [styles.flex, { backgroundColor: theme.colors.background }, style], children }) }) }) }) })
629
+ return /* @__PURE__ */ jsx4(ThemeSettingsContext.Provider, { value: { settings, set }, children: /* @__PURE__ */ jsxs2(PaperProvider, { theme, children: [
630
+ /* @__PURE__ */ jsx4(StatusBar2, { backgroundColor: theme.colors.background, barStyle: theme.dark ? "light-content" : "dark-content", ...statusBarProps }),
631
+ /* @__PURE__ */ jsx4(PaperDefaultsContext.Provider, { value: defaults ?? {}, children: /* @__PURE__ */ jsx4(NavBarContext.Provider, { value: { navigationBar, onNavBarChange }, children: /* @__PURE__ */ jsx4(BlurModuleContext.Provider, { value: expoBlur, children: /* @__PURE__ */ jsx4(ReanimatedModuleContext.Provider, { value: reanimated, children: /* @__PURE__ */ jsx4(View, { style: [styles.flex, { backgroundColor: theme.colors.background }, style], children }) }) }) }) })
587
632
  ] }) });
588
633
  }
589
634
  var styles = StyleSheet.create({
@@ -591,21 +636,24 @@ var styles = StyleSheet.create({
591
636
  });
592
637
 
593
638
  // src/components/BlurView.tsx
594
- import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
639
+ import { useContext as useContext5 } from "react";
640
+ import { StyleSheet as StyleSheet2, View as View2 } from "react-native";
641
+ import { useTheme as useTheme2 } from "react-native-paper";
642
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
595
643
  var ELEVATION_OPACITY = { 0: 0, 1: 0.05, 2: 0.08, 3: 0.11, 4: 0.12, 5: 0.14 };
596
644
  var VARIANT_TINT_OPACITY = { light: 0.12, dark: 0.18 };
597
645
  var BlurView = ({ blur = true, children, elevation, style, tintColor, tintOpacity, variant = "surface", ...props }) => {
598
646
  const { dark, colors } = useTheme2();
599
- const { settings } = useContext4(ThemeSettingsContext);
647
+ const { settings } = useContext5(ThemeSettingsContext);
600
648
  const expoBlur = useBlurModule();
601
649
  const surfaceColor = variant === "surfaceVariant" ? colors.surfaceVariant : colors.surface;
602
650
  const variantColor = variant === "primary" ? colors.primary : variant === "secondary" ? colors.secondary : variant === "tertiary" ? colors.tertiary : variant === "error" ? colors.error : void 0;
603
651
  const resolvedTintColor = tintColor ?? variantColor ?? (elevation !== void 0 ? colors.primary : void 0);
604
652
  const resolvedTintOpacity = tintOpacity ?? (tintColor ? dark ? 0.24 : 0.16 : variantColor ? dark ? VARIANT_TINT_OPACITY.dark : VARIANT_TINT_OPACITY.light : elevation !== void 0 ? ELEVATION_OPACITY[elevation] : 0);
605
- const tint = resolvedTintColor && resolvedTintOpacity > 0 ? /* @__PURE__ */ jsx4(View2, { style: [StyleSheet2.absoluteFill, { backgroundColor: resolvedTintColor, opacity: resolvedTintOpacity }] }) : null;
653
+ const tint = resolvedTintColor && resolvedTintOpacity > 0 ? /* @__PURE__ */ jsx5(View2, { style: [StyleSheet2.absoluteFill, { backgroundColor: resolvedTintColor, opacity: resolvedTintOpacity }] }) : null;
606
654
  if (blur && expoBlur)
607
655
  return /* @__PURE__ */ jsxs3(expoBlur.BlurView, { ...props, tint: dark ? "dark" : "light", style, children: [
608
- /* @__PURE__ */ jsx4(View2, { style: [StyleSheet2.absoluteFill, { backgroundColor: surfaceColor, opacity: settings.blurTint }] }),
656
+ /* @__PURE__ */ jsx5(View2, { style: [StyleSheet2.absoluteFill, { backgroundColor: surfaceColor, opacity: settings.blurTint }] }),
609
657
  tint,
610
658
  children
611
659
  ] });
@@ -615,103 +663,20 @@ var BlurView = ({ blur = true, children, elevation, style, tintColor, tintOpacit
615
663
  ] });
616
664
  };
617
665
 
618
- // src/components/BottomNavigation.tsx
619
- import { useEffect as useEffect3 } from "react";
620
- import { Platform } from "react-native";
621
- import { BottomNavigation as PaperBottomNavigation, useTheme as useTheme3 } from "react-native-paper";
622
-
623
- // src/navigation-bar.ts
624
- var setNavigationBarStyle = (navigationBar, dark) => {
625
- if (!navigationBar) return;
626
- navigationBar.NavigationBar.setStyle(dark ? "light" : "dark");
627
- };
628
-
629
- // src/components/BottomNavigation.tsx
630
- import { jsx as jsx5 } from "react/jsx-runtime";
631
- function useNavigationBarSync() {
632
- const theme = useTheme3();
633
- const { navigationBar, onNavBarChange } = useNavBarContext();
634
- useEffect3(() => {
635
- if (Platform.OS !== "android") return;
636
- if (onNavBarChange) onNavBarChange(theme.colors.surface, theme.dark);
637
- else if (navigationBar) setNavigationBarStyle(navigationBar, theme.dark);
638
- }, [theme, onNavBarChange, navigationBar]);
639
- }
640
- function BottomNavigationComponent(props) {
641
- const defaults = usePaperDefaults();
642
- useNavigationBarSync();
643
- return /* @__PURE__ */ jsx5(PaperBottomNavigation, { ...defaults.BottomNavigation, ...props });
644
- }
645
- function Bar(props) {
646
- useNavigationBarSync();
647
- return /* @__PURE__ */ jsx5(PaperBottomNavigation.Bar, { ...props });
648
- }
649
- BottomNavigationComponent.Bar = Bar;
650
- BottomNavigationComponent.SceneMap = PaperBottomNavigation?.SceneMap;
651
- var BottomNavigation = BottomNavigationComponent;
652
-
653
- // src/components/Button.tsx
654
- import { Button as PaperButton } from "react-native-paper";
655
- import { jsx as jsx6 } from "react/jsx-runtime";
656
- function Button(props) {
657
- const defaults = usePaperDefaults();
658
- return /* @__PURE__ */ jsx6(PaperButton, { ...defaults.Button, ...props });
659
- }
660
-
661
- // src/components/Chip.tsx
662
- import { Chip as PaperChip, useTheme as useTheme4 } from "react-native-paper";
663
- import { jsx as jsx7 } from "react/jsx-runtime";
664
- function Chip({ variant, style, selectedColor, ...props }) {
665
- const defaults = usePaperDefaults();
666
- const { colors } = useTheme4();
667
- const variantStyle = variant === "primary" ? { backgroundColor: colors.primaryContainer } : variant === "secondary" ? { backgroundColor: colors.secondaryContainer } : variant === "tertiary" ? { backgroundColor: colors.tertiaryContainer } : variant === "surface" ? { backgroundColor: colors.surface } : void 0;
668
- const variantSelectedColor = variant === "primary" ? colors.onPrimaryContainer : variant === "secondary" ? colors.onSecondaryContainer : variant === "tertiary" ? colors.onTertiaryContainer : variant === "surface" ? colors.onSurface : void 0;
669
- return /* @__PURE__ */ jsx7(PaperChip, { ...defaults.Chip, selectedColor: selectedColor ?? variantSelectedColor, ...props, style: [variantStyle, style] });
670
- }
671
-
672
- // src/components/ColorPicker.tsx
673
- import { useState as useState5 } from "react";
674
- import { StyleSheet as StyleSheet4, TouchableOpacity, View as View4 } from "react-native";
675
- import { Icon, TouchableRipple, useTheme as useTheme6 } from "react-native-paper";
676
-
677
- // src/useSwatchGrid.ts
678
- import { useState as useState3 } from "react";
679
- var SWATCH_GRID_COLUMNS = 5;
680
- var SWATCH_GRID_GAP = 12;
681
- function useSwatchSize(fallback) {
682
- const [width, setWidth] = useState3(0);
683
- const onLayout = ({ nativeEvent }) => setWidth(nativeEvent.layout.width);
684
- const size = width > 0 ? (width - SWATCH_GRID_GAP * (SWATCH_GRID_COLUMNS - 1)) / SWATCH_GRID_COLUMNS : fallback;
685
- return { onLayout, size };
686
- }
687
-
688
- // src/utils/getSwatchContrast.ts
689
- var RING_WIDTH = 1;
690
- var SELECTED_RING_WIDTH = 3;
691
- var getContrastColor = (color) => isDarkColor(color) ? "#ffffff" : "#000000";
692
- var getSwatchRing = (color, selected, outlineColor) => ({
693
- borderColor: selected ? getContrastColor(color) : outlineColor,
694
- borderWidth: selected ? SELECTED_RING_WIDTH : RING_WIDTH
695
- });
696
-
697
666
  // src/components/Dialog.tsx
698
- import React2, { useEffect as useEffect4, useRef as useRef2, useState as useState4 } from "react";
699
- import { Animated, BackHandler, Easing, Pressable, StyleSheet as StyleSheet3, View as View3 } from "react-native";
700
- import { Dialog as PaperDialog, Portal, useTheme as useTheme5 } from "react-native-paper";
701
- import { useSafeAreaInsets } from "react-native-safe-area-context";
702
- import { jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
667
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
703
668
  var ANIMATION_DURATION = 220;
704
669
  var DIALOG_MARGIN = 32;
705
670
  function DialogComponent({ animatedStyle, blur: blurProp, dismissable = true, dismissableBackButton = dismissable, visible, onDismiss, children, style, testID = "dialog" }) {
706
671
  const blur = useBlur(blurProp);
707
672
  const reanimated = useReanimatedModule();
708
- const theme = useTheme5();
673
+ const theme = useTheme3();
709
674
  const { colors, isV3, roundness } = theme;
710
675
  const { scale } = theme.animation;
711
676
  const { bottom, left, right, top } = useSafeAreaInsets();
712
677
  const opacity = useRef2(new Animated.Value(visible ? 1 : 0)).current;
713
678
  const [mounted, setMounted] = useState4(visible);
714
- useEffect4(() => {
679
+ useEffect3(() => {
715
680
  if (visible) {
716
681
  setMounted(true);
717
682
  Animated.timing(opacity, { duration: scale * ANIMATION_DURATION, easing: Easing.out(Easing.cubic), toValue: 1, useNativeDriver: true }).start();
@@ -721,7 +686,7 @@ function DialogComponent({ animatedStyle, blur: blurProp, dismissable = true, di
721
686
  });
722
687
  }
723
688
  }, [visible]);
724
- useEffect4(() => {
689
+ useEffect3(() => {
725
690
  if (!visible) return void 0;
726
691
  const onHardwareBackPress = () => {
727
692
  if (dismissable || dismissableBackButton) onDismiss?.();
@@ -731,21 +696,21 @@ function DialogComponent({ animatedStyle, blur: blurProp, dismissable = true, di
731
696
  return () => subscription.remove();
732
697
  }, [dismissable, dismissableBackButton, onDismiss, visible]);
733
698
  if (!mounted) return null;
734
- const content = React2.Children.toArray(children).filter((child) => child != null && typeof child !== "boolean").map((child, i) => {
699
+ const content = React.Children.toArray(children).filter((child) => child != null && typeof child !== "boolean").map((child, i) => {
735
700
  if (isV3) {
736
- if (i === 0 && React2.isValidElement(child)) {
737
- return React2.cloneElement(child, { style: [{ marginTop: 24 }, child.props.style] });
701
+ if (i === 0 && React.isValidElement(child)) {
702
+ return React.cloneElement(child, { style: [{ marginTop: 24 }, child.props.style] });
738
703
  }
739
704
  }
740
- if (i === 0 && React2.isValidElement(child) && child.type === PaperDialog.Content) {
741
- return React2.cloneElement(child, { style: [{ paddingTop: 24 }, child.props.style] });
705
+ if (i === 0 && React.isValidElement(child) && child.type === PaperDialog.Content) {
706
+ return React.cloneElement(child, { style: [{ paddingTop: 24 }, child.props.style] });
742
707
  }
743
708
  return child;
744
709
  });
745
710
  const borderRadius = (isV3 ? 7 : 1) * roundness;
746
- return /* @__PURE__ */ jsx8(Portal, { children: /* @__PURE__ */ jsxs4(Animated.View, { accessibilityLiveRegion: "polite", accessibilityViewIsModal: true, pointerEvents: visible ? "box-none" : "none", style: [StyleSheet3.absoluteFill, { opacity }], testID, children: [
747
- /* @__PURE__ */ jsx8(Pressable, { accessibilityLabel: "Close modal", accessibilityRole: "button", disabled: !dismissable, onPress: dismissable ? onDismiss : void 0, style: [StyleSheet3.absoluteFill, { backgroundColor: colors.backdrop }], testID: `${testID}-backdrop` }),
748
- /* @__PURE__ */ jsx8(View3, { pointerEvents: "box-none", style: [styles2.wrapper, { marginBottom: bottom, marginTop: top, paddingHorizontal: Math.max(left, right, DIALOG_MARGIN) }], testID: `${testID}-wrapper`, children: reanimated && animatedStyle ? /* @__PURE__ */ jsx8(reanimated.View, { style: animatedStyle, testID: `${testID}-animated-wrapper`, children: /* @__PURE__ */ jsx8(BlurView, { blur, style: [styles2.card, { borderRadius }, style], testID: `${testID}-surface`, children: content }) }) : /* @__PURE__ */ jsx8(BlurView, { blur, style: [styles2.card, { borderRadius }, style], testID: `${testID}-surface`, children: content }) })
711
+ return /* @__PURE__ */ jsx6(Portal, { children: /* @__PURE__ */ jsxs4(Animated.View, { accessibilityLiveRegion: "polite", accessibilityViewIsModal: true, pointerEvents: visible ? "box-none" : "none", style: [StyleSheet3.absoluteFill, { opacity }], testID, children: [
712
+ /* @__PURE__ */ jsx6(Pressable, { accessibilityLabel: "Close modal", accessibilityRole: "button", disabled: !dismissable, onPress: dismissable ? onDismiss : void 0, style: [StyleSheet3.absoluteFill, { backgroundColor: colors.backdrop }], testID: `${testID}-backdrop` }),
713
+ /* @__PURE__ */ jsx6(View3, { pointerEvents: "box-none", style: [styles2.wrapper, { marginBottom: bottom, marginTop: top, paddingHorizontal: Math.max(left, right, DIALOG_MARGIN) }], testID: `${testID}-wrapper`, children: reanimated && animatedStyle ? /* @__PURE__ */ jsx6(reanimated.View, { style: animatedStyle, testID: `${testID}-animated-wrapper`, children: /* @__PURE__ */ jsx6(BlurView, { blur, style: [styles2.card, { borderRadius }, style], testID: `${testID}-surface`, children: content }) }) : /* @__PURE__ */ jsx6(BlurView, { blur, style: [styles2.card, { borderRadius }, style], testID: `${testID}-surface`, children: content }) })
749
714
  ] }) });
750
715
  }
751
716
  DialogComponent.Title = PaperDialog.Title;
@@ -760,7 +725,7 @@ var styles2 = StyleSheet3.create({
760
725
  });
761
726
 
762
727
  // src/components/ColorPicker.tsx
763
- import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
728
+ import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
764
729
  var SIZE = 48;
765
730
  var defaultColors = [
766
731
  { label: "Red", value: "#f44336" },
@@ -786,12 +751,12 @@ var defaultColors = [
786
751
  ];
787
752
  var ColorPicker = ({ value, onChange, colors = defaultColors, blur: blurProp }) => {
788
753
  const blur = useBlur(blurProp);
789
- const { colors: themeColors } = useTheme6();
754
+ const { colors: themeColors } = useTheme4();
790
755
  const [open, setOpen] = useState5(false);
791
756
  const { onLayout, size } = useSwatchSize(SIZE);
792
757
  return /* @__PURE__ */ jsxs5(Fragment2, { children: [
793
- /* @__PURE__ */ jsx9(TouchableRipple, { onPress: () => setOpen(true), style: [styles3.trigger, { backgroundColor: value }, getSwatchRing(value, false, themeColors.outlineVariant)], borderless: true, children: /* @__PURE__ */ jsx9(Icon, { source: "palette", size: 20, color: getContrastColor(value) }) }),
794
- /* @__PURE__ */ jsx9(Dialog, { blur, visible: open, onDismiss: () => setOpen(false), children: /* @__PURE__ */ jsx9(Dialog.Content, { children: /* @__PURE__ */ jsx9(View4, { style: styles3.swatches, onLayout, children: colors.map(({ value: hex }) => /* @__PURE__ */ jsx9(
758
+ /* @__PURE__ */ jsx7(TouchableRipple, { onPress: () => setOpen(true), style: [styles3.trigger, { backgroundColor: value }, getSwatchRing(value, false, themeColors.outlineVariant)], borderless: true, children: /* @__PURE__ */ jsx7(Icon, { source: "palette", size: 20, color: getContrastColor(value) }) }),
759
+ /* @__PURE__ */ jsx7(Dialog, { blur, visible: open, onDismiss: () => setOpen(false), children: /* @__PURE__ */ jsx7(Dialog.Content, { children: /* @__PURE__ */ jsx7(View4, { style: styles3.swatches, onLayout, children: colors.map(({ value: hex }) => /* @__PURE__ */ jsx7(
795
760
  TouchableOpacity,
796
761
  {
797
762
  onPress: () => {
@@ -799,7 +764,7 @@ var ColorPicker = ({ value, onChange, colors = defaultColors, blur: blurProp })
799
764
  setOpen(false);
800
765
  },
801
766
  style: [styles3.swatch, { backgroundColor: hex, borderRadius: size / 2, height: size, width: size }, getSwatchRing(hex, value === hex, themeColors.outlineVariant)],
802
- children: value === hex && /* @__PURE__ */ jsx9(Icon, { source: "check", size: 20, color: getContrastColor(hex) })
767
+ children: value === hex && /* @__PURE__ */ jsx7(Icon, { source: "check", size: 20, color: getContrastColor(hex) })
803
768
  },
804
769
  hex
805
770
  )) }) }) })
@@ -811,17 +776,9 @@ var styles3 = StyleSheet4.create({
811
776
  trigger: { alignItems: "center", alignSelf: "flex-start", borderRadius: SIZE / 2, height: SIZE, justifyContent: "center", width: SIZE }
812
777
  });
813
778
 
814
- // src/components/FAB.tsx
815
- import { FAB as PaperFAB } from "react-native-paper";
816
- import { jsx as jsx10 } from "react/jsx-runtime";
817
- function FAB(props) {
818
- const defaults = usePaperDefaults();
819
- return /* @__PURE__ */ jsx10(PaperFAB, { ...defaults.FAB, ...props });
820
- }
821
-
822
779
  // src/components/HarmonyPicker.tsx
823
780
  import { SegmentedButtons as SegmentedButtons2 } from "react-native-paper";
824
- import { jsx as jsx11 } from "react/jsx-runtime";
781
+ import { jsx as jsx8 } from "react/jsx-runtime";
825
782
  var HARMONIES = [
826
783
  { label: "Triadic", value: "triadic", icon: "triangle-outline" },
827
784
  { label: "Split", value: "split-complementary", icon: "arrow-split-vertical" },
@@ -831,7 +788,7 @@ var HARMONIES = [
831
788
  { label: "Dbl Split", value: "double-split", icon: "arrow-expand-horizontal" }
832
789
  ];
833
790
  var COMPACT_MIN_WIDTH = 0;
834
- var HarmonyPicker = ({ value, onChange, showLabels = true, checkedColor, uncheckedColor, checkedContainerColor, uncheckedContainerColor }) => /* @__PURE__ */ jsx11(
791
+ var HarmonyPicker = ({ value, onChange, showLabels = true, checkedColor, uncheckedColor, checkedContainerColor, uncheckedContainerColor }) => /* @__PURE__ */ jsx8(
835
792
  SegmentedButtons2,
836
793
  {
837
794
  value,
@@ -852,37 +809,8 @@ var HarmonyPicker = ({ value, onChange, showLabels = true, checkedColor, uncheck
852
809
  }
853
810
  );
854
811
 
855
- // src/components/IconButton.tsx
856
- import { IconButton as PaperIconButton, useTheme as useTheme7 } from "react-native-paper";
857
- import { jsx as jsx12 } from "react/jsx-runtime";
858
- function IconButton({ variant, iconColor, containerColor, ...props }) {
859
- const defaults = usePaperDefaults();
860
- const { colors } = useTheme7();
861
- const variantContainerColor = variant === "primary" ? colors.primaryContainer : variant === "secondary" ? colors.secondaryContainer : variant === "tertiary" ? colors.tertiaryContainer : variant === "surface" ? colors.surface : void 0;
862
- const variantIconColor = variant === "primary" ? colors.onPrimaryContainer : variant === "secondary" ? colors.onSecondaryContainer : variant === "tertiary" ? colors.onTertiaryContainer : variant === "surface" ? colors.onSurface : void 0;
863
- return /* @__PURE__ */ jsx12(PaperIconButton, { ...defaults.IconButton, containerColor: containerColor ?? variantContainerColor, iconColor: iconColor ?? variantIconColor, ...props });
864
- }
865
-
866
- // src/components/Menu.tsx
867
- import { StyleSheet as StyleSheet5 } from "react-native";
868
- import { Menu as PaperMenu } from "react-native-paper";
869
- import { jsx as jsx13 } from "react/jsx-runtime";
870
- var MenuComponent = ({ blur: blurProp, children, ...props }) => {
871
- const blur = useBlur(blurProp);
872
- return /* @__PURE__ */ jsx13(PaperMenu, { ...props, contentStyle: [styles4.content, props.contentStyle], children: /* @__PURE__ */ jsx13(BlurView, { blur, children }) });
873
- };
874
- var Menu = Object.assign(MenuComponent, {
875
- Item: PaperMenu.Item
876
- });
877
- var styles4 = StyleSheet5.create({
878
- content: { backgroundColor: "transparent", paddingVertical: 0 }
879
- });
880
-
881
812
  // src/components/PalettePicker.tsx
882
- import { useState as useState6 } from "react";
883
- import { StyleSheet as StyleSheet6, TouchableOpacity as TouchableOpacity2, View as View5 } from "react-native";
884
- import { Icon as Icon2, TouchableRipple as TouchableRipple2, useTheme as useTheme8 } from "react-native-paper";
885
- import { Fragment as Fragment3, jsx as jsx14, jsxs as jsxs6 } from "react/jsx-runtime";
813
+ import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
886
814
  var SIZE2 = 48;
887
815
  var defaultWeights = { primary: 2, secondary: 1, tertiary: 1 };
888
816
  var buildWedges = (weights) => {
@@ -896,30 +824,30 @@ var buildWedges = (weights) => {
896
824
  { key: "secondary", rotate: primary / 2 + tertiary, share: secondary }
897
825
  ];
898
826
  };
899
- var Pie = ({ palette, weights = defaultWeights, size = SIZE2 }) => /* @__PURE__ */ jsx14(View5, { style: [styles5.pie, { borderRadius: size / 2, height: size, width: size }], children: buildWedges(weights).map(({ key, rotate, share }) => /* @__PURE__ */ jsx14(View5, { style: [styles5.rotator, { transform: [{ rotate: `${rotate}deg` }] }], children: /* @__PURE__ */ jsx14(View5, { style: styles5.halfMask, children: /* @__PURE__ */ jsx14(View5, { style: [styles5.innerRotator, { transform: [{ rotate: `${share - 180}deg` }] }], children: /* @__PURE__ */ jsx14(View5, { style: [styles5.wedgeFill, { backgroundColor: palette[key] }] }) }) }) }, key)) });
827
+ var Pie = ({ palette, weights = defaultWeights, size = SIZE2 }) => /* @__PURE__ */ jsx9(View5, { style: [styles4.pie, { borderRadius: size / 2, height: size, width: size }], children: buildWedges(weights).map(({ key, rotate, share }) => /* @__PURE__ */ jsx9(View5, { style: [styles4.rotator, { transform: [{ rotate: `${rotate}deg` }] }], children: /* @__PURE__ */ jsx9(View5, { style: styles4.halfMask, children: /* @__PURE__ */ jsx9(View5, { style: [styles4.innerRotator, { transform: [{ rotate: `${share - 180}deg` }] }], children: /* @__PURE__ */ jsx9(View5, { style: [styles4.wedgeFill, { backgroundColor: palette[key] }] }) }) }) }, key)) });
900
828
  var PalettePicker = ({ value, onChange, harmony = "split-complementary", onHarmonyChange, weights, colors = defaultColors, blur: blurProp }) => {
901
829
  const blur = useBlur(blurProp);
902
- const { colors: themeColors } = useTheme8();
830
+ const { colors: themeColors } = useTheme5();
903
831
  const [open, setOpen] = useState6(false);
904
832
  const { onLayout, size } = useSwatchSize(SIZE2);
905
833
  return /* @__PURE__ */ jsxs6(Fragment3, { children: [
906
- /* @__PURE__ */ jsx14(TouchableRipple2, { onPress: () => setOpen(true), style: styles5.trigger, borderless: true, children: /* @__PURE__ */ jsxs6(View5, { style: styles5.triggerContent, children: [
907
- /* @__PURE__ */ jsx14(Pie, { palette: getTriadicPalette(value, harmony), weights }),
908
- /* @__PURE__ */ jsx14(View5, { pointerEvents: "none", style: [styles5.triggerIcon, { borderRadius: SIZE2 / 2 }, getSwatchRing(value, false, themeColors.outlineVariant)], children: /* @__PURE__ */ jsx14(Icon2, { source: "palette", size: 20, color: getContrastColor(value) }) })
834
+ /* @__PURE__ */ jsx9(TouchableRipple2, { onPress: () => setOpen(true), style: styles4.trigger, borderless: true, children: /* @__PURE__ */ jsxs6(View5, { style: styles4.triggerContent, children: [
835
+ /* @__PURE__ */ jsx9(Pie, { palette: getTriadicPalette(value, harmony), weights }),
836
+ /* @__PURE__ */ jsx9(View5, { pointerEvents: "none", style: [styles4.triggerIcon, { borderRadius: SIZE2 / 2 }, getSwatchRing(value, false, themeColors.outlineVariant)], children: /* @__PURE__ */ jsx9(Icon2, { source: "palette", size: 20, color: getContrastColor(value) }) })
909
837
  ] }) }),
910
- /* @__PURE__ */ jsx14(Dialog, { blur, visible: open, onDismiss: () => setOpen(false), children: /* @__PURE__ */ jsxs6(Dialog.Content, { children: [
911
- onHarmonyChange && /* @__PURE__ */ jsx14(View5, { style: styles5.harmonyRow, children: /* @__PURE__ */ jsx14(HarmonyPicker, { value: harmony, onChange: onHarmonyChange, showLabels: false }) }),
912
- /* @__PURE__ */ jsx14(View5, { style: styles5.swatches, onLayout, children: colors.map(({ value: hex }) => /* @__PURE__ */ jsxs6(
838
+ /* @__PURE__ */ jsx9(Dialog, { blur, visible: open, onDismiss: () => setOpen(false), children: /* @__PURE__ */ jsxs6(Dialog.Content, { children: [
839
+ onHarmonyChange && /* @__PURE__ */ jsx9(View5, { style: styles4.harmonyRow, children: /* @__PURE__ */ jsx9(HarmonyPicker, { value: harmony, onChange: onHarmonyChange, showLabels: false }) }),
840
+ /* @__PURE__ */ jsx9(View5, { style: styles4.swatches, onLayout, children: colors.map(({ value: hex }) => /* @__PURE__ */ jsxs6(
913
841
  TouchableOpacity2,
914
842
  {
915
843
  onPress: () => {
916
844
  onChange(hex);
917
845
  setOpen(false);
918
846
  },
919
- style: [styles5.swatch, { height: size, width: size }],
847
+ style: [styles4.swatch, { height: size, width: size }],
920
848
  children: [
921
- /* @__PURE__ */ jsx14(Pie, { palette: getTriadicPalette(hex, harmony), weights, size }),
922
- /* @__PURE__ */ jsx14(View5, { pointerEvents: "none", style: [styles5.ring, { borderRadius: size / 2 }, getSwatchRing(hex, value === hex, themeColors.outlineVariant)], children: value === hex && /* @__PURE__ */ jsx14(Icon2, { source: "check", size: 20, color: getContrastColor(hex) }) })
849
+ /* @__PURE__ */ jsx9(Pie, { palette: getTriadicPalette(hex, harmony), weights, size }),
850
+ /* @__PURE__ */ jsx9(View5, { pointerEvents: "none", style: [styles4.ring, { borderRadius: size / 2 }, getSwatchRing(hex, value === hex, themeColors.outlineVariant)], children: value === hex && /* @__PURE__ */ jsx9(Icon2, { source: "check", size: 20, color: getContrastColor(hex) }) })
923
851
  ]
924
852
  },
925
853
  hex
@@ -927,7 +855,7 @@ var PalettePicker = ({ value, onChange, harmony = "split-complementary", onHarmo
927
855
  ] }) })
928
856
  ] });
929
857
  };
930
- var styles5 = StyleSheet6.create({
858
+ var styles4 = StyleSheet5.create({
931
859
  halfMask: { height: "100%", left: "50%", overflow: "hidden", position: "absolute", top: 0, width: "50%" },
932
860
  harmonyRow: { marginBottom: 4 },
933
861
  innerRotator: { height: "100%", left: "-100%", overflow: "hidden", position: "absolute", top: 0, width: "200%" },
@@ -942,13 +870,108 @@ var styles5 = StyleSheet6.create({
942
870
  wedgeFill: { height: "100%", left: "50%", position: "absolute", top: 0, width: "50%" }
943
871
  });
944
872
 
873
+ // src/components/AutoPalettePicker.tsx
874
+ import { jsx as jsx10 } from "react/jsx-runtime";
875
+ var AutoPalettePicker = (props) => {
876
+ const { settings, set } = useThemeSettings();
877
+ return /* @__PURE__ */ jsx10(PalettePicker, { ...props, value: resolveSeedColor(settings.color), onChange: (color) => set({ color }), harmony: settings.harmony, onHarmonyChange: (harmony) => set({ harmony }) });
878
+ };
879
+
880
+ // src/components/BottomNavigation.tsx
881
+ import { useEffect as useEffect4 } from "react";
882
+ import { Platform } from "react-native";
883
+ import { BottomNavigation as PaperBottomNavigation, useTheme as useTheme6 } from "react-native-paper";
884
+
885
+ // src/navigation-bar.ts
886
+ var setNavigationBarStyle = (navigationBar, dark) => {
887
+ if (!navigationBar) return;
888
+ navigationBar.NavigationBar.setStyle(dark ? "light" : "dark");
889
+ };
890
+
891
+ // src/components/BottomNavigation.tsx
892
+ import { jsx as jsx11 } from "react/jsx-runtime";
893
+ function useNavigationBarSync() {
894
+ const theme = useTheme6();
895
+ const { navigationBar, onNavBarChange } = useNavBarContext();
896
+ useEffect4(() => {
897
+ if (Platform.OS !== "android") return;
898
+ if (onNavBarChange) onNavBarChange(theme.colors.surface, theme.dark);
899
+ else if (navigationBar) setNavigationBarStyle(navigationBar, theme.dark);
900
+ }, [theme, onNavBarChange, navigationBar]);
901
+ }
902
+ function BottomNavigationComponent(props) {
903
+ const defaults = usePaperDefaults();
904
+ useNavigationBarSync();
905
+ return /* @__PURE__ */ jsx11(PaperBottomNavigation, { ...defaults.BottomNavigation, ...props });
906
+ }
907
+ function Bar(props) {
908
+ useNavigationBarSync();
909
+ return /* @__PURE__ */ jsx11(PaperBottomNavigation.Bar, { ...props });
910
+ }
911
+ BottomNavigationComponent.Bar = Bar;
912
+ BottomNavigationComponent.SceneMap = PaperBottomNavigation?.SceneMap;
913
+ var BottomNavigation = BottomNavigationComponent;
914
+
915
+ // src/components/Button.tsx
916
+ import { Button as PaperButton } from "react-native-paper";
917
+ import { jsx as jsx12 } from "react/jsx-runtime";
918
+ function Button(props) {
919
+ const defaults = usePaperDefaults();
920
+ return /* @__PURE__ */ jsx12(PaperButton, { ...defaults.Button, ...props });
921
+ }
922
+
923
+ // src/components/Chip.tsx
924
+ import { Chip as PaperChip, useTheme as useTheme7 } from "react-native-paper";
925
+ import { jsx as jsx13 } from "react/jsx-runtime";
926
+ function Chip({ variant, style, selectedColor, ...props }) {
927
+ const defaults = usePaperDefaults();
928
+ const { colors } = useTheme7();
929
+ const variantStyle = variant === "primary" ? { backgroundColor: colors.primaryContainer } : variant === "secondary" ? { backgroundColor: colors.secondaryContainer } : variant === "tertiary" ? { backgroundColor: colors.tertiaryContainer } : variant === "surface" ? { backgroundColor: colors.surface } : void 0;
930
+ const variantSelectedColor = variant === "primary" ? colors.onPrimaryContainer : variant === "secondary" ? colors.onSecondaryContainer : variant === "tertiary" ? colors.onTertiaryContainer : variant === "surface" ? colors.onSurface : void 0;
931
+ return /* @__PURE__ */ jsx13(PaperChip, { ...defaults.Chip, selectedColor: selectedColor ?? variantSelectedColor, ...props, style: [variantStyle, style] });
932
+ }
933
+
934
+ // src/components/FAB.tsx
935
+ import { FAB as PaperFAB } from "react-native-paper";
936
+ import { jsx as jsx14 } from "react/jsx-runtime";
937
+ function FAB(props) {
938
+ const defaults = usePaperDefaults();
939
+ return /* @__PURE__ */ jsx14(PaperFAB, { ...defaults.FAB, ...props });
940
+ }
941
+
942
+ // src/components/IconButton.tsx
943
+ import { IconButton as PaperIconButton, useTheme as useTheme8 } from "react-native-paper";
944
+ import { jsx as jsx15 } from "react/jsx-runtime";
945
+ function IconButton({ variant, iconColor, containerColor, ...props }) {
946
+ const defaults = usePaperDefaults();
947
+ const { colors } = useTheme8();
948
+ const variantContainerColor = variant === "primary" ? colors.primaryContainer : variant === "secondary" ? colors.secondaryContainer : variant === "tertiary" ? colors.tertiaryContainer : variant === "surface" ? colors.surface : void 0;
949
+ const variantIconColor = variant === "primary" ? colors.onPrimaryContainer : variant === "secondary" ? colors.onSecondaryContainer : variant === "tertiary" ? colors.onTertiaryContainer : variant === "surface" ? colors.onSurface : void 0;
950
+ return /* @__PURE__ */ jsx15(PaperIconButton, { ...defaults.IconButton, containerColor: containerColor ?? variantContainerColor, iconColor: iconColor ?? variantIconColor, ...props });
951
+ }
952
+
953
+ // src/components/Menu.tsx
954
+ import { StyleSheet as StyleSheet6 } from "react-native";
955
+ import { Menu as PaperMenu } from "react-native-paper";
956
+ import { jsx as jsx16 } from "react/jsx-runtime";
957
+ var MenuComponent = ({ blur: blurProp, children, ...props }) => {
958
+ const blur = useBlur(blurProp);
959
+ return /* @__PURE__ */ jsx16(PaperMenu, { ...props, contentStyle: [styles5.content, props.contentStyle], children: /* @__PURE__ */ jsx16(BlurView, { blur, children }) });
960
+ };
961
+ var Menu = Object.assign(MenuComponent, {
962
+ Item: PaperMenu.Item
963
+ });
964
+ var styles5 = StyleSheet6.create({
965
+ content: { backgroundColor: "transparent", paddingVertical: 0 }
966
+ });
967
+
945
968
  // src/components/TextInput.tsx
946
969
  import { forwardRef } from "react";
947
970
  import { TextInput as PaperTextInput } from "react-native-paper";
948
- import { jsx as jsx15 } from "react/jsx-runtime";
971
+ import { jsx as jsx17 } from "react/jsx-runtime";
949
972
  var TextInput = forwardRef(function TextInput2(props, ref) {
950
973
  const defaults = usePaperDefaults();
951
- return /* @__PURE__ */ jsx15(PaperTextInput, { ref, ...defaults.TextInput, ...props });
974
+ return /* @__PURE__ */ jsx17(PaperTextInput, { ref, ...defaults.TextInput, ...props });
952
975
  });
953
976
 
954
977
  // src/redux/themeSlice.ts
@@ -992,10 +1015,6 @@ var selectThemeHarmony = (state) => state.harmony;
992
1015
  import { useTheme as usePaperTheme } from "react-native-paper";
993
1016
  var useAutoPaperTheme = () => usePaperTheme();
994
1017
 
995
- // src/useThemeSettings.ts
996
- import { useContext as useContext5 } from "react";
997
- var useThemeSettings = () => useContext5(ThemeSettingsContext);
998
-
999
1018
  // src/utils/getThirdColor.ts
1000
1019
  function rgbToHsl(r, g, b) {
1001
1020
  r /= 255;
@@ -1080,6 +1099,8 @@ var getTintTextColor = (tintColor, backdropColor, tintOpacity) => {
1080
1099
  export {
1081
1100
  Appbar,
1082
1101
  AppearancePicker,
1102
+ AutoAppearancePicker,
1103
+ AutoPalettePicker,
1083
1104
  BlurView,
1084
1105
  BottomNavigation,
1085
1106
  Button,
@@ -1108,6 +1129,7 @@ export {
1108
1129
  getTonalColor,
1109
1130
  getTriadicPalette,
1110
1131
  isDarkColor,
1132
+ resolveSeedColor,
1111
1133
  selectThemeAppearance,
1112
1134
  selectThemeBlur,
1113
1135
  selectThemeColor,