@retor/react-native 0.2.0 → 0.3.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.js CHANGED
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  AddNoteSheet: () => AddNoteSheet,
34
+ BlurBackground: () => BlurBackground,
34
35
  CoverPhoto: () => CoverPhoto,
35
36
  Hud: () => Hud,
36
37
  LineDetailSheet: () => LineDetailSheet,
@@ -356,28 +357,52 @@ function Hud({ children }) {
356
357
  }
357
358
 
358
359
  // src/ProjectSheet.tsx
360
+ var import_react5 = __toESM(require("react"));
361
+ var import_react_native4 = require("react-native");
362
+ var import_bottom_sheet2 = require("@gorhom/bottom-sheet");
363
+ var import_lucide_react_native = require("lucide-react-native");
364
+
365
+ // src/BlurBackground.tsx
359
366
  var import_react4 = __toESM(require("react"));
360
367
  var import_react_native3 = require("react-native");
361
- var import_bottom_sheet2 = require("@gorhom/bottom-sheet");
362
- function ProjectSheet({ snapPoints = ["20%", "60%"], renderHeader, children }) {
368
+ var import_expo_blur = require("expo-blur");
369
+ function BlurBackground({ style }) {
370
+ return /* @__PURE__ */ import_react4.default.createElement(import_react_native3.View, { style: [style, import_react_native3.StyleSheet.absoluteFill, { overflow: "hidden", borderTopLeftRadius: 24, borderTopRightRadius: 24 }] }, /* @__PURE__ */ import_react4.default.createElement(import_expo_blur.BlurView, { intensity: 60, tint: "dark", style: import_react_native3.StyleSheet.absoluteFill }), /* @__PURE__ */ import_react4.default.createElement(import_react_native3.View, { style: [import_react_native3.StyleSheet.absoluteFill, { backgroundColor: "rgba(20,20,20,0.55)" }] }));
371
+ }
372
+
373
+ // src/ProjectSheet.tsx
374
+ function ProjectSheet({ snapPoints = ["35%", "85%"], renderHeader, children }) {
363
375
  const { project, activeLineId, isAddNoteOpen } = useRetorBridge();
364
- const sheetRef = (0, import_react4.useRef)(null);
365
- const snapPointsArr = (0, import_react4.useMemo)(() => snapPoints, [snapPoints]);
366
- (0, import_react4.useEffect)(() => {
376
+ const sheetRef = (0, import_react5.useRef)(null);
377
+ const snapPointsArr = (0, import_react5.useMemo)(() => snapPoints, [snapPoints]);
378
+ const [minimized, setMinimized] = (0, import_react5.useState)(false);
379
+ (0, import_react5.useEffect)(() => {
367
380
  if (activeLineId || isAddNoteOpen) {
368
381
  sheetRef.current?.dismiss();
369
382
  } else {
370
383
  sheetRef.current?.present();
384
+ setMinimized(false);
371
385
  }
372
386
  }, [activeLineId, isAddNoteOpen]);
373
- return /* @__PURE__ */ import_react4.default.createElement(
387
+ const handleSheetChange = (index) => {
388
+ setMinimized(index === 0);
389
+ };
390
+ const toggleMinimize = () => {
391
+ if (minimized) {
392
+ sheetRef.current?.snapToIndex(snapPointsArr.length - 1);
393
+ } else {
394
+ sheetRef.current?.snapToIndex(0);
395
+ }
396
+ };
397
+ return /* @__PURE__ */ import_react5.default.createElement(
374
398
  import_bottom_sheet2.BottomSheetModal,
375
399
  {
376
400
  ref: sheetRef,
377
401
  snapPoints: snapPointsArr,
378
402
  enablePanDownToClose: false,
379
403
  enableDismissOnClose: false,
380
- backdropComponent: (props) => /* @__PURE__ */ import_react4.default.createElement(
404
+ onChange: handleSheetChange,
405
+ backdropComponent: (props) => /* @__PURE__ */ import_react5.default.createElement(
381
406
  import_bottom_sheet2.BottomSheetBackdrop,
382
407
  {
383
408
  ...props,
@@ -388,48 +413,69 @@ function ProjectSheet({ snapPoints = ["20%", "60%"], renderHeader, children }) {
388
413
  }
389
414
  ),
390
415
  handleIndicatorStyle: styles2.handle,
391
- backgroundStyle: styles2.background
416
+ backgroundComponent: BlurBackground
392
417
  },
393
- /* @__PURE__ */ import_react4.default.createElement(import_bottom_sheet2.BottomSheetView, { style: styles2.content }, renderHeader ? renderHeader({ name: project?.name, description: project?.description }) : /* @__PURE__ */ import_react4.default.createElement(import_react_native3.View, { style: styles2.header }, project?.name && /* @__PURE__ */ import_react4.default.createElement(import_react_native3.Text, { style: styles2.title }, project.name), project?.description && /* @__PURE__ */ import_react4.default.createElement(import_react_native3.Text, { style: styles2.subtitle, numberOfLines: 4 }, project.description)), children ?? /* @__PURE__ */ import_react4.default.createElement(DefaultLinesCarousel, null))
418
+ /* @__PURE__ */ import_react5.default.createElement(import_bottom_sheet2.BottomSheetView, { style: styles2.content }, renderHeader ? renderHeader({ name: project?.name, description: project?.description }) : /* @__PURE__ */ import_react5.default.createElement(import_react_native4.View, { style: styles2.header }, /* @__PURE__ */ import_react5.default.createElement(import_react_native4.View, { style: { flex: 1, minWidth: 0 } }, project?.name && /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles2.title, numberOfLines: 1 }, project.name), project?.description && /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles2.subtitle, numberOfLines: 4 }, project.description)), /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Pressable, { style: styles2.iconBtn, onPress: toggleMinimize }, minimized ? /* @__PURE__ */ import_react5.default.createElement(import_lucide_react_native.ArrowUp, { size: 14, color: "rgba(255,255,255,0.6)" }) : /* @__PURE__ */ import_react5.default.createElement(import_lucide_react_native.ArrowDown, { size: 14, color: "rgba(255,255,255,0.6)" }))), children ?? /* @__PURE__ */ import_react5.default.createElement(DefaultLinesCarousel, null))
394
419
  );
395
420
  }
396
421
  function DefaultLinesCarousel() {
397
- return /* @__PURE__ */ import_react4.default.createElement(LinesCarousel, null, (line) => /* @__PURE__ */ import_react4.default.createElement(DefaultLineCard, { line }));
422
+ return /* @__PURE__ */ import_react5.default.createElement(LinesCarousel, null, (line) => /* @__PURE__ */ import_react5.default.createElement(DefaultLineCard, { line }));
398
423
  }
399
424
  function LinesCarousel({ children, gap = 12, paddingHorizontal = 16 }) {
400
425
  const { lines } = useRetorBridge();
401
426
  if (lines.length === 0) return null;
402
- return /* @__PURE__ */ import_react4.default.createElement(
403
- import_react_native3.ScrollView,
427
+ return /* @__PURE__ */ import_react5.default.createElement(import_react_native4.View, { style: styles2.carouselWrap }, /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles2.carouselLabel }, "Routes"), /* @__PURE__ */ import_react5.default.createElement(
428
+ import_react_native4.ScrollView,
404
429
  {
405
430
  horizontal: true,
406
431
  showsHorizontalScrollIndicator: false,
407
- contentContainerStyle: { paddingHorizontal, gap },
408
- style: styles2.carousel
432
+ contentContainerStyle: { paddingHorizontal, gap }
409
433
  },
410
- lines.map((line, idx) => /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, { key: line._id }, children(line, idx)))
411
- );
434
+ lines.map((line, idx) => /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, { key: line._id }, children(line, idx)))
435
+ ));
412
436
  }
413
437
  function DefaultLineCard({ line }) {
414
438
  const { controls } = useRetorBridge();
415
- return /* @__PURE__ */ import_react4.default.createElement(
416
- import_react_native3.Pressable,
439
+ return /* @__PURE__ */ import_react5.default.createElement(
440
+ import_react_native4.Pressable,
417
441
  {
418
442
  onPress: () => controls.openLine(line._id),
419
443
  style: styles2.lineCard
420
444
  },
421
- /* @__PURE__ */ import_react4.default.createElement(import_react_native3.Text, { style: styles2.lineCardTitle, numberOfLines: 1 }, line.name || "Line"),
422
- line.subtitle && /* @__PURE__ */ import_react4.default.createElement(import_react_native3.Text, { style: styles2.lineCardSubtitle, numberOfLines: 2 }, line.subtitle)
445
+ /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles2.lineCardTitle, numberOfLines: 1 }, line.name || "Line"),
446
+ line.subtitle && /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles2.lineCardSubtitle, numberOfLines: 2 }, line.subtitle)
423
447
  );
424
448
  }
425
- var styles2 = import_react_native3.StyleSheet.create({
426
- background: { backgroundColor: "rgba(20,20,20,0.95)" },
449
+ var styles2 = import_react_native4.StyleSheet.create({
427
450
  handle: { backgroundColor: "rgba(255,255,255,0.3)" },
428
451
  content: { flex: 1, paddingTop: 12, paddingBottom: 24 },
429
- header: { paddingHorizontal: 24, paddingBottom: 16 },
452
+ header: {
453
+ flexDirection: "row",
454
+ alignItems: "flex-start",
455
+ paddingHorizontal: 24,
456
+ paddingBottom: 16,
457
+ gap: 8
458
+ },
430
459
  title: { color: "white", fontSize: 18, fontWeight: "600", lineHeight: 22 },
431
460
  subtitle: { color: "rgba(255,255,255,0.6)", fontSize: 13, marginTop: 4, lineHeight: 18 },
432
- carousel: { marginTop: 8 },
461
+ iconBtn: {
462
+ width: 28,
463
+ height: 28,
464
+ borderRadius: 14,
465
+ backgroundColor: "rgba(255,255,255,0.1)",
466
+ alignItems: "center",
467
+ justifyContent: "center"
468
+ },
469
+ carouselWrap: { marginTop: 8 },
470
+ carouselLabel: {
471
+ color: "rgba(255,255,255,0.4)",
472
+ fontSize: 10,
473
+ textTransform: "uppercase",
474
+ letterSpacing: 1,
475
+ fontWeight: "500",
476
+ paddingHorizontal: 24,
477
+ marginBottom: 8
478
+ },
433
479
  lineCard: {
434
480
  width: 220,
435
481
  backgroundColor: "rgba(255,255,255,0.06)",
@@ -441,28 +487,49 @@ var styles2 = import_react_native3.StyleSheet.create({
441
487
  });
442
488
 
443
489
  // src/LineDetailSheet.tsx
444
- var import_react5 = __toESM(require("react"));
445
- var import_react_native4 = require("react-native");
490
+ var import_react6 = __toESM(require("react"));
491
+ var import_react_native5 = require("react-native");
446
492
  var import_bottom_sheet3 = require("@gorhom/bottom-sheet");
447
- function LineDetailSheet({ snapPoints = ["25%", "75%"], renderHeader, children }) {
493
+ var import_react_native_svg = __toESM(require("react-native-svg"));
494
+ var import_lucide_react_native2 = require("lucide-react-native");
495
+ function LineDetailSheet({ snapPoints = ["35%", "85%"], renderHeader, children }) {
448
496
  const { activeLine, isAddNoteOpen, controls } = useRetorBridge();
449
- const sheetRef = (0, import_react5.useRef)(null);
450
- const snapPointsArr = (0, import_react5.useMemo)(() => snapPoints, [snapPoints]);
451
- (0, import_react5.useEffect)(() => {
497
+ const sheetRef = (0, import_react6.useRef)(null);
498
+ const snapPointsArr = (0, import_react6.useMemo)(() => snapPoints, [snapPoints]);
499
+ const [minimized, setMinimized] = (0, import_react6.useState)(false);
500
+ (0, import_react6.useEffect)(() => {
452
501
  if (activeLine && !isAddNoteOpen) {
453
502
  sheetRef.current?.present();
503
+ setMinimized(false);
454
504
  } else {
455
505
  sheetRef.current?.dismiss();
456
506
  }
457
507
  }, [activeLine, isAddNoteOpen]);
458
- return /* @__PURE__ */ import_react5.default.createElement(
508
+ const handleSheetChange = (index) => {
509
+ setMinimized(index === 0);
510
+ };
511
+ const toggleMinimize = () => {
512
+ if (minimized) {
513
+ sheetRef.current?.snapToIndex(snapPointsArr.length - 1);
514
+ } else {
515
+ sheetRef.current?.snapToIndex(0);
516
+ }
517
+ };
518
+ const renderFooter = (0, import_react6.useCallback)(
519
+ (props) => /* @__PURE__ */ import_react6.default.createElement(import_bottom_sheet3.BottomSheetFooter, { ...props, bottomInset: 0 }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: styles3.footer }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Pressable, { style: styles3.doneButton, onPress: () => controls.exitLine() }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles3.doneText }, "Done")))),
520
+ [controls]
521
+ );
522
+ const header = activeLine ? renderHeader ? renderHeader(activeLine) : /* @__PURE__ */ import_react6.default.createElement(DefaultHeader, { line: activeLine, minimized, onToggleMinimize: toggleMinimize }) : null;
523
+ return /* @__PURE__ */ import_react6.default.createElement(
459
524
  import_bottom_sheet3.BottomSheetModal,
460
525
  {
461
526
  ref: sheetRef,
462
527
  snapPoints: snapPointsArr,
463
528
  enablePanDownToClose: false,
464
529
  enableDismissOnClose: false,
465
- backdropComponent: (props) => /* @__PURE__ */ import_react5.default.createElement(
530
+ onChange: handleSheetChange,
531
+ footerComponent: renderFooter,
532
+ backdropComponent: (props) => /* @__PURE__ */ import_react6.default.createElement(
466
533
  import_bottom_sheet3.BottomSheetBackdrop,
467
534
  {
468
535
  ...props,
@@ -473,63 +540,158 @@ function LineDetailSheet({ snapPoints = ["25%", "75%"], renderHeader, children }
473
540
  }
474
541
  ),
475
542
  handleIndicatorStyle: styles3.handle,
476
- backgroundStyle: styles3.background
543
+ backgroundComponent: BlurBackground
477
544
  },
478
- /* @__PURE__ */ import_react5.default.createElement(import_bottom_sheet3.BottomSheetView, { style: styles3.content }, activeLine && (renderHeader ? renderHeader(activeLine) : /* @__PURE__ */ import_react5.default.createElement(import_react_native4.View, { style: styles3.header }, /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles3.title }, activeLine.name), activeLine.subtitle && /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles3.subtitle }, activeLine.subtitle), activeLine.description && /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles3.description, numberOfLines: 4 }, activeLine.description))), children ?? /* @__PURE__ */ import_react5.default.createElement(DefaultLineTagList, null), /* @__PURE__ */ import_react5.default.createElement(import_react_native4.View, { style: styles3.footer }, /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Pressable, { style: styles3.doneButton, onPress: () => controls.exitLine() }, /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles3.doneText }, "Done"))))
545
+ activeLine && (children ?? /* @__PURE__ */ import_react6.default.createElement(DefaultLineTagList, { listHeader: header }))
479
546
  );
480
547
  }
481
- function DefaultLineTagList() {
482
- return /* @__PURE__ */ import_react5.default.createElement(LineTagList, null, (tag, isActive) => /* @__PURE__ */ import_react5.default.createElement(DefaultTagItem, { tag, isActive }));
548
+ function DefaultHeader({
549
+ line,
550
+ minimized,
551
+ onToggleMinimize
552
+ }) {
553
+ return /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: styles3.header }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles3.title, numberOfLines: 1 }, line.name), line.subtitle && /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles3.subtitle, numberOfLines: 1 }, line.subtitle), line.description && /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles3.description, numberOfLines: minimized ? 2 : 4 }, line.description)), /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: styles3.headerActions }, /* @__PURE__ */ import_react6.default.createElement(AutoplayButton, null), /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Pressable, { style: styles3.iconBtn, onPress: onToggleMinimize }, minimized ? /* @__PURE__ */ import_react6.default.createElement(import_lucide_react_native2.ArrowUp, { size: 14, color: "rgba(255,255,255,0.6)" }) : /* @__PURE__ */ import_react6.default.createElement(import_lucide_react_native2.ArrowDown, { size: 14, color: "rgba(255,255,255,0.6)" }))));
483
554
  }
484
- function LineTagList({ children }) {
555
+ function AutoplayButton() {
556
+ const { isPlaying, progress, controls } = useRetorBridge();
557
+ const r = 12.5;
558
+ const c = 2 * Math.PI * r;
559
+ return /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Pressable, { style: styles3.iconBtn, onPress: () => controls.toggleAutoplay() }, /* @__PURE__ */ import_react6.default.createElement(import_react_native_svg.default, { width: 28, height: 28, style: import_react_native5.StyleSheet.absoluteFill }, /* @__PURE__ */ import_react6.default.createElement(
560
+ import_react_native_svg.Circle,
561
+ {
562
+ cx: 14,
563
+ cy: 14,
564
+ r,
565
+ fill: "none",
566
+ stroke: "white",
567
+ strokeWidth: 2,
568
+ strokeDasharray: `${c}`,
569
+ strokeDashoffset: c * (1 - progress),
570
+ strokeLinecap: "round",
571
+ transform: "rotate(-90, 14, 14)"
572
+ }
573
+ )), isPlaying ? /* @__PURE__ */ import_react6.default.createElement(import_lucide_react_native2.Pause, { size: 11, color: "white", fill: "white" }) : /* @__PURE__ */ import_react6.default.createElement(import_lucide_react_native2.Play, { size: 11, color: "white", fill: "white", style: { marginLeft: 1 } }));
574
+ }
575
+ function LineTagList({ children, listHeader }) {
485
576
  const { activeLine, closestTagId } = useRetorBridge();
486
- const tags = (0, import_react5.useMemo)(
577
+ const listRef = (0, import_react6.useRef)(null);
578
+ const tags = (0, import_react6.useMemo)(
487
579
  () => (activeLine?.tags ?? []).filter((t) => t.name && t.name.trim().length > 0),
488
580
  [activeLine]
489
581
  );
582
+ (0, import_react6.useEffect)(() => {
583
+ if (!closestTagId) return;
584
+ const index = tags.findIndex((t2) => t2._id === closestTagId);
585
+ if (index < 0) return;
586
+ const t = setTimeout(() => {
587
+ try {
588
+ listRef.current?.scrollToIndex({ index, animated: true, viewPosition: 0 });
589
+ } catch {
590
+ }
591
+ }, 50);
592
+ return () => clearTimeout(t);
593
+ }, [closestTagId, tags]);
490
594
  if (!activeLine) return null;
491
- return /* @__PURE__ */ import_react5.default.createElement(
595
+ return /* @__PURE__ */ import_react6.default.createElement(
492
596
  import_bottom_sheet3.BottomSheetFlatList,
493
597
  {
598
+ ref: listRef,
494
599
  data: tags,
495
600
  keyExtractor: (t) => t._id,
496
- renderItem: ({ item }) => /* @__PURE__ */ import_react5.default.createElement(import_react_native4.View, null, children(item, item._id === closestTagId)),
497
- contentContainerStyle: styles3.list
601
+ ListHeaderComponent: listHeader ? () => /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, listHeader) : void 0,
602
+ renderItem: ({ item }) => /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, null, children(item, item._id === closestTagId)),
603
+ contentContainerStyle: styles3.list,
604
+ removeClippedSubviews: false,
605
+ onScrollToIndexFailed: (info) => {
606
+ const offset = info.averageItemLength * info.index;
607
+ listRef.current?.scrollToOffset({ offset, animated: false });
608
+ setTimeout(() => {
609
+ try {
610
+ listRef.current?.scrollToIndex({ index: info.index, animated: true, viewPosition: 0 });
611
+ } catch {
612
+ }
613
+ }, 100);
614
+ }
498
615
  }
499
616
  );
500
617
  }
618
+ function DefaultLineTagList({ listHeader }) {
619
+ return /* @__PURE__ */ import_react6.default.createElement(LineTagList, { listHeader }, (tag, isActive) => /* @__PURE__ */ import_react6.default.createElement(DefaultTagItem, { tag, isActive }));
620
+ }
501
621
  function DefaultTagItem({ tag, isActive }) {
502
- const { controls } = useRetorBridge();
503
- return /* @__PURE__ */ import_react5.default.createElement(
504
- import_react_native4.Pressable,
622
+ const { controls, openAddNote } = useRetorBridge();
623
+ return /* @__PURE__ */ import_react6.default.createElement(
624
+ import_react_native5.Pressable,
505
625
  {
506
626
  onPress: () => controls.scrollToTag(tag._id),
507
627
  style: [styles3.tagItem, isActive && styles3.tagItemActive]
508
628
  },
509
- /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: [styles3.tagText, isActive && styles3.tagTextActive], numberOfLines: 1 }, tag.name),
510
- tag.subtitle && /* @__PURE__ */ import_react5.default.createElement(import_react_native4.Text, { style: styles3.tagSubtitle, numberOfLines: 1 }, tag.subtitle)
629
+ /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: [styles3.tagText, isActive && styles3.tagTextActive], numberOfLines: 1 }, tag.name), isActive && tag.description && /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles3.tagDescription, numberOfLines: 2 }, tag.description)),
630
+ tag.subtitle && /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles3.tagSubtitle, numberOfLines: 1 }, tag.subtitle),
631
+ isActive && /* @__PURE__ */ import_react6.default.createElement(
632
+ import_react_native5.Pressable,
633
+ {
634
+ onPress: (e) => {
635
+ e.stopPropagation();
636
+ openAddNote(tag._id);
637
+ },
638
+ style: styles3.plusBtn
639
+ },
640
+ /* @__PURE__ */ import_react6.default.createElement(import_lucide_react_native2.Plus, { size: 14, color: "white" })
641
+ )
511
642
  );
512
643
  }
513
- var styles3 = import_react_native4.StyleSheet.create({
514
- background: { backgroundColor: "rgba(20,20,20,0.95)" },
644
+ var styles3 = import_react_native5.StyleSheet.create({
515
645
  handle: { backgroundColor: "rgba(255,255,255,0.3)" },
516
- content: { flex: 1 },
517
- header: { paddingHorizontal: 24, paddingTop: 8, paddingBottom: 12 },
518
- title: { color: "white", fontSize: 20, fontWeight: "700" },
519
- subtitle: { color: "rgba(255,255,255,0.5)", fontSize: 12, marginTop: 4 },
520
- description: { color: "rgba(255,255,255,0.7)", fontSize: 13, marginTop: 8, lineHeight: 18 },
521
- list: { paddingHorizontal: 16, paddingBottom: 8 },
646
+ header: {
647
+ flexDirection: "row",
648
+ alignItems: "flex-start",
649
+ paddingHorizontal: 24,
650
+ paddingTop: 8,
651
+ paddingBottom: 16,
652
+ gap: 8
653
+ },
654
+ headerActions: { flexDirection: "row", alignItems: "center", gap: 6 },
655
+ title: { color: "white", fontSize: 18, fontWeight: "700" },
656
+ subtitle: { color: "rgba(255,255,255,0.5)", fontSize: 12, marginTop: 2 },
657
+ description: { color: "rgba(255,255,255,0.6)", fontSize: 12, marginTop: 6, lineHeight: 18 },
658
+ iconBtn: {
659
+ width: 28,
660
+ height: 28,
661
+ borderRadius: 14,
662
+ backgroundColor: "rgba(255,255,255,0.1)",
663
+ alignItems: "center",
664
+ justifyContent: "center",
665
+ position: "relative"
666
+ },
667
+ list: { paddingHorizontal: 16, paddingBottom: 96, gap: 4 },
522
668
  tagItem: {
669
+ flexDirection: "row",
670
+ alignItems: "center",
523
671
  paddingHorizontal: 12,
524
- paddingVertical: 10,
672
+ paddingVertical: 12,
525
673
  borderRadius: 12,
526
- marginBottom: 4
674
+ gap: 8
527
675
  },
528
676
  tagItemActive: { backgroundColor: "rgba(255,255,255,0.1)" },
529
- tagText: { color: "rgba(255,255,255,0.6)", fontSize: 14 },
677
+ tagText: { color: "rgba(255,255,255,0.6)", fontSize: 13 },
530
678
  tagTextActive: { color: "white", fontWeight: "600" },
531
- tagSubtitle: { color: "rgba(255,255,255,0.4)", fontSize: 10, marginTop: 2 },
532
- footer: { paddingHorizontal: 16, paddingBottom: 16, paddingTop: 8 },
679
+ tagDescription: { color: "rgba(255,255,255,0.4)", fontSize: 11, marginTop: 2, lineHeight: 14 },
680
+ tagSubtitle: { color: "rgba(255,255,255,0.4)", fontSize: 10 },
681
+ plusBtn: {
682
+ width: 24,
683
+ height: 24,
684
+ borderRadius: 12,
685
+ backgroundColor: "rgba(255,255,255,0.2)",
686
+ alignItems: "center",
687
+ justifyContent: "center"
688
+ },
689
+ footer: {
690
+ paddingHorizontal: 16,
691
+ paddingBottom: 24,
692
+ paddingTop: 8,
693
+ backgroundColor: "transparent"
694
+ },
533
695
  doneButton: {
534
696
  backgroundColor: "white",
535
697
  borderRadius: 14,
@@ -540,9 +702,10 @@ var styles3 = import_react_native4.StyleSheet.create({
540
702
  });
541
703
 
542
704
  // src/AddNoteSheet.tsx
543
- var import_react6 = __toESM(require("react"));
544
- var import_react_native5 = require("react-native");
705
+ var import_react7 = __toESM(require("react"));
706
+ var import_react_native6 = require("react-native");
545
707
  var import_bottom_sheet4 = require("@gorhom/bottom-sheet");
708
+ var import_lucide_react_native3 = require("lucide-react-native");
546
709
  function AddNoteSheet({
547
710
  snapPoints = ["50%"],
548
711
  maxLength = 280,
@@ -550,11 +713,11 @@ function AddNoteSheet({
550
713
  renderForm
551
714
  }) {
552
715
  const { isAddNoteOpen, addNoteTagId, activeLine, closeAddNote, submitNote } = useRetorBridge();
553
- const sheetRef = (0, import_react6.useRef)(null);
554
- const snapPointsArr = (0, import_react6.useMemo)(() => snapPoints, [snapPoints]);
555
- const [text, setText] = (0, import_react6.useState)("");
556
- const [isPrivate, setPrivate] = (0, import_react6.useState)(true);
557
- (0, import_react6.useEffect)(() => {
716
+ const sheetRef = (0, import_react7.useRef)(null);
717
+ const snapPointsArr = (0, import_react7.useMemo)(() => snapPoints, [snapPoints]);
718
+ const [text, setText] = (0, import_react7.useState)("");
719
+ const [isPrivate, setPrivate] = (0, import_react7.useState)(true);
720
+ (0, import_react7.useEffect)(() => {
558
721
  if (isAddNoteOpen) {
559
722
  sheetRef.current?.present();
560
723
  setText("");
@@ -563,7 +726,7 @@ function AddNoteSheet({
563
726
  sheetRef.current?.dismiss();
564
727
  }
565
728
  }, [isAddNoteOpen]);
566
- const tag = (0, import_react6.useMemo)(
729
+ const tag = (0, import_react7.useMemo)(
567
730
  () => activeLine?.tags.find((t) => t._id === addNoteTagId) ?? null,
568
731
  [activeLine, addNoteTagId]
569
732
  );
@@ -583,14 +746,14 @@ function AddNoteSheet({
583
746
  close: closeAddNote,
584
747
  maxLength
585
748
  };
586
- return /* @__PURE__ */ import_react6.default.createElement(
749
+ return /* @__PURE__ */ import_react7.default.createElement(
587
750
  import_bottom_sheet4.BottomSheetModal,
588
751
  {
589
752
  ref: sheetRef,
590
753
  snapPoints: snapPointsArr,
591
754
  enablePanDownToClose: true,
592
755
  onDismiss: closeAddNote,
593
- backdropComponent: (props) => /* @__PURE__ */ import_react6.default.createElement(
756
+ backdropComponent: (props) => /* @__PURE__ */ import_react7.default.createElement(
594
757
  import_bottom_sheet4.BottomSheetBackdrop,
595
758
  {
596
759
  ...props,
@@ -600,9 +763,9 @@ function AddNoteSheet({
600
763
  }
601
764
  ),
602
765
  handleIndicatorStyle: styles4.handle,
603
- backgroundStyle: styles4.background
766
+ backgroundComponent: BlurBackground
604
767
  },
605
- /* @__PURE__ */ import_react6.default.createElement(import_bottom_sheet4.BottomSheetView, { style: styles4.content }, renderForm ? renderForm(formApi) : /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: styles4.form }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: styles4.headerRow }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: { flex: 1 } }, activeLine && /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles4.title, numberOfLines: 1 }, activeLine.name), tag && /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles4.subtitle, numberOfLines: 1 }, tag.name)), /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Pressable, { onPress: closeAddNote, style: styles4.closeBtn }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles4.closeBtnText }, "\u2715"))), /* @__PURE__ */ import_react6.default.createElement(
768
+ /* @__PURE__ */ import_react7.default.createElement(import_bottom_sheet4.BottomSheetView, { style: styles4.content }, renderForm ? renderForm(formApi) : /* @__PURE__ */ import_react7.default.createElement(import_react_native6.View, { style: styles4.form }, /* @__PURE__ */ import_react7.default.createElement(import_react_native6.View, { style: styles4.headerRow }, /* @__PURE__ */ import_react7.default.createElement(import_react_native6.View, { style: { flex: 1 } }, activeLine && /* @__PURE__ */ import_react7.default.createElement(import_react_native6.Text, { style: styles4.title, numberOfLines: 1 }, activeLine.name), tag && /* @__PURE__ */ import_react7.default.createElement(import_react_native6.Text, { style: styles4.subtitle, numberOfLines: 1 }, tag.name)), /* @__PURE__ */ import_react7.default.createElement(import_react_native6.Pressable, { onPress: closeAddNote, style: styles4.closeBtn }, /* @__PURE__ */ import_react7.default.createElement(import_lucide_react_native3.X, { size: 14, color: "rgba(255,255,255,0.6)" }))), /* @__PURE__ */ import_react7.default.createElement(
606
769
  import_bottom_sheet4.BottomSheetTextInput,
607
770
  {
608
771
  value: text,
@@ -615,26 +778,25 @@ function AddNoteSheet({
615
778
  style: styles4.input,
616
779
  autoFocus: true
617
780
  }
618
- ), /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: styles4.footer }, /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: [styles4.counter, text.length > maxLength * 0.9 && { color: "#fbbf24" }] }, text.length, "/", maxLength), /* @__PURE__ */ import_react6.default.createElement(import_react_native5.View, { style: { flex: 1 } }), /* @__PURE__ */ import_react6.default.createElement(
619
- import_react_native5.Pressable,
781
+ ), /* @__PURE__ */ import_react7.default.createElement(import_react_native6.View, { style: styles4.footer }, /* @__PURE__ */ import_react7.default.createElement(import_react_native6.Text, { style: [styles4.counter, text.length > maxLength * 0.9 && { color: "#fbbf24" }] }, text.length, "/", maxLength), /* @__PURE__ */ import_react7.default.createElement(import_react_native6.View, { style: { flex: 1 } }), /* @__PURE__ */ import_react7.default.createElement(
782
+ import_react_native6.Pressable,
620
783
  {
621
784
  onPress: () => setPrivate(!isPrivate),
622
785
  style: [styles4.pill, !isPrivate && styles4.pillActive]
623
786
  },
624
- /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: [styles4.pillText, !isPrivate && styles4.pillTextActive] }, isPrivate ? "Private" : "Public")
625
- ), /* @__PURE__ */ import_react6.default.createElement(
626
- import_react_native5.Pressable,
787
+ /* @__PURE__ */ import_react7.default.createElement(import_react_native6.Text, { style: [styles4.pillText, !isPrivate && styles4.pillTextActive] }, isPrivate ? "Private" : "Public")
788
+ ), /* @__PURE__ */ import_react7.default.createElement(
789
+ import_react_native6.Pressable,
627
790
  {
628
791
  onPress: handleSubmit,
629
792
  disabled: !text.trim(),
630
793
  style: [styles4.submit, !text.trim() && styles4.submitDisabled]
631
794
  },
632
- /* @__PURE__ */ import_react6.default.createElement(import_react_native5.Text, { style: styles4.submitArrow }, "\u2191")
795
+ /* @__PURE__ */ import_react7.default.createElement(import_lucide_react_native3.ArrowUp, { size: 16, color: "black", strokeWidth: 2.5 })
633
796
  ))))
634
797
  );
635
798
  }
636
- var styles4 = import_react_native5.StyleSheet.create({
637
- background: { backgroundColor: "rgba(20,20,20,0.98)" },
799
+ var styles4 = import_react_native6.StyleSheet.create({
638
800
  handle: { backgroundColor: "rgba(255,255,255,0.3)" },
639
801
  content: { flex: 1, padding: 24 },
640
802
  form: { flex: 1 },
@@ -649,7 +811,6 @@ var styles4 = import_react_native5.StyleSheet.create({
649
811
  alignItems: "center",
650
812
  justifyContent: "center"
651
813
  },
652
- closeBtnText: { color: "rgba(255,255,255,0.6)", fontSize: 14 },
653
814
  input: {
654
815
  flex: 1,
655
816
  color: "white",
@@ -683,16 +844,15 @@ var styles4 = import_react_native5.StyleSheet.create({
683
844
  alignItems: "center",
684
845
  justifyContent: "center"
685
846
  },
686
- submitDisabled: { opacity: 0.3 },
687
- submitArrow: { color: "black", fontSize: 16, fontWeight: "700" }
847
+ submitDisabled: { opacity: 0.3 }
688
848
  });
689
849
 
690
850
  // src/CoverPhoto.tsx
691
- var import_react7 = __toESM(require("react"));
851
+ var import_react8 = __toESM(require("react"));
692
852
  var import_react_native_webview2 = require("react-native-webview");
693
853
  function CoverPhoto({ projectId, baseUrl = "https://retor.app", style }) {
694
854
  const uri = `${baseUrl}/p/${projectId}?cover=true`;
695
- return /* @__PURE__ */ import_react7.default.createElement(
855
+ return /* @__PURE__ */ import_react8.default.createElement(
696
856
  import_react_native_webview2.WebView,
697
857
  {
698
858
  source: { uri },
@@ -707,6 +867,7 @@ function CoverPhoto({ projectId, baseUrl = "https://retor.app", style }) {
707
867
  // Annotate the CommonJS export names for ESM import in node:
708
868
  0 && (module.exports = {
709
869
  AddNoteSheet,
870
+ BlurBackground,
710
871
  CoverPhoto,
711
872
  Hud,
712
873
  LineDetailSheet,