doodleui-react 0.5.0 → 0.6.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.cjs CHANGED
@@ -31,6 +31,8 @@ var HoverCardPrimitive = require('@radix-ui/react-hover-card');
31
31
  var ContextMenuPrimitive = require('@radix-ui/react-context-menu');
32
32
  var NavigationMenuPrimitive = require('@radix-ui/react-navigation-menu');
33
33
  var MenubarPrimitive = require('@radix-ui/react-menubar');
34
+ var AspectRatioPrimitive = require('@radix-ui/react-aspect-ratio');
35
+ var useEmblaCarousel = require('embla-carousel-react');
34
36
 
35
37
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
36
38
 
@@ -77,6 +79,8 @@ var HoverCardPrimitive__namespace = /*#__PURE__*/_interopNamespace(HoverCardPrim
77
79
  var ContextMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(ContextMenuPrimitive);
78
80
  var NavigationMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(NavigationMenuPrimitive);
79
81
  var MenubarPrimitive__namespace = /*#__PURE__*/_interopNamespace(MenubarPrimitive);
82
+ var AspectRatioPrimitive__namespace = /*#__PURE__*/_interopNamespace(AspectRatioPrimitive);
83
+ var useEmblaCarousel__default = /*#__PURE__*/_interopDefault(useEmblaCarousel);
80
84
 
81
85
  // src/types.ts
82
86
  function toRoughOptions(props) {
@@ -91,6 +95,9 @@ function toRoughOptions(props) {
91
95
  if (props.fill) {
92
96
  options.fill = props.fill;
93
97
  options.fillStyle = props.fillStyle ?? "hachure";
98
+ if (props.hachureGap !== void 0) options.hachureGap = props.hachureGap;
99
+ if (props.hachureAngle !== void 0) options.hachureAngle = props.hachureAngle;
100
+ if (props.fillWeight !== void 0) options.fillWeight = props.fillWeight;
94
101
  }
95
102
  return options;
96
103
  }
@@ -98,6 +105,10 @@ var DEFAULT_ROUGHNESS = 1.5;
98
105
  var DEFAULT_BOWING = 1;
99
106
  var DEFAULT_STROKE_WIDTH = 1.75;
100
107
  var DEFAULT_INK = "#1f1d1a";
108
+ var DEFAULT_DARK_INK = "#f3f4f6";
109
+ var DEFAULT_PAPER = "#f7f6f2";
110
+ var DEFAULT_DARK_PAPER = "#131923";
111
+ var DEFAULT_DARK_CARD_BG = "#131923";
101
112
  var DEFAULT_INSET = 3;
102
113
  var SKETCH_COLORS = {
103
114
  ink: DEFAULT_INK,
@@ -110,6 +121,19 @@ var SKETCH_COLORS = {
110
121
  error: "#c0392b",
111
122
  success: "#2d6a4f"
112
123
  };
124
+ var DARK_SKETCH_COLORS = {
125
+ ink: DEFAULT_DARK_INK,
126
+ accent: "#f87171",
127
+ accentFill: "rgba(248, 113, 113, 0.22)",
128
+ secondaryFill: "rgba(255, 255, 255, 0.08)",
129
+ paper: DEFAULT_DARK_PAPER,
130
+ cardBg: DEFAULT_DARK_CARD_BG,
131
+ shadow: "#000000",
132
+ info: "#60a5fa",
133
+ warning: "#fbbf24",
134
+ error: "#f87171",
135
+ success: "#34d399"
136
+ };
113
137
 
114
138
  // src/utils.ts
115
139
  function assignRef(ref, value) {
@@ -225,6 +249,9 @@ function RoughSvg({
225
249
  fillStyle,
226
250
  strokeWidth,
227
251
  fill,
252
+ hachureGap,
253
+ hachureAngle,
254
+ fillWeight,
228
255
  inset = DEFAULT_INSET,
229
256
  path,
230
257
  className,
@@ -248,7 +275,10 @@ function RoughSvg({
248
275
  bowing,
249
276
  fillStyle,
250
277
  strokeWidth,
251
- fill
278
+ fill,
279
+ hachureGap,
280
+ hachureAngle,
281
+ fillWeight
252
282
  });
253
283
  const x = inset;
254
284
  const y = inset;
@@ -284,6 +314,9 @@ function RoughSvg({
284
314
  fillStyle,
285
315
  strokeWidth,
286
316
  fill,
317
+ hachureGap,
318
+ hachureAngle,
319
+ fillWeight,
287
320
  inset,
288
321
  path
289
322
  ]);
@@ -321,16 +354,17 @@ var DoodleUIContext = react.createContext(null);
321
354
  function DoodleUIProvider({
322
355
  children,
323
356
  animate = true,
324
- forceAnimate = false
357
+ forceAnimate = false,
358
+ theme = "system"
325
359
  }) {
326
360
  const value = react.useMemo(
327
- () => ({ animate, forceAnimate }),
328
- [animate, forceAnimate]
361
+ () => ({ animate, forceAnimate, theme }),
362
+ [animate, forceAnimate, theme]
329
363
  );
330
364
  return /* @__PURE__ */ jsxRuntime.jsx(DoodleUIContext.Provider, { value, children });
331
365
  }
332
366
  function useDoodleUI() {
333
- return react.useContext(DoodleUIContext) ?? { animate: true, forceAnimate: false };
367
+ return react.useContext(DoodleUIContext) ?? { animate: true, forceAnimate: false, theme: "system" };
334
368
  }
335
369
 
336
370
  // src/animations/resolveAnimate.ts
@@ -488,6 +522,93 @@ function useDrawIn(pathRef, duration = DRAW_IN_DURATION_MS, enabled = true, repl
488
522
  };
489
523
  }, [pathRef, duration, enabled, replayKey, delay]);
490
524
  }
525
+ function checkIsDark() {
526
+ if (typeof window === "undefined" || typeof document === "undefined") {
527
+ return false;
528
+ }
529
+ const root = document.documentElement;
530
+ if (root.classList.contains("dark")) return true;
531
+ const dataTheme = root.getAttribute("data-theme");
532
+ if (dataTheme === "dark") return true;
533
+ if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) {
534
+ return true;
535
+ }
536
+ return false;
537
+ }
538
+ function useSketchTheme(sketchColorOverride) {
539
+ const doodleContext = useDoodleUI();
540
+ const contextTheme = doodleContext?.theme;
541
+ const [isClientDark, setIsClientDark] = react.useState(() => {
542
+ if (contextTheme === "dark") return true;
543
+ if (contextTheme === "light") return false;
544
+ return checkIsDark();
545
+ });
546
+ react.useEffect(() => {
547
+ if (contextTheme === "dark") {
548
+ setIsClientDark(true);
549
+ return;
550
+ }
551
+ if (contextTheme === "light") {
552
+ setIsClientDark(false);
553
+ return;
554
+ }
555
+ const update = () => {
556
+ setIsClientDark(checkIsDark());
557
+ };
558
+ update();
559
+ const mediaQuery = window.matchMedia?.("(prefers-color-scheme: dark)");
560
+ mediaQuery?.addEventListener?.("change", update);
561
+ const observer = new MutationObserver((mutations) => {
562
+ for (const m of mutations) {
563
+ if (m.attributeName === "class" || m.attributeName === "data-theme") {
564
+ update();
565
+ break;
566
+ }
567
+ }
568
+ });
569
+ observer.observe(document.documentElement, {
570
+ attributes: true,
571
+ attributeFilter: ["class", "data-theme"]
572
+ });
573
+ return () => {
574
+ mediaQuery?.removeEventListener?.("change", update);
575
+ observer.disconnect();
576
+ };
577
+ }, [contextTheme]);
578
+ const isDark = contextTheme === "dark" ? true : contextTheme === "light" ? false : isClientDark;
579
+ const baseInk = isDark ? DEFAULT_DARK_INK : DEFAULT_INK;
580
+ const ink = sketchColorOverride ?? baseInk;
581
+ if (isDark) {
582
+ return {
583
+ isDark: true,
584
+ ink,
585
+ paper: DEFAULT_DARK_PAPER,
586
+ cardBg: DEFAULT_DARK_CARD_BG,
587
+ shadow: "rgba(0, 0, 0, 0.45)",
588
+ accent: DARK_SKETCH_COLORS.accent,
589
+ accentFill: DARK_SKETCH_COLORS.accentFill,
590
+ secondaryFill: DARK_SKETCH_COLORS.secondaryFill,
591
+ info: DARK_SKETCH_COLORS.info,
592
+ warning: DARK_SKETCH_COLORS.warning,
593
+ error: DARK_SKETCH_COLORS.error,
594
+ success: DARK_SKETCH_COLORS.success
595
+ };
596
+ }
597
+ return {
598
+ isDark: false,
599
+ ink,
600
+ paper: DEFAULT_PAPER,
601
+ cardBg: DEFAULT_PAPER,
602
+ shadow: sketchColorOverride ?? DEFAULT_INK,
603
+ accent: SKETCH_COLORS.accent,
604
+ accentFill: SKETCH_COLORS.accentFill,
605
+ secondaryFill: SKETCH_COLORS.secondaryFill,
606
+ info: SKETCH_COLORS.info,
607
+ warning: SKETCH_COLORS.warning,
608
+ error: SKETCH_COLORS.error,
609
+ success: SKETCH_COLORS.success
610
+ };
611
+ }
491
612
  var SketchBox = react.forwardRef(
492
613
  function SketchBox2({
493
614
  children,
@@ -504,6 +625,9 @@ var SketchBox = react.forwardRef(
504
625
  sketchColor,
505
626
  bowing,
506
627
  strokeWidth,
628
+ hachureGap,
629
+ hachureAngle,
630
+ fillWeight,
507
631
  inset,
508
632
  path,
509
633
  animate,
@@ -512,8 +636,14 @@ var SketchBox = react.forwardRef(
512
636
  ...rest
513
637
  }, ref) {
514
638
  const rootRef = react.useRef(null);
639
+ const theme = useSketchTheme(sketchColor);
640
+ const resolvedInk = sketchColor ?? theme.ink;
515
641
  const shouldAnimate = useAnimate(animate);
516
642
  useDrawIn(rootRef, drawInDuration, shouldAnimate, drawInKey);
643
+ const hasExplicitFill = fill !== void 0;
644
+ const resolvedFill = hasExplicitFill ? fill : shadow ? theme.cardBg : void 0;
645
+ const resolvedFillStyle = fillStyle ?? (resolvedFill ? "solid" : "solid");
646
+ const isPatternedFill = Boolean(resolvedFill && resolvedFillStyle !== "solid");
517
647
  return /* @__PURE__ */ jsxRuntime.jsxs(
518
648
  "div",
519
649
  {
@@ -531,13 +661,31 @@ var SketchBox = react.forwardRef(
531
661
  shape,
532
662
  roughness: (roughness ?? 1.5) + 0.35,
533
663
  seed,
534
- sketchColor,
664
+ sketchColor: theme.isDark ? "rgba(0, 0, 0, 0.45)" : resolvedInk,
535
665
  bowing,
536
666
  fillStyle: "hachure",
537
- fill: sketchColor ?? "#1f1d1a",
667
+ fill: theme.isDark ? theme.shadow : resolvedInk ?? theme.ink,
538
668
  strokeWidth: 1,
669
+ hachureGap: 8,
539
670
  inset,
540
- style: { transform: "translate(5px, 6px)", opacity: 0.16 }
671
+ style: {
672
+ transform: "translate(5px, 6px)",
673
+ opacity: theme.isDark ? 0.35 : 0.16
674
+ }
675
+ }
676
+ ) : null,
677
+ isPatternedFill ? /* @__PURE__ */ jsxRuntime.jsx(
678
+ RoughSvg,
679
+ {
680
+ shape,
681
+ roughness,
682
+ seed,
683
+ sketchColor: "transparent",
684
+ bowing,
685
+ fillStyle: "solid",
686
+ fill: theme.cardBg,
687
+ strokeWidth: 0,
688
+ inset
541
689
  }
542
690
  ) : null,
543
691
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -546,11 +694,14 @@ var SketchBox = react.forwardRef(
546
694
  shape,
547
695
  roughness,
548
696
  seed,
549
- sketchColor,
697
+ sketchColor: resolvedInk,
550
698
  bowing,
551
- fillStyle: fill ? fillStyle : shadow ? "solid" : fillStyle,
552
- fill: fill ?? (shadow ? "#f7f6f2" : void 0),
699
+ fillStyle: resolvedFill ? resolvedFillStyle : void 0,
700
+ fill: resolvedFill,
553
701
  strokeWidth,
702
+ hachureGap: hachureGap ?? (isPatternedFill ? 10 : void 0),
703
+ hachureAngle,
704
+ fillWeight: fillWeight ?? (isPatternedFill ? 0.9 : void 0),
554
705
  inset,
555
706
  path
556
707
  }
@@ -563,6 +714,7 @@ var SketchBox = react.forwardRef(
563
714
  position: "relative",
564
715
  zIndex: 1,
565
716
  fontFamily: doodleUiFontFamily,
717
+ color: resolvedInk,
566
718
  ...contentStyle
567
719
  },
568
720
  children
@@ -595,6 +747,9 @@ var Button = react.forwardRef(
595
747
  bowing,
596
748
  fillStyle,
597
749
  strokeWidth,
750
+ hachureGap,
751
+ hachureAngle,
752
+ fillWeight,
598
753
  disabled,
599
754
  animate,
600
755
  onMouseEnter,
@@ -603,13 +758,15 @@ var Button = react.forwardRef(
603
758
  }, ref) {
604
759
  const rootRef = react.useRef(null);
605
760
  const [hovered, setHovered] = react.useState(false);
761
+ const theme = useSketchTheme(sketchColor);
606
762
  const shouldAnimate = useAnimate(animate);
607
763
  const resolvedSeed = useResolvedSeed(seed);
608
764
  const hoverSeed = deriveSeed(resolvedSeed, "hover");
609
765
  const sketchSeed = shouldAnimate && hovered && !disabled ? hoverSeed : resolvedSeed;
610
- const ink = sketchColor ?? SKETCH_COLORS.ink;
611
- const fill = variant === "primary" ? SKETCH_COLORS.accentFill : variant === "secondary" ? SKETCH_COLORS.secondaryFill : void 0;
612
- const stroke = variant === "ghost" && !hovered ? "transparent" : variant === "primary" ? sketchColor ?? SKETCH_COLORS.accent : ink;
766
+ const ink = sketchColor ?? theme.ink;
767
+ const fill = variant === "primary" ? theme.isDark ? sketchColor ? `${sketchColor}28` : theme.accentFill : theme.accentFill : variant === "secondary" ? theme.secondaryFill : hovered && variant === "ghost" ? theme.isDark ? "rgba(255,255,255,0.06)" : "rgba(31,29,26,0.05)" : void 0;
768
+ const stroke = variant === "ghost" && !hovered ? "transparent" : variant === "primary" ? sketchColor ?? theme.accent : ink;
769
+ const textColor = variant === "primary" ? sketchColor ?? (theme.isDark ? "#ffffff" : ink) : ink;
613
770
  useDrawIn(rootRef, DRAW_IN_DURATION_MS, shouldAnimate, sketchSeed);
614
771
  return /* @__PURE__ */ jsxRuntime.jsxs(
615
772
  "button",
@@ -638,7 +795,7 @@ var Button = react.forwardRef(
638
795
  border: "none",
639
796
  background: "transparent",
640
797
  cursor: disabled ? "not-allowed" : "pointer",
641
- color: ink,
798
+ color: textColor,
642
799
  fontFamily: doodleUiFontFamily,
643
800
  fontWeight: doodleUiFontWeight(600),
644
801
  lineHeight: 1.2,
@@ -656,8 +813,11 @@ var Button = react.forwardRef(
656
813
  seed: sketchSeed,
657
814
  sketchColor: stroke,
658
815
  bowing,
659
- fillStyle: fillStyle ?? "hachure",
816
+ fillStyle: fillStyle ?? (fill ? "hachure" : void 0),
660
817
  fill,
818
+ hachureGap: hachureGap ?? 7,
819
+ hachureAngle,
820
+ fillWeight: fillWeight ?? 1,
661
821
  strokeWidth: !shouldAnimate && hovered ? (strokeWidth ?? 1.75) + 0.4 : strokeWidth
662
822
  }
663
823
  ),
@@ -677,6 +837,9 @@ var Input = react.forwardRef(function Input2({
677
837
  bowing,
678
838
  fillStyle,
679
839
  strokeWidth,
840
+ hachureGap,
841
+ hachureAngle,
842
+ fillWeight,
680
843
  id,
681
844
  onFocus,
682
845
  onBlur,
@@ -685,11 +848,12 @@ var Input = react.forwardRef(function Input2({
685
848
  }, ref) {
686
849
  const [focused, setFocused] = react.useState(false);
687
850
  const fieldRef = react.useRef(null);
851
+ const theme = useSketchTheme(sketchColor);
688
852
  const shouldAnimate = useAnimate(animate);
689
853
  const resolvedSeed = useResolvedSeed(seed);
690
854
  const focusSeed = deriveSeed(resolvedSeed, "focus");
691
855
  const sketchSeed = shouldAnimate && focused ? focusSeed : resolvedSeed;
692
- const ink = sketchColor ?? SKETCH_COLORS.ink;
856
+ const ink = sketchColor ?? theme.ink;
693
857
  const inputId = id;
694
858
  useDrawIn(fieldRef, DRAW_IN_DURATION_MS, shouldAnimate, sketchSeed);
695
859
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -722,9 +886,12 @@ var Input = react.forwardRef(function Input2({
722
886
  shape: "rectangle",
723
887
  roughness,
724
888
  seed: sketchSeed,
725
- sketchColor: focused ? SKETCH_COLORS.accent : ink,
889
+ sketchColor: focused ? sketchColor ?? theme.accent : ink,
726
890
  bowing,
727
891
  fillStyle,
892
+ hachureGap,
893
+ hachureAngle,
894
+ fillWeight,
728
895
  strokeWidth: focused && !shouldAnimate ? (strokeWidth ?? 1.75) + 0.35 : focused ? (strokeWidth ?? 1.75) + 0.2 : strokeWidth
729
896
  }
730
897
  ),
@@ -775,6 +942,9 @@ var Textarea = react.forwardRef(
775
942
  bowing,
776
943
  fillStyle,
777
944
  strokeWidth,
945
+ hachureGap,
946
+ hachureAngle,
947
+ fillWeight,
778
948
  id,
779
949
  rows = 4,
780
950
  onFocus,
@@ -784,11 +954,12 @@ var Textarea = react.forwardRef(
784
954
  }, ref) {
785
955
  const [focused, setFocused] = react.useState(false);
786
956
  const fieldRef = react.useRef(null);
957
+ const theme = useSketchTheme(sketchColor);
787
958
  const shouldAnimate = useAnimate(animate);
788
959
  const resolvedSeed = useResolvedSeed(seed);
789
960
  const focusSeed = deriveSeed(resolvedSeed, "focus");
790
961
  const sketchSeed = shouldAnimate && focused ? focusSeed : resolvedSeed;
791
- const ink = sketchColor ?? SKETCH_COLORS.ink;
962
+ const ink = sketchColor ?? theme.ink;
792
963
  useDrawIn(fieldRef, DRAW_IN_DURATION_MS, shouldAnimate, sketchSeed);
793
964
  return /* @__PURE__ */ jsxRuntime.jsxs(
794
965
  "label",
@@ -820,9 +991,12 @@ var Textarea = react.forwardRef(
820
991
  shape: "rectangle",
821
992
  roughness,
822
993
  seed: sketchSeed,
823
- sketchColor: focused ? SKETCH_COLORS.accent : ink,
994
+ sketchColor: focused ? sketchColor ?? theme.accent : ink,
824
995
  bowing,
825
996
  fillStyle,
997
+ hachureGap,
998
+ hachureAngle,
999
+ fillWeight,
826
1000
  strokeWidth: focused && !shouldAnimate ? (strokeWidth ?? 1.75) + 0.35 : focused ? (strokeWidth ?? 1.75) + 0.2 : strokeWidth
827
1001
  }
828
1002
  ),
@@ -852,8 +1026,7 @@ var Textarea = react.forwardRef(
852
1026
  color: ink,
853
1027
  fontFamily: doodleUiFontFamily,
854
1028
  fontSize: 15,
855
- lineHeight: 1.5,
856
- padding: "10px 12px",
1029
+ padding: "8px 12px",
857
1030
  resize: "vertical",
858
1031
  ...style
859
1032
  },
@@ -871,6 +1044,7 @@ var CHECK_PATH = "M 4.5 10.5 L 8.5 14.5 L 15.5 5.5";
871
1044
  function CheckMark({
872
1045
  roughness,
873
1046
  seed,
1047
+ sketchColor,
874
1048
  bowing,
875
1049
  strokeWidth,
876
1050
  shouldAnimate
@@ -889,7 +1063,7 @@ function CheckMark({
889
1063
  path: CHECK_PATH,
890
1064
  roughness: (roughness ?? 1.5) * 0.7,
891
1065
  seed,
892
- sketchColor: SKETCH_COLORS.accent,
1066
+ sketchColor,
893
1067
  bowing,
894
1068
  strokeWidth: (strokeWidth ?? 1.6) + 0.4,
895
1069
  inset: 0
@@ -903,12 +1077,16 @@ var Checkbox = react.forwardRef(
903
1077
  className,
904
1078
  style,
905
1079
  label,
1080
+ fill,
906
1081
  roughness,
907
1082
  seed,
908
1083
  sketchColor,
909
1084
  bowing,
910
1085
  fillStyle,
911
1086
  strokeWidth,
1087
+ hachureGap,
1088
+ hachureAngle,
1089
+ fillWeight,
912
1090
  checked,
913
1091
  defaultChecked,
914
1092
  onCheckedChange,
@@ -916,7 +1094,9 @@ var Checkbox = react.forwardRef(
916
1094
  animate,
917
1095
  ...rest
918
1096
  }, ref) {
919
- const ink = sketchColor ?? SKETCH_COLORS.ink;
1097
+ const theme = useSketchTheme(sketchColor);
1098
+ const ink = sketchColor ?? theme.ink;
1099
+ const accent = sketchColor ?? theme.accent;
920
1100
  const generatedId = react.useId();
921
1101
  const inputId = id ?? generatedId;
922
1102
  const boxRef = react.useRef(null);
@@ -932,6 +1112,7 @@ var Checkbox = react.forwardRef(
932
1112
  gap: 8,
933
1113
  cursor: "pointer",
934
1114
  userSelect: "none",
1115
+ color: ink,
935
1116
  ...style
936
1117
  },
937
1118
  children: [
@@ -968,8 +1149,12 @@ var Checkbox = react.forwardRef(
968
1149
  seed,
969
1150
  sketchColor: ink,
970
1151
  bowing,
971
- fillStyle,
1152
+ fillStyle: fillStyle ?? (fill ? "solid" : void 0),
1153
+ fill,
972
1154
  strokeWidth: strokeWidth ?? 1.6,
1155
+ hachureGap,
1156
+ hachureAngle,
1157
+ fillWeight,
973
1158
  inset: 1.5
974
1159
  }
975
1160
  )
@@ -988,6 +1173,7 @@ var Checkbox = react.forwardRef(
988
1173
  {
989
1174
  roughness,
990
1175
  seed,
1176
+ sketchColor: accent,
991
1177
  bowing,
992
1178
  strokeWidth,
993
1179
  shouldAnimate
@@ -1002,7 +1188,7 @@ var Checkbox = react.forwardRef(
1002
1188
  "label",
1003
1189
  {
1004
1190
  htmlFor: inputId,
1005
- style: { fontSize: 15, cursor: "pointer", fontFamily: doodleUiFontFamily },
1191
+ style: { fontSize: 15, cursor: "pointer", fontFamily: doodleUiFontFamily, color: ink },
1006
1192
  children: label
1007
1193
  }
1008
1194
  ) : null
@@ -1034,6 +1220,7 @@ var SIZE = 20;
1034
1220
  function RadioDot({
1035
1221
  roughness,
1036
1222
  seed,
1223
+ sketchColor,
1037
1224
  bowing,
1038
1225
  shouldAnimate
1039
1226
  }) {
@@ -1067,8 +1254,8 @@ function RadioDot({
1067
1254
  shape: "ellipse",
1068
1255
  roughness: (roughness ?? 1.5) + 0.2,
1069
1256
  seed,
1070
- sketchColor: SKETCH_COLORS.accent,
1071
- fill: SKETCH_COLORS.accent,
1257
+ sketchColor,
1258
+ fill: sketchColor,
1072
1259
  fillStyle: "solid",
1073
1260
  bowing,
1074
1261
  strokeWidth: 1,
@@ -1082,17 +1269,23 @@ var Radio = react.forwardRef(function Radio2({
1082
1269
  className,
1083
1270
  style,
1084
1271
  label,
1272
+ fill,
1085
1273
  roughness,
1086
1274
  seed,
1087
1275
  sketchColor,
1088
1276
  bowing,
1089
1277
  fillStyle,
1090
1278
  strokeWidth,
1279
+ hachureGap,
1280
+ hachureAngle,
1281
+ fillWeight,
1091
1282
  id,
1092
1283
  animate,
1093
1284
  ...rest
1094
1285
  }, ref) {
1095
- const ink = sketchColor ?? SKETCH_COLORS.ink;
1286
+ const theme = useSketchTheme(sketchColor);
1287
+ const ink = sketchColor ?? theme.ink;
1288
+ const accent = sketchColor ?? theme.accent;
1096
1289
  const generatedId = react.useId();
1097
1290
  const inputId = id ?? generatedId;
1098
1291
  const ringRef = react.useRef(null);
@@ -1108,6 +1301,7 @@ var Radio = react.forwardRef(function Radio2({
1108
1301
  gap: 8,
1109
1302
  cursor: "pointer",
1110
1303
  userSelect: "none",
1304
+ color: ink,
1111
1305
  ...style
1112
1306
  },
1113
1307
  children: [
@@ -1142,8 +1336,12 @@ var Radio = react.forwardRef(function Radio2({
1142
1336
  seed,
1143
1337
  sketchColor: ink,
1144
1338
  bowing,
1145
- fillStyle,
1339
+ fillStyle: fillStyle ?? (fill ? "solid" : void 0),
1340
+ fill,
1146
1341
  strokeWidth: strokeWidth ?? 1.6,
1342
+ hachureGap,
1343
+ hachureAngle,
1344
+ fillWeight,
1147
1345
  inset: 1.5
1148
1346
  }
1149
1347
  )
@@ -1162,6 +1360,7 @@ var Radio = react.forwardRef(function Radio2({
1162
1360
  {
1163
1361
  roughness,
1164
1362
  seed,
1363
+ sketchColor: accent,
1165
1364
  bowing,
1166
1365
  shouldAnimate
1167
1366
  }
@@ -1175,7 +1374,7 @@ var Radio = react.forwardRef(function Radio2({
1175
1374
  "label",
1176
1375
  {
1177
1376
  htmlFor: inputId,
1178
- style: { fontSize: 15, cursor: "pointer", fontFamily: doodleUiFontFamily },
1377
+ style: { fontSize: 15, cursor: "pointer", fontFamily: doodleUiFontFamily, color: ink },
1179
1378
  children: label
1180
1379
  }
1181
1380
  ) : null
@@ -1197,18 +1396,26 @@ var Card = react.forwardRef(function Card2({
1197
1396
  bowing,
1198
1397
  fillStyle,
1199
1398
  strokeWidth,
1399
+ hachureGap,
1400
+ hachureAngle,
1401
+ fillWeight,
1200
1402
  animate,
1201
1403
  ...rest
1202
1404
  }, ref) {
1405
+ const theme = useSketchTheme(sketchColor);
1406
+ const ink = sketchColor ?? theme.ink;
1203
1407
  const boxProps = {
1204
1408
  shadow,
1205
1409
  fill,
1206
1410
  roughness,
1207
1411
  seed,
1208
- sketchColor: sketchColor ?? SKETCH_COLORS.ink,
1412
+ sketchColor: ink,
1209
1413
  bowing,
1210
1414
  fillStyle,
1211
1415
  strokeWidth,
1416
+ hachureGap,
1417
+ hachureAngle,
1418
+ fillWeight,
1212
1419
  animate
1213
1420
  };
1214
1421
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1216,7 +1423,10 @@ var Card = react.forwardRef(function Card2({
1216
1423
  {
1217
1424
  ref,
1218
1425
  className: cn(className),
1219
- style,
1426
+ style: {
1427
+ color: ink,
1428
+ ...style
1429
+ },
1220
1430
  contentStyle: { padding: "16px 18px" },
1221
1431
  ...boxProps,
1222
1432
  ...rest,
@@ -1227,13 +1437,14 @@ var Card = react.forwardRef(function Card2({
1227
1437
  style: {
1228
1438
  fontWeight: doodleUiFontWeight(700),
1229
1439
  fontSize: 16,
1230
- marginBottom: 10
1440
+ marginBottom: 10,
1441
+ color: ink
1231
1442
  },
1232
1443
  children: title
1233
1444
  }
1234
1445
  ) : null,
1235
1446
  children,
1236
- footer ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 14, fontSize: 13, opacity: 0.8 }, children: footer }) : null
1447
+ footer ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 14, fontSize: 13, opacity: 0.8, color: ink }, children: footer }) : null
1237
1448
  ]
1238
1449
  }
1239
1450
  );
@@ -1249,11 +1460,15 @@ var Badge = react.forwardRef(function Badge2({
1249
1460
  bowing,
1250
1461
  fillStyle,
1251
1462
  strokeWidth,
1463
+ hachureGap,
1464
+ hachureAngle,
1465
+ fillWeight,
1252
1466
  animate,
1253
1467
  ...rest
1254
1468
  }, ref) {
1255
- const ink = variant === "accent" ? sketchColor ?? SKETCH_COLORS.accent : sketchColor ?? SKETCH_COLORS.ink;
1256
- const fill = variant === "accent" ? SKETCH_COLORS.accentFill : variant === "outline" ? void 0 : SKETCH_COLORS.secondaryFill;
1469
+ const theme = useSketchTheme(sketchColor);
1470
+ const ink = variant === "accent" ? sketchColor ?? theme.accent : sketchColor ?? theme.ink;
1471
+ const fill = variant === "accent" ? theme.isDark ? sketchColor ? `${sketchColor}25` : theme.accentFill : theme.accentFill : variant === "outline" ? void 0 : theme.secondaryFill;
1257
1472
  return /* @__PURE__ */ jsxRuntime.jsx(
1258
1473
  SketchBox,
1259
1474
  {
@@ -1268,10 +1483,14 @@ var Badge = react.forwardRef(function Badge2({
1268
1483
  fontSize: 12,
1269
1484
  fontWeight: doodleUiFontWeight(650),
1270
1485
  lineHeight: 1.4,
1271
- letterSpacing: "0.01em"
1486
+ letterSpacing: "0.01em",
1487
+ color: ink
1272
1488
  },
1273
1489
  fill,
1274
- fillStyle: fillStyle ?? "hachure",
1490
+ fillStyle: fillStyle ?? (fill ? "hachure" : void 0),
1491
+ hachureGap: hachureGap ?? 6,
1492
+ hachureAngle,
1493
+ fillWeight: fillWeight ?? 0.9,
1275
1494
  roughness,
1276
1495
  seed,
1277
1496
  sketchColor: ink,
@@ -1283,35 +1502,42 @@ var Badge = react.forwardRef(function Badge2({
1283
1502
  }
1284
1503
  );
1285
1504
  });
1286
- var VARIANT_COLOR = {
1287
- info: SKETCH_COLORS.info,
1288
- warning: SKETCH_COLORS.warning,
1289
- error: SKETCH_COLORS.error,
1290
- success: SKETCH_COLORS.success
1291
- };
1292
- var VARIANT_FILL = {
1505
+ var LIGHT_VARIANT_FILL = {
1293
1506
  info: "#d2deec",
1294
1507
  warning: "#f3e2c0",
1295
1508
  error: "#f3d0cc",
1296
1509
  success: "#d3e8dc"
1297
1510
  };
1511
+ var DARK_VARIANT_FILL = {
1512
+ info: "rgba(96, 165, 250, 0.16)",
1513
+ warning: "rgba(251, 191, 36, 0.16)",
1514
+ error: "rgba(248, 113, 113, 0.16)",
1515
+ success: "rgba(52, 211, 153, 0.16)"
1516
+ };
1298
1517
  var Alert = react.forwardRef(function Alert2({
1299
1518
  children,
1300
1519
  className,
1301
1520
  style,
1302
1521
  variant = "info",
1303
1522
  title,
1523
+ fill,
1304
1524
  roughness,
1305
1525
  seed,
1306
1526
  sketchColor,
1307
1527
  bowing,
1308
1528
  fillStyle,
1309
1529
  strokeWidth,
1530
+ hachureGap,
1531
+ hachureAngle,
1532
+ fillWeight,
1310
1533
  role = "status",
1311
1534
  animate,
1312
1535
  ...rest
1313
1536
  }, ref) {
1314
- const color = sketchColor ?? VARIANT_COLOR[variant];
1537
+ const theme = useSketchTheme(sketchColor);
1538
+ const color = sketchColor ?? theme[variant];
1539
+ const defaultFill = theme.isDark ? DARK_VARIANT_FILL[variant] : LIGHT_VARIANT_FILL[variant];
1540
+ const resolvedFill = fill ?? defaultFill;
1315
1541
  return /* @__PURE__ */ jsxRuntime.jsxs(
1316
1542
  SketchBox,
1317
1543
  {
@@ -1319,14 +1545,17 @@ var Alert = react.forwardRef(function Alert2({
1319
1545
  role,
1320
1546
  className: cn(className),
1321
1547
  style: { color, ...style },
1322
- contentStyle: { padding: "12px 16px" },
1548
+ contentStyle: { padding: "12px 16px", color: theme.ink },
1323
1549
  roughness,
1324
1550
  seed,
1325
1551
  sketchColor: color,
1326
1552
  bowing,
1327
1553
  fillStyle: fillStyle ?? "hachure",
1328
- fill: VARIANT_FILL[variant],
1554
+ fill: resolvedFill,
1329
1555
  strokeWidth,
1556
+ hachureGap: hachureGap ?? 9,
1557
+ hachureAngle,
1558
+ fillWeight: fillWeight ?? 0.85,
1330
1559
  animate,
1331
1560
  drawInDuration: DRAW_IN_ALERT_MS,
1332
1561
  ...rest,
@@ -1337,12 +1566,13 @@ var Alert = react.forwardRef(function Alert2({
1337
1566
  style: {
1338
1567
  fontWeight: doodleUiFontWeight(700),
1339
1568
  marginBottom: 4,
1340
- fontSize: 15
1569
+ fontSize: 15,
1570
+ color
1341
1571
  },
1342
1572
  children: title
1343
1573
  }
1344
1574
  ) : null,
1345
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 14, lineHeight: 1.5, color: SKETCH_COLORS.ink }, children })
1575
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 14, lineHeight: 1.5, color: theme.ink }, children })
1346
1576
  ]
1347
1577
  }
1348
1578
  );
@@ -1356,15 +1586,20 @@ function Modal({
1356
1586
  description,
1357
1587
  children,
1358
1588
  className,
1589
+ fill,
1359
1590
  roughness,
1360
1591
  seed,
1361
1592
  sketchColor,
1362
1593
  bowing,
1363
1594
  fillStyle,
1364
1595
  strokeWidth,
1596
+ hachureGap,
1597
+ hachureAngle,
1598
+ fillWeight,
1365
1599
  animate
1366
1600
  }) {
1367
- const ink = sketchColor ?? SKETCH_COLORS.ink;
1601
+ const theme = useSketchTheme(sketchColor);
1602
+ const ink = sketchColor ?? theme.ink;
1368
1603
  const [uncontrolled, setUncontrolled] = react.useState(defaultOpen === true);
1369
1604
  const isOpen = open ?? uncontrolled;
1370
1605
  const shouldAnimate = useAnimate(animate);
@@ -1385,7 +1620,7 @@ function Modal({
1385
1620
  style: {
1386
1621
  position: "fixed",
1387
1622
  inset: 0,
1388
- background: "rgba(31, 29, 26, 0.38)",
1623
+ background: theme.isDark ? "rgba(0, 0, 0, 0.65)" : "rgba(31, 29, 26, 0.38)",
1389
1624
  zIndex: 70
1390
1625
  }
1391
1626
  }
@@ -1414,7 +1649,8 @@ function Modal({
1414
1649
  style: {
1415
1650
  width: "min(480px, calc(100vw - 32px))",
1416
1651
  outline: "none",
1417
- pointerEvents: "auto"
1652
+ pointerEvents: "auto",
1653
+ color: ink
1418
1654
  },
1419
1655
  children: /* @__PURE__ */ jsxRuntime.jsxs(
1420
1656
  SketchBox,
@@ -1424,11 +1660,14 @@ function Modal({
1424
1660
  sketchColor: ink,
1425
1661
  bowing,
1426
1662
  fillStyle: fillStyle ?? "solid",
1427
- fill: "#f7f6f2",
1663
+ fill: fill ?? theme.paper,
1428
1664
  strokeWidth: strokeWidth ?? 2,
1665
+ hachureGap,
1666
+ hachureAngle,
1667
+ fillWeight,
1429
1668
  shadow: true,
1430
1669
  animate,
1431
- contentStyle: { padding: "20px 22px 18px" },
1670
+ contentStyle: { padding: "20px 22px 18px", color: ink },
1432
1671
  children: [
1433
1672
  /* @__PURE__ */ jsxRuntime.jsxs(
1434
1673
  "div",
@@ -1471,12 +1710,10 @@ function Modal({
1471
1710
  {
1472
1711
  variant: "ghost",
1473
1712
  size: "sm",
1474
- roughness,
1475
- seed,
1476
1713
  sketchColor: ink,
1477
- animate,
1478
- "aria-label": "Close",
1479
- children: "Close"
1714
+ "aria-label": "Close dialog",
1715
+ style: { padding: "2px 8px", minHeight: 26 },
1716
+ children: "\u2715"
1480
1717
  }
1481
1718
  ) })
1482
1719
  ]
@@ -1486,11 +1723,13 @@ function Modal({
1486
1723
  Dialog__namespace.Description,
1487
1724
  {
1488
1725
  style: {
1489
- margin: "0 0 14px",
1726
+ margin: 0,
1727
+ marginBottom: 14,
1490
1728
  fontSize: 14,
1491
- lineHeight: 1.5,
1492
- color: ink,
1493
- opacity: 0.8
1729
+ lineHeight: 1.4,
1730
+ opacity: 0.78,
1731
+ fontFamily: doodleUiFontFamily,
1732
+ color: ink
1494
1733
  },
1495
1734
  children: description
1496
1735
  }
@@ -1521,10 +1760,15 @@ var Divider = react.forwardRef(
1521
1760
  sketchColor,
1522
1761
  bowing,
1523
1762
  strokeWidth,
1763
+ hachureGap,
1764
+ hachureAngle,
1765
+ fillWeight,
1524
1766
  animate,
1525
1767
  ...rest
1526
1768
  }, ref) {
1527
1769
  const rootRef = react.useRef(null);
1770
+ const theme = useSketchTheme(sketchColor);
1771
+ const ink = sketchColor ?? theme.ink;
1528
1772
  const shouldAnimate = useAnimate(animate);
1529
1773
  const horizontal = orientation === "horizontal";
1530
1774
  useDrawIn(rootRef, DRAW_IN_DURATION_MS, shouldAnimate);
@@ -1552,9 +1796,12 @@ var Divider = react.forwardRef(
1552
1796
  shape: horizontal ? "line" : "line-vertical",
1553
1797
  roughness: roughness ?? 1.8,
1554
1798
  seed,
1555
- sketchColor: sketchColor ?? SKETCH_COLORS.ink,
1799
+ sketchColor: ink,
1556
1800
  bowing: bowing ?? 2,
1557
1801
  strokeWidth: strokeWidth ?? 1.5,
1802
+ hachureGap,
1803
+ hachureAngle,
1804
+ fillWeight,
1558
1805
  inset: 4
1559
1806
  }
1560
1807
  )
@@ -1574,12 +1821,16 @@ var Progress = react.forwardRef(
1574
1821
  bowing,
1575
1822
  fillStyle,
1576
1823
  strokeWidth,
1824
+ hachureGap,
1825
+ fillWeight,
1577
1826
  animate,
1578
1827
  ...rest
1579
1828
  }, ref) {
1580
1829
  const rootRef = react.useRef(null);
1581
1830
  const trackRef = react.useRef(null);
1582
- const ink = sketchColor ?? SKETCH_COLORS.accent;
1831
+ const theme = useSketchTheme(sketchColor);
1832
+ const ink = sketchColor ?? theme.accent;
1833
+ const trackInk = sketchColor ?? (theme.isDark ? "rgba(243, 244, 246, 0.45)" : theme.ink);
1583
1834
  const clamped = Math.min(max, Math.max(0, value));
1584
1835
  const percent = max === 0 ? 0 : clamped / max * 100;
1585
1836
  const shouldAnimate = useAnimate(animate);
@@ -1619,7 +1870,7 @@ var Progress = react.forwardRef(
1619
1870
  shape: "rectangle",
1620
1871
  roughness,
1621
1872
  seed: resolvedSeed,
1622
- sketchColor: SKETCH_COLORS.ink,
1873
+ sketchColor: trackInk,
1623
1874
  bowing,
1624
1875
  strokeWidth: strokeWidth ?? 1.5,
1625
1876
  inset: 2
@@ -1650,6 +1901,8 @@ var Progress = react.forwardRef(
1650
1901
  fillStyle: fillStyle ?? "hachure",
1651
1902
  bowing,
1652
1903
  strokeWidth: 1.1,
1904
+ hachureGap: hachureGap ?? 5,
1905
+ fillWeight: fillWeight ?? 1.2,
1653
1906
  inset: 1
1654
1907
  }
1655
1908
  )
@@ -1667,15 +1920,20 @@ function Tooltip({
1667
1920
  side = "top",
1668
1921
  delayDuration = 200,
1669
1922
  className,
1923
+ fill,
1670
1924
  roughness,
1671
1925
  seed,
1672
1926
  sketchColor,
1673
1927
  bowing,
1674
1928
  fillStyle,
1675
1929
  strokeWidth,
1930
+ hachureGap,
1931
+ hachureAngle,
1932
+ fillWeight,
1676
1933
  animate
1677
1934
  }) {
1678
- const ink = sketchColor ?? SKETCH_COLORS.ink;
1935
+ const theme = useSketchTheme(sketchColor);
1936
+ const ink = sketchColor ?? theme.ink;
1679
1937
  return /* @__PURE__ */ jsxRuntime.jsxs(TooltipPrimitive__namespace.Root, { delayDuration, children: [
1680
1938
  /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Trigger, { asChild: true, children }),
1681
1939
  /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -1693,8 +1951,11 @@ function Tooltip({
1693
1951
  sketchColor: ink,
1694
1952
  bowing,
1695
1953
  fillStyle: fillStyle ?? "solid",
1696
- fill: "#f7f6f2",
1954
+ fill: fill ?? theme.paper,
1697
1955
  strokeWidth: strokeWidth ?? 1.4,
1956
+ hachureGap,
1957
+ hachureAngle,
1958
+ fillWeight,
1698
1959
  animate,
1699
1960
  drawInDuration: DRAW_IN_TOOLTIP_MS,
1700
1961
  contentStyle: {
@@ -1729,12 +1990,16 @@ function Select({
1729
1990
  placeholder = "Select\u2026",
1730
1991
  className,
1731
1992
  style,
1993
+ fill,
1732
1994
  roughness,
1733
1995
  seed,
1734
1996
  sketchColor,
1735
1997
  bowing,
1736
1998
  fillStyle,
1737
1999
  strokeWidth,
2000
+ hachureGap,
2001
+ hachureAngle,
2002
+ fillWeight,
1738
2003
  value,
1739
2004
  defaultValue,
1740
2005
  onValueChange,
@@ -1746,7 +2011,8 @@ function Select({
1746
2011
  const selectedValue = value ?? uncontrolled;
1747
2012
  const selectedLabel = options.find((option) => option.value === selectedValue)?.label;
1748
2013
  const resolvedSeed = useResolvedSeed(seed);
1749
- const ink = sketchColor ?? SKETCH_COLORS.ink;
2014
+ const theme = useSketchTheme(sketchColor);
2015
+ const ink = sketchColor ?? theme.ink;
1750
2016
  return /* @__PURE__ */ jsxRuntime.jsx(
1751
2017
  SelectSketchContext.Provider,
1752
2018
  {
@@ -1757,8 +2023,13 @@ function Select({
1757
2023
  bowing,
1758
2024
  fillStyle,
1759
2025
  strokeWidth,
2026
+ hachureGap,
2027
+ hachureAngle,
2028
+ fillWeight,
1760
2029
  resolvedSeed,
1761
2030
  ink,
2031
+ paper: fill ?? theme.paper,
2032
+ accent: theme.accent,
1762
2033
  selectedValue,
1763
2034
  selectedLabel,
1764
2035
  placeholder,
@@ -1844,7 +2115,7 @@ var SelectTrigger = react.forwardRef(
1844
2115
  shape: "rectangle",
1845
2116
  roughness: sketch.roughness,
1846
2117
  seed: sketch.resolvedSeed,
1847
- sketchColor: openish ? SKETCH_COLORS.accent : sketch.ink,
2118
+ sketchColor: openish ? sketch.accent : sketch.ink,
1848
2119
  bowing: sketch.bowing,
1849
2120
  fillStyle: sketch.fillStyle,
1850
2121
  strokeWidth: openish ? (sketch.strokeWidth ?? 1.75) + 0.35 : sketch.strokeWidth
@@ -1895,7 +2166,7 @@ var SelectTrigger = react.forwardRef(
1895
2166
  }
1896
2167
  );
1897
2168
  var SelectContent = react.forwardRef(
1898
- function SelectContent2({ className, style, children, ...rest }, ref) {
2169
+ function SelectContent2({ className, style, children, fill, ...rest }, ref) {
1899
2170
  const sketch = useSelectSketch();
1900
2171
  return /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
1901
2172
  SelectPrimitive__namespace.Content,
@@ -1908,6 +2179,7 @@ var SelectContent = react.forwardRef(
1908
2179
  zIndex: 80,
1909
2180
  outline: "none",
1910
2181
  minWidth: "var(--radix-select-trigger-width)",
2182
+ color: sketch.ink,
1911
2183
  ...style
1912
2184
  },
1913
2185
  ...rest,
@@ -1919,10 +2191,13 @@ var SelectContent = react.forwardRef(
1919
2191
  sketchColor: sketch.ink,
1920
2192
  bowing: sketch.bowing,
1921
2193
  fillStyle: sketch.fillStyle ?? "solid",
1922
- fill: "#f7f6f2",
2194
+ fill: fill ?? sketch.paper,
1923
2195
  strokeWidth: sketch.strokeWidth ?? 1.5,
2196
+ hachureGap: sketch.hachureGap,
2197
+ hachureAngle: sketch.hachureAngle,
2198
+ fillWeight: sketch.fillWeight,
1924
2199
  animate: sketch.animate,
1925
- contentStyle: { padding: "6px 4px" },
2200
+ contentStyle: { padding: "6px 4px", color: sketch.ink },
1926
2201
  children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Viewport, { children })
1927
2202
  }
1928
2203
  )
@@ -1968,7 +2243,7 @@ var SelectItem = react.forwardRef(
1968
2243
  shape: "line",
1969
2244
  roughness: (sketch.roughness ?? 1.5) + 0.4,
1970
2245
  seed: sketch.resolvedSeed,
1971
- sketchColor: selected ? SKETCH_COLORS.accent : sketch.ink,
2246
+ sketchColor: selected ? sketch.accent : sketch.ink,
1972
2247
  bowing: sketch.bowing ?? 1.6,
1973
2248
  strokeWidth: selected ? 1.8 : 1.3,
1974
2249
  inset: UNDERLINE_INSET,
@@ -2017,7 +2292,10 @@ var Switch = react.forwardRef(
2017
2292
  }, ref) {
2018
2293
  const [uncontrolled, setUncontrolled] = react.useState(defaultChecked === true);
2019
2294
  const isOn = checked ?? uncontrolled;
2020
- const ink = sketchColor ?? SKETCH_COLORS.ink;
2295
+ const theme = useSketchTheme(sketchColor);
2296
+ const ink = sketchColor ?? theme.ink;
2297
+ const activeColor = sketchColor ?? theme.accent;
2298
+ const activeFill = theme.isDark ? sketchColor ? `${sketchColor}25` : theme.accentFill : theme.accentFill;
2021
2299
  const resolvedSeed = useResolvedSeed(seed);
2022
2300
  const shouldAnimate = useAnimate(animate);
2023
2301
  const trackRef = react.useRef(null);
@@ -2033,6 +2311,7 @@ var Switch = react.forwardRef(
2033
2311
  gap: 8,
2034
2312
  cursor: "pointer",
2035
2313
  userSelect: "none",
2314
+ color: ink,
2036
2315
  ...style
2037
2316
  },
2038
2317
  children: [
@@ -2071,10 +2350,10 @@ var Switch = react.forwardRef(
2071
2350
  shape: "rectangle",
2072
2351
  roughness,
2073
2352
  seed: trackSeed,
2074
- sketchColor: isOn ? SKETCH_COLORS.accent : ink,
2353
+ sketchColor: isOn ? activeColor : ink,
2075
2354
  bowing: bowing ?? 1.4,
2076
2355
  fillStyle: fillStyle ?? (isOn ? "hachure" : void 0),
2077
- fill: isOn ? SKETCH_COLORS.accentFill : void 0,
2356
+ fill: isOn ? activeFill : void 0,
2078
2357
  strokeWidth: strokeWidth ?? 1.6,
2079
2358
  inset: 1.5
2080
2359
  }
@@ -2102,8 +2381,8 @@ var Switch = react.forwardRef(
2102
2381
  shape: "ellipse",
2103
2382
  roughness: (roughness ?? 1.5) * 0.85,
2104
2383
  seed: deriveSeed(resolvedSeed, "thumb"),
2105
- sketchColor: isOn ? SKETCH_COLORS.accent : ink,
2106
- fill: "#f7f6f2",
2384
+ sketchColor: isOn ? activeColor : ink,
2385
+ fill: theme.paper,
2107
2386
  fillStyle: "solid",
2108
2387
  bowing,
2109
2388
  strokeWidth: (strokeWidth ?? 1.5) + 0.2,
@@ -2122,7 +2401,8 @@ var Switch = react.forwardRef(
2122
2401
  style: {
2123
2402
  fontSize: 15,
2124
2403
  cursor: "pointer",
2125
- fontFamily: doodleUiFontFamily
2404
+ fontFamily: doodleUiFontFamily,
2405
+ color: ink
2126
2406
  },
2127
2407
  children: label
2128
2408
  }
@@ -2159,7 +2439,9 @@ var Tabs = react.forwardRef(function Tabs2({
2159
2439
  const [uncontrolled, setUncontrolled] = react.useState(defaultValue);
2160
2440
  const current = value ?? uncontrolled;
2161
2441
  const resolvedSeed = useResolvedSeed(seed);
2162
- const ink = sketchColor ?? SKETCH_COLORS.ink;
2442
+ const theme = useSketchTheme(sketchColor);
2443
+ const ink = sketchColor ?? theme.ink;
2444
+ const accent = sketchColor ?? theme.accent;
2163
2445
  const shouldAnimate = useAnimate(animate);
2164
2446
  return /* @__PURE__ */ jsxRuntime.jsx(
2165
2447
  TabsSketchContext.Provider,
@@ -2173,6 +2455,7 @@ var Tabs = react.forwardRef(function Tabs2({
2173
2455
  strokeWidth,
2174
2456
  resolvedSeed,
2175
2457
  ink,
2458
+ accent,
2176
2459
  current,
2177
2460
  shouldAnimate
2178
2461
  },
@@ -2222,7 +2505,7 @@ function TabUnderline({
2222
2505
  shape: "line",
2223
2506
  roughness: (sketch.roughness ?? 1.5) + 0.35,
2224
2507
  seed,
2225
- sketchColor: SKETCH_COLORS.accent,
2508
+ sketchColor: sketch.accent,
2226
2509
  bowing: sketch.bowing ?? 1.8,
2227
2510
  strokeWidth: (sketch.strokeWidth ?? 1.75) + 0.4,
2228
2511
  inset: 2
@@ -2305,7 +2588,7 @@ var Tab = react.forwardRef(function Tab2({ className, style, children, value, ..
2305
2588
  fontFamily: doodleUiFontFamily,
2306
2589
  fontSize: 15,
2307
2590
  fontWeight: active ? doodleUiFontWeight(650) : doodleUiFontWeight(400),
2308
- color: sketch.ink,
2591
+ color: active ? sketch.accent : sketch.ink,
2309
2592
  outline: "none",
2310
2593
  ...style
2311
2594
  },
@@ -2403,7 +2686,8 @@ var Table = react.forwardRef(function Table2({
2403
2686
  const tableRef = react.useRef(null);
2404
2687
  const [lines, setLines] = react.useState([]);
2405
2688
  const resolvedSeed = useResolvedSeed(seed);
2406
- const ink = sketchColor ?? SKETCH_COLORS.ink;
2689
+ const theme = useSketchTheme(sketchColor);
2690
+ const ink = sketchColor ?? theme.ink;
2407
2691
  const shouldAnimate = useAnimate(animate);
2408
2692
  react.useLayoutEffect(() => {
2409
2693
  const wrapper = wrapperRef.current;
@@ -2576,18 +2860,18 @@ var TableCell = react.forwardRef(
2576
2860
  );
2577
2861
  }
2578
2862
  );
2579
- var VARIANT_COLOR2 = {
2580
- info: SKETCH_COLORS.info,
2581
- warning: SKETCH_COLORS.warning,
2582
- error: SKETCH_COLORS.error,
2583
- success: SKETCH_COLORS.success
2584
- };
2585
- var VARIANT_FILL2 = {
2863
+ var LIGHT_VARIANT_FILL2 = {
2586
2864
  info: "#d2deec",
2587
2865
  warning: "#f3e2c0",
2588
2866
  error: "#f3d0cc",
2589
2867
  success: "#d3e8dc"
2590
2868
  };
2869
+ var DARK_VARIANT_FILL2 = {
2870
+ info: "rgba(96, 165, 250, 0.16)",
2871
+ warning: "rgba(251, 191, 36, 0.16)",
2872
+ error: "rgba(248, 113, 113, 0.16)",
2873
+ success: "rgba(52, 211, 153, 0.16)"
2874
+ };
2591
2875
  var POSITION_STYLE = {
2592
2876
  "top-left": { top: 16, left: 16 },
2593
2877
  "top-right": { top: 16, right: 16 },
@@ -2639,6 +2923,7 @@ function Toast({
2639
2923
  title,
2640
2924
  children,
2641
2925
  variant = "info",
2926
+ fill,
2642
2927
  duration,
2643
2928
  className,
2644
2929
  style,
@@ -2648,6 +2933,9 @@ function Toast({
2648
2933
  bowing,
2649
2934
  fillStyle,
2650
2935
  strokeWidth,
2936
+ hachureGap,
2937
+ hachureAngle,
2938
+ fillWeight,
2651
2939
  animate
2652
2940
  }) {
2653
2941
  const position = react.useContext(ToastPositionContext);
@@ -2655,7 +2943,10 @@ function Toast({
2655
2943
  const [uncontrolled, setUncontrolled] = react.useState(defaultOpen ?? false);
2656
2944
  const isOpen = open ?? uncontrolled;
2657
2945
  const shouldAnimate = useAnimate(animate);
2658
- const color = sketchColor ?? VARIANT_COLOR2[variant];
2946
+ const theme = useSketchTheme(sketchColor);
2947
+ const color = sketchColor ?? theme[variant];
2948
+ const defaultFill = theme.isDark ? DARK_VARIANT_FILL2[variant] : LIGHT_VARIANT_FILL2[variant];
2949
+ const resolvedFill = fill ?? defaultFill;
2659
2950
  const offset = fromTop ? -14 : 14;
2660
2951
  function handleOpenChange(next) {
2661
2952
  setUncontrolled(next);
@@ -2690,11 +2981,14 @@ function Toast({
2690
2981
  sketchColor: color,
2691
2982
  bowing,
2692
2983
  fillStyle: fillStyle ?? "hachure",
2693
- fill: VARIANT_FILL2[variant],
2984
+ fill: resolvedFill,
2694
2985
  strokeWidth: strokeWidth ?? 1.7,
2986
+ hachureGap: hachureGap ?? 9,
2987
+ hachureAngle,
2988
+ fillWeight: fillWeight ?? 0.85,
2695
2989
  shadow: true,
2696
2990
  animate,
2697
- contentStyle: { padding: "12px 16px" },
2991
+ contentStyle: { padding: "12px 16px", color: theme.ink },
2698
2992
  children: [
2699
2993
  title ? /* @__PURE__ */ jsxRuntime.jsx(
2700
2994
  ToastPrimitive__namespace.Title,
@@ -2718,7 +3012,7 @@ function Toast({
2718
3012
  fontSize: 14,
2719
3013
  lineHeight: 1.5,
2720
3014
  fontFamily: doodleUiFontFamily,
2721
- color: SKETCH_COLORS.ink
3015
+ color: theme.ink
2722
3016
  },
2723
3017
  children
2724
3018
  }
@@ -2763,19 +3057,26 @@ var Accordion = react.forwardRef(
2763
3057
  sketchColor,
2764
3058
  bowing,
2765
3059
  fillStyle,
2766
- strokeWidth
3060
+ strokeWidth,
3061
+ hachureGap,
3062
+ hachureAngle,
3063
+ fillWeight
2767
3064
  }, ref) {
2768
3065
  const resolvedSeed = useResolvedSeed(seed);
2769
- const ink = sketchColor ?? SKETCH_COLORS.ink;
3066
+ const theme = useSketchTheme(sketchColor);
3067
+ const ink = sketchColor ?? theme.ink;
2770
3068
  const [uncontrolled, setUncontrolled] = react.useState(defaultValue ?? (type === "multiple" ? [] : void 0));
2771
3069
  const openValue = value ?? uncontrolled;
2772
3070
  const sketchValue = {
2773
3071
  roughness,
2774
3072
  seed: resolvedSeed,
2775
- sketchColor,
3073
+ sketchColor: ink,
2776
3074
  bowing,
2777
3075
  fillStyle,
2778
3076
  strokeWidth,
3077
+ hachureGap,
3078
+ hachureAngle,
3079
+ fillWeight,
2779
3080
  resolvedSeed,
2780
3081
  ink,
2781
3082
  openValue
@@ -2938,11 +3239,6 @@ var AccordionContent = react.forwardRef(function AccordionContent2({ className,
2938
3239
  }
2939
3240
  );
2940
3241
  });
2941
- var STATUS_COLOR = {
2942
- online: SKETCH_COLORS.success,
2943
- offline: "#8a8680",
2944
- busy: SKETCH_COLORS.accent
2945
- };
2946
3242
  var Avatar = react.forwardRef(
2947
3243
  function Avatar2({
2948
3244
  className,
@@ -2953,18 +3249,28 @@ var Avatar = react.forwardRef(
2953
3249
  size = 40,
2954
3250
  shape = "circle",
2955
3251
  status,
3252
+ fill,
2956
3253
  roughness,
2957
3254
  seed,
2958
3255
  sketchColor,
2959
3256
  bowing,
2960
3257
  fillStyle,
2961
3258
  strokeWidth,
3259
+ hachureGap,
3260
+ hachureAngle,
3261
+ fillWeight,
2962
3262
  ...rest
2963
3263
  }, ref) {
2964
- const ink = sketchColor ?? SKETCH_COLORS.ink;
3264
+ const theme = useSketchTheme(sketchColor);
3265
+ const ink = sketchColor ?? theme.ink;
2965
3266
  const resolvedSeed = useResolvedSeed(seed);
2966
3267
  const roughShape = shape === "circle" ? "ellipse" : "rectangle";
2967
3268
  const badge = 12;
3269
+ const statusColors = {
3270
+ online: theme.success,
3271
+ offline: theme.isDark ? "#9ca3af" : "#8a8680",
3272
+ busy: theme.accent
3273
+ };
2968
3274
  const rootStyle = {
2969
3275
  position: "relative",
2970
3276
  display: "inline-flex",
@@ -2991,8 +3297,11 @@ var Avatar = react.forwardRef(
2991
3297
  sketchColor: ink,
2992
3298
  bowing,
2993
3299
  fillStyle: fillStyle ?? "solid",
2994
- fill: "#f7f6f2",
3300
+ fill: fill ?? theme.paper,
2995
3301
  strokeWidth: strokeWidth ?? 1.6,
3302
+ hachureGap,
3303
+ hachureAngle,
3304
+ fillWeight,
2996
3305
  inset: 1.5
2997
3306
  }
2998
3307
  ),
@@ -3036,7 +3345,7 @@ var Avatar = react.forwardRef(
3036
3345
  fontWeight: doodleUiFontWeight(650),
3037
3346
  fontSize: Math.max(12, size * 0.36),
3038
3347
  color: ink,
3039
- background: SKETCH_COLORS.secondaryFill
3348
+ background: theme.secondaryFill
3040
3349
  },
3041
3350
  children: fallback
3042
3351
  }
@@ -3061,8 +3370,8 @@ var Avatar = react.forwardRef(
3061
3370
  shape: "ellipse",
3062
3371
  roughness: (roughness ?? 1.5) * 0.8,
3063
3372
  seed: deriveSeed(resolvedSeed, "status"),
3064
- sketchColor: STATUS_COLOR[status],
3065
- fill: STATUS_COLOR[status],
3373
+ sketchColor: statusColors[status],
3374
+ fill: statusColors[status],
3066
3375
  fillStyle: "solid",
3067
3376
  bowing,
3068
3377
  strokeWidth: 1,
@@ -3079,16 +3388,23 @@ var Avatar = react.forwardRef(
3079
3388
  var Slider = react.forwardRef(function Slider2({
3080
3389
  className,
3081
3390
  style,
3391
+ fill,
3082
3392
  roughness,
3083
3393
  seed,
3084
3394
  sketchColor,
3085
3395
  bowing,
3086
3396
  fillStyle,
3087
3397
  strokeWidth,
3398
+ hachureGap,
3399
+ hachureAngle,
3400
+ fillWeight,
3088
3401
  thumbShape = "circle",
3089
3402
  ...rest
3090
3403
  }, ref) {
3091
- const ink = sketchColor ?? SKETCH_COLORS.ink;
3404
+ const theme = useSketchTheme(sketchColor);
3405
+ const ink = sketchColor ?? theme.ink;
3406
+ const accent = sketchColor ?? theme.accent;
3407
+ const trackInk = sketchColor ?? (theme.isDark ? "rgba(243, 244, 246, 0.4)" : theme.ink);
3092
3408
  const resolvedSeed = useResolvedSeed(seed);
3093
3409
  return /* @__PURE__ */ jsxRuntime.jsxs(
3094
3410
  SliderPrimitive__namespace.Root,
@@ -3103,6 +3419,7 @@ var Slider = react.forwardRef(function Slider2({
3103
3419
  height: 28,
3104
3420
  userSelect: "none",
3105
3421
  touchAction: "none",
3422
+ color: ink,
3106
3423
  ...style
3107
3424
  },
3108
3425
  ...rest,
@@ -3122,7 +3439,7 @@ var Slider = react.forwardRef(function Slider2({
3122
3439
  shape: "line",
3123
3440
  roughness: roughness ?? 1.8,
3124
3441
  seed: resolvedSeed,
3125
- sketchColor: ink,
3442
+ sketchColor: trackInk,
3126
3443
  bowing: bowing ?? 2,
3127
3444
  strokeWidth: strokeWidth ?? 1.6,
3128
3445
  inset: 4
@@ -3142,7 +3459,7 @@ var Slider = react.forwardRef(function Slider2({
3142
3459
  shape: "line",
3143
3460
  roughness: (roughness ?? 1.5) + 0.4,
3144
3461
  seed: deriveSeed(resolvedSeed, "range"),
3145
- sketchColor: SKETCH_COLORS.accent,
3462
+ sketchColor: accent,
3146
3463
  bowing: bowing ?? 1.6,
3147
3464
  strokeWidth: (strokeWidth ?? 1.6) + 0.6,
3148
3465
  inset: 4
@@ -3170,11 +3487,14 @@ var Slider = react.forwardRef(function Slider2({
3170
3487
  shape: thumbShape === "square" ? "rectangle" : "ellipse",
3171
3488
  roughness: (roughness ?? 1.5) * 0.85,
3172
3489
  seed: deriveSeed(resolvedSeed, "thumb"),
3173
- sketchColor: SKETCH_COLORS.accent,
3174
- fill: "#f7f6f2",
3490
+ sketchColor: accent,
3491
+ fill: fill ?? theme.paper,
3175
3492
  fillStyle: fillStyle ?? "solid",
3176
3493
  bowing,
3177
3494
  strokeWidth: (strokeWidth ?? 1.5) + 0.3,
3495
+ hachureGap,
3496
+ hachureAngle,
3497
+ fillWeight,
3178
3498
  inset: 1
3179
3499
  }
3180
3500
  )
@@ -3213,7 +3533,10 @@ var Pagination = react.forwardRef(
3213
3533
  strokeWidth,
3214
3534
  ...rest
3215
3535
  }, ref) {
3216
- const ink = sketchColor ?? SKETCH_COLORS.ink;
3536
+ const theme = useSketchTheme(sketchColor);
3537
+ const ink = sketchColor ?? theme.ink;
3538
+ const accent = sketchColor ?? theme.accent;
3539
+ const accentFill = theme.isDark ? sketchColor ? `${sketchColor}25` : theme.accentFill : theme.accentFill;
3217
3540
  const resolvedSeed = useResolvedSeed(seed);
3218
3541
  const items = pageItems(page, count);
3219
3542
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -3226,6 +3549,7 @@ var Pagination = react.forwardRef(
3226
3549
  display: "inline-flex",
3227
3550
  alignItems: "center",
3228
3551
  gap: 4,
3552
+ color: ink,
3229
3553
  ...style
3230
3554
  },
3231
3555
  ...rest,
@@ -3239,6 +3563,9 @@ var Pagination = react.forwardRef(
3239
3563
  roughness,
3240
3564
  seed: deriveSeed(resolvedSeed, "prev"),
3241
3565
  ink,
3566
+ accent,
3567
+ accentFill,
3568
+ isDark: theme.isDark,
3242
3569
  bowing,
3243
3570
  strokeWidth,
3244
3571
  children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: { position: "relative", width: 16, height: 16, display: "block" }, children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -3278,6 +3605,9 @@ var Pagination = react.forwardRef(
3278
3605
  roughness,
3279
3606
  seed: deriveSeed(resolvedSeed, `page-${item}`),
3280
3607
  ink,
3608
+ accent,
3609
+ accentFill,
3610
+ isDark: theme.isDark,
3281
3611
  bowing,
3282
3612
  strokeWidth,
3283
3613
  children: item
@@ -3294,6 +3624,9 @@ var Pagination = react.forwardRef(
3294
3624
  roughness,
3295
3625
  seed: deriveSeed(resolvedSeed, "next"),
3296
3626
  ink,
3627
+ accent,
3628
+ accentFill,
3629
+ isDark: theme.isDark,
3297
3630
  bowing,
3298
3631
  strokeWidth,
3299
3632
  children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: { position: "relative", width: 16, height: 16, display: "block" }, children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -3324,10 +3657,15 @@ function PageButton({
3324
3657
  roughness,
3325
3658
  seed,
3326
3659
  ink,
3660
+ accent,
3661
+ accentFill,
3662
+ isDark,
3327
3663
  bowing,
3328
3664
  strokeWidth,
3329
3665
  ...rest
3330
3666
  }) {
3667
+ const activeColor = accent ?? ink;
3668
+ const textColor = active ? isDark ? "#ffffff" : activeColor : ink;
3331
3669
  return /* @__PURE__ */ jsxRuntime.jsxs(
3332
3670
  "button",
3333
3671
  {
@@ -3342,7 +3680,7 @@ function PageButton({
3342
3680
  border: "none",
3343
3681
  background: "transparent",
3344
3682
  cursor: disabled ? "not-allowed" : "pointer",
3345
- color: ink,
3683
+ color: textColor,
3346
3684
  fontFamily: doodleUiFontFamily,
3347
3685
  fontWeight: active ? doodleUiFontWeight(700) : doodleUiFontWeight(400),
3348
3686
  fontSize: 14,
@@ -3358,9 +3696,9 @@ function PageButton({
3358
3696
  shape: "ellipse",
3359
3697
  roughness,
3360
3698
  seed,
3361
- sketchColor: active ? SKETCH_COLORS.accent : ink,
3699
+ sketchColor: active ? activeColor : ink,
3362
3700
  bowing,
3363
- fill: active ? SKETCH_COLORS.accentFill : void 0,
3701
+ fill: active ? accentFill : void 0,
3364
3702
  fillStyle: active ? "hachure" : void 0,
3365
3703
  strokeWidth: active ? (strokeWidth ?? 1.6) + 0.3 : strokeWidth ?? 1.4,
3366
3704
  inset: 1.5
@@ -3372,7 +3710,7 @@ function PageButton({
3372
3710
  shape: "ellipse",
3373
3711
  roughness: (roughness ?? 1.5) + 0.45,
3374
3712
  seed,
3375
- sketchColor: SKETCH_COLORS.accent,
3713
+ sketchColor: activeColor,
3376
3714
  bowing: bowing ?? 1.6,
3377
3715
  strokeWidth: 1.1,
3378
3716
  inset: -1.5,
@@ -3405,9 +3743,13 @@ var Breadcrumb = react.forwardRef(
3405
3743
  sketchColor,
3406
3744
  bowing,
3407
3745
  strokeWidth,
3746
+ hachureGap,
3747
+ hachureAngle,
3748
+ fillWeight,
3408
3749
  ...rest
3409
3750
  }, ref) {
3410
- const ink = sketchColor ?? SKETCH_COLORS.ink;
3751
+ const theme = useSketchTheme(sketchColor);
3752
+ const ink = sketchColor ?? theme.ink;
3411
3753
  const resolvedSeed = useResolvedSeed(seed);
3412
3754
  const items = react.Children.toArray(children).filter(react.isValidElement);
3413
3755
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -3416,9 +3758,12 @@ var Breadcrumb = react.forwardRef(
3416
3758
  value: {
3417
3759
  roughness,
3418
3760
  seed: resolvedSeed,
3419
- sketchColor,
3761
+ sketchColor: ink,
3420
3762
  bowing,
3421
3763
  strokeWidth,
3764
+ hachureGap,
3765
+ hachureAngle,
3766
+ fillWeight,
3422
3767
  resolvedSeed,
3423
3768
  ink,
3424
3769
  separator
@@ -3557,11 +3902,15 @@ var Skeleton = react.forwardRef(
3557
3902
  bowing,
3558
3903
  fillStyle,
3559
3904
  strokeWidth,
3905
+ hachureGap,
3906
+ hachureAngle,
3907
+ fillWeight,
3560
3908
  ...rest
3561
3909
  }, ref) {
3562
3910
  const base = useResolvedSeed(seed);
3563
3911
  const [tick, setTick] = react.useState(0);
3564
- const ink = sketchColor ?? SKETCH_COLORS.ink;
3912
+ const theme = useSketchTheme(sketchColor);
3913
+ const ink = sketchColor ?? theme.ink;
3565
3914
  react.useEffect(() => {
3566
3915
  if (!pulse) return;
3567
3916
  const id = window.setInterval(() => {
@@ -3598,6 +3947,9 @@ var Skeleton = react.forwardRef(
3598
3947
  fillStyle: fillStyle ?? "hachure",
3599
3948
  bowing: bowing ?? 1.6,
3600
3949
  strokeWidth: strokeWidth ?? 1.1,
3950
+ hachureGap,
3951
+ hachureAngle,
3952
+ fillWeight,
3601
3953
  inset: 2,
3602
3954
  style: { opacity: 0.28 }
3603
3955
  }
@@ -3618,15 +3970,21 @@ var Stepper = react.forwardRef(
3618
3970
  steps,
3619
3971
  current = 0,
3620
3972
  orientation = "horizontal",
3973
+ fill,
3621
3974
  roughness,
3622
3975
  seed,
3623
3976
  sketchColor,
3624
3977
  bowing,
3625
3978
  fillStyle,
3626
3979
  strokeWidth,
3980
+ hachureGap,
3981
+ hachureAngle,
3982
+ fillWeight,
3627
3983
  ...rest
3628
3984
  }, ref) {
3629
- const ink = sketchColor ?? SKETCH_COLORS.ink;
3985
+ const theme = useSketchTheme(sketchColor);
3986
+ const ink = sketchColor ?? theme.ink;
3987
+ const accent = sketchColor ?? theme.accent;
3630
3988
  const resolvedSeed = useResolvedSeed(seed);
3631
3989
  const items = normalizeSteps(steps);
3632
3990
  const horizontal = orientation === "horizontal";
@@ -3640,13 +3998,15 @@ var Stepper = react.forwardRef(
3640
3998
  display: "flex",
3641
3999
  flexDirection: horizontal ? "row" : "column",
3642
4000
  alignItems: horizontal ? "flex-start" : "stretch",
4001
+ color: ink,
3643
4002
  ...style
3644
4003
  },
3645
4004
  ...rest,
3646
4005
  children: items.map((step, index) => {
3647
4006
  const complete = index < current;
3648
4007
  const active = index === current;
3649
- const markerColor = complete || active ? SKETCH_COLORS.accent : ink;
4008
+ const markerColor = complete || active ? accent : ink;
4009
+ const completeFill = theme.isDark ? sketchColor ? `${sketchColor}25` : theme.accentFill : theme.accentFill;
3650
4010
  return /* @__PURE__ */ jsxRuntime.jsxs(
3651
4011
  "div",
3652
4012
  {
@@ -3694,10 +4054,13 @@ var Stepper = react.forwardRef(
3694
4054
  roughness,
3695
4055
  seed: deriveSeed(resolvedSeed, `step-${index}`),
3696
4056
  sketchColor: markerColor,
3697
- fill: complete ? SKETCH_COLORS.accentFill : active ? "#f7f6f2" : void 0,
4057
+ fill: complete ? completeFill : active ? fill ?? theme.paper : void 0,
3698
4058
  fillStyle: complete || active ? fillStyle ?? "hachure" : void 0,
3699
4059
  bowing,
3700
4060
  strokeWidth: active ? (strokeWidth ?? 1.6) + 0.4 : strokeWidth ?? 1.5,
4061
+ hachureGap,
4062
+ hachureAngle,
4063
+ fillWeight,
3701
4064
  inset: 1.5
3702
4065
  }
3703
4066
  ),
@@ -3722,7 +4085,7 @@ var Stepper = react.forwardRef(
3722
4085
  shape: horizontal ? "line" : "line-vertical",
3723
4086
  roughness: (roughness ?? 1.5) + 0.3,
3724
4087
  seed: deriveSeed(resolvedSeed, `connector-${index}`),
3725
- sketchColor: complete ? SKETCH_COLORS.accent : ink,
4088
+ sketchColor: complete ? accent : theme.isDark ? "rgba(243, 244, 246, 0.35)" : ink,
3726
4089
  bowing: bowing ?? 2,
3727
4090
  strokeWidth: strokeWidth ?? 1.4,
3728
4091
  inset: 2
@@ -3770,10 +4133,14 @@ var Label2 = react.forwardRef(function Label3({
3770
4133
  sketchColor,
3771
4134
  bowing,
3772
4135
  strokeWidth,
4136
+ hachureGap,
4137
+ hachureAngle,
4138
+ fillWeight,
3773
4139
  animate,
3774
4140
  ...rest
3775
4141
  }, ref) {
3776
- const ink = sketchColor ?? SKETCH_COLORS.ink;
4142
+ const theme = useSketchTheme(sketchColor);
4143
+ const ink = sketchColor ?? theme.ink;
3777
4144
  const resolvedSeed = useResolvedSeed(seed);
3778
4145
  const shouldAnimate = useAnimate(animate);
3779
4146
  const markRef = react.useRef(null);
@@ -3809,11 +4176,14 @@ var Label2 = react.forwardRef(function Label3({
3809
4176
  shape: "ellipse",
3810
4177
  roughness: (roughness ?? 1.5) * 0.9,
3811
4178
  seed: resolvedSeed,
3812
- sketchColor: SKETCH_COLORS.accent,
4179
+ sketchColor: theme.accent,
3813
4180
  bowing,
3814
4181
  fillStyle: "solid",
3815
- fill: SKETCH_COLORS.accent,
4182
+ fill: theme.accent,
3816
4183
  strokeWidth: strokeWidth ?? 1.2,
4184
+ hachureGap,
4185
+ hachureAngle,
4186
+ fillWeight,
3817
4187
  inset: 1
3818
4188
  }
3819
4189
  )
@@ -3849,10 +4219,14 @@ var Collapsible = react.forwardRef(
3849
4219
  bowing,
3850
4220
  fillStyle,
3851
4221
  strokeWidth,
4222
+ hachureGap,
4223
+ hachureAngle,
4224
+ fillWeight,
3852
4225
  ...rest
3853
4226
  }, ref) {
3854
4227
  const resolvedSeed = useResolvedSeed(seed);
3855
- const ink = sketchColor ?? SKETCH_COLORS.ink;
4228
+ const theme = useSketchTheme(sketchColor);
4229
+ const ink = sketchColor ?? theme.ink;
3856
4230
  const [uncontrolled, setUncontrolled] = react.useState(defaultOpen ?? false);
3857
4231
  const isOpen = open ?? uncontrolled;
3858
4232
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -3861,10 +4235,13 @@ var Collapsible = react.forwardRef(
3861
4235
  value: {
3862
4236
  roughness,
3863
4237
  seed: resolvedSeed,
3864
- sketchColor,
4238
+ sketchColor: ink,
3865
4239
  bowing,
3866
4240
  fillStyle,
3867
4241
  strokeWidth,
4242
+ hachureGap,
4243
+ hachureAngle,
4244
+ fillWeight,
3868
4245
  resolvedSeed,
3869
4246
  ink,
3870
4247
  open: isOpen
@@ -3979,17 +4356,22 @@ function usePopoverSketch() {
3979
4356
  }
3980
4357
  function Popover({
3981
4358
  children,
4359
+ fill,
3982
4360
  roughness,
3983
4361
  seed,
3984
4362
  sketchColor,
3985
4363
  bowing,
3986
4364
  fillStyle,
3987
4365
  strokeWidth,
4366
+ hachureGap,
4367
+ hachureAngle,
4368
+ fillWeight,
3988
4369
  animate,
3989
4370
  ...rest
3990
4371
  }) {
3991
4372
  const resolvedSeed = useResolvedSeed(seed);
3992
- const ink = sketchColor ?? SKETCH_COLORS.ink;
4373
+ const theme = useSketchTheme(sketchColor);
4374
+ const ink = sketchColor ?? theme.ink;
3993
4375
  return /* @__PURE__ */ jsxRuntime.jsx(
3994
4376
  PopoverSketchContext.Provider,
3995
4377
  {
@@ -4000,8 +4382,12 @@ function Popover({
4000
4382
  bowing,
4001
4383
  fillStyle,
4002
4384
  strokeWidth,
4385
+ hachureGap,
4386
+ hachureAngle,
4387
+ fillWeight,
4003
4388
  resolvedSeed,
4004
4389
  ink,
4390
+ paper: fill ?? theme.paper,
4005
4391
  animate
4006
4392
  },
4007
4393
  children: /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Root, { ...rest, children })
@@ -4012,7 +4398,7 @@ var PopoverTrigger = PopoverPrimitive__namespace.Trigger;
4012
4398
  var PopoverAnchor = PopoverPrimitive__namespace.Anchor;
4013
4399
  var PopoverClose = PopoverPrimitive__namespace.Close;
4014
4400
  var PopoverContent = react.forwardRef(
4015
- function PopoverContent2({ className, style, children, sideOffset = 8, ...rest }, ref) {
4401
+ function PopoverContent2({ className, style, children, fill, sideOffset = 8, ...rest }, ref) {
4016
4402
  const sketch = usePopoverSketch();
4017
4403
  return /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
4018
4404
  PopoverPrimitive__namespace.Content,
@@ -4020,7 +4406,7 @@ var PopoverContent = react.forwardRef(
4020
4406
  ref,
4021
4407
  sideOffset,
4022
4408
  className: cn(className),
4023
- style: { zIndex: 80, outline: "none", ...style },
4409
+ style: { zIndex: 80, outline: "none", color: sketch.ink, ...style },
4024
4410
  ...rest,
4025
4411
  children: /* @__PURE__ */ jsxRuntime.jsx(
4026
4412
  SketchBox,
@@ -4030,11 +4416,14 @@ var PopoverContent = react.forwardRef(
4030
4416
  sketchColor: sketch.ink,
4031
4417
  bowing: sketch.bowing,
4032
4418
  fillStyle: sketch.fillStyle ?? "solid",
4033
- fill: "#f7f6f2",
4419
+ fill: fill ?? sketch.paper,
4034
4420
  strokeWidth: sketch.strokeWidth ?? 1.5,
4421
+ hachureGap: sketch.hachureGap,
4422
+ hachureAngle: sketch.hachureAngle,
4423
+ fillWeight: sketch.fillWeight,
4035
4424
  shadow: true,
4036
4425
  animate: sketch.animate,
4037
- contentStyle: { padding: "14px 16px", minWidth: 200 },
4426
+ contentStyle: { padding: "14px 16px", minWidth: 200, color: sketch.ink },
4038
4427
  children
4039
4428
  }
4040
4429
  )
@@ -4042,12 +4431,9 @@ var PopoverContent = react.forwardRef(
4042
4431
  ) });
4043
4432
  }
4044
4433
  );
4045
- var PopoverArrow = react.forwardRef(
4046
- function PopoverArrow2(props, ref) {
4047
- const sketch = usePopoverSketch();
4048
- return /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Arrow, { ref, fill: sketch.ink, ...props });
4049
- }
4050
- );
4434
+ function PopoverArrow(props) {
4435
+ return /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Arrow, { ...props });
4436
+ }
4051
4437
  var DropdownMenuSketchContext = react.createContext(null);
4052
4438
  function useDropdownMenuSketch() {
4053
4439
  const ctx = react.useContext(DropdownMenuSketchContext);
@@ -4060,17 +4446,22 @@ function useDropdownMenuSketch() {
4060
4446
  }
4061
4447
  function DropdownMenu({
4062
4448
  children,
4449
+ fill,
4063
4450
  roughness,
4064
4451
  seed,
4065
4452
  sketchColor,
4066
4453
  bowing,
4067
4454
  fillStyle,
4068
4455
  strokeWidth,
4456
+ hachureGap,
4457
+ hachureAngle,
4458
+ fillWeight,
4069
4459
  animate,
4070
4460
  ...rest
4071
4461
  }) {
4072
4462
  const resolvedSeed = useResolvedSeed(seed);
4073
- const ink = sketchColor ?? SKETCH_COLORS.ink;
4463
+ const theme = useSketchTheme(sketchColor);
4464
+ const ink = sketchColor ?? theme.ink;
4074
4465
  return /* @__PURE__ */ jsxRuntime.jsx(
4075
4466
  DropdownMenuSketchContext.Provider,
4076
4467
  {
@@ -4081,8 +4472,13 @@ function DropdownMenu({
4081
4472
  bowing,
4082
4473
  fillStyle,
4083
4474
  strokeWidth,
4475
+ hachureGap,
4476
+ hachureAngle,
4477
+ fillWeight,
4084
4478
  resolvedSeed,
4085
4479
  ink,
4480
+ paper: fill ?? theme.paper,
4481
+ accent: theme.accent,
4086
4482
  animate
4087
4483
  },
4088
4484
  children: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.Root, { ...rest, children })
@@ -4093,7 +4489,7 @@ var DropdownMenuTrigger = DropdownMenuPrimitive__namespace.Trigger;
4093
4489
  var DropdownMenuGroup = DropdownMenuPrimitive__namespace.Group;
4094
4490
  var DropdownMenuRadioGroup = DropdownMenuPrimitive__namespace.RadioGroup;
4095
4491
  var DropdownMenuSub = DropdownMenuPrimitive__namespace.Sub;
4096
- var DropdownMenuContent = react.forwardRef(function DropdownMenuContent2({ className, style, children, sideOffset = 6, align = "start", ...rest }, ref) {
4492
+ var DropdownMenuContent = react.forwardRef(function DropdownMenuContent2({ className, style, children, fill, sideOffset = 6, align = "start", ...rest }, ref) {
4097
4493
  const sketch = useDropdownMenuSketch();
4098
4494
  return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
4099
4495
  DropdownMenuPrimitive__namespace.Content,
@@ -4102,7 +4498,7 @@ var DropdownMenuContent = react.forwardRef(function DropdownMenuContent2({ class
4102
4498
  sideOffset,
4103
4499
  align,
4104
4500
  className: cn(className),
4105
- style: { zIndex: 80, outline: "none", minWidth: 180, ...style },
4501
+ style: { zIndex: 80, outline: "none", minWidth: 180, color: sketch.ink, ...style },
4106
4502
  ...rest,
4107
4503
  children: /* @__PURE__ */ jsxRuntime.jsx(
4108
4504
  SketchBox,
@@ -4112,11 +4508,14 @@ var DropdownMenuContent = react.forwardRef(function DropdownMenuContent2({ class
4112
4508
  sketchColor: sketch.ink,
4113
4509
  bowing: sketch.bowing,
4114
4510
  fillStyle: sketch.fillStyle ?? "solid",
4115
- fill: "#f7f6f2",
4511
+ fill: fill ?? sketch.paper,
4116
4512
  strokeWidth: sketch.strokeWidth ?? 1.5,
4513
+ hachureGap: sketch.hachureGap,
4514
+ hachureAngle: sketch.hachureAngle,
4515
+ fillWeight: sketch.fillWeight,
4117
4516
  shadow: true,
4118
4517
  animate: sketch.animate,
4119
- contentStyle: { padding: "6px 4px" },
4518
+ contentStyle: { padding: "6px 4px", color: sketch.ink },
4120
4519
  children
4121
4520
  }
4122
4521
  )
@@ -4231,7 +4630,7 @@ var DropdownMenuCheckboxItem = react.forwardRef(function DropdownMenuCheckboxIte
4231
4630
  path: CHECK_PATH2,
4232
4631
  roughness: (sketch.roughness ?? 1.5) * 0.7,
4233
4632
  seed: deriveSeed(sketch.resolvedSeed, "checkbox-mark"),
4234
- sketchColor: SKETCH_COLORS.accent,
4633
+ sketchColor: sketch.accent,
4235
4634
  bowing: sketch.bowing,
4236
4635
  strokeWidth: 1.6,
4237
4636
  inset: 0
@@ -4299,10 +4698,10 @@ var DropdownMenuRadioItem = react.forwardRef(function DropdownMenuRadioItem2({ c
4299
4698
  shape: "ellipse",
4300
4699
  roughness: (sketch.roughness ?? 1.5) * 0.8,
4301
4700
  seed: deriveSeed(sketch.resolvedSeed, "radio-mark"),
4302
- sketchColor: SKETCH_COLORS.accent,
4701
+ sketchColor: sketch.accent,
4303
4702
  bowing: sketch.bowing,
4304
4703
  fillStyle: "solid",
4305
- fill: SKETCH_COLORS.accent,
4704
+ fill: sketch.accent,
4306
4705
  strokeWidth: 1.2,
4307
4706
  inset: 0
4308
4707
  }
@@ -4377,17 +4776,22 @@ function Dialog2({
4377
4776
  open,
4378
4777
  defaultOpen,
4379
4778
  onOpenChange,
4779
+ fill,
4380
4780
  roughness,
4381
4781
  seed,
4382
4782
  sketchColor,
4383
4783
  bowing,
4384
4784
  fillStyle,
4385
4785
  strokeWidth,
4786
+ hachureGap,
4787
+ hachureAngle,
4788
+ fillWeight,
4386
4789
  animate,
4387
4790
  ...rest
4388
4791
  }) {
4389
4792
  const resolvedSeed = useResolvedSeed(seed);
4390
- const ink = sketchColor ?? SKETCH_COLORS.ink;
4793
+ const theme = useSketchTheme(sketchColor);
4794
+ const ink = sketchColor ?? theme.ink;
4391
4795
  const [uncontrolled, setUncontrolled] = react.useState(defaultOpen === true);
4392
4796
  const isOpen = open ?? uncontrolled;
4393
4797
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -4400,8 +4804,13 @@ function Dialog2({
4400
4804
  bowing,
4401
4805
  fillStyle,
4402
4806
  strokeWidth,
4807
+ hachureGap,
4808
+ hachureAngle,
4809
+ fillWeight,
4403
4810
  resolvedSeed,
4404
4811
  ink,
4812
+ paper: fill ?? theme.paper,
4813
+ isDark: theme.isDark,
4405
4814
  animate,
4406
4815
  open: isOpen
4407
4816
  },
@@ -4437,7 +4846,7 @@ var DialogOverlay = react.forwardRef(
4437
4846
  style: {
4438
4847
  position: "fixed",
4439
4848
  inset: 0,
4440
- background: "rgba(31, 29, 26, 0.38)",
4849
+ background: sketch.isDark ? "rgba(0, 0, 0, 0.65)" : "rgba(31, 29, 26, 0.38)",
4441
4850
  zIndex: 70,
4442
4851
  ...style
4443
4852
  }
@@ -4446,7 +4855,7 @@ var DialogOverlay = react.forwardRef(
4446
4855
  }
4447
4856
  );
4448
4857
  var DialogContent = react.forwardRef(
4449
- function DialogContent2({ className, style, contentStyle, children, ...rest }, ref) {
4858
+ function DialogContent2({ className, style, contentStyle, fill, children, ...rest }, ref) {
4450
4859
  const sketch = useDialogSketch();
4451
4860
  const shouldAnimate = useAnimate(sketch.animate);
4452
4861
  return /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { children: sketch.open ? /* @__PURE__ */ jsxRuntime.jsxs(Dialog__namespace.Portal, { forceMount: true, children: [
@@ -4476,6 +4885,7 @@ var DialogContent = react.forwardRef(
4476
4885
  width: "min(420px, calc(100vw - 32px))",
4477
4886
  outline: "none",
4478
4887
  pointerEvents: "auto",
4888
+ color: sketch.ink,
4479
4889
  ...style
4480
4890
  },
4481
4891
  children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -4486,10 +4896,13 @@ var DialogContent = react.forwardRef(
4486
4896
  sketchColor: sketch.ink,
4487
4897
  bowing: sketch.bowing,
4488
4898
  fillStyle: sketch.fillStyle ?? "solid",
4489
- fill: "#f7f6f2",
4899
+ fill: fill ?? sketch.paper,
4490
4900
  strokeWidth: sketch.strokeWidth ?? 2,
4901
+ hachureGap: sketch.hachureGap,
4902
+ hachureAngle: sketch.hachureAngle,
4903
+ fillWeight: sketch.fillWeight,
4491
4904
  animate: sketch.animate,
4492
- contentStyle: { padding: 20, ...contentStyle },
4905
+ contentStyle: { padding: 20, color: sketch.ink, ...contentStyle },
4493
4906
  children
4494
4907
  }
4495
4908
  )
@@ -4586,17 +4999,22 @@ function AlertDialog({
4586
4999
  open,
4587
5000
  defaultOpen,
4588
5001
  onOpenChange,
5002
+ fill,
4589
5003
  roughness,
4590
5004
  seed,
4591
5005
  sketchColor,
4592
5006
  bowing,
4593
5007
  fillStyle,
4594
5008
  strokeWidth,
5009
+ hachureGap,
5010
+ hachureAngle,
5011
+ fillWeight,
4595
5012
  animate,
4596
5013
  ...rest
4597
5014
  }) {
4598
5015
  const resolvedSeed = useResolvedSeed(seed);
4599
- const ink = sketchColor ?? SKETCH_COLORS.ink;
5016
+ const theme = useSketchTheme(sketchColor);
5017
+ const ink = sketchColor ?? theme.ink;
4600
5018
  const [uncontrolled, setUncontrolled] = react.useState(defaultOpen === true);
4601
5019
  const isOpen = open ?? uncontrolled;
4602
5020
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -4609,8 +5027,13 @@ function AlertDialog({
4609
5027
  bowing,
4610
5028
  fillStyle,
4611
5029
  strokeWidth,
5030
+ hachureGap,
5031
+ hachureAngle,
5032
+ fillWeight,
4612
5033
  resolvedSeed,
4613
5034
  ink,
5035
+ paper: fill ?? theme.paper,
5036
+ isDark: theme.isDark,
4614
5037
  animate,
4615
5038
  open: isOpen
4616
5039
  },
@@ -4644,14 +5067,14 @@ var AlertDialogOverlay = react.forwardRef(function AlertDialogOverlay2({ style,
4644
5067
  style: {
4645
5068
  position: "fixed",
4646
5069
  inset: 0,
4647
- background: "rgba(31, 29, 26, 0.38)",
5070
+ background: sketch.isDark ? "rgba(0, 0, 0, 0.65)" : "rgba(31, 29, 26, 0.38)",
4648
5071
  zIndex: 70,
4649
5072
  ...style
4650
5073
  }
4651
5074
  }
4652
5075
  ) });
4653
5076
  });
4654
- var AlertDialogContent = react.forwardRef(function AlertDialogContent2({ className, style, contentStyle, children, ...rest }, ref) {
5077
+ var AlertDialogContent = react.forwardRef(function AlertDialogContent2({ className, style, contentStyle, fill, children, ...rest }, ref) {
4655
5078
  const sketch = useAlertDialogSketch();
4656
5079
  const shouldAnimate = useAnimate(sketch.animate);
4657
5080
  return /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { children: sketch.open ? /* @__PURE__ */ jsxRuntime.jsxs(AlertDialogPrimitive__namespace.Portal, { forceMount: true, children: [
@@ -4681,6 +5104,7 @@ var AlertDialogContent = react.forwardRef(function AlertDialogContent2({ classNa
4681
5104
  width: "min(420px, calc(100vw - 32px))",
4682
5105
  outline: "none",
4683
5106
  pointerEvents: "auto",
5107
+ color: sketch.ink,
4684
5108
  ...style
4685
5109
  },
4686
5110
  children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -4691,10 +5115,13 @@ var AlertDialogContent = react.forwardRef(function AlertDialogContent2({ classNa
4691
5115
  sketchColor: sketch.ink,
4692
5116
  bowing: sketch.bowing,
4693
5117
  fillStyle: sketch.fillStyle ?? "solid",
4694
- fill: "#f7f6f2",
5118
+ fill: fill ?? sketch.paper,
4695
5119
  strokeWidth: sketch.strokeWidth ?? 2,
5120
+ hachureGap: sketch.hachureGap,
5121
+ hachureAngle: sketch.hachureAngle,
5122
+ fillWeight: sketch.fillWeight,
4696
5123
  animate: sketch.animate,
4697
- contentStyle: { padding: 20, ...contentStyle },
5124
+ contentStyle: { padding: 20, color: sketch.ink, ...contentStyle },
4698
5125
  children
4699
5126
  }
4700
5127
  )
@@ -4836,11 +5263,15 @@ var Command = react.forwardRef(
4836
5263
  bowing,
4837
5264
  fillStyle,
4838
5265
  strokeWidth,
5266
+ hachureGap,
5267
+ hachureAngle,
5268
+ fillWeight,
4839
5269
  animate,
4840
5270
  ...rest
4841
5271
  }, ref) {
4842
5272
  const resolvedSeed = useResolvedSeed(seed);
4843
- const ink = sketchColor ?? SKETCH_COLORS.ink;
5273
+ const theme = useSketchTheme(sketchColor);
5274
+ const ink = sketchColor ?? theme.ink;
4844
5275
  return /* @__PURE__ */ jsxRuntime.jsx(
4845
5276
  CommandSketchContext.Provider,
4846
5277
  {
@@ -4851,24 +5282,31 @@ var Command = react.forwardRef(
4851
5282
  bowing,
4852
5283
  fillStyle,
4853
5284
  strokeWidth,
5285
+ hachureGap,
5286
+ hachureAngle,
5287
+ fillWeight,
4854
5288
  resolvedSeed,
4855
5289
  ink,
5290
+ paper: theme.paper,
4856
5291
  animate
4857
5292
  },
4858
5293
  children: /* @__PURE__ */ jsxRuntime.jsx(
4859
5294
  SketchBox,
4860
5295
  {
4861
5296
  className: cn(className),
4862
- style,
5297
+ style: { color: ink, ...style },
4863
5298
  roughness,
4864
5299
  seed: resolvedSeed,
4865
5300
  sketchColor: ink,
4866
5301
  bowing,
4867
5302
  fillStyle: fillStyle ?? "solid",
4868
- fill: "#f7f6f2",
5303
+ fill: theme.paper,
4869
5304
  strokeWidth: strokeWidth ?? 1.5,
5305
+ hachureGap,
5306
+ hachureAngle,
5307
+ fillWeight,
4870
5308
  animate,
4871
- contentStyle: { padding: 0, display: "flex", flexDirection: "column" },
5309
+ contentStyle: { padding: 0, display: "flex", flexDirection: "column", color: ink },
4872
5310
  children: /* @__PURE__ */ jsxRuntime.jsx(cmdk.Command, { ref, ...rest, children })
4873
5311
  }
4874
5312
  )
@@ -5089,6 +5527,9 @@ function Combobox({
5089
5527
  bowing,
5090
5528
  fillStyle,
5091
5529
  strokeWidth,
5530
+ hachureGap,
5531
+ hachureAngle,
5532
+ fillWeight,
5092
5533
  animate,
5093
5534
  "aria-label": ariaLabel
5094
5535
  }) {
@@ -5098,7 +5539,8 @@ function Combobox({
5098
5539
  const selectedOption = options.find(
5099
5540
  (option) => option.value === selectedValue
5100
5541
  );
5101
- const ink = sketchColor ?? SKETCH_COLORS.ink;
5542
+ const theme = useSketchTheme(sketchColor);
5543
+ const ink = sketchColor ?? theme.ink;
5102
5544
  const resolvedSeed = useResolvedSeed(seed);
5103
5545
  const shouldAnimate = useAnimate(animate);
5104
5546
  const triggerRef = react.useRef(null);
@@ -5148,9 +5590,12 @@ function Combobox({
5148
5590
  shape: "rectangle",
5149
5591
  roughness,
5150
5592
  seed: resolvedSeed,
5151
- sketchColor: open ? SKETCH_COLORS.accent : ink,
5593
+ sketchColor: open ? theme.accent : ink,
5152
5594
  bowing,
5153
5595
  fillStyle,
5596
+ hachureGap,
5597
+ hachureAngle,
5598
+ fillWeight,
5154
5599
  strokeWidth: open ? (strokeWidth ?? 1.75) + 0.35 : strokeWidth
5155
5600
  }
5156
5601
  ),
@@ -5209,6 +5654,9 @@ function Combobox({
5209
5654
  bowing,
5210
5655
  fillStyle,
5211
5656
  strokeWidth,
5657
+ hachureGap,
5658
+ hachureAngle,
5659
+ fillWeight,
5212
5660
  animate,
5213
5661
  children: [
5214
5662
  /* @__PURE__ */ jsxRuntime.jsx(CommandInput, { placeholder: searchPlaceholder }),
@@ -5236,16 +5684,21 @@ var Kbd = react.forwardRef(function Kbd2({
5236
5684
  children,
5237
5685
  className,
5238
5686
  style,
5687
+ fill,
5239
5688
  roughness,
5240
5689
  seed,
5241
5690
  sketchColor,
5242
5691
  bowing,
5243
5692
  fillStyle,
5244
5693
  strokeWidth,
5694
+ hachureGap,
5695
+ hachureAngle,
5696
+ fillWeight,
5245
5697
  animate,
5246
5698
  ...rest
5247
5699
  }, ref) {
5248
- const ink = sketchColor ?? SKETCH_COLORS.ink;
5700
+ const theme = useSketchTheme(sketchColor);
5701
+ const ink = sketchColor ?? theme.ink;
5249
5702
  return /* @__PURE__ */ jsxRuntime.jsx(
5250
5703
  SketchBox,
5251
5704
  {
@@ -5253,6 +5706,7 @@ var Kbd = react.forwardRef(function Kbd2({
5253
5706
  style: {
5254
5707
  display: "inline-flex",
5255
5708
  verticalAlign: "middle",
5709
+ color: ink,
5256
5710
  ...style
5257
5711
  },
5258
5712
  contentStyle: {
@@ -5260,10 +5714,14 @@ var Kbd = react.forwardRef(function Kbd2({
5260
5714
  fontSize: 11,
5261
5715
  fontFamily: doodleUiFontFamily,
5262
5716
  lineHeight: 1.35,
5263
- letterSpacing: "0.04em"
5717
+ letterSpacing: "0.04em",
5718
+ color: ink
5264
5719
  },
5265
- fill: SKETCH_COLORS.secondaryFill,
5720
+ fill: fill ?? theme.secondaryFill,
5266
5721
  fillStyle: fillStyle ?? "hachure",
5722
+ hachureGap: hachureGap ?? 6,
5723
+ hachureAngle,
5724
+ fillWeight: fillWeight ?? 0.8,
5267
5725
  roughness,
5268
5726
  seed,
5269
5727
  sketchColor: ink,
@@ -5310,7 +5768,8 @@ var Spinner = react.forwardRef(
5310
5768
  }, ref) {
5311
5769
  const px = SIZE_PX[size];
5312
5770
  const resolvedSeed = useResolvedSeed(seed);
5313
- const ink = sketchColor ?? SKETCH_COLORS.ink;
5771
+ const theme = useSketchTheme(sketchColor);
5772
+ const ink = sketchColor ?? theme.ink;
5314
5773
  const shouldSpin = useAnimate(animate);
5315
5774
  const boxStyle = {
5316
5775
  position: "relative",
@@ -5378,6 +5837,9 @@ var Toggle = react.forwardRef(
5378
5837
  bowing,
5379
5838
  fillStyle,
5380
5839
  strokeWidth,
5840
+ hachureGap,
5841
+ hachureAngle,
5842
+ fillWeight,
5381
5843
  pressed,
5382
5844
  defaultPressed,
5383
5845
  onPressedChange,
@@ -5389,7 +5851,10 @@ var Toggle = react.forwardRef(
5389
5851
  const rootRef = react.useRef(null);
5390
5852
  const [uncontrolled, setUncontrolled] = react.useState(defaultPressed === true);
5391
5853
  const isPressed = pressed ?? uncontrolled;
5392
- const ink = sketchColor ?? SKETCH_COLORS.ink;
5854
+ const theme = useSketchTheme(sketchColor);
5855
+ const ink = sketchColor ?? theme.ink;
5856
+ const accent = sketchColor ?? theme.accent;
5857
+ const accentFill = theme.isDark ? sketchColor ? `${sketchColor}25` : theme.accentFill : theme.accentFill;
5393
5858
  const resolvedSeed = useResolvedSeed(seed);
5394
5859
  const shouldAnimate = useAnimate(animate);
5395
5860
  const pressSeed = deriveSeed(resolvedSeed, isPressed ? "on" : "off");
@@ -5418,7 +5883,7 @@ var Toggle = react.forwardRef(
5418
5883
  border: "none",
5419
5884
  background: "transparent",
5420
5885
  cursor: disabled ? "not-allowed" : "pointer",
5421
- color: ink,
5886
+ color: isPressed ? theme.isDark ? "#ffffff" : accent : ink,
5422
5887
  fontFamily: doodleUiFontFamily,
5423
5888
  fontWeight: doodleUiFontWeight(600),
5424
5889
  opacity: disabled ? 0.45 : 1,
@@ -5434,11 +5899,14 @@ var Toggle = react.forwardRef(
5434
5899
  shape: "rectangle",
5435
5900
  roughness,
5436
5901
  seed: sketchSeed,
5437
- sketchColor: isPressed ? SKETCH_COLORS.accent : ink,
5902
+ sketchColor: isPressed ? accent : ink,
5438
5903
  bowing,
5439
5904
  fillStyle: fillStyle ?? "hachure",
5440
- fill: isPressed ? SKETCH_COLORS.accentFill : void 0,
5441
- strokeWidth: strokeWidth ?? 1.6
5905
+ fill: isPressed ? accentFill : void 0,
5906
+ strokeWidth: strokeWidth ?? 1.6,
5907
+ hachureGap: hachureGap ?? 7,
5908
+ hachureAngle,
5909
+ fillWeight: fillWeight ?? 1
5442
5910
  }
5443
5911
  ),
5444
5912
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { position: "relative", zIndex: 1 }, children })
@@ -5464,13 +5932,19 @@ function ToggleGroup(props) {
5464
5932
  bowing,
5465
5933
  fillStyle,
5466
5934
  strokeWidth,
5935
+ hachureGap,
5936
+ hachureAngle,
5937
+ fillWeight,
5467
5938
  size = "md",
5468
5939
  animate,
5469
5940
  type = "single",
5470
5941
  ...rest
5471
5942
  } = props;
5472
5943
  const resolvedSeed = useResolvedSeed(seed);
5473
- const ink = sketchColor ?? SKETCH_COLORS.ink;
5944
+ const theme = useSketchTheme(sketchColor);
5945
+ const ink = sketchColor ?? theme.ink;
5946
+ const accent = sketchColor ?? theme.accent;
5947
+ const accentFill = theme.isDark ? sketchColor ? `${sketchColor}25` : theme.accentFill : theme.accentFill;
5474
5948
  const rootStyle = { display: "inline-flex", gap: 6, flexWrap: "wrap" };
5475
5949
  return /* @__PURE__ */ jsxRuntime.jsx(
5476
5950
  ToggleGroupSketchContext.Provider,
@@ -5482,8 +5956,14 @@ function ToggleGroup(props) {
5482
5956
  bowing,
5483
5957
  fillStyle,
5484
5958
  strokeWidth,
5959
+ hachureGap,
5960
+ hachureAngle,
5961
+ fillWeight,
5485
5962
  resolvedSeed,
5486
5963
  ink,
5964
+ accent,
5965
+ accentFill,
5966
+ isDark: theme.isDark,
5487
5967
  animate,
5488
5968
  size
5489
5969
  },
@@ -5532,6 +6012,7 @@ var ToggleGroupItem = react.forwardRef(function ToggleGroupItem2({ className, st
5532
6012
  return () => obs.disconnect();
5533
6013
  }, [value]);
5534
6014
  useDrawIn(rootRef, DRAW_IN_DURATION_MS, shouldAnimate, sketchSeed);
6015
+ const textColor = pressed ? sketch.isDark ? "#ffffff" : sketch.accent : sketch.ink;
5535
6016
  return /* @__PURE__ */ jsxRuntime.jsxs(
5536
6017
  ToggleGroupPrimitive__namespace.Item,
5537
6018
  {
@@ -5550,7 +6031,7 @@ var ToggleGroupItem = react.forwardRef(function ToggleGroupItem2({ className, st
5550
6031
  border: "none",
5551
6032
  background: "transparent",
5552
6033
  cursor: disabled ? "not-allowed" : "pointer",
5553
- color: sketch.ink,
6034
+ color: textColor,
5554
6035
  fontFamily: doodleUiFontFamily,
5555
6036
  fontWeight: doodleUiFontWeight(600),
5556
6037
  opacity: disabled ? 0.45 : 1,
@@ -5566,11 +6047,14 @@ var ToggleGroupItem = react.forwardRef(function ToggleGroupItem2({ className, st
5566
6047
  shape: "rectangle",
5567
6048
  roughness: sketch.roughness,
5568
6049
  seed: sketchSeed,
5569
- sketchColor: pressed ? SKETCH_COLORS.accent : sketch.ink,
6050
+ sketchColor: pressed ? sketch.accent : sketch.ink,
5570
6051
  bowing: sketch.bowing,
5571
6052
  fillStyle: sketch.fillStyle ?? "hachure",
5572
- fill: pressed ? SKETCH_COLORS.accentFill : void 0,
5573
- strokeWidth: sketch.strokeWidth ?? 1.6
6053
+ fill: pressed ? sketch.accentFill : void 0,
6054
+ strokeWidth: sketch.strokeWidth ?? 1.6,
6055
+ hachureGap: sketch.hachureGap ?? 7,
6056
+ hachureAngle: sketch.hachureAngle,
6057
+ fillWeight: sketch.fillWeight ?? 1
5574
6058
  }
5575
6059
  ),
5576
6060
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { position: "relative", zIndex: 1 }, children })
@@ -5596,13 +6080,17 @@ function InputGroup({
5596
6080
  bowing,
5597
6081
  fillStyle,
5598
6082
  strokeWidth,
6083
+ hachureGap,
6084
+ hachureAngle,
6085
+ fillWeight,
5599
6086
  animate,
5600
6087
  onFocus,
5601
6088
  onBlur,
5602
6089
  ...rest
5603
6090
  }) {
5604
6091
  const resolvedSeed = useResolvedSeed(seed);
5605
- const ink = sketchColor ?? SKETCH_COLORS.ink;
6092
+ const theme = useSketchTheme(sketchColor);
6093
+ const ink = sketchColor ?? theme.ink;
5606
6094
  const [focused, setFocused] = react.useState(false);
5607
6095
  const shouldAnimate = useAnimate(animate);
5608
6096
  const focusSeed = deriveSeed(resolvedSeed, "focus");
@@ -5613,12 +6101,16 @@ function InputGroup({
5613
6101
  value: {
5614
6102
  roughness,
5615
6103
  seed: resolvedSeed,
5616
- sketchColor,
6104
+ sketchColor: ink,
5617
6105
  bowing,
5618
6106
  fillStyle,
5619
6107
  strokeWidth,
6108
+ hachureGap,
6109
+ hachureAngle,
6110
+ fillWeight,
5620
6111
  resolvedSeed,
5621
6112
  ink,
6113
+ accent: theme.accent,
5622
6114
  animate,
5623
6115
  focused,
5624
6116
  setFocused
@@ -5644,10 +6136,13 @@ function InputGroup({
5644
6136
  {
5645
6137
  roughness,
5646
6138
  seed: sketchSeed,
5647
- sketchColor: focused ? SKETCH_COLORS.accent : ink,
6139
+ sketchColor: focused ? theme.accent : ink,
5648
6140
  bowing,
5649
6141
  fillStyle,
5650
6142
  strokeWidth: focused && !shouldAnimate ? (strokeWidth ?? 1.75) + 0.35 : strokeWidth,
6143
+ hachureGap,
6144
+ hachureAngle,
6145
+ fillWeight,
5651
6146
  animate,
5652
6147
  drawInKey: sketchSeed,
5653
6148
  contentStyle: {
@@ -5747,24 +6242,35 @@ var InputOTP = react.forwardRef(
5747
6242
  bowing,
5748
6243
  fillStyle,
5749
6244
  strokeWidth,
6245
+ hachureGap,
6246
+ hachureAngle,
6247
+ fillWeight,
6248
+ fill,
5750
6249
  animate,
5751
6250
  children,
5752
6251
  ...rest
5753
6252
  }, ref) {
5754
6253
  const resolvedSeed = useResolvedSeed(seed);
5755
- const ink = sketchColor ?? SKETCH_COLORS.ink;
6254
+ const theme = useSketchTheme(sketchColor);
6255
+ const ink = sketchColor ?? theme.ink;
5756
6256
  return /* @__PURE__ */ jsxRuntime.jsx(
5757
6257
  InputOTPSketchContext.Provider,
5758
6258
  {
5759
6259
  value: {
5760
6260
  roughness,
5761
6261
  seed: resolvedSeed,
5762
- sketchColor,
6262
+ sketchColor: ink,
5763
6263
  bowing,
5764
6264
  fillStyle,
5765
6265
  strokeWidth,
6266
+ hachureGap,
6267
+ hachureAngle,
6268
+ fillWeight,
6269
+ fill,
5766
6270
  resolvedSeed,
5767
6271
  ink,
6272
+ accent: theme.accent,
6273
+ paper: theme.paper,
5768
6274
  animate
5769
6275
  },
5770
6276
  children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -5841,9 +6347,13 @@ var InputOTPSlot = react.forwardRef(
5841
6347
  shape: "rectangle",
5842
6348
  roughness: sketch.roughness,
5843
6349
  seed: slotSeed,
5844
- sketchColor: isActive ? SKETCH_COLORS.accent : sketch.ink,
6350
+ sketchColor: isActive ? sketch.accent : sketch.ink,
5845
6351
  bowing: sketch.bowing,
5846
6352
  fillStyle: sketch.fillStyle,
6353
+ fill: sketch.fill,
6354
+ hachureGap: sketch.hachureGap,
6355
+ hachureAngle: sketch.hachureAngle,
6356
+ fillWeight: sketch.fillWeight,
5847
6357
  strokeWidth: isActive ? (sketch.strokeWidth ?? 1.75) + 0.15 : sketch.strokeWidth
5848
6358
  }
5849
6359
  ),
@@ -5903,17 +6413,22 @@ var ScrollArea = react.forwardRef(function ScrollArea2({
5903
6413
  className,
5904
6414
  style,
5905
6415
  children,
6416
+ fill,
5906
6417
  roughness,
5907
6418
  seed,
5908
6419
  sketchColor,
5909
6420
  bowing,
5910
6421
  fillStyle,
5911
6422
  strokeWidth,
6423
+ hachureGap,
6424
+ hachureAngle,
6425
+ fillWeight,
5912
6426
  animate,
5913
6427
  ...rest
5914
6428
  }, ref) {
5915
6429
  const resolvedSeed = useResolvedSeed(seed);
5916
- const ink = sketchColor ?? SKETCH_COLORS.ink;
6430
+ const theme = useSketchTheme(sketchColor);
6431
+ const ink = sketchColor ?? theme.ink;
5917
6432
  return /* @__PURE__ */ jsxRuntime.jsx(
5918
6433
  ScrollAreaSketchContext.Provider,
5919
6434
  {
@@ -5924,8 +6439,12 @@ var ScrollArea = react.forwardRef(function ScrollArea2({
5924
6439
  bowing,
5925
6440
  fillStyle,
5926
6441
  strokeWidth,
6442
+ hachureGap,
6443
+ hachureAngle,
6444
+ fillWeight,
5927
6445
  resolvedSeed,
5928
6446
  ink,
6447
+ paper: fill ?? theme.paper,
5929
6448
  animate
5930
6449
  },
5931
6450
  children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -5933,7 +6452,7 @@ var ScrollArea = react.forwardRef(function ScrollArea2({
5933
6452
  {
5934
6453
  ref,
5935
6454
  className: cn(className),
5936
- style: { position: "relative", overflow: "hidden", ...style },
6455
+ style: { position: "relative", overflow: "hidden", color: ink, ...style },
5937
6456
  ...rest,
5938
6457
  children: /* @__PURE__ */ jsxRuntime.jsx(
5939
6458
  SketchBox,
@@ -5943,10 +6462,13 @@ var ScrollArea = react.forwardRef(function ScrollArea2({
5943
6462
  sketchColor: ink,
5944
6463
  bowing,
5945
6464
  fillStyle: fillStyle ?? "solid",
5946
- fill: "#f7f6f2",
6465
+ fill: fill ?? theme.paper,
5947
6466
  strokeWidth: strokeWidth ?? 1.5,
6467
+ hachureGap,
6468
+ hachureAngle,
6469
+ fillWeight,
5948
6470
  animate,
5949
- contentStyle: { padding: 0, height: "100%" },
6471
+ contentStyle: { padding: 0, height: "100%", color: ink },
5950
6472
  style: { height: "100%" },
5951
6473
  children
5952
6474
  }
@@ -6035,7 +6557,8 @@ function ResizableHandle({
6035
6557
  ...rest
6036
6558
  }) {
6037
6559
  const resolvedSeed = useResolvedSeed(seed);
6038
- const ink = sketchColor ?? SKETCH_COLORS.ink;
6560
+ const theme = useSketchTheme(sketchColor);
6561
+ const ink = sketchColor ?? theme.ink;
6039
6562
  const handleSeed = deriveSeed(resolvedSeed, "handle");
6040
6563
  const base = {
6041
6564
  position: "relative",
@@ -6109,17 +6632,22 @@ function useHoverCardSketch() {
6109
6632
  }
6110
6633
  function HoverCard({
6111
6634
  children,
6635
+ fill,
6112
6636
  roughness,
6113
6637
  seed,
6114
6638
  sketchColor,
6115
6639
  bowing,
6116
6640
  fillStyle,
6117
6641
  strokeWidth,
6642
+ hachureGap,
6643
+ hachureAngle,
6644
+ fillWeight,
6118
6645
  animate,
6119
6646
  ...rest
6120
6647
  }) {
6121
6648
  const resolvedSeed = useResolvedSeed(seed);
6122
- const ink = sketchColor ?? SKETCH_COLORS.ink;
6649
+ const theme = useSketchTheme(sketchColor);
6650
+ const ink = sketchColor ?? theme.ink;
6123
6651
  return /* @__PURE__ */ jsxRuntime.jsx(
6124
6652
  HoverCardSketchContext.Provider,
6125
6653
  {
@@ -6130,8 +6658,12 @@ function HoverCard({
6130
6658
  bowing,
6131
6659
  fillStyle,
6132
6660
  strokeWidth,
6661
+ hachureGap,
6662
+ hachureAngle,
6663
+ fillWeight,
6133
6664
  resolvedSeed,
6134
6665
  ink,
6666
+ paper: fill ?? theme.paper,
6135
6667
  animate
6136
6668
  },
6137
6669
  children: /* @__PURE__ */ jsxRuntime.jsx(HoverCardPrimitive__namespace.Root, { ...rest, children })
@@ -6139,7 +6671,7 @@ function HoverCard({
6139
6671
  );
6140
6672
  }
6141
6673
  var HoverCardTrigger = HoverCardPrimitive__namespace.Trigger;
6142
- var HoverCardContent = react.forwardRef(function HoverCardContent2({ className, style, children, sideOffset = 6, align = "center", ...rest }, ref) {
6674
+ var HoverCardContent = react.forwardRef(function HoverCardContent2({ className, style, children, fill, sideOffset = 6, align = "center", ...rest }, ref) {
6143
6675
  const sketch = useHoverCardSketch();
6144
6676
  return /* @__PURE__ */ jsxRuntime.jsx(HoverCardPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
6145
6677
  HoverCardPrimitive__namespace.Content,
@@ -6148,7 +6680,7 @@ var HoverCardContent = react.forwardRef(function HoverCardContent2({ className,
6148
6680
  sideOffset,
6149
6681
  align,
6150
6682
  className: cn(className),
6151
- style: { zIndex: 75, outline: "none", ...style },
6683
+ style: { zIndex: 75, outline: "none", color: sketch.ink, ...style },
6152
6684
  ...rest,
6153
6685
  children: /* @__PURE__ */ jsxRuntime.jsx(
6154
6686
  SketchBox,
@@ -6158,11 +6690,14 @@ var HoverCardContent = react.forwardRef(function HoverCardContent2({ className,
6158
6690
  sketchColor: sketch.ink,
6159
6691
  bowing: sketch.bowing,
6160
6692
  fillStyle: sketch.fillStyle ?? "solid",
6161
- fill: "#f7f6f2",
6693
+ fill: fill ?? sketch.paper,
6162
6694
  strokeWidth: sketch.strokeWidth ?? 1.5,
6695
+ hachureGap: sketch.hachureGap,
6696
+ hachureAngle: sketch.hachureAngle,
6697
+ fillWeight: sketch.fillWeight,
6163
6698
  shadow: true,
6164
6699
  animate: sketch.animate,
6165
- contentStyle: { padding: 14, maxWidth: 320, fontSize: 14 },
6700
+ contentStyle: { padding: 14, maxWidth: 320, fontSize: 14, color: sketch.ink },
6166
6701
  children
6167
6702
  }
6168
6703
  )
@@ -6182,17 +6717,22 @@ function useContextMenuSketch() {
6182
6717
  }
6183
6718
  function ContextMenu({
6184
6719
  children,
6720
+ fill,
6185
6721
  roughness,
6186
6722
  seed,
6187
6723
  sketchColor,
6188
6724
  bowing,
6189
6725
  fillStyle,
6190
6726
  strokeWidth,
6727
+ hachureGap,
6728
+ hachureAngle,
6729
+ fillWeight,
6191
6730
  animate,
6192
6731
  ...rest
6193
6732
  }) {
6194
6733
  const resolvedSeed = useResolvedSeed(seed);
6195
- const ink = sketchColor ?? SKETCH_COLORS.ink;
6734
+ const theme = useSketchTheme(sketchColor);
6735
+ const ink = sketchColor ?? theme.ink;
6196
6736
  return /* @__PURE__ */ jsxRuntime.jsx(
6197
6737
  ContextMenuSketchContext.Provider,
6198
6738
  {
@@ -6203,8 +6743,13 @@ function ContextMenu({
6203
6743
  bowing,
6204
6744
  fillStyle,
6205
6745
  strokeWidth,
6746
+ hachureGap,
6747
+ hachureAngle,
6748
+ fillWeight,
6206
6749
  resolvedSeed,
6207
6750
  ink,
6751
+ paper: fill ?? theme.paper,
6752
+ accent: theme.accent,
6208
6753
  animate
6209
6754
  },
6210
6755
  children: /* @__PURE__ */ jsxRuntime.jsx(ContextMenuPrimitive__namespace.Root, { ...rest, children })
@@ -6215,14 +6760,14 @@ var ContextMenuTrigger = ContextMenuPrimitive__namespace.Trigger;
6215
6760
  var ContextMenuGroup = ContextMenuPrimitive__namespace.Group;
6216
6761
  var ContextMenuRadioGroup = ContextMenuPrimitive__namespace.RadioGroup;
6217
6762
  var ContextMenuSub = ContextMenuPrimitive__namespace.Sub;
6218
- var ContextMenuContent = react.forwardRef(function ContextMenuContent2({ className, style, children, ...rest }, ref) {
6763
+ var ContextMenuContent = react.forwardRef(function ContextMenuContent2({ className, style, children, fill, ...rest }, ref) {
6219
6764
  const sketch = useContextMenuSketch();
6220
6765
  return /* @__PURE__ */ jsxRuntime.jsx(ContextMenuPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
6221
6766
  ContextMenuPrimitive__namespace.Content,
6222
6767
  {
6223
6768
  ref,
6224
6769
  className: cn(className),
6225
- style: { zIndex: 80, outline: "none", minWidth: 180, ...style },
6770
+ style: { zIndex: 80, outline: "none", minWidth: 180, color: sketch.ink, ...style },
6226
6771
  ...rest,
6227
6772
  children: /* @__PURE__ */ jsxRuntime.jsx(
6228
6773
  SketchBox,
@@ -6232,11 +6777,14 @@ var ContextMenuContent = react.forwardRef(function ContextMenuContent2({ classNa
6232
6777
  sketchColor: sketch.ink,
6233
6778
  bowing: sketch.bowing,
6234
6779
  fillStyle: sketch.fillStyle ?? "solid",
6235
- fill: "#f7f6f2",
6780
+ fill: fill ?? sketch.paper,
6236
6781
  strokeWidth: sketch.strokeWidth ?? 1.5,
6782
+ hachureGap: sketch.hachureGap,
6783
+ hachureAngle: sketch.hachureAngle,
6784
+ fillWeight: sketch.fillWeight,
6237
6785
  shadow: true,
6238
6786
  animate: sketch.animate,
6239
- contentStyle: { padding: "6px 4px" },
6787
+ contentStyle: { padding: "6px 4px", color: sketch.ink },
6240
6788
  children
6241
6789
  }
6242
6790
  )
@@ -6351,7 +6899,7 @@ var ContextMenuCheckboxItem = react.forwardRef(function ContextMenuCheckboxItem2
6351
6899
  path: CHECK_PATH3,
6352
6900
  roughness: (sketch.roughness ?? 1.5) * 0.7,
6353
6901
  seed: deriveSeed(sketch.resolvedSeed, "checkbox-mark"),
6354
- sketchColor: SKETCH_COLORS.accent,
6902
+ sketchColor: sketch.accent,
6355
6903
  bowing: sketch.bowing,
6356
6904
  strokeWidth: 1.6,
6357
6905
  inset: 0
@@ -6419,10 +6967,10 @@ var ContextMenuRadioItem = react.forwardRef(function ContextMenuRadioItem2({ cla
6419
6967
  shape: "ellipse",
6420
6968
  roughness: (sketch.roughness ?? 1.5) * 0.8,
6421
6969
  seed: deriveSeed(sketch.resolvedSeed, "radio-mark"),
6422
- sketchColor: SKETCH_COLORS.accent,
6970
+ sketchColor: sketch.accent,
6423
6971
  bowing: sketch.bowing,
6424
6972
  fillStyle: "solid",
6425
- fill: SKETCH_COLORS.accent,
6973
+ fill: sketch.accent,
6426
6974
  strokeWidth: 1.2,
6427
6975
  inset: 0
6428
6976
  }
@@ -6492,17 +7040,22 @@ function useNavigationMenuSketch() {
6492
7040
  }
6493
7041
  function NavigationMenu({
6494
7042
  children,
7043
+ fill,
6495
7044
  roughness,
6496
7045
  seed,
6497
7046
  sketchColor,
6498
7047
  bowing,
6499
7048
  fillStyle,
6500
7049
  strokeWidth,
7050
+ hachureGap,
7051
+ hachureAngle,
7052
+ fillWeight,
6501
7053
  animate,
6502
7054
  ...rest
6503
7055
  }) {
6504
7056
  const resolvedSeed = useResolvedSeed(seed);
6505
- const ink = sketchColor ?? SKETCH_COLORS.ink;
7057
+ const theme = useSketchTheme(sketchColor);
7058
+ const ink = sketchColor ?? theme.ink;
6506
7059
  return /* @__PURE__ */ jsxRuntime.jsx(
6507
7060
  NavigationMenuSketchContext.Provider,
6508
7061
  {
@@ -6513,8 +7066,12 @@ function NavigationMenu({
6513
7066
  bowing,
6514
7067
  fillStyle,
6515
7068
  strokeWidth,
7069
+ hachureGap,
7070
+ hachureAngle,
7071
+ fillWeight,
6516
7072
  resolvedSeed,
6517
7073
  ink,
7074
+ paper: fill ?? theme.paper,
6518
7075
  animate
6519
7076
  },
6520
7077
  children: /* @__PURE__ */ jsxRuntime.jsxs(NavigationMenuPrimitive__namespace.Root, { ...rest, children: [
@@ -6569,14 +7126,14 @@ var NavigationMenuTrigger = react.forwardRef(function NavigationMenuTrigger2({ c
6569
7126
  }
6570
7127
  );
6571
7128
  });
6572
- var NavigationMenuContent = react.forwardRef(function NavigationMenuContent2({ className, style, children, ...rest }, ref) {
7129
+ var NavigationMenuContent = react.forwardRef(function NavigationMenuContent2({ className, style, children, fill, ...rest }, ref) {
6573
7130
  const sketch = useNavigationMenuSketch();
6574
7131
  return /* @__PURE__ */ jsxRuntime.jsx(
6575
7132
  NavigationMenuPrimitive__namespace.Content,
6576
7133
  {
6577
7134
  ref,
6578
7135
  className: cn(className),
6579
- style: { outline: "none", ...style },
7136
+ style: { outline: "none", color: sketch.ink, ...style },
6580
7137
  ...rest,
6581
7138
  children: /* @__PURE__ */ jsxRuntime.jsx(
6582
7139
  SketchBox,
@@ -6586,11 +7143,14 @@ var NavigationMenuContent = react.forwardRef(function NavigationMenuContent2({ c
6586
7143
  sketchColor: sketch.ink,
6587
7144
  bowing: sketch.bowing,
6588
7145
  fillStyle: sketch.fillStyle ?? "solid",
6589
- fill: "#f7f6f2",
7146
+ fill: fill ?? sketch.paper,
6590
7147
  strokeWidth: sketch.strokeWidth ?? 1.5,
7148
+ hachureGap: sketch.hachureGap,
7149
+ hachureAngle: sketch.hachureAngle,
7150
+ fillWeight: sketch.fillWeight,
6591
7151
  shadow: true,
6592
7152
  animate: sketch.animate,
6593
- contentStyle: { padding: 12, minWidth: 200 },
7153
+ contentStyle: { padding: 12, minWidth: 200, color: sketch.ink },
6594
7154
  children
6595
7155
  }
6596
7156
  )
@@ -6692,17 +7252,22 @@ function Menubar({
6692
7252
  children,
6693
7253
  className,
6694
7254
  style,
7255
+ fill,
6695
7256
  roughness,
6696
7257
  seed,
6697
7258
  sketchColor,
6698
7259
  bowing,
6699
7260
  fillStyle,
6700
7261
  strokeWidth,
7262
+ hachureGap,
7263
+ hachureAngle,
7264
+ fillWeight,
6701
7265
  animate,
6702
7266
  ...rest
6703
7267
  }) {
6704
7268
  const resolvedSeed = useResolvedSeed(seed);
6705
- const ink = sketchColor ?? SKETCH_COLORS.ink;
7269
+ const theme = useSketchTheme(sketchColor);
7270
+ const ink = sketchColor ?? theme.ink;
6706
7271
  return /* @__PURE__ */ jsxRuntime.jsx(
6707
7272
  MenubarSketchContext.Provider,
6708
7273
  {
@@ -6713,8 +7278,12 @@ function Menubar({
6713
7278
  bowing,
6714
7279
  fillStyle,
6715
7280
  strokeWidth,
7281
+ hachureGap,
7282
+ hachureAngle,
7283
+ fillWeight,
6716
7284
  resolvedSeed,
6717
7285
  ink,
7286
+ paper: fill ?? theme.paper,
6718
7287
  animate
6719
7288
  },
6720
7289
  children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -6759,7 +7328,7 @@ var MenubarTrigger = react.forwardRef(function MenubarTrigger2({ className, styl
6759
7328
  }
6760
7329
  );
6761
7330
  });
6762
- var MenubarContent = react.forwardRef(function MenubarContent2({ className, style, children, align = "start", sideOffset = 6, ...rest }, ref) {
7331
+ var MenubarContent = react.forwardRef(function MenubarContent2({ className, style, children, fill, align = "start", sideOffset = 6, ...rest }, ref) {
6763
7332
  const sketch = useMenubarSketch();
6764
7333
  return /* @__PURE__ */ jsxRuntime.jsx(MenubarPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
6765
7334
  MenubarPrimitive__namespace.Content,
@@ -6768,7 +7337,7 @@ var MenubarContent = react.forwardRef(function MenubarContent2({ className, styl
6768
7337
  align,
6769
7338
  sideOffset,
6770
7339
  className: cn(className),
6771
- style: { zIndex: 80, outline: "none", minWidth: 180, ...style },
7340
+ style: { zIndex: 80, outline: "none", minWidth: 180, color: sketch.ink, ...style },
6772
7341
  ...rest,
6773
7342
  children: /* @__PURE__ */ jsxRuntime.jsx(
6774
7343
  SketchBox,
@@ -6778,11 +7347,14 @@ var MenubarContent = react.forwardRef(function MenubarContent2({ className, styl
6778
7347
  sketchColor: sketch.ink,
6779
7348
  bowing: sketch.bowing,
6780
7349
  fillStyle: sketch.fillStyle ?? "solid",
6781
- fill: "#f7f6f2",
7350
+ fill: fill ?? sketch.paper,
6782
7351
  strokeWidth: sketch.strokeWidth ?? 1.5,
7352
+ hachureGap: sketch.hachureGap,
7353
+ hachureAngle: sketch.hachureAngle,
7354
+ fillWeight: sketch.fillWeight,
6783
7355
  shadow: true,
6784
7356
  animate: sketch.animate,
6785
- contentStyle: { padding: "6px 4px" },
7357
+ contentStyle: { padding: "6px 4px", color: sketch.ink },
6786
7358
  children
6787
7359
  }
6788
7360
  )
@@ -6921,17 +7493,22 @@ function SlidingPanelRoot({
6921
7493
  defaultOpen,
6922
7494
  onOpenChange,
6923
7495
  side = "right",
7496
+ fill,
6924
7497
  roughness,
6925
7498
  seed,
6926
7499
  sketchColor,
6927
7500
  bowing,
6928
7501
  fillStyle,
6929
7502
  strokeWidth,
7503
+ hachureGap,
7504
+ hachureAngle,
7505
+ fillWeight,
6930
7506
  animate,
6931
7507
  ...rest
6932
7508
  }) {
6933
7509
  const resolvedSeed = useResolvedSeed(seed);
6934
- const ink = sketchColor ?? SKETCH_COLORS.ink;
7510
+ const theme = useSketchTheme(sketchColor);
7511
+ const ink = sketchColor ?? theme.ink;
6935
7512
  const [uncontrolled, setUncontrolled] = react.useState(defaultOpen === true);
6936
7513
  const isOpen = open ?? uncontrolled;
6937
7514
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -6944,8 +7521,13 @@ function SlidingPanelRoot({
6944
7521
  bowing,
6945
7522
  fillStyle,
6946
7523
  strokeWidth,
7524
+ hachureGap,
7525
+ hachureAngle,
7526
+ fillWeight,
6947
7527
  resolvedSeed,
6948
7528
  ink,
7529
+ paper: fill ?? theme.paper,
7530
+ isDark: theme.isDark,
6949
7531
  animate,
6950
7532
  open: isOpen,
6951
7533
  side
@@ -7023,14 +7605,14 @@ var SlidingPanelOverlay = react.forwardRef(function SlidingPanelOverlay2({ style
7023
7605
  style: {
7024
7606
  position: "fixed",
7025
7607
  inset: 0,
7026
- background: "rgba(31, 29, 26, 0.38)",
7608
+ background: sketch.isDark ? "rgba(0, 0, 0, 0.65)" : "rgba(31, 29, 26, 0.38)",
7027
7609
  zIndex: 70,
7028
7610
  ...style
7029
7611
  }
7030
7612
  }
7031
7613
  ) });
7032
7614
  });
7033
- var SlidingPanelContent = react.forwardRef(function SlidingPanelContent2({ className, style, contentStyle, children, chrome, ...rest }, ref) {
7615
+ var SlidingPanelContent = react.forwardRef(function SlidingPanelContent2({ className, style, contentStyle, fill, children, chrome, ...rest }, ref) {
7034
7616
  const sketch = useSlidingPanelSketch();
7035
7617
  const shouldAnimate = useAnimate(sketch.animate);
7036
7618
  const variants = slideVariants(sketch.side, shouldAnimate);
@@ -7061,8 +7643,11 @@ var SlidingPanelContent = react.forwardRef(function SlidingPanelContent2({ class
7061
7643
  sketchColor: sketch.ink,
7062
7644
  bowing: sketch.bowing,
7063
7645
  fillStyle: sketch.fillStyle ?? "solid",
7064
- fill: "#f7f6f2",
7646
+ fill: fill ?? sketch.paper,
7065
7647
  strokeWidth: sketch.strokeWidth ?? 2,
7648
+ hachureGap: sketch.hachureGap,
7649
+ hachureAngle: sketch.hachureAngle,
7650
+ fillWeight: sketch.fillWeight,
7066
7651
  animate: sketch.animate,
7067
7652
  contentStyle: {
7068
7653
  padding: 20,
@@ -7070,6 +7655,7 @@ var SlidingPanelContent = react.forwardRef(function SlidingPanelContent2({ class
7070
7655
  boxSizing: "border-box",
7071
7656
  display: "flex",
7072
7657
  flexDirection: "column",
7658
+ color: sketch.ink,
7073
7659
  ...contentStyle
7074
7660
  },
7075
7661
  style: { height: "100%" },
@@ -7201,7 +7787,7 @@ var DrawerHandle = react.forwardRef(
7201
7787
  shape: "line",
7202
7788
  roughness: (sketch.roughness ?? 1.5) + 0.3,
7203
7789
  seed: deriveSeed(sketch.resolvedSeed, "drawer-handle"),
7204
- sketchColor: sketch.sketchColor ?? SKETCH_COLORS.ink,
7790
+ sketchColor: sketch.sketchColor ?? sketch.ink,
7205
7791
  bowing: sketch.bowing ?? 1.6,
7206
7792
  strokeWidth: 2.4,
7207
7793
  width: 48,
@@ -7231,6 +7817,1406 @@ var DrawerHeader = SlidingPanelHeader;
7231
7817
  var DrawerFooter = SlidingPanelFooter;
7232
7818
  var DrawerTitle = SlidingPanelTitle;
7233
7819
  var DrawerDescription = SlidingPanelDescription;
7820
+ function AspectRatio({
7821
+ ratio = 16 / 9,
7822
+ bordered = false,
7823
+ className,
7824
+ style,
7825
+ children,
7826
+ fill,
7827
+ roughness,
7828
+ seed,
7829
+ sketchColor,
7830
+ bowing,
7831
+ fillStyle,
7832
+ strokeWidth,
7833
+ hachureGap,
7834
+ hachureAngle,
7835
+ fillWeight,
7836
+ animate
7837
+ }) {
7838
+ const theme = useSketchTheme(sketchColor);
7839
+ const ink = sketchColor ?? theme.ink;
7840
+ const inner = /* @__PURE__ */ jsxRuntime.jsx(
7841
+ AspectRatioPrimitive__namespace.Root,
7842
+ {
7843
+ ratio,
7844
+ className: cn(className),
7845
+ style: {
7846
+ width: "100%",
7847
+ overflow: "hidden",
7848
+ color: ink,
7849
+ ...style
7850
+ },
7851
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { width: "100%", height: "100%" }, children })
7852
+ }
7853
+ );
7854
+ if (!bordered) {
7855
+ return inner;
7856
+ }
7857
+ return /* @__PURE__ */ jsxRuntime.jsx(
7858
+ SketchBox,
7859
+ {
7860
+ className: cn(className),
7861
+ style: { width: "100%", color: ink, ...style },
7862
+ contentStyle: { padding: 0, width: "100%", color: ink },
7863
+ fill: fill ?? theme.paper,
7864
+ fillStyle: fillStyle ?? "solid",
7865
+ hachureGap,
7866
+ hachureAngle,
7867
+ fillWeight,
7868
+ roughness,
7869
+ seed,
7870
+ sketchColor: ink,
7871
+ bowing,
7872
+ strokeWidth,
7873
+ animate,
7874
+ children: /* @__PURE__ */ jsxRuntime.jsx(AspectRatioPrimitive__namespace.Root, { ratio, style: { width: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { width: "100%", height: "100%" }, children }) })
7875
+ }
7876
+ );
7877
+ }
7878
+ var CHEVRON_PATH6 = "M 4 6 L 10 12 L 16 6";
7879
+ var NativeSelect = react.forwardRef(
7880
+ function NativeSelect2({
7881
+ className,
7882
+ style,
7883
+ options,
7884
+ children,
7885
+ fill,
7886
+ roughness,
7887
+ seed,
7888
+ sketchColor,
7889
+ bowing,
7890
+ fillStyle,
7891
+ strokeWidth,
7892
+ hachureGap,
7893
+ hachureAngle,
7894
+ fillWeight,
7895
+ animate,
7896
+ disabled,
7897
+ ...rest
7898
+ }, ref) {
7899
+ const fieldRef = react.useRef(null);
7900
+ const shouldAnimate = useAnimate(animate);
7901
+ const resolvedSeed = useResolvedSeed(seed);
7902
+ const theme = useSketchTheme(sketchColor);
7903
+ const ink = sketchColor ?? theme.ink;
7904
+ useDrawIn(fieldRef, DRAW_IN_DURATION_MS, shouldAnimate);
7905
+ return /* @__PURE__ */ jsxRuntime.jsx(
7906
+ "span",
7907
+ {
7908
+ className: cn(className),
7909
+ style: {
7910
+ position: "relative",
7911
+ display: "block",
7912
+ width: "100%",
7913
+ opacity: disabled ? 0.6 : 1,
7914
+ color: ink,
7915
+ ...style
7916
+ },
7917
+ children: /* @__PURE__ */ jsxRuntime.jsxs("span", { ref: fieldRef, style: { position: "relative", display: "block" }, children: [
7918
+ /* @__PURE__ */ jsxRuntime.jsx(
7919
+ RoughSvg,
7920
+ {
7921
+ shape: "rectangle",
7922
+ roughness,
7923
+ seed: resolvedSeed,
7924
+ sketchColor: ink,
7925
+ bowing,
7926
+ fillStyle: fillStyle ?? "solid",
7927
+ fill: fill ?? theme.paper,
7928
+ strokeWidth,
7929
+ hachureGap,
7930
+ hachureAngle,
7931
+ fillWeight
7932
+ }
7933
+ ),
7934
+ /* @__PURE__ */ jsxRuntime.jsx(
7935
+ "select",
7936
+ {
7937
+ ref,
7938
+ disabled,
7939
+ style: {
7940
+ position: "relative",
7941
+ zIndex: 1,
7942
+ width: "100%",
7943
+ border: "none",
7944
+ background: "transparent",
7945
+ padding: "10px 36px 10px 12px",
7946
+ fontFamily: doodleUiFontFamily,
7947
+ fontSize: 14,
7948
+ fontWeight: doodleUiFontWeight(500),
7949
+ color: ink,
7950
+ cursor: disabled ? "not-allowed" : "pointer",
7951
+ appearance: "none",
7952
+ WebkitAppearance: "none",
7953
+ MozAppearance: "none",
7954
+ outline: "none"
7955
+ },
7956
+ ...rest,
7957
+ children: options ? options.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(
7958
+ "option",
7959
+ {
7960
+ value: opt.value,
7961
+ disabled: opt.disabled,
7962
+ children: opt.label
7963
+ },
7964
+ opt.value
7965
+ )) : children
7966
+ }
7967
+ ),
7968
+ /* @__PURE__ */ jsxRuntime.jsx(
7969
+ "span",
7970
+ {
7971
+ "aria-hidden": true,
7972
+ style: {
7973
+ position: "absolute",
7974
+ right: 10,
7975
+ top: "50%",
7976
+ transform: "translateY(-50%)",
7977
+ width: 20,
7978
+ height: 14,
7979
+ pointerEvents: "none",
7980
+ zIndex: 2
7981
+ },
7982
+ children: /* @__PURE__ */ jsxRuntime.jsx(
7983
+ RoughSvg,
7984
+ {
7985
+ shape: "path",
7986
+ path: CHEVRON_PATH6,
7987
+ roughness: (roughness ?? 1.5) * 0.85,
7988
+ seed: resolvedSeed,
7989
+ sketchColor: ink,
7990
+ bowing,
7991
+ strokeWidth: strokeWidth ?? 1.5
7992
+ }
7993
+ )
7994
+ }
7995
+ )
7996
+ ] })
7997
+ }
7998
+ );
7999
+ }
8000
+ );
8001
+ var EmptyContext = react.createContext(null);
8002
+ function useEmptyInk() {
8003
+ const ctx = react.useContext(EmptyContext);
8004
+ const theme = useSketchTheme();
8005
+ return ctx?.ink ?? theme.ink;
8006
+ }
8007
+ var emptyContentStyle = {
8008
+ display: "flex",
8009
+ flexDirection: "column",
8010
+ alignItems: "center",
8011
+ justifyContent: "center",
8012
+ textAlign: "center",
8013
+ gap: 12,
8014
+ padding: "32px 24px",
8015
+ minHeight: 160,
8016
+ width: "100%"
8017
+ };
8018
+ var Empty = react.forwardRef(function Empty2({
8019
+ className,
8020
+ style,
8021
+ children,
8022
+ bordered = true,
8023
+ fill,
8024
+ roughness,
8025
+ seed,
8026
+ sketchColor,
8027
+ bowing,
8028
+ fillStyle,
8029
+ strokeWidth,
8030
+ hachureGap,
8031
+ hachureAngle,
8032
+ fillWeight,
8033
+ animate,
8034
+ ...rest
8035
+ }, ref) {
8036
+ const theme = useSketchTheme(sketchColor);
8037
+ const ink = sketchColor ?? theme.ink;
8038
+ const inner = /* @__PURE__ */ jsxRuntime.jsx(EmptyContext.Provider, { value: { ink }, children: /* @__PURE__ */ jsxRuntime.jsx(
8039
+ "div",
8040
+ {
8041
+ ref: bordered ? void 0 : ref,
8042
+ className: cn(className),
8043
+ style: { ...emptyContentStyle, color: ink, ...style },
8044
+ ...bordered ? {} : rest,
8045
+ children
8046
+ }
8047
+ ) });
8048
+ if (!bordered) {
8049
+ return inner;
8050
+ }
8051
+ return /* @__PURE__ */ jsxRuntime.jsx(
8052
+ SketchBox,
8053
+ {
8054
+ ref,
8055
+ className: cn(className),
8056
+ style: { width: "100%", color: ink, ...style },
8057
+ contentStyle: { ...emptyContentStyle, color: ink },
8058
+ fill: fill ?? theme.secondaryFill,
8059
+ fillStyle: fillStyle ?? "hachure",
8060
+ hachureGap: hachureGap ?? 8,
8061
+ hachureAngle,
8062
+ fillWeight: fillWeight ?? 0.85,
8063
+ roughness,
8064
+ seed,
8065
+ sketchColor: ink,
8066
+ bowing,
8067
+ strokeWidth,
8068
+ animate,
8069
+ ...rest,
8070
+ children: /* @__PURE__ */ jsxRuntime.jsx(EmptyContext.Provider, { value: { ink }, children })
8071
+ }
8072
+ );
8073
+ });
8074
+ function EmptyMedia({
8075
+ className,
8076
+ style,
8077
+ children
8078
+ }) {
8079
+ return /* @__PURE__ */ jsxRuntime.jsx(
8080
+ "div",
8081
+ {
8082
+ className: cn(className),
8083
+ style: {
8084
+ display: "flex",
8085
+ alignItems: "center",
8086
+ justifyContent: "center",
8087
+ marginBottom: 4,
8088
+ ...style
8089
+ },
8090
+ children
8091
+ }
8092
+ );
8093
+ }
8094
+ function EmptyTitle({
8095
+ className,
8096
+ style,
8097
+ children
8098
+ }) {
8099
+ const ink = useEmptyInk();
8100
+ return /* @__PURE__ */ jsxRuntime.jsx(
8101
+ "h3",
8102
+ {
8103
+ className: cn(className),
8104
+ style: {
8105
+ margin: 0,
8106
+ fontFamily: doodleUiFontFamily,
8107
+ fontSize: 18,
8108
+ fontWeight: doodleUiFontWeight(700),
8109
+ color: ink,
8110
+ ...style
8111
+ },
8112
+ children
8113
+ }
8114
+ );
8115
+ }
8116
+ function EmptyDescription({
8117
+ className,
8118
+ style,
8119
+ children
8120
+ }) {
8121
+ const ink = useEmptyInk();
8122
+ return /* @__PURE__ */ jsxRuntime.jsx(
8123
+ "p",
8124
+ {
8125
+ className: cn(className),
8126
+ style: {
8127
+ margin: 0,
8128
+ maxWidth: 360,
8129
+ fontFamily: doodleUiFontFamily,
8130
+ fontSize: 14,
8131
+ lineHeight: 1.5,
8132
+ color: ink,
8133
+ opacity: 0.85,
8134
+ ...style
8135
+ },
8136
+ children
8137
+ }
8138
+ );
8139
+ }
8140
+ function EmptyAction({
8141
+ className,
8142
+ style,
8143
+ children
8144
+ }) {
8145
+ return /* @__PURE__ */ jsxRuntime.jsx(
8146
+ "div",
8147
+ {
8148
+ className: cn(className),
8149
+ style: {
8150
+ display: "flex",
8151
+ flexWrap: "wrap",
8152
+ gap: 8,
8153
+ justifyContent: "center",
8154
+ marginTop: 8,
8155
+ ...style
8156
+ },
8157
+ children
8158
+ }
8159
+ );
8160
+ }
8161
+ var FieldContext = react.createContext(null);
8162
+ function useField() {
8163
+ const ctx = react.useContext(FieldContext);
8164
+ if (!ctx) {
8165
+ throw new Error("Field parts must be used inside <Field>.");
8166
+ }
8167
+ return ctx;
8168
+ }
8169
+ function Field({
8170
+ className,
8171
+ style,
8172
+ children,
8173
+ invalid = false,
8174
+ error,
8175
+ ...rest
8176
+ }) {
8177
+ const id = react.useId();
8178
+ const descriptionId = `${id}-description`;
8179
+ const errorId = `${id}-error`;
8180
+ const value = react.useMemo(
8181
+ () => ({
8182
+ id,
8183
+ descriptionId,
8184
+ errorId,
8185
+ invalid: invalid || Boolean(error),
8186
+ error
8187
+ }),
8188
+ [id, descriptionId, errorId, invalid, error]
8189
+ );
8190
+ return /* @__PURE__ */ jsxRuntime.jsx(FieldContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(
8191
+ "div",
8192
+ {
8193
+ className: cn(className),
8194
+ style: {
8195
+ display: "flex",
8196
+ flexDirection: "column",
8197
+ gap: 6,
8198
+ width: "100%",
8199
+ ...style
8200
+ },
8201
+ ...rest,
8202
+ children
8203
+ }
8204
+ ) });
8205
+ }
8206
+ function FieldLabel({ className, style, ...rest }) {
8207
+ const { id } = useField();
8208
+ return /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: id, className, style, ...rest });
8209
+ }
8210
+ function FieldDescription({
8211
+ className,
8212
+ style,
8213
+ children,
8214
+ ...rest
8215
+ }) {
8216
+ const { descriptionId } = useField();
8217
+ const theme = useSketchTheme();
8218
+ return /* @__PURE__ */ jsxRuntime.jsx(
8219
+ "p",
8220
+ {
8221
+ id: descriptionId,
8222
+ className: cn(className),
8223
+ style: {
8224
+ margin: 0,
8225
+ fontFamily: doodleUiFontFamily,
8226
+ fontSize: 12,
8227
+ lineHeight: 1.45,
8228
+ color: theme.ink,
8229
+ opacity: 0.75,
8230
+ ...style
8231
+ },
8232
+ ...rest,
8233
+ children
8234
+ }
8235
+ );
8236
+ }
8237
+ function FieldError({
8238
+ className,
8239
+ style,
8240
+ children,
8241
+ ...rest
8242
+ }) {
8243
+ const { error, errorId } = useField();
8244
+ const theme = useSketchTheme();
8245
+ const message = children ?? error;
8246
+ if (!message) return null;
8247
+ return /* @__PURE__ */ jsxRuntime.jsx(
8248
+ "p",
8249
+ {
8250
+ id: errorId,
8251
+ role: "alert",
8252
+ className: cn(className),
8253
+ style: {
8254
+ margin: 0,
8255
+ fontFamily: doodleUiFontFamily,
8256
+ fontSize: 12,
8257
+ lineHeight: 1.45,
8258
+ color: theme.error,
8259
+ ...style
8260
+ },
8261
+ ...rest,
8262
+ children: message
8263
+ }
8264
+ );
8265
+ }
8266
+ function FieldControl({ children }) {
8267
+ const { id, descriptionId, errorId, invalid } = useField();
8268
+ const child = react.Children.only(children);
8269
+ if (!react.isValidElement(child)) {
8270
+ throw new Error("FieldControl expects a single React element child.");
8271
+ }
8272
+ const describedBy = [descriptionId, invalid ? errorId : null].filter(Boolean).join(" ");
8273
+ const props = child.props;
8274
+ return react.cloneElement(child, {
8275
+ id: props.id ?? id,
8276
+ "aria-describedby": props["aria-describedby"] ?? (describedBy.length > 0 ? describedBy : void 0),
8277
+ "aria-invalid": invalid ? true : props["aria-invalid"]
8278
+ });
8279
+ }
8280
+ var HEADING_SIZES = {
8281
+ 1: 32,
8282
+ 2: 26,
8283
+ 3: 22,
8284
+ 4: 18,
8285
+ 5: 16,
8286
+ 6: 14
8287
+ };
8288
+ var Heading = react.forwardRef(
8289
+ function Heading2({
8290
+ level = 2,
8291
+ accent = "none",
8292
+ className,
8293
+ style,
8294
+ children,
8295
+ roughness,
8296
+ seed,
8297
+ sketchColor,
8298
+ bowing,
8299
+ strokeWidth,
8300
+ animate,
8301
+ ...rest
8302
+ }, ref) {
8303
+ const Tag = `h${level}`;
8304
+ const theme = useSketchTheme(sketchColor);
8305
+ const ink = sketchColor ?? theme.ink;
8306
+ const accentColor = sketchColor ?? theme.accent;
8307
+ const accentFill = theme.isDark ? sketchColor ? `${sketchColor}25` : theme.accentFill : theme.accentFill;
8308
+ const resolvedSeed = useResolvedSeed(seed);
8309
+ const shouldAnimate = useAnimate(animate);
8310
+ const accentRef = react.useRef(null);
8311
+ useDrawIn(accentRef, DRAW_IN_MARK_MS, shouldAnimate && accent !== "none");
8312
+ const fontSize = HEADING_SIZES[level];
8313
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8314
+ Tag,
8315
+ {
8316
+ ref,
8317
+ className: cn(className),
8318
+ style: {
8319
+ position: "relative",
8320
+ margin: 0,
8321
+ fontFamily: doodleUiFontFamily,
8322
+ fontSize,
8323
+ fontWeight: doodleUiFontWeight(700),
8324
+ color: ink,
8325
+ lineHeight: 1.2,
8326
+ ...style
8327
+ },
8328
+ ...rest,
8329
+ children: [
8330
+ accent === "highlight" ? /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { position: "relative", display: "inline" }, children: [
8331
+ /* @__PURE__ */ jsxRuntime.jsx(
8332
+ "span",
8333
+ {
8334
+ ref: accentRef,
8335
+ "aria-hidden": true,
8336
+ style: {
8337
+ position: "absolute",
8338
+ left: -4,
8339
+ right: -4,
8340
+ bottom: 2,
8341
+ height: "0.45em",
8342
+ zIndex: 0
8343
+ },
8344
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8345
+ RoughSvg,
8346
+ {
8347
+ shape: "rectangle",
8348
+ roughness,
8349
+ seed: resolvedSeed,
8350
+ sketchColor: accentColor,
8351
+ fill: accentFill,
8352
+ fillStyle: "solid",
8353
+ bowing,
8354
+ strokeWidth: strokeWidth ?? 1.2
8355
+ }
8356
+ )
8357
+ }
8358
+ ),
8359
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { position: "relative", zIndex: 1 }, children })
8360
+ ] }) : children,
8361
+ accent === "underline" ? /* @__PURE__ */ jsxRuntime.jsx(
8362
+ "span",
8363
+ {
8364
+ ref: accentRef,
8365
+ "aria-hidden": true,
8366
+ style: {
8367
+ display: "block",
8368
+ position: "relative",
8369
+ height: 6,
8370
+ marginTop: 4,
8371
+ maxWidth: "100%"
8372
+ },
8373
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8374
+ RoughSvg,
8375
+ {
8376
+ shape: "path",
8377
+ path: "M 2 4 Q 40 1 80 5 T 160 3",
8378
+ roughness,
8379
+ seed: resolvedSeed,
8380
+ sketchColor: accentColor,
8381
+ bowing,
8382
+ strokeWidth: strokeWidth ?? 1.5
8383
+ }
8384
+ )
8385
+ }
8386
+ ) : null
8387
+ ]
8388
+ }
8389
+ );
8390
+ }
8391
+ );
8392
+ var Text = react.forwardRef(function Text2({ variant = "body", className, style, children, ...rest }, ref) {
8393
+ const theme = useSketchTheme();
8394
+ const sizes = { body: 14, lead: 17, muted: 13 };
8395
+ const opacity = variant === "muted" ? 0.75 : 1;
8396
+ return /* @__PURE__ */ jsxRuntime.jsx(
8397
+ "p",
8398
+ {
8399
+ ref,
8400
+ className: cn(className),
8401
+ style: {
8402
+ margin: 0,
8403
+ fontFamily: doodleUiFontFamily,
8404
+ fontSize: sizes[variant],
8405
+ fontWeight: doodleUiFontWeight(variant === "lead" ? 500 : 400),
8406
+ lineHeight: 1.55,
8407
+ color: theme.ink,
8408
+ opacity,
8409
+ ...style
8410
+ },
8411
+ ...rest,
8412
+ children
8413
+ }
8414
+ );
8415
+ });
8416
+ var Paragraph = Text;
8417
+ var Blockquote = react.forwardRef(
8418
+ function Blockquote2({
8419
+ className,
8420
+ style,
8421
+ children,
8422
+ roughness,
8423
+ seed,
8424
+ sketchColor,
8425
+ bowing,
8426
+ strokeWidth,
8427
+ animate,
8428
+ ...rest
8429
+ }, ref) {
8430
+ const theme = useSketchTheme(sketchColor);
8431
+ const ink = sketchColor ?? theme.ink;
8432
+ const accent = sketchColor ?? theme.accent;
8433
+ const resolvedSeed = useResolvedSeed(seed);
8434
+ const shouldAnimate = useAnimate(animate);
8435
+ const ruleRef = react.useRef(null);
8436
+ useDrawIn(ruleRef, DRAW_IN_MARK_MS, shouldAnimate);
8437
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8438
+ "blockquote",
8439
+ {
8440
+ ref,
8441
+ className: cn(className),
8442
+ style: {
8443
+ display: "flex",
8444
+ gap: 12,
8445
+ margin: 0,
8446
+ padding: "8px 0 8px 4px",
8447
+ fontFamily: doodleUiFontFamily,
8448
+ fontSize: 15,
8449
+ fontStyle: "italic",
8450
+ lineHeight: 1.5,
8451
+ color: ink,
8452
+ ...style
8453
+ },
8454
+ ...rest,
8455
+ children: [
8456
+ /* @__PURE__ */ jsxRuntime.jsx(
8457
+ "span",
8458
+ {
8459
+ ref: ruleRef,
8460
+ "aria-hidden": true,
8461
+ style: { position: "relative", width: 6, flexShrink: 0, minHeight: 40 },
8462
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8463
+ RoughSvg,
8464
+ {
8465
+ shape: "line-vertical",
8466
+ roughness,
8467
+ seed: resolvedSeed,
8468
+ sketchColor: accent,
8469
+ bowing,
8470
+ strokeWidth: strokeWidth ?? 2
8471
+ }
8472
+ )
8473
+ }
8474
+ ),
8475
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children })
8476
+ ]
8477
+ }
8478
+ );
8479
+ }
8480
+ );
8481
+ var InlineCode = react.forwardRef(
8482
+ function InlineCode2({
8483
+ className,
8484
+ style,
8485
+ children,
8486
+ fill,
8487
+ roughness,
8488
+ seed,
8489
+ sketchColor,
8490
+ bowing,
8491
+ fillStyle,
8492
+ strokeWidth,
8493
+ hachureGap,
8494
+ hachureAngle,
8495
+ fillWeight,
8496
+ animate,
8497
+ ...rest
8498
+ }, ref) {
8499
+ const theme = useSketchTheme(sketchColor);
8500
+ const ink = sketchColor ?? theme.ink;
8501
+ return /* @__PURE__ */ jsxRuntime.jsx(
8502
+ SketchBox,
8503
+ {
8504
+ className: cn(className),
8505
+ style: { display: "inline-flex", verticalAlign: "baseline", color: ink, ...style },
8506
+ contentStyle: {
8507
+ padding: "1px 6px",
8508
+ fontSize: "0.9em",
8509
+ fontFamily: "ui-monospace, monospace",
8510
+ color: ink
8511
+ },
8512
+ fill: fill ?? theme.paper,
8513
+ fillStyle: fillStyle ?? "solid",
8514
+ roughness,
8515
+ seed,
8516
+ sketchColor: ink,
8517
+ bowing,
8518
+ strokeWidth: strokeWidth ?? 1.2,
8519
+ hachureGap,
8520
+ hachureAngle,
8521
+ fillWeight,
8522
+ animate,
8523
+ ...rest,
8524
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8525
+ "code",
8526
+ {
8527
+ ref,
8528
+ style: {
8529
+ border: "none",
8530
+ background: "transparent",
8531
+ padding: 0,
8532
+ font: "inherit",
8533
+ color: ink
8534
+ },
8535
+ children
8536
+ }
8537
+ )
8538
+ }
8539
+ );
8540
+ }
8541
+ );
8542
+ var Highlight = react.forwardRef(
8543
+ function Highlight2({
8544
+ className,
8545
+ style,
8546
+ children,
8547
+ fill,
8548
+ roughness,
8549
+ seed,
8550
+ sketchColor,
8551
+ bowing,
8552
+ strokeWidth,
8553
+ animate,
8554
+ ...rest
8555
+ }, ref) {
8556
+ const resolvedSeed = useResolvedSeed(seed);
8557
+ const theme = useSketchTheme(sketchColor);
8558
+ const accent = sketchColor ?? theme.accent;
8559
+ const accentFill = fill ?? (theme.isDark ? sketchColor ? `${sketchColor}25` : theme.accentFill : theme.accentFill);
8560
+ const shouldAnimate = useAnimate(animate);
8561
+ const markRef = react.useRef(null);
8562
+ useDrawIn(markRef, DRAW_IN_MARK_MS, shouldAnimate);
8563
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8564
+ "span",
8565
+ {
8566
+ ref,
8567
+ className: cn(className),
8568
+ style: { position: "relative", display: "inline", ...style },
8569
+ ...rest,
8570
+ children: [
8571
+ /* @__PURE__ */ jsxRuntime.jsx(
8572
+ "span",
8573
+ {
8574
+ ref: markRef,
8575
+ "aria-hidden": true,
8576
+ style: {
8577
+ position: "absolute",
8578
+ left: -2,
8579
+ right: -2,
8580
+ bottom: 0,
8581
+ top: "35%",
8582
+ zIndex: 0
8583
+ },
8584
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8585
+ RoughSvg,
8586
+ {
8587
+ shape: "rectangle",
8588
+ roughness,
8589
+ seed: resolvedSeed,
8590
+ sketchColor: accent,
8591
+ fill: accentFill,
8592
+ fillStyle: "solid",
8593
+ bowing,
8594
+ strokeWidth: strokeWidth ?? 1
8595
+ }
8596
+ )
8597
+ }
8598
+ ),
8599
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { position: "relative", zIndex: 1 }, children })
8600
+ ]
8601
+ }
8602
+ );
8603
+ }
8604
+ );
8605
+ var SIDEBAR_WIDTH = 240;
8606
+ var SIDEBAR_WIDTH_COLLAPSED = 56;
8607
+ var SidebarContext = react.createContext(null);
8608
+ function useSidebar() {
8609
+ const ctx = react.useContext(SidebarContext);
8610
+ if (!ctx) {
8611
+ throw new Error("Sidebar parts must be used inside <SidebarProvider>.");
8612
+ }
8613
+ return ctx;
8614
+ }
8615
+ function SidebarProvider({
8616
+ defaultOpen = true,
8617
+ open: openProp,
8618
+ onOpenChange,
8619
+ defaultCollapsed = false,
8620
+ children,
8621
+ roughness,
8622
+ seed,
8623
+ sketchColor,
8624
+ bowing,
8625
+ strokeWidth
8626
+ }) {
8627
+ const [uncontrolledOpen, setUncontrolledOpen] = react.useState(defaultOpen);
8628
+ const [collapsed, setCollapsed] = react.useState(defaultCollapsed);
8629
+ const open = openProp ?? uncontrolledOpen;
8630
+ const setOpen = react.useCallback(
8631
+ (next) => {
8632
+ onOpenChange?.(next);
8633
+ if (openProp === void 0) {
8634
+ setUncontrolledOpen(next);
8635
+ }
8636
+ },
8637
+ [onOpenChange, openProp]
8638
+ );
8639
+ const toggleCollapsed = react.useCallback(() => {
8640
+ setCollapsed((c) => !c);
8641
+ }, []);
8642
+ const theme = useSketchTheme(sketchColor);
8643
+ const ink = sketchColor ?? theme.ink;
8644
+ const paper = theme.paper;
8645
+ const value = react.useMemo(
8646
+ () => ({
8647
+ open,
8648
+ setOpen,
8649
+ collapsed,
8650
+ toggleCollapsed,
8651
+ ink,
8652
+ paper,
8653
+ sketch: { roughness, seed, sketchColor: ink, bowing, strokeWidth }
8654
+ }),
8655
+ [
8656
+ open,
8657
+ setOpen,
8658
+ collapsed,
8659
+ toggleCollapsed,
8660
+ ink,
8661
+ paper,
8662
+ roughness,
8663
+ seed,
8664
+ bowing,
8665
+ strokeWidth
8666
+ ]
8667
+ );
8668
+ return /* @__PURE__ */ jsxRuntime.jsx(SidebarContext.Provider, { value, children });
8669
+ }
8670
+ var Sidebar = react.forwardRef(function Sidebar2({ className, style, children, fill, side = "left", ...rest }, ref) {
8671
+ const { open, collapsed, ink, paper, sketch } = useSidebar();
8672
+ const resolvedSeed = useResolvedSeed(sketch.seed);
8673
+ const width = collapsed ? SIDEBAR_WIDTH_COLLAPSED : SIDEBAR_WIDTH;
8674
+ if (!open) {
8675
+ return null;
8676
+ }
8677
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8678
+ "aside",
8679
+ {
8680
+ ref,
8681
+ className: cn(className),
8682
+ style: {
8683
+ position: "relative",
8684
+ flexShrink: 0,
8685
+ width,
8686
+ minHeight: 200,
8687
+ transition: "width 200ms ease",
8688
+ display: "flex",
8689
+ flexDirection: "column",
8690
+ background: fill ?? paper,
8691
+ color: ink,
8692
+ ...style
8693
+ },
8694
+ "data-side": side,
8695
+ ...rest,
8696
+ children: [
8697
+ children,
8698
+ /* @__PURE__ */ jsxRuntime.jsx(
8699
+ "span",
8700
+ {
8701
+ "aria-hidden": true,
8702
+ style: {
8703
+ position: "absolute",
8704
+ top: 0,
8705
+ bottom: 0,
8706
+ width: 4,
8707
+ ...side === "left" ? { right: 0 } : { left: 0 },
8708
+ pointerEvents: "none"
8709
+ },
8710
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8711
+ RoughSvg,
8712
+ {
8713
+ shape: "line-vertical",
8714
+ roughness: sketch.roughness,
8715
+ seed: resolvedSeed,
8716
+ sketchColor: sketch.sketchColor ?? ink,
8717
+ bowing: sketch.bowing,
8718
+ strokeWidth: sketch.strokeWidth ?? 1.5
8719
+ }
8720
+ )
8721
+ }
8722
+ )
8723
+ ]
8724
+ }
8725
+ );
8726
+ });
8727
+ function SidebarHeader({
8728
+ className,
8729
+ style,
8730
+ children,
8731
+ ...rest
8732
+ }) {
8733
+ const { collapsed, ink } = useSidebar();
8734
+ return /* @__PURE__ */ jsxRuntime.jsx(
8735
+ "div",
8736
+ {
8737
+ className: cn(className),
8738
+ style: {
8739
+ padding: collapsed ? "12px 8px" : "16px 14px",
8740
+ borderBottom: `1px solid ${ink}22`,
8741
+ ...style
8742
+ },
8743
+ ...rest,
8744
+ children
8745
+ }
8746
+ );
8747
+ }
8748
+ function SidebarContent({
8749
+ className,
8750
+ style,
8751
+ children,
8752
+ ...rest
8753
+ }) {
8754
+ return /* @__PURE__ */ jsxRuntime.jsx(
8755
+ "div",
8756
+ {
8757
+ className: cn(className),
8758
+ style: {
8759
+ flex: 1,
8760
+ overflow: "auto",
8761
+ padding: "8px 6px",
8762
+ ...style
8763
+ },
8764
+ ...rest,
8765
+ children
8766
+ }
8767
+ );
8768
+ }
8769
+ function SidebarFooter({
8770
+ className,
8771
+ style,
8772
+ children,
8773
+ ...rest
8774
+ }) {
8775
+ const { ink } = useSidebar();
8776
+ return /* @__PURE__ */ jsxRuntime.jsx(
8777
+ "div",
8778
+ {
8779
+ className: cn(className),
8780
+ style: {
8781
+ padding: "12px 10px",
8782
+ borderTop: `1px solid ${ink}22`,
8783
+ ...style
8784
+ },
8785
+ ...rest,
8786
+ children
8787
+ }
8788
+ );
8789
+ }
8790
+ function SidebarGroup({
8791
+ className,
8792
+ style,
8793
+ children,
8794
+ title,
8795
+ ...rest
8796
+ }) {
8797
+ const { collapsed, ink } = useSidebar();
8798
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8799
+ "div",
8800
+ {
8801
+ className: cn(className),
8802
+ style: { marginBottom: 12, ...style },
8803
+ ...rest,
8804
+ children: [
8805
+ title && !collapsed ? /* @__PURE__ */ jsxRuntime.jsx(
8806
+ "div",
8807
+ {
8808
+ style: {
8809
+ padding: "4px 10px 8px",
8810
+ fontSize: 11,
8811
+ fontWeight: doodleUiFontWeight(600),
8812
+ fontFamily: doodleUiFontFamily,
8813
+ color: ink,
8814
+ opacity: 0.65,
8815
+ textTransform: "uppercase",
8816
+ letterSpacing: "0.06em"
8817
+ },
8818
+ children: title
8819
+ }
8820
+ ) : null,
8821
+ children
8822
+ ]
8823
+ }
8824
+ );
8825
+ }
8826
+ var SidebarItem = react.forwardRef(
8827
+ function SidebarItem2({ className, style, children, active, ...rest }, ref) {
8828
+ const { collapsed, ink, sketch } = useSidebar();
8829
+ return /* @__PURE__ */ jsxRuntime.jsx(
8830
+ Button,
8831
+ {
8832
+ ref,
8833
+ type: "button",
8834
+ variant: active ? "secondary" : "ghost",
8835
+ className: cn(className),
8836
+ style: {
8837
+ width: "100%",
8838
+ justifyContent: collapsed ? "center" : "flex-start",
8839
+ marginBottom: 4,
8840
+ ...style
8841
+ },
8842
+ roughness: sketch.roughness,
8843
+ seed: sketch.seed,
8844
+ sketchColor: ink,
8845
+ bowing: sketch.bowing,
8846
+ strokeWidth: sketch.strokeWidth,
8847
+ ...rest,
8848
+ children
8849
+ }
8850
+ );
8851
+ }
8852
+ );
8853
+ function SidebarTrigger({
8854
+ className,
8855
+ style,
8856
+ children,
8857
+ ...rest
8858
+ }) {
8859
+ const { toggleCollapsed, sketch, ink } = useSidebar();
8860
+ return /* @__PURE__ */ jsxRuntime.jsx(
8861
+ Button,
8862
+ {
8863
+ type: "button",
8864
+ variant: "outline",
8865
+ size: "sm",
8866
+ className: cn(className),
8867
+ style,
8868
+ onClick: toggleCollapsed,
8869
+ roughness: sketch.roughness,
8870
+ seed: sketch.seed,
8871
+ sketchColor: ink,
8872
+ bowing: sketch.bowing,
8873
+ strokeWidth: sketch.strokeWidth,
8874
+ ...rest,
8875
+ children: children ?? "Toggle"
8876
+ }
8877
+ );
8878
+ }
8879
+ function SidebarLayout({
8880
+ className,
8881
+ style,
8882
+ children,
8883
+ ...rest
8884
+ }) {
8885
+ return /* @__PURE__ */ jsxRuntime.jsx(
8886
+ "div",
8887
+ {
8888
+ className: cn(className),
8889
+ style: {
8890
+ display: "flex",
8891
+ width: "100%",
8892
+ minHeight: 280,
8893
+ alignItems: "stretch",
8894
+ ...style
8895
+ },
8896
+ ...rest,
8897
+ children
8898
+ }
8899
+ );
8900
+ }
8901
+ function SidebarInset({
8902
+ className,
8903
+ style,
8904
+ children,
8905
+ ...rest
8906
+ }) {
8907
+ return /* @__PURE__ */ jsxRuntime.jsx(
8908
+ "div",
8909
+ {
8910
+ className: cn(className),
8911
+ style: {
8912
+ flex: 1,
8913
+ padding: 16,
8914
+ minWidth: 0,
8915
+ ...style
8916
+ },
8917
+ ...rest,
8918
+ children
8919
+ }
8920
+ );
8921
+ }
8922
+ var CarouselContext = react.createContext(null);
8923
+ function useCarousel() {
8924
+ const ctx = react.useContext(CarouselContext);
8925
+ if (!ctx) {
8926
+ throw new Error("Carousel parts must be used inside <Carousel>.");
8927
+ }
8928
+ return ctx;
8929
+ }
8930
+ function Carousel({
8931
+ opts,
8932
+ plugins,
8933
+ orientation = "horizontal",
8934
+ bordered = false,
8935
+ className,
8936
+ style,
8937
+ children,
8938
+ setApi,
8939
+ fill,
8940
+ roughness,
8941
+ seed,
8942
+ sketchColor,
8943
+ bowing,
8944
+ strokeWidth,
8945
+ fillStyle,
8946
+ hachureGap,
8947
+ hachureAngle,
8948
+ fillWeight,
8949
+ animate
8950
+ }) {
8951
+ const [emblaRef, api] = useEmblaCarousel__default.default(
8952
+ {
8953
+ ...opts,
8954
+ axis: orientation === "horizontal" ? "x" : "y"
8955
+ },
8956
+ plugins
8957
+ );
8958
+ const [canScrollPrev, setCanScrollPrev] = react.useState(false);
8959
+ const [canScrollNext, setCanScrollNext] = react.useState(false);
8960
+ const theme = useSketchTheme(sketchColor);
8961
+ const ink = sketchColor ?? theme.ink;
8962
+ const paper = fill ?? theme.paper;
8963
+ const scrollPrev = react.useCallback(() => api?.scrollPrev(), [api]);
8964
+ const scrollNext = react.useCallback(() => api?.scrollNext(), [api]);
8965
+ const onSelect = react.useCallback(() => {
8966
+ if (!api) return;
8967
+ setCanScrollPrev(api.canScrollPrev());
8968
+ setCanScrollNext(api.canScrollNext());
8969
+ }, [api]);
8970
+ react.useEffect(() => {
8971
+ if (!api) return;
8972
+ setApi?.(api);
8973
+ onSelect();
8974
+ api.on("reInit", onSelect);
8975
+ api.on("select", onSelect);
8976
+ return () => {
8977
+ api.off("reInit", onSelect);
8978
+ api.off("select", onSelect);
8979
+ };
8980
+ }, [api, onSelect, setApi]);
8981
+ const handleKeyDown = react.useCallback(
8982
+ (event) => {
8983
+ if (orientation === "horizontal") {
8984
+ if (event.key === "ArrowLeft") {
8985
+ event.preventDefault();
8986
+ scrollPrev();
8987
+ } else if (event.key === "ArrowRight") {
8988
+ event.preventDefault();
8989
+ scrollNext();
8990
+ }
8991
+ } else if (event.key === "ArrowUp") {
8992
+ event.preventDefault();
8993
+ scrollPrev();
8994
+ } else if (event.key === "ArrowDown") {
8995
+ event.preventDefault();
8996
+ scrollNext();
8997
+ }
8998
+ },
8999
+ [orientation, scrollPrev, scrollNext]
9000
+ );
9001
+ const value = {
9002
+ emblaRef,
9003
+ api,
9004
+ scrollPrev,
9005
+ scrollNext,
9006
+ canScrollPrev,
9007
+ canScrollNext,
9008
+ orientation,
9009
+ sketch: {
9010
+ roughness,
9011
+ seed,
9012
+ sketchColor: ink,
9013
+ bowing,
9014
+ strokeWidth,
9015
+ fillStyle,
9016
+ hachureGap,
9017
+ hachureAngle,
9018
+ fillWeight,
9019
+ animate,
9020
+ paper,
9021
+ ink
9022
+ },
9023
+ bordered
9024
+ };
9025
+ return /* @__PURE__ */ jsxRuntime.jsx(CarouselContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(
9026
+ "div",
9027
+ {
9028
+ className: cn(className),
9029
+ role: "region",
9030
+ "aria-roledescription": "carousel",
9031
+ tabIndex: 0,
9032
+ onKeyDown: handleKeyDown,
9033
+ style: {
9034
+ position: "relative",
9035
+ width: "100%",
9036
+ outline: "none",
9037
+ color: ink,
9038
+ ...style
9039
+ },
9040
+ children
9041
+ }
9042
+ ) });
9043
+ }
9044
+ var CarouselContent = react.forwardRef(
9045
+ function CarouselContent2({ className, style, children, ...rest }, ref) {
9046
+ const { emblaRef, orientation, bordered, sketch } = useCarousel();
9047
+ const viewport = /* @__PURE__ */ jsxRuntime.jsx("div", { ref: emblaRef, style: { overflow: "hidden" }, children: /* @__PURE__ */ jsxRuntime.jsx(
9048
+ "div",
9049
+ {
9050
+ ref,
9051
+ className: cn(className),
9052
+ style: {
9053
+ display: "flex",
9054
+ flexDirection: orientation === "vertical" ? "column" : "row",
9055
+ marginLeft: orientation === "horizontal" ? -16 : 0,
9056
+ marginTop: orientation === "vertical" ? -16 : 0,
9057
+ ...style
9058
+ },
9059
+ ...rest,
9060
+ children
9061
+ }
9062
+ ) });
9063
+ if (!bordered) {
9064
+ return viewport;
9065
+ }
9066
+ return /* @__PURE__ */ jsxRuntime.jsx(
9067
+ SketchBox,
9068
+ {
9069
+ fill: sketch.paper,
9070
+ fillStyle: sketch.fillStyle ?? "solid",
9071
+ roughness: sketch.roughness,
9072
+ seed: sketch.seed,
9073
+ sketchColor: sketch.sketchColor,
9074
+ bowing: sketch.bowing,
9075
+ strokeWidth: sketch.strokeWidth,
9076
+ hachureGap: sketch.hachureGap,
9077
+ hachureAngle: sketch.hachureAngle,
9078
+ fillWeight: sketch.fillWeight,
9079
+ animate: sketch.animate,
9080
+ contentStyle: { padding: 8, color: sketch.ink },
9081
+ children: viewport
9082
+ }
9083
+ );
9084
+ }
9085
+ );
9086
+ var CarouselItem = react.forwardRef(
9087
+ function CarouselItem2({ className, style, children, ...rest }, ref) {
9088
+ const { orientation } = useCarousel();
9089
+ const gap = 16;
9090
+ return /* @__PURE__ */ jsxRuntime.jsx(
9091
+ "div",
9092
+ {
9093
+ ref,
9094
+ className: cn(className),
9095
+ role: "group",
9096
+ "aria-roledescription": "slide",
9097
+ style: {
9098
+ flex: "0 0 100%",
9099
+ minWidth: 0,
9100
+ paddingLeft: orientation === "horizontal" ? gap : 0,
9101
+ paddingTop: orientation === "vertical" ? gap : 0,
9102
+ ...style
9103
+ },
9104
+ ...rest,
9105
+ children
9106
+ }
9107
+ );
9108
+ }
9109
+ );
9110
+ var ARROW_PATH_PREV = "M 14 4 L 6 12 L 14 20";
9111
+ var ARROW_PATH_NEXT = "M 6 4 L 14 12 L 6 20";
9112
+ var ARROW_SIZE = 40;
9113
+ var CarouselArrow = react.forwardRef(function CarouselArrow2({ className, style, direction, ...rest }, ref) {
9114
+ const {
9115
+ scrollPrev,
9116
+ scrollNext,
9117
+ canScrollPrev,
9118
+ canScrollNext,
9119
+ sketch,
9120
+ orientation
9121
+ } = useCarousel();
9122
+ const resolvedSeed = useResolvedSeed(sketch.seed);
9123
+ const ink = sketch.sketchColor ?? sketch.ink;
9124
+ const isPrev = direction === "prev";
9125
+ const disabled = isPrev ? !canScrollPrev : !canScrollNext;
9126
+ const shouldAnimate = useAnimate(sketch.animate);
9127
+ const rootRef = react.useRef(null);
9128
+ const sketchSeed = deriveSeed(resolvedSeed, direction);
9129
+ useDrawIn(rootRef, DRAW_IN_DURATION_MS, shouldAnimate, sketchSeed);
9130
+ const horizontal = orientation === "horizontal";
9131
+ return /* @__PURE__ */ jsxRuntime.jsxs(
9132
+ "button",
9133
+ {
9134
+ ref: (node) => {
9135
+ rootRef.current = node;
9136
+ assignRef(ref, node);
9137
+ },
9138
+ type: "button",
9139
+ disabled,
9140
+ className: cn(className),
9141
+ style: {
9142
+ position: "absolute",
9143
+ zIndex: 2,
9144
+ width: ARROW_SIZE,
9145
+ height: ARROW_SIZE,
9146
+ padding: 0,
9147
+ border: "none",
9148
+ background: "transparent",
9149
+ cursor: disabled ? "not-allowed" : "pointer",
9150
+ opacity: disabled ? 0.5 : 1,
9151
+ ...horizontal ? {
9152
+ top: "50%",
9153
+ transform: "translateY(-50%)",
9154
+ left: isPrev ? -52 : void 0,
9155
+ right: isPrev ? void 0 : -52
9156
+ } : {
9157
+ left: "50%",
9158
+ transform: "translateX(-50%) rotate(90deg)",
9159
+ top: isPrev ? -52 : void 0,
9160
+ bottom: isPrev ? void 0 : -52
9161
+ },
9162
+ ...style
9163
+ },
9164
+ onClick: isPrev ? scrollPrev : scrollNext,
9165
+ "aria-label": isPrev ? "Previous slide" : "Next slide",
9166
+ ...rest,
9167
+ children: [
9168
+ /* @__PURE__ */ jsxRuntime.jsx(
9169
+ RoughSvg,
9170
+ {
9171
+ shape: "ellipse",
9172
+ roughness: sketch.roughness,
9173
+ seed: sketchSeed,
9174
+ sketchColor: ink,
9175
+ bowing: sketch.bowing,
9176
+ fill: sketch.paper,
9177
+ fillStyle: "solid",
9178
+ strokeWidth: sketch.strokeWidth ?? 1.5,
9179
+ inset: 1.5
9180
+ }
9181
+ ),
9182
+ /* @__PURE__ */ jsxRuntime.jsx(
9183
+ "span",
9184
+ {
9185
+ style: {
9186
+ position: "relative",
9187
+ zIndex: 1,
9188
+ width: 18,
9189
+ height: 22,
9190
+ display: "block",
9191
+ margin: "0 auto"
9192
+ },
9193
+ children: /* @__PURE__ */ jsxRuntime.jsx(
9194
+ RoughSvg,
9195
+ {
9196
+ shape: "path",
9197
+ path: isPrev ? ARROW_PATH_PREV : ARROW_PATH_NEXT,
9198
+ roughness: sketch.roughness,
9199
+ seed: deriveSeed(resolvedSeed, `${direction}-arrow`),
9200
+ sketchColor: ink,
9201
+ strokeWidth: sketch.strokeWidth ?? 1.6
9202
+ }
9203
+ )
9204
+ }
9205
+ )
9206
+ ]
9207
+ }
9208
+ );
9209
+ });
9210
+ var CarouselPrevious = react.forwardRef(
9211
+ function CarouselPrevious2(props, ref) {
9212
+ return /* @__PURE__ */ jsxRuntime.jsx(CarouselArrow, { ref, direction: "prev", ...props });
9213
+ }
9214
+ );
9215
+ var CarouselNext = react.forwardRef(
9216
+ function CarouselNext2(props, ref) {
9217
+ return /* @__PURE__ */ jsxRuntime.jsx(CarouselArrow, { ref, direction: "next", ...props });
9218
+ }
9219
+ );
7234
9220
 
7235
9221
  exports.Accordion = Accordion;
7236
9222
  exports.AccordionContent = AccordionContent;
@@ -7248,12 +9234,19 @@ exports.AlertDialogOverlay = AlertDialogOverlay;
7248
9234
  exports.AlertDialogPortal = AlertDialogPortal;
7249
9235
  exports.AlertDialogTitle = AlertDialogTitle;
7250
9236
  exports.AlertDialogTrigger = AlertDialogTrigger;
9237
+ exports.AspectRatio = AspectRatio;
7251
9238
  exports.Avatar = Avatar;
7252
9239
  exports.Badge = Badge;
9240
+ exports.Blockquote = Blockquote;
7253
9241
  exports.Breadcrumb = Breadcrumb;
7254
9242
  exports.BreadcrumbItem = BreadcrumbItem;
7255
9243
  exports.Button = Button;
7256
9244
  exports.Card = Card;
9245
+ exports.Carousel = Carousel;
9246
+ exports.CarouselContent = CarouselContent;
9247
+ exports.CarouselItem = CarouselItem;
9248
+ exports.CarouselNext = CarouselNext;
9249
+ exports.CarouselPrevious = CarouselPrevious;
7257
9250
  exports.Checkbox = Checkbox;
7258
9251
  exports.Collapsible = Collapsible;
7259
9252
  exports.CollapsibleContent = CollapsibleContent;
@@ -7278,8 +9271,13 @@ exports.ContextMenuRadioItem = ContextMenuRadioItem;
7278
9271
  exports.ContextMenuSeparator = ContextMenuSeparator;
7279
9272
  exports.ContextMenuSub = ContextMenuSub;
7280
9273
  exports.ContextMenuTrigger = ContextMenuTrigger;
9274
+ exports.DARK_SKETCH_COLORS = DARK_SKETCH_COLORS;
7281
9275
  exports.DEFAULT_BOWING = DEFAULT_BOWING;
9276
+ exports.DEFAULT_DARK_CARD_BG = DEFAULT_DARK_CARD_BG;
9277
+ exports.DEFAULT_DARK_INK = DEFAULT_DARK_INK;
9278
+ exports.DEFAULT_DARK_PAPER = DEFAULT_DARK_PAPER;
7282
9279
  exports.DEFAULT_INK = DEFAULT_INK;
9280
+ exports.DEFAULT_PAPER = DEFAULT_PAPER;
7283
9281
  exports.DEFAULT_ROUGHNESS = DEFAULT_ROUGHNESS;
7284
9282
  exports.DEFAULT_STROKE_WIDTH = DEFAULT_STROKE_WIDTH;
7285
9283
  exports.DRAW_IN_ALERT_MS = DRAW_IN_ALERT_MS;
@@ -7318,10 +9316,23 @@ exports.DropdownMenuRadioItem = DropdownMenuRadioItem;
7318
9316
  exports.DropdownMenuSeparator = DropdownMenuSeparator;
7319
9317
  exports.DropdownMenuSub = DropdownMenuSub;
7320
9318
  exports.DropdownMenuTrigger = DropdownMenuTrigger;
9319
+ exports.Empty = Empty;
9320
+ exports.EmptyAction = EmptyAction;
9321
+ exports.EmptyDescription = EmptyDescription;
9322
+ exports.EmptyMedia = EmptyMedia;
9323
+ exports.EmptyTitle = EmptyTitle;
9324
+ exports.Field = Field;
9325
+ exports.FieldControl = FieldControl;
9326
+ exports.FieldDescription = FieldDescription;
9327
+ exports.FieldError = FieldError;
9328
+ exports.FieldLabel = FieldLabel;
9329
+ exports.Heading = Heading;
9330
+ exports.Highlight = Highlight;
7321
9331
  exports.HoverCard = HoverCard;
7322
9332
  exports.HoverCardArrow = HoverCardArrow;
7323
9333
  exports.HoverCardContent = HoverCardContent;
7324
9334
  exports.HoverCardTrigger = HoverCardTrigger;
9335
+ exports.InlineCode = InlineCode;
7325
9336
  exports.Input = Input;
7326
9337
  exports.InputGroup = InputGroup;
7327
9338
  exports.InputGroupAddon = InputGroupAddon;
@@ -7353,6 +9364,7 @@ exports.ModalDescription = ModalDescription;
7353
9364
  exports.ModalRoot = ModalRoot;
7354
9365
  exports.ModalTitle = ModalTitle;
7355
9366
  exports.ModalTrigger = ModalTrigger;
9367
+ exports.NativeSelect = NativeSelect;
7356
9368
  exports.NavigationMenu = NavigationMenu;
7357
9369
  exports.NavigationMenuContent = NavigationMenuContent;
7358
9370
  exports.NavigationMenuIndicator = NavigationMenuIndicator;
@@ -7363,6 +9375,7 @@ exports.NavigationMenuList = NavigationMenuList;
7363
9375
  exports.NavigationMenuTrigger = NavigationMenuTrigger;
7364
9376
  exports.NavigationMenuViewport = NavigationMenuViewport;
7365
9377
  exports.Pagination = Pagination;
9378
+ exports.Paragraph = Paragraph;
7366
9379
  exports.Popover = Popover;
7367
9380
  exports.PopoverAnchor = PopoverAnchor;
7368
9381
  exports.PopoverArrow = PopoverArrow;
@@ -7398,6 +9411,16 @@ exports.SheetFooter = SheetFooter;
7398
9411
  exports.SheetHeader = SheetHeader;
7399
9412
  exports.SheetTitle = SheetTitle;
7400
9413
  exports.SheetTrigger = SheetTrigger;
9414
+ exports.Sidebar = Sidebar;
9415
+ exports.SidebarContent = SidebarContent;
9416
+ exports.SidebarFooter = SidebarFooter;
9417
+ exports.SidebarGroup = SidebarGroup;
9418
+ exports.SidebarHeader = SidebarHeader;
9419
+ exports.SidebarInset = SidebarInset;
9420
+ exports.SidebarItem = SidebarItem;
9421
+ exports.SidebarLayout = SidebarLayout;
9422
+ exports.SidebarProvider = SidebarProvider;
9423
+ exports.SidebarTrigger = SidebarTrigger;
7401
9424
  exports.Skeleton = Skeleton;
7402
9425
  exports.SketchBox = SketchBox;
7403
9426
  exports.SketchSeedProvider = SketchSeedProvider;
@@ -7416,6 +9439,7 @@ exports.TableHead = TableHead;
7416
9439
  exports.TableHeaderCell = TableHeaderCell;
7417
9440
  exports.TableRow = TableRow;
7418
9441
  exports.Tabs = Tabs;
9442
+ exports.Text = Text;
7419
9443
  exports.Textarea = Textarea;
7420
9444
  exports.Toast = Toast;
7421
9445
  exports.ToastAction = ToastAction;
@@ -7433,9 +9457,12 @@ exports.TooltipProvider = TooltipProvider;
7433
9457
  exports.deriveSeed = deriveSeed;
7434
9458
  exports.toRoughOptions = toRoughOptions;
7435
9459
  exports.useAnimate = useAnimate;
9460
+ exports.useCarousel = useCarousel;
7436
9461
  exports.useDoodleUI = useDoodleUI;
7437
9462
  exports.useDrawIn = useDrawIn;
7438
9463
  exports.useResolvedSeed = useResolvedSeed;
9464
+ exports.useSidebar = useSidebar;
7439
9465
  exports.useSketchSeed = useSketchSeed;
9466
+ exports.useSketchTheme = useSketchTheme;
7440
9467
  //# sourceMappingURL=index.cjs.map
7441
9468
  //# sourceMappingURL=index.cjs.map