@embeddr/react-ui 0.1.0 → 0.1.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.
Files changed (151) hide show
  1. package/dist/context/ImageDialogContext.js.map +1 -1
  2. package/dist/index.js +123 -124
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/utils.js.map +1 -1
  5. package/dist/providers/ExternalNav.js.map +1 -1
  6. package/dist/providers/ImageDialogProvider.js +7 -7
  7. package/dist/providers/ImageDialogProvider.js.map +1 -1
  8. package/dist/{context → src/context}/ImageDialogContext.d.ts +4 -4
  9. package/dist/src/context/ImageDialogContext.d.ts.map +1 -0
  10. package/dist/src/hooks/useExternalNav.d.ts.map +1 -0
  11. package/dist/src/hooks/useImageDialog.d.ts.map +1 -0
  12. package/dist/src/index.d.ts.map +1 -0
  13. package/dist/src/lib/utils.d.ts +3 -0
  14. package/dist/src/lib/utils.d.ts.map +1 -0
  15. package/dist/src/providers/ExternalNav.d.ts.map +1 -0
  16. package/dist/src/providers/ImageDialog.d.ts.map +1 -0
  17. package/dist/{providers → src/providers}/ImageDialogProvider.d.ts +1 -1
  18. package/dist/src/providers/ImageDialogProvider.d.ts.map +1 -0
  19. package/dist/{types → src/types}/gallery.d.ts +3 -3
  20. package/dist/src/types/gallery.d.ts.map +1 -0
  21. package/dist/src/ui/accordion.d.ts.map +1 -0
  22. package/dist/src/ui/aspect-ratio.d.ts.map +1 -0
  23. package/dist/src/ui/avatar.d.ts.map +1 -0
  24. package/dist/{ui → src/ui}/badge.d.ts +1 -1
  25. package/dist/src/ui/badge.d.ts.map +1 -0
  26. package/dist/src/ui/breadcrumb.d.ts.map +1 -0
  27. package/dist/{ui → src/ui}/button.d.ts +1 -1
  28. package/dist/src/ui/button.d.ts.map +1 -0
  29. package/dist/src/ui/card.d.ts.map +1 -0
  30. package/dist/src/ui/checkbox.d.ts.map +1 -0
  31. package/dist/src/ui/dialog.d.ts.map +1 -0
  32. package/dist/src/ui/dropdown-menu.d.ts.map +1 -0
  33. package/dist/src/ui/explorers/Umap3DExplorer.d.ts.map +1 -0
  34. package/dist/{ui → src/ui}/explorers/types.d.ts +1 -1
  35. package/dist/src/ui/explorers/types.d.ts.map +1 -0
  36. package/dist/{ui → src/ui}/input-group.d.ts +1 -1
  37. package/dist/src/ui/input-group.d.ts.map +1 -0
  38. package/dist/src/ui/input.d.ts.map +1 -0
  39. package/dist/src/ui/label.d.ts.map +1 -0
  40. package/dist/src/ui/lightbox/GalleryPicker.d.ts.map +1 -0
  41. package/dist/src/ui/lightbox/ImageThumbnailStrip.d.ts.map +1 -0
  42. package/dist/{ui → src/ui}/lightbox/LightboxViewer.d.ts +1 -1
  43. package/dist/src/ui/lightbox/LightboxViewer.d.ts.map +1 -0
  44. package/dist/{ui → src/ui}/lightbox/PannableImage.d.ts +2 -2
  45. package/dist/src/ui/lightbox/PannableImage.d.ts.map +1 -0
  46. package/dist/src/ui/menubar.d.ts.map +1 -0
  47. package/dist/src/ui/progress.d.ts.map +1 -0
  48. package/dist/{ui → src/ui}/resizable.d.ts +1 -1
  49. package/dist/src/ui/resizable.d.ts.map +1 -0
  50. package/dist/src/ui/scroll-area.d.ts.map +1 -0
  51. package/dist/src/ui/select.d.ts.map +1 -0
  52. package/dist/src/ui/separator.d.ts.map +1 -0
  53. package/dist/src/ui/skeleton.d.ts.map +1 -0
  54. package/dist/src/ui/slider.d.ts.map +1 -0
  55. package/dist/{ui → src/ui}/sonner.d.ts +1 -1
  56. package/dist/src/ui/sonner.d.ts.map +1 -0
  57. package/dist/src/ui/spinner.d.ts.map +1 -0
  58. package/dist/src/ui/switch.d.ts.map +1 -0
  59. package/dist/src/ui/table.d.ts.map +1 -0
  60. package/dist/src/ui/tabs.d.ts.map +1 -0
  61. package/dist/src/ui/textarea.d.ts.map +1 -0
  62. package/dist/src/ui/tooltip.d.ts.map +1 -0
  63. package/dist/ui/badge.js.map +1 -1
  64. package/dist/ui/button.js.map +1 -1
  65. package/dist/ui/explorers/Umap3DExplorer.js.map +1 -1
  66. package/dist/ui/input-group.js.map +1 -1
  67. package/dist/ui/lightbox/GalleryPicker.js.map +1 -1
  68. package/dist/ui/lightbox/ImageThumbnailStrip.js.map +1 -1
  69. package/dist/ui/lightbox/LightboxViewer.js.map +1 -1
  70. package/dist/ui/lightbox/PannableImage.js.map +1 -1
  71. package/dist/ui/resizable.js.map +1 -1
  72. package/dist/ui/scroll-area.js.map +1 -1
  73. package/dist/ui/sonner.js.map +1 -1
  74. package/dist/vite.config.d.ts +3 -0
  75. package/dist/vite.config.d.ts.map +1 -0
  76. package/package.json +5 -4
  77. package/dist/context/ImageDialogContext.d.ts.map +0 -1
  78. package/dist/hooks/useExternalNav.d.ts.map +0 -1
  79. package/dist/hooks/useImageDialog.d.ts.map +0 -1
  80. package/dist/index.d.ts.map +0 -1
  81. package/dist/lib/utils.d.ts +0 -3
  82. package/dist/lib/utils.d.ts.map +0 -1
  83. package/dist/providers/ExternalNav.d.ts.map +0 -1
  84. package/dist/providers/ImageDialog.d.ts.map +0 -1
  85. package/dist/providers/ImageDialogProvider.d.ts.map +0 -1
  86. package/dist/types/gallery.d.ts.map +0 -1
  87. package/dist/ui/accordion.d.ts.map +0 -1
  88. package/dist/ui/aspect-ratio.d.ts.map +0 -1
  89. package/dist/ui/avatar.d.ts.map +0 -1
  90. package/dist/ui/badge.d.ts.map +0 -1
  91. package/dist/ui/breadcrumb.d.ts.map +0 -1
  92. package/dist/ui/button.d.ts.map +0 -1
  93. package/dist/ui/card.d.ts.map +0 -1
  94. package/dist/ui/checkbox.d.ts.map +0 -1
  95. package/dist/ui/dialog.d.ts.map +0 -1
  96. package/dist/ui/dropdown-menu.d.ts.map +0 -1
  97. package/dist/ui/explorers/Umap3DExplorer.d.ts.map +0 -1
  98. package/dist/ui/explorers/types.d.ts.map +0 -1
  99. package/dist/ui/input-group.d.ts.map +0 -1
  100. package/dist/ui/input.d.ts.map +0 -1
  101. package/dist/ui/label.d.ts.map +0 -1
  102. package/dist/ui/lightbox/GalleryPicker.d.ts.map +0 -1
  103. package/dist/ui/lightbox/ImageThumbnailStrip.d.ts.map +0 -1
  104. package/dist/ui/lightbox/LightboxViewer.d.ts.map +0 -1
  105. package/dist/ui/lightbox/PannableImage.d.ts.map +0 -1
  106. package/dist/ui/menubar.d.ts.map +0 -1
  107. package/dist/ui/progress.d.ts.map +0 -1
  108. package/dist/ui/resizable.d.ts.map +0 -1
  109. package/dist/ui/scroll-area.d.ts.map +0 -1
  110. package/dist/ui/select.d.ts.map +0 -1
  111. package/dist/ui/separator.d.ts.map +0 -1
  112. package/dist/ui/skeleton.d.ts.map +0 -1
  113. package/dist/ui/slider.d.ts.map +0 -1
  114. package/dist/ui/sonner.d.ts.map +0 -1
  115. package/dist/ui/spinner.d.ts.map +0 -1
  116. package/dist/ui/switch.d.ts.map +0 -1
  117. package/dist/ui/table.d.ts.map +0 -1
  118. package/dist/ui/tabs.d.ts.map +0 -1
  119. package/dist/ui/textarea.d.ts.map +0 -1
  120. package/dist/ui/tooltip.d.ts.map +0 -1
  121. /package/dist/{hooks → src/hooks}/useExternalNav.d.ts +0 -0
  122. /package/dist/{hooks → src/hooks}/useImageDialog.d.ts +0 -0
  123. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  124. /package/dist/{providers → src/providers}/ExternalNav.d.ts +0 -0
  125. /package/dist/{providers → src/providers}/ImageDialog.d.ts +0 -0
  126. /package/dist/{ui → src/ui}/accordion.d.ts +0 -0
  127. /package/dist/{ui → src/ui}/aspect-ratio.d.ts +0 -0
  128. /package/dist/{ui → src/ui}/avatar.d.ts +0 -0
  129. /package/dist/{ui → src/ui}/breadcrumb.d.ts +0 -0
  130. /package/dist/{ui → src/ui}/card.d.ts +0 -0
  131. /package/dist/{ui → src/ui}/checkbox.d.ts +0 -0
  132. /package/dist/{ui → src/ui}/dialog.d.ts +0 -0
  133. /package/dist/{ui → src/ui}/dropdown-menu.d.ts +0 -0
  134. /package/dist/{ui → src/ui}/explorers/Umap3DExplorer.d.ts +0 -0
  135. /package/dist/{ui → src/ui}/input.d.ts +0 -0
  136. /package/dist/{ui → src/ui}/label.d.ts +0 -0
  137. /package/dist/{ui → src/ui}/lightbox/GalleryPicker.d.ts +0 -0
  138. /package/dist/{ui → src/ui}/lightbox/ImageThumbnailStrip.d.ts +0 -0
  139. /package/dist/{ui → src/ui}/menubar.d.ts +0 -0
  140. /package/dist/{ui → src/ui}/progress.d.ts +0 -0
  141. /package/dist/{ui → src/ui}/scroll-area.d.ts +0 -0
  142. /package/dist/{ui → src/ui}/select.d.ts +0 -0
  143. /package/dist/{ui → src/ui}/separator.d.ts +0 -0
  144. /package/dist/{ui → src/ui}/skeleton.d.ts +0 -0
  145. /package/dist/{ui → src/ui}/slider.d.ts +0 -0
  146. /package/dist/{ui → src/ui}/spinner.d.ts +0 -0
  147. /package/dist/{ui → src/ui}/switch.d.ts +0 -0
  148. /package/dist/{ui → src/ui}/table.d.ts +0 -0
  149. /package/dist/{ui → src/ui}/tabs.d.ts +0 -0
  150. /package/dist/{ui → src/ui}/textarea.d.ts +0 -0
  151. /package/dist/{ui → src/ui}/tooltip.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GalleryPicker.d.ts","sourceRoot":"","sources":["../../../../src/ui/lightbox/GalleryPicker.tsx"],"names":[],"mappings":"AAKA,UAAU,kBAAkB;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,eAAO,MAAM,aAAa,GAAI,wCAG3B,kBAAkB,4CAyEpB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageThumbnailStrip.d.ts","sourceRoot":"","sources":["../../../../src/ui/lightbox/ImageThumbnailStrip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,UAAU,wBAAwB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,mBAAmB,GAAI,6DAMjC,wBAAwB,4CAyG1B,CAAC"}
@@ -6,7 +6,7 @@ interface LightboxViewerProps {
6
6
  onGalleryChange: (galleryId: string) => void;
7
7
  onImageChange: (index: number) => void;
8
8
  isOpen?: boolean;
9
- actions?: ImageAction[];
9
+ actions?: Array<ImageAction>;
10
10
  isLoading?: boolean;
11
11
  onClose?: () => void;
12
12
  showGalleryPicker?: boolean;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightboxViewer.d.ts","sourceRoot":"","sources":["../../../../src/ui/lightbox/LightboxViewer.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEhE,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,GAAI,gJAY5B,mBAAmB,4CAmIrB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type ReactNode } from "react";
1
+ import type { ReactNode } from "react";
2
2
  interface PannableImageAction {
3
3
  icon: ReactNode;
4
4
  label: string;
@@ -8,7 +8,7 @@ interface PannableImageProps {
8
8
  src: string;
9
9
  className?: string;
10
10
  isOpen?: boolean;
11
- actions?: PannableImageAction[];
11
+ actions?: Array<PannableImageAction>;
12
12
  controlsBottomOffset?: number;
13
13
  }
14
14
  export declare const PannableImage: ({ src, className, isOpen, actions, controlsBottomOffset, }: PannableImageProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PannableImage.d.ts","sourceRoot":"","sources":["../../../../src/ui/lightbox/PannableImage.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAErC,UAAU,mBAAmB;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,kBAAkB;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,aAAa,GAAI,4DAM3B,kBAAkB,4CAuZpB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menubar.d.ts","sourceRoot":"","sources":["../../../src/ui/menubar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../src/ui/progress.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAI9D,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,2CAiBrD;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import { Panel, Group, Separator } from "react-resizable-panels";
2
+ import { Group, Panel, Separator } from "react-resizable-panels";
3
3
  declare function ResizablePanelGroup({ className, ...props }: React.ComponentProps<typeof Group>): import("react/jsx-runtime").JSX.Element;
4
4
  declare function ResizablePanel({ ...props }: React.ComponentProps<typeof Panel>): import("react/jsx-runtime").JSX.Element;
5
5
  declare function ResizableHandle({ withHandle, className, ...props }: React.ComponentProps<typeof Separator> & {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizable.d.ts","sourceRoot":"","sources":["../../../src/ui/resizable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIjE,iBAAS,mBAAmB,CAAC,EAC3B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,2CAWpC;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,2CAEvE;AAED,iBAAS,eAAe,CAAC,EACvB,UAAU,EACV,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,GAAG;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,2CAmBA;AAED,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-area.d.ts","sourceRoot":"","sources":["../../../src/ui/scroll-area.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,mBAAmB,MAAM,6BAA6B,CAAC;AAInE,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,WAAW,EACX,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG;IACzD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACrD,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;CACrC,2CAmBA;AAED,UAAU,cACR,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,mBAAmB,CAAC;IAC5E,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;CACrC;AAED,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,WAAwB,EACxB,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,cAAc,2CAoBhB;AAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/ui/select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAK1D,iBAAS,MAAM,CAAC,EACd,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,2CAEnD;AAED,iBAAS,WAAW,CAAC,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAEpD;AAED,iBAAS,WAAW,CAAC,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAEpD;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,IAAgB,EAChB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,GAAG;IACxD,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CACzB,2CAiBA;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,QAAyB,EACzB,KAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,2CA6BtD;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAQpD;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,2CAqBnD;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,2CAQxD;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,cAAc,CAAC,2CAa7D;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,gBAAgB,CAAC,2CAa/D;AAED,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"separator.d.ts","sourceRoot":"","sources":["../../../src/ui/separator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAIhE,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,WAA0B,EAC1B,UAAiB,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,2CAatD;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../../src/ui/skeleton.tsx"],"names":[],"mappings":"AAEA,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,2CAOtC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/ui/slider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAI1D,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,YAAY,EACZ,KAAK,EACL,GAAO,EACP,GAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,2CA8CnD;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type ToasterProps } from "sonner";
1
+ import type { ToasterProps } from "sonner";
2
2
  declare const Toaster: ({ ...props }: ToasterProps) => import("react/jsx-runtime").JSX.Element;
3
3
  export { Toaster };
4
4
  //# sourceMappingURL=sonner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonner.d.ts","sourceRoot":"","sources":["../../../src/ui/sonner.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AAEzC,QAAA,MAAM,OAAO,GAAI,cAAc,YAAY,4CA8B1C,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/ui/spinner.tsx"],"names":[],"mappings":"AAUA,iBAAS,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAYpE;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/ui/switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAI1D,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,2CAkBnD;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/ui/table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,iBAAS,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,2CAapE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,2CAQ1E;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,2CAQxE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,2CAW1E;AAED,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,2CAWpE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,2CAWrE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,2CAWrE;AAED,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,2CAQjC;AAED,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,GACb,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/ui/tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AAItD,iBAAS,IAAI,CAAC,EACZ,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,2CAQjD;AAED,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,2CAWjD;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,2CAWpD;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,2CAWpD;AAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../../src/ui/textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,2CAW1E;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../src/ui/tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAI5D,iBAAS,eAAe,CAAC,EACvB,aAAiB,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,2CAQxD;AAED,iBAAS,OAAO,CAAC,EACf,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,2CAMpD;AAED,iBAAS,cAAc,CAAC,EACtB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,2CAEvD;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,UAAc,EACd,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,2CAiBvD;AAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","sources":["../../src/ui/badge.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center border px-2 py-1 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n"],"names":["badgeVariants","cva","Badge","className","variant","asChild","props","jsx","Slot","cn"],"mappings":";;;;;AAMA,MAAMA,IAAgBC;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,IAAA;AAAA,EACX;AAEJ;AAEA,SAASC,EAAM;AAAA,EACb,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,GAAGC;AACL,GAC8D;AAG5D,SACE,gBAAAC;AAAA,IAHWF,IAAUG,IAAO;AAAA,IAG3B;AAAA,MACC,aAAU;AAAA,MACV,WAAWC,EAAGT,EAAc,EAAE,SAAAI,EAAA,CAAS,GAAGD,CAAS;AAAA,MAClD,GAAGG;AAAA,IAAA;AAAA,EAAA;AAGV;"}
1
+ {"version":3,"file":"badge.js","sources":["../../src/ui/badge.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../lib/utils\";\nimport type {VariantProps} from \"class-variance-authority\";\n\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center border px-2 py-1 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n"],"names":["badgeVariants","cva","Badge","className","variant","asChild","props","jsx","Slot","cn"],"mappings":";;;;;AAOA,MAAMA,IAAgBC;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,IAAA;AAAA,EACX;AAEJ;AAEA,SAASC,EAAM;AAAA,EACb,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,GAAGC;AACL,GAC8D;AAG5D,SACE,gBAAAC;AAAA,IAHWF,IAAUG,IAAO;AAAA,IAG3B;AAAA,MACC,aAAU;AAAA,MACV,WAAWC,EAAGT,EAAc,EAAE,SAAAI,EAAA,CAAS,GAAGD,CAAS;AAAA,MAClD,GAAGG;AAAA,IAAA;AAAA,EAAA;AAGV;"}
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sources":["../../src/ui/button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { cn } from \"../lib/utils\";\n\nconst buttonVariants = cva(\n \"cursor-pointer focus-visible:border-ring ring-1 ring-foreground/20 hover:ring-foreground/40 focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-none border border-transparent bg-clip-padding text-xs font-medium focus-visible:ring-1 aria-invalid:ring-1 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n destructive:\n \"bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-none px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-none px-2.5 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-8\",\n \"icon-xs\": \"size-6 rounded-none [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-7 rounded-none\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n"],"names":["buttonVariants","cva","Button","className","variant","size","asChild","props","jsx","Slot","cn"],"mappings":";;;;;AAMA,MAAMA,IAAiBC;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SACE;AAAA,QACF,WACE;AAAA,QACF,OACE;AAAA,QACF,aACE;AAAA,QACF,MAAM;AAAA,MAAA;AAAA,MAER,MAAM;AAAA,QACJ,SACE;AAAA,QACF,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AAEA,SAASC,EAAO;AAAA,EACd,WAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,GAAGC;AACL,GAGK;AAGH,SACE,gBAAAC;AAAA,IAHWF,IAAUG,IAAO;AAAA,IAG3B;AAAA,MACC,aAAU;AAAA,MACV,gBAAcL;AAAA,MACd,aAAWC;AAAA,MACX,WAAWK,EAAGV,EAAe,EAAE,SAAAI,GAAS,MAAAC,GAAM,WAAAF,EAAA,CAAW,CAAC;AAAA,MACzD,GAAGI;AAAA,IAAA;AAAA,EAAA;AAGV;"}
1
+ {"version":3,"file":"button.js","sources":["../../src/ui/button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { cn } from \"../lib/utils\";\nimport type {VariantProps} from \"class-variance-authority\";\n\nconst buttonVariants = cva(\n \"cursor-pointer focus-visible:border-ring ring-1 ring-foreground/20 hover:ring-foreground/40 focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-none border border-transparent bg-clip-padding text-xs font-medium focus-visible:ring-1 aria-invalid:ring-1 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n destructive:\n \"bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-none px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-none px-2.5 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-8\",\n \"icon-xs\": \"size-6 rounded-none [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-7 rounded-none\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n"],"names":["buttonVariants","cva","Button","className","variant","size","asChild","props","jsx","Slot","cn"],"mappings":";;;;;AAOA,MAAMA,IAAiBC;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SACE;AAAA,QACF,WACE;AAAA,QACF,OACE;AAAA,QACF,aACE;AAAA,QACF,MAAM;AAAA,MAAA;AAAA,MAER,MAAM;AAAA,QACJ,SACE;AAAA,QACF,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AAEA,SAASC,EAAO;AAAA,EACd,WAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,GAAGC;AACL,GAGK;AAGH,SACE,gBAAAC;AAAA,IAHWF,IAAUG,IAAO;AAAA,IAG3B;AAAA,MACC,aAAU;AAAA,MACV,gBAAcL;AAAA,MACd,aAAWC;AAAA,MACX,WAAWK,EAAGV,EAAe,EAAE,SAAAI,GAAS,MAAAC,GAAM,WAAAF,EAAA,CAAW,CAAC;AAAA,MACzD,GAAGI;AAAA,IAAA;AAAA,EAAA;AAGV;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Umap3DExplorer.js","sources":["../../../src/ui/explorers/Umap3DExplorer.tsx"],"sourcesContent":["import { useMemo, useState, useRef, useEffect } from \"react\";\nimport {\n Canvas,\n useFrame,\n useThree,\n type ThreeEvent,\n} from \"@react-three/fiber\";\nimport { OrbitControls } from \"@react-three/drei\";\nimport * as THREE from \"three\";\nimport { Spinner } from \"../spinner\";\nimport { Button } from \"../button\";\nimport { ExternalLinkIcon, EyeIcon, ScatterChart, X } from \"lucide-react\";\nimport type { Point3D, Explorer3DProps } from \"./types\";\nexport type { Point3D, Explorer3DProps } from \"./types\";\n\n// Helper to extract coordinates safely\nconst getCoordinates = (point: Point3D): [number, number, number] => {\n let x = 0,\n y = 0,\n z = 0;\n // Check for nested umap coordinates first\n if (point.umap && typeof point.umap === \"object\") {\n x = (point.umap as any).x || 0;\n y = (point.umap as any).y || 0;\n z = (point.umap as any).z || 0;\n } else {\n x = point.x || 0;\n y = point.y || 0;\n z = point.z || 0;\n }\n\n if (isNaN(x)) x = 0;\n if (isNaN(y)) y = 0;\n if (isNaN(z)) z = 0;\n\n // Scale up the coordinates to make the cloud larger\n return [(x - 0.5) * 20, (y - 0.5) * 20, (z - 0.5) * 20];\n};\n\nconst PointCloud = ({\n points,\n onHover,\n onClick,\n}: {\n points: Point3D[];\n onHover: (index: number | null, point: Point3D | null) => void;\n onClick: (\n index: number,\n point: Point3D,\n event: ThreeEvent<MouseEvent>\n ) => void;\n}) => {\n const meshRef = useRef<THREE.Points>(null);\n const hoverRef = useRef<number | null>(null);\n\n // Convert points to Float32Array for BufferGeometry\n const positions = useMemo(() => {\n const pos = new Float32Array(points.length * 3);\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (!p) continue;\n const [x, y, z] = getCoordinates(p);\n pos[i * 3] = x;\n pos[i * 3 + 1] = y;\n pos[i * 3 + 2] = z;\n }\n return pos;\n }, [points]);\n\n const colors = useMemo(() => {\n const cols = new Float32Array(points.length * 3);\n const color = new THREE.Color();\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (!p) continue;\n let x = 0,\n y = 0,\n z = 0;\n if (p.umap && typeof p.umap === \"object\") {\n x = (p.umap as any).x || 0;\n y = (p.umap as any).y || 0;\n z = (p.umap as any).z || 0;\n } else {\n x = p.x || 0;\n y = p.y || 0;\n z = p.z || 0;\n }\n\n if (isNaN(x)) x = 0;\n if (isNaN(y)) y = 0;\n if (isNaN(z)) z = 0;\n\n // Map position to color\n color.setRGB(x, y, z);\n cols[i * 3] = color.r;\n cols[i * 3 + 1] = color.g;\n cols[i * 3 + 2] = color.b;\n }\n return cols;\n }, [points]);\n\n const handlePointerMove = (e: ThreeEvent<PointerEvent>) => {\n e.stopPropagation();\n const index = e.index;\n if (index !== undefined && index !== hoverRef.current) {\n hoverRef.current = index;\n if (index >= 0 && index < points.length) {\n const p = points[index];\n if (p) onHover(index, p);\n }\n }\n };\n\n const handlePointerOut = (e: ThreeEvent<PointerEvent>) => {\n hoverRef.current = null;\n onHover(null, null);\n };\n\n const handleClick = (e: ThreeEvent<MouseEvent>) => {\n e.stopPropagation();\n const index = e.index;\n if (index !== undefined && index >= 0 && index < points.length) {\n const p = points[index];\n if (p) onClick(index, p, e);\n }\n };\n\n return (\n <points\n ref={meshRef}\n onPointerMove={handlePointerMove}\n onPointerOut={handlePointerOut}\n onClick={handleClick}\n >\n <bufferGeometry>\n <bufferAttribute\n attach=\"attributes-position\"\n count={positions.length / 3}\n array={positions}\n itemSize={3}\n args={[positions, 3]}\n />\n <bufferAttribute\n attach=\"attributes-color\"\n count={colors.length / 3}\n array={colors}\n itemSize={3}\n args={[colors, 3]}\n />\n </bufferGeometry>\n <pointsMaterial\n size={0.15}\n vertexColors\n sizeAttenuation\n transparent\n opacity={0.8}\n />\n </points>\n );\n};\n\nconst HighlightPoint = ({ point }: { point: Point3D | null }) => {\n if (!point) return null;\n const pos = getCoordinates(point);\n\n return (\n <mesh position={pos}>\n <sphereGeometry args={[0.15, 16, 16]} />\n <meshStandardMaterial\n color=\"#ff00ff\"\n emissive=\"#ff00ff\"\n emissiveIntensity={2}\n transparent\n opacity={0.8}\n />\n </mesh>\n );\n};\n\nconst SelectedPoints = ({\n points,\n selectedIndices,\n}: {\n points: Point3D[];\n selectedIndices: number[];\n}) => {\n if (!points || selectedIndices.length === 0) return null;\n\n return (\n <group>\n {selectedIndices.map((idx) => {\n const point = points[idx];\n if (!point) return null;\n const pos = getCoordinates(point);\n\n return (\n <mesh key={idx} position={pos}>\n <sphereGeometry args={[0.15, 16, 16]} />\n <meshStandardMaterial\n color=\"#00ffff\"\n emissive=\"#00ffff\"\n emissiveIntensity={2}\n transparent\n opacity={0.8}\n />\n </mesh>\n );\n })}\n </group>\n );\n};\n\nconst CameraController = ({\n controlsRef,\n targetPoint,\n}: {\n controlsRef: React.RefObject<any>;\n targetPoint: THREE.Vector3 | null;\n}) => {\n const { camera } = useThree();\n const [keys, setKeys] = useState<Record<string, boolean>>({});\n const isAnimating = useRef(false);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) =>\n setKeys((k) => ({ ...k, [e.code]: true }));\n const handleKeyUp = (e: KeyboardEvent) =>\n setKeys((k) => ({ ...k, [e.code]: false }));\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"keyup\", handleKeyUp);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"keyup\", handleKeyUp);\n };\n }, []);\n\n useFrame((state, delta) => {\n if (!controlsRef.current) return;\n\n // Handle animation to target\n if (targetPoint) {\n const currentTarget = controlsRef.current.target;\n const dist = currentTarget.distanceTo(targetPoint);\n\n if (dist > 0.1) {\n isAnimating.current = true;\n // Smoothly interpolate target\n controlsRef.current.target.lerp(targetPoint, delta * 5);\n } else {\n isAnimating.current = false;\n }\n }\n\n // Manual controls override animation if keys are pressed\n const hasInput = Object.values(keys).some((k) => k);\n if (hasInput) {\n isAnimating.current = false;\n const speed = (keys[\"ShiftLeft\"] || keys[\"ShiftRight\"] ? 20 : 8) * delta;\n const forward = new THREE.Vector3();\n camera.getWorldDirection(forward);\n\n const right = new THREE.Vector3();\n right.crossVectors(forward, camera.up).normalize();\n\n const move = new THREE.Vector3();\n\n if (keys[\"KeyW\"] || keys[\"ArrowUp\"]) move.add(forward);\n if (keys[\"KeyS\"] || keys[\"ArrowDown\"]) move.sub(forward);\n if (keys[\"KeyA\"] || keys[\"ArrowLeft\"]) move.sub(right);\n if (keys[\"KeyD\"] || keys[\"ArrowRight\"]) move.add(right);\n\n // Q/E for vertical movement\n if (keys[\"KeyQ\"]) move.y += 1;\n if (keys[\"KeyE\"]) move.y -= 1;\n\n if (move.lengthSq() > 0) {\n move.normalize().multiplyScalar(speed);\n camera.position.add(move);\n controlsRef.current.target.add(move);\n }\n }\n });\n\n return null;\n};\n\nexport const Umap3DExplorer = ({\n points = [],\n isLoading = false,\n error = null,\n onPointSelect,\n getImageUrl: customGetImageUrl,\n className,\n}: Explorer3DProps) => {\n const [hoveredPoint, setHoveredPoint] = useState<Point3D | null>(null);\n const [selectedIndices, setSelectedIndices] = useState<number[]>([]);\n const [cameraTarget, setCameraTarget] = useState<THREE.Vector3 | null>(null);\n const controlsRef = useRef<any>(null);\n\n const getImageUrl = (point: Point3D, type: \"thumb\" | \"full\" = \"thumb\") => {\n if (customGetImageUrl) return customGetImageUrl(point, type);\n\n // Fallback default behavior\n if (type === \"thumb\") {\n if (point.thumb_url) return point.thumb_url;\n if (point.thumb_path?.startsWith(\"http\")) return point.thumb_path;\n return point.rel_path\n ? `/static/images/posts/thumb_${point.rel_path}`\n : \"\";\n } else {\n if (point.image_url) return point.image_url;\n return point.rel_path ? `/static/images/posts/${point.rel_path}` : \"\";\n }\n };\n\n const handlePointClick = (\n index: number,\n point: Point3D,\n event?: ThreeEvent<MouseEvent>\n ) => {\n // If Ctrl/Cmd click, center camera\n if (event && (event.ctrlKey || event.metaKey)) {\n const [x, y, z] = getCoordinates(point);\n const target = new THREE.Vector3(x, y, z);\n setCameraTarget(target);\n // Also select it\n setSelectedIndices([index]);\n if (onPointSelect) onPointSelect(point);\n return;\n }\n\n // Normal click: Select point\n setSelectedIndices([index]);\n if (onPointSelect) onPointSelect(point);\n };\n\n const selectNearest = (index: number, count: number = 50) => {\n if (!points) return;\n const origin = points[index];\n if (!origin) return;\n\n const [ox, oy, oz] = getCoordinates(origin);\n\n // Calculate all distances\n const distances = points.map((p: Point3D, i: number) => {\n const [px, py, pz] = getCoordinates(p);\n const dx = px - ox;\n const dy = py - oy;\n const dz = pz - oz;\n return { i, d: dx * dx + dy * dy + dz * dz }; // Squared dist is enough for sorting\n });\n distances.sort((a: any, b: any) => a.d - b.d);\n const nearest = distances.slice(0, count).map((d: any) => d.i);\n setSelectedIndices(nearest);\n };\n\n if (isLoading) {\n return (\n <div className=\"h-full w-full flex items-center justify-center flex-col gap-4\">\n <Spinner className=\"w-8 h-8 text-primary\" />\n <p className=\"text-muted-foreground animate-pulse\">\n Loading 3D Point Cloud...\n </p>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"h-full w-full flex items-center justify-center text-destructive\">\n Error loading 3D data: {(error as Error).message}\n </div>\n );\n }\n\n if (!points || points.length === 0) {\n return (\n <div className=\"h-full w-full flex items-center justify-center text-muted-foreground\">\n No 3D data found.\n </div>\n );\n }\n\n const selectedIndex =\n selectedIndices.length === 1 ? selectedIndices[0] : undefined;\n const selectedPoint =\n selectedIndex !== undefined ? points[selectedIndex] : undefined;\n\n return (\n <div\n className={`w-full h-full flex flex-col bg-card relative overflow-hidden ${\n className || \"\"\n }`}\n >\n <Canvas\n camera={{ position: [0, 0, 15], fov: 60 }}\n raycaster={{ params: { Points: { threshold: 0.15 } } as any }}\n >\n <fog attach=\"fog\" args={[\"#050505\", 10, 70]} />\n\n <ambientLight intensity={0.5} />\n <pointLight position={[10, 10, 10]} />\n\n <OrbitControls\n ref={controlsRef}\n enableDamping\n dampingFactor={0.1}\n rotateSpeed={0.5}\n zoomSpeed={0.8}\n minDistance={1}\n maxDistance={30}\n />\n\n <CameraController\n controlsRef={controlsRef}\n targetPoint={cameraTarget}\n />\n\n <PointCloud\n points={points}\n onHover={(_, point) => setHoveredPoint(point)}\n onClick={handlePointClick}\n />\n\n <HighlightPoint point={hoveredPoint} />\n <SelectedPoints points={points} selectedIndices={selectedIndices} />\n </Canvas>\n\n <div className=\"absolute top-4 left-4 pointer-events-none\">\n <div className=\"bg-black/50 backdrop-blur text-white px-3 py-1 text-xs border border-white/10\">\n {points.length.toLocaleString()} points\n </div>\n </div>\n\n {/* Selected info with full image (Bottom Left) */}\n {selectedPoint && selectedIndex !== undefined && (\n <div className=\"absolute bottom-4 left-4 z-10 ring-2 ring-foreground/10 overflow-hidden shadow-lg max-w-sm\">\n <div\n className=\"bg-card cursor-pointer relative ring-1 ring-foreground/10 hover:ring-2 \"\n onClick={() => {\n if (onPointSelect) onPointSelect(selectedPoint);\n }}\n >\n <img\n src={getImageUrl(selectedPoint, \"thumb\")}\n alt={`Point ${selectedIndex}`}\n className=\"w-full h-64 object-contain bg-black/20\"\n />\n <Button\n onClick={(e) => {\n e.stopPropagation();\n setSelectedIndices([]);\n }}\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute top-2 right-2 w-8 h-8 bg-black/50 hover:bg-black/70 text-white flex items-center justify-center backdrop-blur-sm\"\n >\n <X className=\"w-4 h-4\" />\n </Button>\n <Button\n onClick={(e) => {\n e.stopPropagation();\n selectNearest(selectedIndex);\n }}\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute top-2 left-2 h-8 px-2 bg-black/50 hover:bg-black/70 text-white text-xs flex items-center justify-center backdrop-blur-sm\"\n title=\"Select 50 nearest neighbors\"\n >\n <ScatterChart className=\"w-4 h-4 mr-1\" />\n </Button>\n </div>\n <div className=\"absolute bottom-2 left-2 px-4 py-3 w-fit\">\n <div className=\"mt-2 flex flex-row gap-1 absolute bottom-0 left-0 p-1 \">\n <Button\n variant=\"ghost\"\n className=\"w-8 h-8 z-50 bg-black/50 hover:bg-black/70 p-2 text-white flex items-center justify-center backdrop-blur-sm\"\n style={{\n padding: 0,\n border: \"none\",\n cursor: \"pointer\",\n }}\n onClick={() => {\n if (onPointSelect) onPointSelect(selectedPoint);\n }}\n >\n <EyeIcon className=\"w-5\" />\n </Button>\n <Button variant=\"ghost\" asChild>\n <a\n href={getImageUrl(selectedPoint, \"full\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"w-8 h-8 bg-black/50 hover:bg-black/70 text-white flex items-center justify-center backdrop-blur-sm\"\n style={{\n padding: 0,\n border: \"none\",\n cursor: \"pointer\",\n }}\n >\n <ExternalLinkIcon className=\"w-5\" />\n </a>\n </Button>\n </div>\n </div>\n </div>\n )}\n\n {/* Multi-selection Grid (Bottom Left) */}\n {selectedIndices.length > 1 && points && (\n <div className=\"absolute bottom-4 left-4 z-10 bg-card border border-border overflow-hidden shadow-lg w-96 max-h-[50vh] flex flex-col\">\n <div className=\"p-2 bg-muted border-b border-border flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {selectedIndices.length} selected\n </span>\n <Button\n onClick={() => setSelectedIndices([])}\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs py-0! my-0! text-muted-foreground hover:text-foreground\"\n >\n Clear\n </Button>\n </div>\n <div className=\"p-2 overflow-y-auto grid grid-cols-4 gap-2\">\n {selectedIndices.slice(0, 100).map((idx) => {\n const point = points[idx];\n if (!point) return null;\n return (\n <div\n key={idx}\n className=\"aspect-square relative group cursor-pointer ring-1 ring-border hover:ring-primary/20 hover:ring-2\"\n onClick={() => {\n setSelectedIndices([idx]);\n if (onPointSelect) onPointSelect(point);\n }}\n onMouseEnter={() => setHoveredPoint(point)}\n onMouseLeave={() => setHoveredPoint(null)}\n >\n <img\n src={getImageUrl(point, \"thumb\")}\n alt=\"\"\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n <div className=\"absolute bottom-4 right-4 pointer-events-none max-w-sm text-right\">\n <div className=\"text-white/50 text-[10px] bg-black/50 backdrop-blur px-2 py-1 border border-white/10\">\n Left Click: Select • Ctrl+Click: Center & Select • Right Click: Pan •\n Scroll: Zoom • WASD/QE: Move\n </div>\n </div>\n </div>\n );\n};\n"],"names":["getCoordinates","point","x","y","z","PointCloud","points","onHover","onClick","meshRef","useRef","hoverRef","positions","useMemo","pos","i","p","colors","cols","color","THREE","jsxs","e","index","jsx","HighlightPoint","SelectedPoints","selectedIndices","idx","CameraController","controlsRef","targetPoint","camera","useThree","keys","setKeys","useState","isAnimating","useEffect","handleKeyDown","k","handleKeyUp","useFrame","state","delta","speed","forward","right","move","Umap3DExplorer","isLoading","error","onPointSelect","customGetImageUrl","className","hoveredPoint","setHoveredPoint","setSelectedIndices","cameraTarget","setCameraTarget","getImageUrl","type","handlePointClick","event","target","selectNearest","count","origin","ox","oy","oz","distances","px","py","pz","dx","dy","dz","a","b","nearest","d","Spinner","selectedIndex","selectedPoint","Canvas","OrbitControls","_","Button","X","ScatterChart","EyeIcon","ExternalLinkIcon"],"mappings":"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"}
1
+ {"version":3,"file":"Umap3DExplorer.js","sources":["../../../src/ui/explorers/Umap3DExplorer.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Canvas,\n \n useFrame,\n useThree\n} from \"@react-three/fiber\";\nimport { OrbitControls } from \"@react-three/drei\";\nimport * as THREE from \"three\";\nimport { ExternalLinkIcon, EyeIcon, ScatterChart, X } from \"lucide-react\";\nimport { Spinner } from \"../spinner\";\nimport { Button } from \"../button\";\nimport type {ThreeEvent} from \"@react-three/fiber\";\nimport type { Explorer3DProps, Point3D } from \"./types\";\n\nexport type { Point3D, Explorer3DProps } from \"./types\";\n\n// Helper to extract coordinates safely\nconst getCoordinates = (point: Point3D): [number, number, number] => {\n let x = 0,\n y = 0,\n z = 0;\n // Check for nested umap coordinates first\n if (point.umap && typeof point.umap === \"object\") {\n x = (point.umap).x || 0;\n y = (point.umap).y || 0;\n z = (point.umap).z || 0;\n } else {\n x = point.x || 0;\n y = point.y || 0;\n z = point.z || 0;\n }\n\n if (isNaN(x)) x = 0;\n if (isNaN(y)) y = 0;\n if (isNaN(z)) z = 0;\n\n // Scale up the coordinates to make the cloud larger\n return [(x - 0.5) * 20, (y - 0.5) * 20, (z - 0.5) * 20];\n};\n\nconst PointCloud = ({\n points,\n onHover,\n onClick,\n}: {\n points: Array<Point3D>;\n onHover: (index: number | null, point: Point3D | null) => void;\n onClick: (\n index: number,\n point: Point3D,\n event: ThreeEvent<MouseEvent>\n ) => void;\n}) => {\n const meshRef = useRef<THREE.Points>(null);\n const hoverRef = useRef<number | null>(null);\n\n // Convert points to Float32Array for BufferGeometry\n const positions = useMemo(() => {\n const pos = new Float32Array(points.length * 3);\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (!p) continue;\n const [x, y, z] = getCoordinates(p);\n pos[i * 3] = x;\n pos[i * 3 + 1] = y;\n pos[i * 3 + 2] = z;\n }\n return pos;\n }, [points]);\n\n const colors = useMemo(() => {\n const cols = new Float32Array(points.length * 3);\n const color = new THREE.Color();\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (!p) continue;\n let x = 0,\n y = 0,\n z = 0;\n if (p.umap && typeof p.umap === \"object\") {\n x = (p.umap).x || 0;\n y = (p.umap).y || 0;\n z = (p.umap).z || 0;\n } else {\n x = p.x || 0;\n y = p.y || 0;\n z = p.z || 0;\n }\n\n if (isNaN(x)) x = 0;\n if (isNaN(y)) y = 0;\n if (isNaN(z)) z = 0;\n\n // Map position to color\n color.setRGB(x, y, z);\n cols[i * 3] = color.r;\n cols[i * 3 + 1] = color.g;\n cols[i * 3 + 2] = color.b;\n }\n return cols;\n }, [points]);\n\n const handlePointerMove = (e: ThreeEvent<PointerEvent>) => {\n e.stopPropagation();\n const index = e.index;\n if (index !== undefined && index !== hoverRef.current) {\n hoverRef.current = index;\n if (index >= 0 && index < points.length) {\n const p = points[index];\n if (p) onHover(index, p);\n }\n }\n };\n\n const handlePointerOut = (e: ThreeEvent<PointerEvent>) => {\n hoverRef.current = null;\n onHover(null, null);\n };\n\n const handleClick = (e: ThreeEvent<MouseEvent>) => {\n e.stopPropagation();\n const index = e.index;\n if (index !== undefined && index >= 0 && index < points.length) {\n const p = points[index];\n if (p) onClick(index, p, e);\n }\n };\n\n return (\n <points\n ref={meshRef}\n onPointerMove={handlePointerMove}\n onPointerOut={handlePointerOut}\n onClick={handleClick}\n >\n <bufferGeometry>\n <bufferAttribute\n attach=\"attributes-position\"\n count={positions.length / 3}\n array={positions}\n itemSize={3}\n args={[positions, 3]}\n />\n <bufferAttribute\n attach=\"attributes-color\"\n count={colors.length / 3}\n array={colors}\n itemSize={3}\n args={[colors, 3]}\n />\n </bufferGeometry>\n <pointsMaterial\n size={0.15}\n vertexColors\n sizeAttenuation\n transparent\n opacity={0.8}\n />\n </points>\n );\n};\n\nconst HighlightPoint = ({ point }: { point: Point3D | null }) => {\n if (!point) return null;\n const pos = getCoordinates(point);\n\n return (\n <mesh position={pos}>\n <sphereGeometry args={[0.15, 16, 16]} />\n <meshStandardMaterial\n color=\"#ff00ff\"\n emissive=\"#ff00ff\"\n emissiveIntensity={2}\n transparent\n opacity={0.8}\n />\n </mesh>\n );\n};\n\nconst SelectedPoints = ({\n points,\n selectedIndices,\n}: {\n points: Array<Point3D>;\n selectedIndices: Array<number>;\n}) => {\n if (!points || selectedIndices.length === 0) return null;\n\n return (\n <group>\n {selectedIndices.map((idx) => {\n const point = points[idx];\n if (!point) return null;\n const pos = getCoordinates(point);\n\n return (\n <mesh key={idx} position={pos}>\n <sphereGeometry args={[0.15, 16, 16]} />\n <meshStandardMaterial\n color=\"#00ffff\"\n emissive=\"#00ffff\"\n emissiveIntensity={2}\n transparent\n opacity={0.8}\n />\n </mesh>\n );\n })}\n </group>\n );\n};\n\nconst CameraController = ({\n controlsRef,\n targetPoint,\n}: {\n controlsRef: React.RefObject<any>;\n targetPoint: THREE.Vector3 | null;\n}) => {\n const { camera } = useThree();\n const [keys, setKeys] = useState<Record<string, boolean>>({});\n const isAnimating = useRef(false);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) =>\n setKeys((k) => ({ ...k, [e.code]: true }));\n const handleKeyUp = (e: KeyboardEvent) =>\n setKeys((k) => ({ ...k, [e.code]: false }));\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"keyup\", handleKeyUp);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"keyup\", handleKeyUp);\n };\n }, []);\n\n useFrame((state, delta) => {\n if (!controlsRef.current) return;\n\n // Handle animation to target\n if (targetPoint) {\n const currentTarget = controlsRef.current.target;\n const dist = currentTarget.distanceTo(targetPoint);\n\n if (dist > 0.1) {\n isAnimating.current = true;\n // Smoothly interpolate target\n controlsRef.current.target.lerp(targetPoint, delta * 5);\n } else {\n isAnimating.current = false;\n }\n }\n\n // Manual controls override animation if keys are pressed\n const hasInput = Object.values(keys).some((k) => k);\n if (hasInput) {\n isAnimating.current = false;\n const speed = (keys[\"ShiftLeft\"] || keys[\"ShiftRight\"] ? 20 : 8) * delta;\n const forward = new THREE.Vector3();\n camera.getWorldDirection(forward);\n\n const right = new THREE.Vector3();\n right.crossVectors(forward, camera.up).normalize();\n\n const move = new THREE.Vector3();\n\n if (keys[\"KeyW\"] || keys[\"ArrowUp\"]) move.add(forward);\n if (keys[\"KeyS\"] || keys[\"ArrowDown\"]) move.sub(forward);\n if (keys[\"KeyA\"] || keys[\"ArrowLeft\"]) move.sub(right);\n if (keys[\"KeyD\"] || keys[\"ArrowRight\"]) move.add(right);\n\n // Q/E for vertical movement\n if (keys[\"KeyQ\"]) move.y += 1;\n if (keys[\"KeyE\"]) move.y -= 1;\n\n if (move.lengthSq() > 0) {\n move.normalize().multiplyScalar(speed);\n camera.position.add(move);\n controlsRef.current.target.add(move);\n }\n }\n });\n\n return null;\n};\n\nexport const Umap3DExplorer = ({\n points = [],\n isLoading = false,\n error = null,\n onPointSelect,\n getImageUrl: customGetImageUrl,\n className,\n}: Explorer3DProps) => {\n const [hoveredPoint, setHoveredPoint] = useState<Point3D | null>(null);\n const [selectedIndices, setSelectedIndices] = useState<Array<number>>([]);\n const [cameraTarget, setCameraTarget] = useState<THREE.Vector3 | null>(null);\n const controlsRef = useRef<any>(null);\n\n const getImageUrl = (point: Point3D, type: \"thumb\" | \"full\" = \"thumb\") => {\n if (customGetImageUrl) return customGetImageUrl(point, type);\n\n // Fallback default behavior\n if (type === \"thumb\") {\n if (point.thumb_url) return point.thumb_url;\n if (point.thumb_path?.startsWith(\"http\")) return point.thumb_path;\n return point.rel_path\n ? `/static/images/posts/thumb_${point.rel_path}`\n : \"\";\n } else {\n if (point.image_url) return point.image_url;\n return point.rel_path ? `/static/images/posts/${point.rel_path}` : \"\";\n }\n };\n\n const handlePointClick = (\n index: number,\n point: Point3D,\n event?: ThreeEvent<MouseEvent>\n ) => {\n // If Ctrl/Cmd click, center camera\n if (event && (event.ctrlKey || event.metaKey)) {\n const [x, y, z] = getCoordinates(point);\n const target = new THREE.Vector3(x, y, z);\n setCameraTarget(target);\n // Also select it\n setSelectedIndices([index]);\n if (onPointSelect) onPointSelect(point);\n return;\n }\n\n // Normal click: Select point\n setSelectedIndices([index]);\n if (onPointSelect) onPointSelect(point);\n };\n\n const selectNearest = (index: number, count: number = 50) => {\n if (!points) return;\n const origin = points[index];\n if (!origin) return;\n\n const [ox, oy, oz] = getCoordinates(origin);\n\n // Calculate all distances\n const distances = points.map((p: Point3D, i: number) => {\n const [px, py, pz] = getCoordinates(p);\n const dx = px - ox;\n const dy = py - oy;\n const dz = pz - oz;\n return { i, d: dx * dx + dy * dy + dz * dz }; // Squared dist is enough for sorting\n });\n distances.sort((a: any, b: any) => a.d - b.d);\n const nearest = distances.slice(0, count).map((d: any) => d.i);\n setSelectedIndices(nearest);\n };\n\n if (isLoading) {\n return (\n <div className=\"h-full w-full flex items-center justify-center flex-col gap-4\">\n <Spinner className=\"w-8 h-8 text-primary\" />\n <p className=\"text-muted-foreground animate-pulse\">\n Loading 3D Point Cloud...\n </p>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"h-full w-full flex items-center justify-center text-destructive\">\n Error loading 3D data: {(error).message}\n </div>\n );\n }\n\n if (!points || points.length === 0) {\n return (\n <div className=\"h-full w-full flex items-center justify-center text-muted-foreground\">\n No 3D data found.\n </div>\n );\n }\n\n const selectedIndex =\n selectedIndices.length === 1 ? selectedIndices[0] : undefined;\n const selectedPoint =\n selectedIndex !== undefined ? points[selectedIndex] : undefined;\n\n return (\n <div\n className={`w-full h-full flex flex-col bg-card relative overflow-hidden ${\n className || \"\"\n }`}\n >\n <Canvas\n camera={{ position: [0, 0, 15], fov: 60 }}\n raycaster={{ params: { Points: { threshold: 0.15 } } as any }}\n >\n <fog attach=\"fog\" args={[\"#050505\", 10, 70]} />\n\n <ambientLight intensity={0.5} />\n <pointLight position={[10, 10, 10]} />\n\n <OrbitControls\n ref={controlsRef}\n enableDamping\n dampingFactor={0.1}\n rotateSpeed={0.5}\n zoomSpeed={0.8}\n minDistance={1}\n maxDistance={30}\n />\n\n <CameraController\n controlsRef={controlsRef}\n targetPoint={cameraTarget}\n />\n\n <PointCloud\n points={points}\n onHover={(_, point) => setHoveredPoint(point)}\n onClick={handlePointClick}\n />\n\n <HighlightPoint point={hoveredPoint} />\n <SelectedPoints points={points} selectedIndices={selectedIndices} />\n </Canvas>\n\n <div className=\"absolute top-4 left-4 pointer-events-none\">\n <div className=\"bg-black/50 backdrop-blur text-white px-3 py-1 text-xs border border-white/10\">\n {points.length.toLocaleString()} points\n </div>\n </div>\n\n {/* Selected info with full image (Bottom Left) */}\n {selectedPoint && selectedIndex !== undefined && (\n <div className=\"absolute bottom-4 left-4 z-10 ring-2 ring-foreground/10 overflow-hidden shadow-lg max-w-sm\">\n <div\n className=\"bg-card cursor-pointer relative ring-1 ring-foreground/10 hover:ring-2 \"\n onClick={() => {\n if (onPointSelect) onPointSelect(selectedPoint);\n }}\n >\n <img\n src={getImageUrl(selectedPoint, \"thumb\")}\n alt={`Point ${selectedIndex}`}\n className=\"w-full h-64 object-contain bg-black/20\"\n />\n <Button\n onClick={(e) => {\n e.stopPropagation();\n setSelectedIndices([]);\n }}\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute top-2 right-2 w-8 h-8 bg-black/50 hover:bg-black/70 text-white flex items-center justify-center backdrop-blur-sm\"\n >\n <X className=\"w-4 h-4\" />\n </Button>\n <Button\n onClick={(e) => {\n e.stopPropagation();\n selectNearest(selectedIndex);\n }}\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute top-2 left-2 h-8 px-2 bg-black/50 hover:bg-black/70 text-white text-xs flex items-center justify-center backdrop-blur-sm\"\n title=\"Select 50 nearest neighbors\"\n >\n <ScatterChart className=\"w-4 h-4 mr-1\" />\n </Button>\n </div>\n <div className=\"absolute bottom-2 left-2 px-4 py-3 w-fit\">\n <div className=\"mt-2 flex flex-row gap-1 absolute bottom-0 left-0 p-1 \">\n <Button\n variant=\"ghost\"\n className=\"w-8 h-8 z-50 bg-black/50 hover:bg-black/70 p-2 text-white flex items-center justify-center backdrop-blur-sm\"\n style={{\n padding: 0,\n border: \"none\",\n cursor: \"pointer\",\n }}\n onClick={() => {\n if (onPointSelect) onPointSelect(selectedPoint);\n }}\n >\n <EyeIcon className=\"w-5\" />\n </Button>\n <Button variant=\"ghost\" asChild>\n <a\n href={getImageUrl(selectedPoint, \"full\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"w-8 h-8 bg-black/50 hover:bg-black/70 text-white flex items-center justify-center backdrop-blur-sm\"\n style={{\n padding: 0,\n border: \"none\",\n cursor: \"pointer\",\n }}\n >\n <ExternalLinkIcon className=\"w-5\" />\n </a>\n </Button>\n </div>\n </div>\n </div>\n )}\n\n {/* Multi-selection Grid (Bottom Left) */}\n {selectedIndices.length > 1 && points && (\n <div className=\"absolute bottom-4 left-4 z-10 bg-card border border-border overflow-hidden shadow-lg w-96 max-h-[50vh] flex flex-col\">\n <div className=\"p-2 bg-muted border-b border-border flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {selectedIndices.length} selected\n </span>\n <Button\n onClick={() => setSelectedIndices([])}\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs py-0! my-0! text-muted-foreground hover:text-foreground\"\n >\n Clear\n </Button>\n </div>\n <div className=\"p-2 overflow-y-auto grid grid-cols-4 gap-2\">\n {selectedIndices.slice(0, 100).map((idx) => {\n const point = points[idx];\n if (!point) return null;\n return (\n <div\n key={idx}\n className=\"aspect-square relative group cursor-pointer ring-1 ring-border hover:ring-primary/20 hover:ring-2\"\n onClick={() => {\n setSelectedIndices([idx]);\n if (onPointSelect) onPointSelect(point);\n }}\n onMouseEnter={() => setHoveredPoint(point)}\n onMouseLeave={() => setHoveredPoint(null)}\n >\n <img\n src={getImageUrl(point, \"thumb\")}\n alt=\"\"\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n <div className=\"absolute bottom-4 right-4 pointer-events-none max-w-sm text-right\">\n <div className=\"text-white/50 text-[10px] bg-black/50 backdrop-blur px-2 py-1 border border-white/10\">\n Left Click: Select • Ctrl+Click: Center & Select • Right Click: Pan •\n Scroll: Zoom • WASD/QE: Move\n </div>\n </div>\n </div>\n );\n};\n"],"names":["getCoordinates","point","x","y","z","PointCloud","points","onHover","onClick","meshRef","useRef","hoverRef","positions","useMemo","pos","i","p","colors","cols","color","THREE","jsxs","e","index","jsx","HighlightPoint","SelectedPoints","selectedIndices","idx","CameraController","controlsRef","targetPoint","camera","useThree","keys","setKeys","useState","isAnimating","useEffect","handleKeyDown","k","handleKeyUp","useFrame","state","delta","speed","forward","right","move","Umap3DExplorer","isLoading","error","onPointSelect","customGetImageUrl","className","hoveredPoint","setHoveredPoint","setSelectedIndices","cameraTarget","setCameraTarget","getImageUrl","type","handlePointClick","event","target","selectNearest","count","origin","ox","oy","oz","distances","px","py","pz","dx","dy","dz","a","b","nearest","d","Spinner","selectedIndex","selectedPoint","Canvas","OrbitControls","_","Button","X","ScatterChart","EyeIcon","ExternalLinkIcon"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"input-group.js","sources":["../../src/ui/input-group.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Textarea } from \"./textarea\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none\",\n \"h-9 min-w-0 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5\",\n \"block-end\":\n \"order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return;\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva(\n \"text-sm shadow-none flex gap-2 items-center\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2\",\n sm: \"h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n);\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"text-muted-foreground flex items-center gap-2 text-sm [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n};\n"],"names":["InputGroup","className","props","jsx","cn","inputGroupAddonVariants","cva","InputGroupAddon","align","e","inputGroupButtonVariants","InputGroupButton","type","variant","size","Button","InputGroupText","InputGroupInput","Input","InputGroupTextarea","Textarea"],"mappings":";;;;;;;AAQA,SAASA,EAAW,EAAE,WAAAC,GAAW,GAAGC,KAAsC;AACxE,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAWC;AAAA,QACT;AAAA,QACA;AAAA;AAAA,QAGA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAGA;AAAA;AAAA,QAGA;AAAA,QAEAH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,MAAMG,IAA0BC;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,OAAO;AAAA,QACL,gBACE;AAAA,QACF,cACE;AAAA,QACF,eACE;AAAA,QACF,aACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB;AAAA,MACf,OAAO;AAAA,IAAA;AAAA,EACT;AAEJ;AAEA,SAASC,EAAgB;AAAA,EACvB,WAAAN;AAAA,EACA,OAAAO,IAAQ;AAAA,EACR,GAAGN;AACL,GAA+E;AAC7E,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAYK;AAAA,MACZ,WAAWJ,EAAGC,EAAwB,EAAE,OAAAG,EAAA,CAAO,GAAGP,CAAS;AAAA,MAC3D,SAAS,CAACQ,MAAM;AACd,QAAKA,EAAE,OAAuB,QAAQ,QAAQ,KAG9CA,EAAE,cAAc,eAAe,cAAc,OAAO,GAAG,MAAA;AAAA,MACzD;AAAA,MACC,GAAGP;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,MAAMQ,IAA2BJ;AAAA,EAC/B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,WACE;AAAA,QACF,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AAEA,SAASK,EAAiB;AAAA,EACxB,WAAAV;AAAA,EACA,MAAAW,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,GAAGZ;AACL,GACiD;AAC/C,SACE,gBAAAC;AAAA,IAACY;AAAA,IAAA;AAAA,MACC,MAAAH;AAAA,MACA,aAAWE;AAAA,MACX,SAAAD;AAAA,MACA,WAAWT,EAAGM,EAAyB,EAAE,MAAAI,EAAA,CAAM,GAAGb,CAAS;AAAA,MAC1D,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASc,EAAe,EAAE,WAAAf,GAAW,GAAGC,KAAuC;AAC7E,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASe,EAAgB;AAAA,EACvB,WAAAhB;AAAA,EACA,GAAGC;AACL,GAAkC;AAChC,SACE,gBAAAC;AAAA,IAACe;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWd;AAAA,QACT;AAAA,QACAH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASiB,EAAmB;AAAA,EAC1B,WAAAlB;AAAA,EACA,GAAGC;AACL,GAAqC;AACnC,SACE,gBAAAC;AAAA,IAACiB;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWhB;AAAA,QACT;AAAA,QACAH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;"}
1
+ {"version":3,"file":"input-group.js","sources":["../../src/ui/input-group.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Textarea } from \"./textarea\";\nimport type {VariantProps} from \"class-variance-authority\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none\",\n \"h-9 min-w-0 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5\",\n \"block-end\":\n \"order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return;\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva(\n \"text-sm shadow-none flex gap-2 items-center\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2\",\n sm: \"h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n);\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"text-muted-foreground flex items-center gap-2 text-sm [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n};\n"],"names":["InputGroup","className","props","jsx","cn","inputGroupAddonVariants","cva","InputGroupAddon","align","e","inputGroupButtonVariants","InputGroupButton","type","variant","size","Button","InputGroupText","InputGroupInput","Input","InputGroupTextarea","Textarea"],"mappings":";;;;;;;AASA,SAASA,EAAW,EAAE,WAAAC,GAAW,GAAGC,KAAsC;AACxE,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAWC;AAAA,QACT;AAAA,QACA;AAAA;AAAA,QAGA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAGA;AAAA;AAAA,QAGA;AAAA,QAEAH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,MAAMG,IAA0BC;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,OAAO;AAAA,QACL,gBACE;AAAA,QACF,cACE;AAAA,QACF,eACE;AAAA,QACF,aACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB;AAAA,MACf,OAAO;AAAA,IAAA;AAAA,EACT;AAEJ;AAEA,SAASC,EAAgB;AAAA,EACvB,WAAAN;AAAA,EACA,OAAAO,IAAQ;AAAA,EACR,GAAGN;AACL,GAA+E;AAC7E,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAYK;AAAA,MACZ,WAAWJ,EAAGC,EAAwB,EAAE,OAAAG,EAAA,CAAO,GAAGP,CAAS;AAAA,MAC3D,SAAS,CAACQ,MAAM;AACd,QAAKA,EAAE,OAAuB,QAAQ,QAAQ,KAG9CA,EAAE,cAAc,eAAe,cAAc,OAAO,GAAG,MAAA;AAAA,MACzD;AAAA,MACC,GAAGP;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,MAAMQ,IAA2BJ;AAAA,EAC/B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,WACE;AAAA,QACF,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AAEA,SAASK,EAAiB;AAAA,EACxB,WAAAV;AAAA,EACA,MAAAW,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,GAAGZ;AACL,GACiD;AAC/C,SACE,gBAAAC;AAAA,IAACY;AAAA,IAAA;AAAA,MACC,MAAAH;AAAA,MACA,aAAWE;AAAA,MACX,SAAAD;AAAA,MACA,WAAWT,EAAGM,EAAyB,EAAE,MAAAI,EAAA,CAAM,GAAGb,CAAS;AAAA,MAC1D,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASc,EAAe,EAAE,WAAAf,GAAW,GAAGC,KAAuC;AAC7E,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASe,EAAgB;AAAA,EACvB,WAAAhB;AAAA,EACA,GAAGC;AACL,GAAkC;AAChC,SACE,gBAAAC;AAAA,IAACe;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWd;AAAA,QACT;AAAA,QACAH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASiB,EAAmB;AAAA,EAC1B,WAAAlB;AAAA,EACA,GAAGC;AACL,GAAqC;AACnC,SACE,gBAAAC;AAAA,IAACiB;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWhB;AAAA,QACT;AAAA,QACAH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;"}
@@ -1 +1 @@
1
- {"version":3,"file":"GalleryPicker.js","sources":["../../../src/ui/lightbox/GalleryPicker.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type { Gallery } from \"../../types/gallery\";\nimport { useImageDialog } from \"../../context/ImageDialogContext\";\n\ninterface GalleryPickerProps {\n currentGalleryId?: string;\n onGalleryChange: (galleryId: string) => void;\n}\n\nexport const GalleryPicker = ({\n currentGalleryId,\n onGalleryChange,\n}: GalleryPickerProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const { galleries } = useImageDialog();\n\n const currentGallery = galleries.find((g) => g.id === currentGalleryId);\n\n return (\n <div className=\"relative w-full\">\n {/* Toggle Button */}\n <div\n onClick={() => setIsOpen(!isOpen)}\n className=\"cursor-pointer w-full flex items-center justify-between px-4 py-3 bg-background/40 border-b border-border hover:bg-secondary/20 transition-colors select-none\"\n >\n <div className=\"flex items-center gap-3\">\n {currentGallery && (\n <>\n <img\n src={currentGallery.thumbnail}\n alt={currentGallery.name}\n className=\"w-8 h-8 object-cover rounded\"\n />\n <div className=\"text-left\">\n <div className=\"font-medium text-sm\">{currentGallery.name}</div>\n {currentGallery.description && (\n <div className=\"text-xs text-muted-foreground\">\n {currentGallery.description}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n {isOpen ? (\n <ChevronUp className=\"w-4 h-4 text-muted-foreground\" />\n ) : (\n <ChevronDown className=\"w-4 h-4 text-muted-foreground\" />\n )}\n </div>\n\n {/* Gallery Grid */}\n {isOpen && (\n <div className=\"overflow-hidden bg-background/95 backdrop-blur-sm border-b border-border\">\n <div className=\"flex flex-wrap gap-2 p-4 max-h-64 overflow-y-auto\">\n {galleries.map((gallery: Gallery) => (\n <button\n key={gallery.id}\n onClick={() => {\n onGalleryChange(gallery.id);\n setIsOpen(false);\n }}\n className={`cursor-pointer relative w-20 h-20 rounded-lg overflow-hidden border-2 transition-all hover:scale-105 shrink-0 ${\n gallery.id === currentGalleryId\n ? \"border-primary ring-2 ring-primary/50\"\n : \"border-border hover:border-primary/50\"\n }`}\n >\n <img\n src={gallery.thumbnail}\n alt={gallery.name}\n className=\"w-full h-full object-cover\"\n />\n <div className=\"absolute inset-0 bg-linear-to-t from-background via-background/60 to-transparent flex items-end p-1\">\n <span className=\"text-xs font-medium truncate w-full text-center leading-tight\">\n {gallery.name}\n </span>\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["GalleryPicker","currentGalleryId","onGalleryChange","isOpen","setIsOpen","useState","galleries","useImageDialog","currentGallery","g","jsxs","jsx","Fragment","ChevronUp","ChevronDown","gallery"],"mappings":";;;;;AAUO,MAAMA,IAAgB,CAAC;AAAA,EAC5B,kBAAAC;AAAA,EACA,iBAAAC;AACF,MAA0B;AACxB,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpC,EAAE,WAAAC,EAAA,IAAcC,EAAA,GAEhBC,IAAiBF,EAAU,KAAK,CAACG,MAAMA,EAAE,OAAOR,CAAgB;AAEtE,SACE,gBAAAS,EAAC,OAAA,EAAI,WAAU,mBAEb,UAAA;AAAA,IAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAMN,EAAU,CAACD,CAAM;AAAA,QAChC,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,gBAAAQ,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAAH,KACC,gBAAAE,EAAAE,GAAA,EACE,UAAA;AAAA,YAAA,gBAAAD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAKH,EAAe;AAAA,gBACpB,KAAKA,EAAe;AAAA,gBACpB,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,YAEZ,gBAAAE,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,cAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,uBAAuB,UAAAH,EAAe,MAAK;AAAA,cACzDA,EAAe,eACd,gBAAAG,EAAC,SAAI,WAAU,iCACZ,YAAe,YAAA,CAClB;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,EAAA,CACF,EAAA,CAEJ;AAAA,UACCR,sBACEU,GAAA,EAAU,WAAU,iCAAgC,IAErD,gBAAAF,EAACG,GAAA,EAAY,WAAU,gCAAA,CAAgC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAK1DX,KACC,gBAAAQ,EAAC,OAAA,EAAI,WAAU,4EACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qDACZ,UAAAL,EAAU,IAAI,CAACS,MACd,gBAAAL;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAM;AACb,UAAAR,EAAgBa,EAAQ,EAAE,GAC1BX,EAAU,EAAK;AAAA,QACjB;AAAA,QACA,WAAW,iHACTW,EAAQ,OAAOd,IACX,0CACA,uCACN;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAU;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKI,EAAQ;AAAA,cACb,KAAKA,EAAQ;AAAA,cACb,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZ,gBAAAJ,EAAC,OAAA,EAAI,WAAU,uGACb,UAAA,gBAAAA,EAAC,UAAK,WAAU,iEACb,UAAAI,EAAQ,KAAA,CACX,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,MApBKA,EAAQ;AAAA,IAAA,CAsBhB,GACH,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"GalleryPicker.js","sources":["../../../src/ui/lightbox/GalleryPicker.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { useImageDialog } from \"../../context/ImageDialogContext\";\nimport type { Gallery } from \"../../types/gallery\";\n\ninterface GalleryPickerProps {\n currentGalleryId?: string;\n onGalleryChange: (galleryId: string) => void;\n}\n\nexport const GalleryPicker = ({\n currentGalleryId,\n onGalleryChange,\n}: GalleryPickerProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const { galleries } = useImageDialog();\n\n const currentGallery = galleries.find((g) => g.id === currentGalleryId);\n\n return (\n <div className=\"relative w-full\">\n {/* Toggle Button */}\n <div\n onClick={() => setIsOpen(!isOpen)}\n className=\"cursor-pointer w-full flex items-center justify-between px-4 py-3 bg-background/40 border-b border-border hover:bg-secondary/20 transition-colors select-none\"\n >\n <div className=\"flex items-center gap-3\">\n {currentGallery && (\n <>\n <img\n src={currentGallery.thumbnail}\n alt={currentGallery.name}\n className=\"w-8 h-8 object-cover rounded\"\n />\n <div className=\"text-left\">\n <div className=\"font-medium text-sm\">{currentGallery.name}</div>\n {currentGallery.description && (\n <div className=\"text-xs text-muted-foreground\">\n {currentGallery.description}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n {isOpen ? (\n <ChevronUp className=\"w-4 h-4 text-muted-foreground\" />\n ) : (\n <ChevronDown className=\"w-4 h-4 text-muted-foreground\" />\n )}\n </div>\n\n {/* Gallery Grid */}\n {isOpen && (\n <div className=\"overflow-hidden bg-background/95 backdrop-blur-sm border-b border-border\">\n <div className=\"flex flex-wrap gap-2 p-4 max-h-64 overflow-y-auto\">\n {galleries.map((gallery: Gallery) => (\n <button\n key={gallery.id}\n onClick={() => {\n onGalleryChange(gallery.id);\n setIsOpen(false);\n }}\n className={`cursor-pointer relative w-20 h-20 rounded-lg overflow-hidden border-2 transition-all hover:scale-105 shrink-0 ${\n gallery.id === currentGalleryId\n ? \"border-primary ring-2 ring-primary/50\"\n : \"border-border hover:border-primary/50\"\n }`}\n >\n <img\n src={gallery.thumbnail}\n alt={gallery.name}\n className=\"w-full h-full object-cover\"\n />\n <div className=\"absolute inset-0 bg-linear-to-t from-background via-background/60 to-transparent flex items-end p-1\">\n <span className=\"text-xs font-medium truncate w-full text-center leading-tight\">\n {gallery.name}\n </span>\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["GalleryPicker","currentGalleryId","onGalleryChange","isOpen","setIsOpen","useState","galleries","useImageDialog","currentGallery","g","jsxs","jsx","Fragment","ChevronUp","ChevronDown","gallery"],"mappings":";;;;;AAUO,MAAMA,IAAgB,CAAC;AAAA,EAC5B,kBAAAC;AAAA,EACA,iBAAAC;AACF,MAA0B;AACxB,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpC,EAAE,WAAAC,EAAA,IAAcC,EAAA,GAEhBC,IAAiBF,EAAU,KAAK,CAACG,MAAMA,EAAE,OAAOR,CAAgB;AAEtE,SACE,gBAAAS,EAAC,OAAA,EAAI,WAAU,mBAEb,UAAA;AAAA,IAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAMN,EAAU,CAACD,CAAM;AAAA,QAChC,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,gBAAAQ,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAAH,KACC,gBAAAE,EAAAE,GAAA,EACE,UAAA;AAAA,YAAA,gBAAAD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAKH,EAAe;AAAA,gBACpB,KAAKA,EAAe;AAAA,gBACpB,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,YAEZ,gBAAAE,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,cAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,uBAAuB,UAAAH,EAAe,MAAK;AAAA,cACzDA,EAAe,eACd,gBAAAG,EAAC,SAAI,WAAU,iCACZ,YAAe,YAAA,CAClB;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,EAAA,CACF,EAAA,CAEJ;AAAA,UACCR,sBACEU,GAAA,EAAU,WAAU,iCAAgC,IAErD,gBAAAF,EAACG,GAAA,EAAY,WAAU,gCAAA,CAAgC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAK1DX,KACC,gBAAAQ,EAAC,OAAA,EAAI,WAAU,4EACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qDACZ,UAAAL,EAAU,IAAI,CAACS,MACd,gBAAAL;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAM;AACb,UAAAR,EAAgBa,EAAQ,EAAE,GAC1BX,EAAU,EAAK;AAAA,QACjB;AAAA,QACA,WAAW,iHACTW,EAAQ,OAAOd,IACX,0CACA,uCACN;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAU;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKI,EAAQ;AAAA,cACb,KAAKA,EAAQ;AAAA,cACb,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZ,gBAAAJ,EAAC,OAAA,EAAI,WAAU,uGACb,UAAA,gBAAAA,EAAC,UAAK,WAAU,iEACb,UAAAI,EAAQ,KAAA,CACX,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,MApBKA,EAAQ;AAAA,IAAA,CAsBhB,GACH,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ImageThumbnailStrip.js","sources":["../../../src/ui/lightbox/ImageThumbnailStrip.tsx"],"sourcesContent":["import { ChevronUp, ChevronDown, Info } from \"lucide-react\";\nimport { useState, useRef, useEffect } from \"react\";\nimport type { Gallery } from \"../../types/gallery\";\n\ninterface ImageThumbnailStripProps {\n gallery: Gallery;\n currentIndex: number;\n onImageChange: (index: number) => void;\n isOpen: boolean;\n onToggle: () => void;\n}\n\nexport const ImageThumbnailStrip = ({\n gallery,\n currentIndex,\n onImageChange,\n isOpen,\n onToggle,\n}: ImageThumbnailStripProps) => {\n const [showInfo, setShowInfo] = useState(false);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n const currentImage = gallery.images[currentIndex];\n\n // Auto-scroll to current image\n useEffect(() => {\n if (isOpen && scrollContainerRef.current) {\n const thumbnail = scrollContainerRef.current.children[\n currentIndex\n ] as HTMLElement;\n if (thumbnail) {\n thumbnail.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n inline: \"center\",\n });\n }\n }\n }, [currentIndex, isOpen]);\n\n return (\n <div className=\"relative w-full flex flex-col-reverse\">\n {/* Toggle Button - stays at bottom */}\n <div\n onClick={onToggle}\n className=\"cursor-pointer w-full flex items-center justify-between px-4 py-3 hover:bg-background/40 backdrop-blur-sm border-t border-border bg-secondary/20 transition-colors select-none focus:outline-none focus:ring-0\"\n >\n <div className=\"flex items-center gap-3\">\n {currentImage && (\n <>\n <img\n src={currentImage.thumbnail || currentImage.src}\n alt={currentImage.title || `Image ${currentIndex + 1}`}\n className=\"w-10 h-10 object-cover rounded\"\n />\n <div className=\"text-left\">\n <div className=\"font-medium text-sm\">\n {currentImage.title || `Image ${currentIndex + 1}`}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {currentIndex + 1} / {gallery.images.length}\n </div>\n </div>\n </>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {currentImage?.description && (\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowInfo(!showInfo);\n }}\n className=\"p-1 hover:bg-primary/20 rounded transition-colors cursor-pointer\"\n >\n <Info className=\"w-4 h-4\" />\n </div>\n )}\n {isOpen ? (\n <ChevronDown className=\"w-4 h-4 text-muted-foreground\" />\n ) : (\n <ChevronUp className=\"w-4 h-4 text-muted-foreground\" />\n )}\n </div>\n </div>\n\n {/* Thumbnail Strip */}\n {isOpen && (\n <div className=\"w-full bg-background/80 backdrop-blur-md border-t border-border p-2 animate-in slide-in-from-bottom-10 fade-in duration-200\">\n <div\n ref={scrollContainerRef}\n className=\"flex gap-2 overflow-x-auto pb-2 scrollbar-thin scrollbar-thumb-secondary scrollbar-track-transparent px-2\"\n >\n {gallery.images.map((img, idx) => (\n <div\n key={idx}\n onClick={() => onImageChange(idx)}\n className={`relative flex-shrink-0 cursor-pointer transition-all duration-200 ${\n idx === currentIndex\n ? \"ring-2 ring-primary scale-105 z-10\"\n : \"opacity-70 hover:opacity-100 hover:scale-105\"\n }`}\n >\n <img\n src={img.thumbnail || img.src}\n alt={img.title || `Thumbnail ${idx + 1}`}\n className=\"h-20 w-auto object-cover rounded-sm\"\n loading=\"lazy\"\n />\n </div>\n ))}\n </div>\n\n {/* Info Panel */}\n {showInfo && currentImage?.description && (\n <div className=\"p-4 text-sm text-muted-foreground border-t border-border mt-2\">\n {currentImage.description}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["ImageThumbnailStrip","gallery","currentIndex","onImageChange","isOpen","onToggle","showInfo","setShowInfo","useState","scrollContainerRef","useRef","currentImage","useEffect","thumbnail","jsxs","jsx","Fragment","e","Info","ChevronDown","ChevronUp","img","idx"],"mappings":"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"}
1
+ {"version":3,"file":"ImageThumbnailStrip.js","sources":["../../../src/ui/lightbox/ImageThumbnailStrip.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp, Info } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { Gallery } from \"../../types/gallery\";\n\ninterface ImageThumbnailStripProps {\n gallery: Gallery;\n currentIndex: number;\n onImageChange: (index: number) => void;\n isOpen: boolean;\n onToggle: () => void;\n}\n\nexport const ImageThumbnailStrip = ({\n gallery,\n currentIndex,\n onImageChange,\n isOpen,\n onToggle,\n}: ImageThumbnailStripProps) => {\n const [showInfo, setShowInfo] = useState(false);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n const currentImage = gallery.images[currentIndex];\n\n // Auto-scroll to current image\n useEffect(() => {\n if (isOpen && scrollContainerRef.current) {\n const thumbnail = scrollContainerRef.current.children[\n currentIndex\n ] as HTMLElement;\n if (thumbnail) {\n thumbnail.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n inline: \"center\",\n });\n }\n }\n }, [currentIndex, isOpen]);\n\n return (\n <div className=\"relative w-full flex flex-col-reverse\">\n {/* Toggle Button - stays at bottom */}\n <div\n onClick={onToggle}\n className=\"cursor-pointer w-full flex items-center justify-between px-4 py-3 hover:bg-background/40 backdrop-blur-sm border-t border-border bg-secondary/20 transition-colors select-none focus:outline-none focus:ring-0\"\n >\n <div className=\"flex items-center gap-3\">\n {currentImage && (\n <>\n <img\n src={currentImage.thumbnail || currentImage.src}\n alt={currentImage.title || `Image ${currentIndex + 1}`}\n className=\"w-10 h-10 object-cover rounded\"\n />\n <div className=\"text-left\">\n <div className=\"font-medium text-sm\">\n {currentImage.title || `Image ${currentIndex + 1}`}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {currentIndex + 1} / {gallery.images.length}\n </div>\n </div>\n </>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {currentImage?.description && (\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowInfo(!showInfo);\n }}\n className=\"p-1 hover:bg-primary/20 rounded transition-colors cursor-pointer\"\n >\n <Info className=\"w-4 h-4\" />\n </div>\n )}\n {isOpen ? (\n <ChevronDown className=\"w-4 h-4 text-muted-foreground\" />\n ) : (\n <ChevronUp className=\"w-4 h-4 text-muted-foreground\" />\n )}\n </div>\n </div>\n\n {/* Thumbnail Strip */}\n {isOpen && (\n <div className=\"w-full bg-background/80 backdrop-blur-md border-t border-border p-2 animate-in slide-in-from-bottom-10 fade-in duration-200\">\n <div\n ref={scrollContainerRef}\n className=\"flex gap-2 overflow-x-auto pb-2 scrollbar-thin scrollbar-thumb-secondary scrollbar-track-transparent px-2\"\n >\n {gallery.images.map((img, idx) => (\n <div\n key={idx}\n onClick={() => onImageChange(idx)}\n className={`relative flex-shrink-0 cursor-pointer transition-all duration-200 ${\n idx === currentIndex\n ? \"ring-2 ring-primary scale-105 z-10\"\n : \"opacity-70 hover:opacity-100 hover:scale-105\"\n }`}\n >\n <img\n src={img.thumbnail || img.src}\n alt={img.title || `Thumbnail ${idx + 1}`}\n className=\"h-20 w-auto object-cover rounded-sm\"\n loading=\"lazy\"\n />\n </div>\n ))}\n </div>\n\n {/* Info Panel */}\n {showInfo && currentImage?.description && (\n <div className=\"p-4 text-sm text-muted-foreground border-t border-border mt-2\">\n {currentImage.description}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["ImageThumbnailStrip","gallery","currentIndex","onImageChange","isOpen","onToggle","showInfo","setShowInfo","useState","scrollContainerRef","useRef","currentImage","useEffect","thumbnail","jsxs","jsx","Fragment","e","Info","ChevronDown","ChevronUp","img","idx"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LightboxViewer.js","sources":["../../../src/ui/lightbox/LightboxViewer.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport { Play, Pause, Loader2, X } from \"lucide-react\";\nimport { Button } from \"../button\";\nimport { PannableImage } from \"./PannableImage\";\nimport { ImageThumbnailStrip } from \"./ImageThumbnailStrip\";\nimport { GalleryPicker } from \"./GalleryPicker\";\nimport type { Gallery, ImageAction } from \"../../types/gallery\";\n\ninterface LightboxViewerProps {\n imageSrc?: string | null;\n gallery: Gallery | null;\n imageIndex: number;\n onGalleryChange: (galleryId: string) => void;\n onImageChange: (index: number) => void;\n isOpen?: boolean;\n actions?: ImageAction[];\n isLoading?: boolean;\n onClose?: () => void;\n showGalleryPicker?: boolean;\n showThumbnailStrip?: boolean;\n}\n\nexport const LightboxViewer = ({\n imageSrc,\n gallery,\n imageIndex,\n onGalleryChange,\n onImageChange,\n isOpen,\n actions = [],\n isLoading,\n onClose,\n showGalleryPicker = false,\n showThumbnailStrip = false,\n}: LightboxViewerProps) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [isStripOpen, setIsStripOpen] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (isPlaying) {\n timerRef.current = setInterval(() => {\n onImageChange(imageIndex + 1);\n }, 2500);\n }\n return () => {\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, [isPlaying, imageIndex, onImageChange]);\n\n // Stop playing if dialog closes\n useEffect(() => {\n if (!isOpen) setIsPlaying(false);\n }, [isOpen]);\n\n const handleImageChange = async (index: number) => {\n if (!gallery) return;\n await onImageChange(index);\n };\n\n // Prepare actions for PannableImage\n const currentImage = gallery?.images[imageIndex];\n const pannableActions = currentImage\n ? actions\n .filter((action) => !action.isVisible || action.isVisible(currentImage))\n .map((action) => ({\n icon: action.icon,\n label: action.label,\n onClick: () => action.onClick(currentImage),\n }))\n : [];\n\n // Calculate bottom offset for controls based on strip state\n const controlsBottomOffset = showThumbnailStrip\n ? isStripOpen\n ? 180 // Strip open height + padding\n : 80 // Strip closed height + padding\n : 16; // Default padding\n\n return (\n <div className=\"flex flex-col w-full h-full relative min-h-max flex-1 focus:outline-none\">\n {/* Top Gallery Picker */}\n {showGalleryPicker && (\n <div className=\"absolute top-0 left-0 right-0 z-20 pointer-events-none\">\n <div className=\"pointer-events-auto\">\n <GalleryPicker\n currentGalleryId={gallery?.id}\n onGalleryChange={onGalleryChange}\n />\n </div>\n </div>\n )}\n\n <div className=\"absolute top-2 right-10 z-30 pointer-events-auto flex gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled\n className=\"px-4 flex items-center justify-center text-sm font-medium text-muted-foreground backdrop-blur-sm\"\n >\n {imageIndex + 1} /{\" \"}\n {gallery?.totalImages || gallery?.images.length || 0}\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={() => setIsPlaying(!isPlaying)}\n className=\" rounded-none bg-background/90 hover:bg-secondary/20 text-muted-foreground hover:text-foreground border-b border-l border-border backdrop-blur-sm\"\n title={isPlaying ? \"Pause slideshow\" : \"Start slideshow\"}\n >\n {isPlaying ? (\n <Pause className=\"h-4 w-4\" />\n ) : (\n <Play className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n\n {/* Main Image - Pannable Canvas */}\n <div className=\"flex-1 flex items-center justify-center relative w-full h-full min-h-full\">\n {isLoading && (\n <div className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/20 backdrop-blur-[1px]\">\n <Loader2 className=\"w-10 h-10 text-white animate-spin\" />\n </div>\n )}\n {imageSrc && (\n <PannableImage\n src={imageSrc}\n className=\"w-full h-full\"\n isOpen={isOpen}\n actions={pannableActions}\n controlsBottomOffset={controlsBottomOffset}\n />\n )}\n </div>\n\n {/* Close Button - positioned over content */}\n {onClose && (\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={onClose}\n className=\"cursor-pointer hover:bg-secondary/20 fixed top-2 right-1.5 z-50 flex items-center justify-center group\"\n aria-label=\"Close dialog\"\n >\n <X className=\" text-muted-foreground group-hover:text-foreground transition-colors\" />\n </Button>\n )}\n\n {/* Bottom Image Strip */}\n {showThumbnailStrip && (\n <div className=\"absolute bottom-0 left-0 right-0 z-20 select-none focus-visible:outline-none focus:ring-0 focus:ring-transparent\">\n {gallery && (\n <ImageThumbnailStrip\n gallery={gallery}\n currentIndex={imageIndex}\n onImageChange={handleImageChange}\n isOpen={isStripOpen}\n onToggle={() => setIsStripOpen(!isStripOpen)}\n />\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["LightboxViewer","imageSrc","gallery","imageIndex","onGalleryChange","onImageChange","isOpen","actions","isLoading","onClose","showGalleryPicker","showThumbnailStrip","isPlaying","setIsPlaying","useState","isStripOpen","setIsStripOpen","timerRef","useRef","useEffect","handleImageChange","index","currentImage","pannableActions","action","controlsBottomOffset","jsxs","jsx","GalleryPicker","Button","Pause","Play","Loader2","PannableImage","X","ImageThumbnailStrip"],"mappings":"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"}
1
+ {"version":3,"file":"LightboxViewer.js","sources":["../../../src/ui/lightbox/LightboxViewer.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { Loader2, Pause, Play, X } from \"lucide-react\";\nimport { Button } from \"../button\";\nimport { PannableImage } from \"./PannableImage\";\nimport { ImageThumbnailStrip } from \"./ImageThumbnailStrip\";\nimport { GalleryPicker } from \"./GalleryPicker\";\nimport type { Gallery, ImageAction } from \"../../types/gallery\";\n\ninterface LightboxViewerProps {\n imageSrc?: string | null;\n gallery: Gallery | null;\n imageIndex: number;\n onGalleryChange: (galleryId: string) => void;\n onImageChange: (index: number) => void;\n isOpen?: boolean;\n actions?: Array<ImageAction>;\n isLoading?: boolean;\n onClose?: () => void;\n showGalleryPicker?: boolean;\n showThumbnailStrip?: boolean;\n}\n\nexport const LightboxViewer = ({\n imageSrc,\n gallery,\n imageIndex,\n onGalleryChange,\n onImageChange,\n isOpen,\n actions = [],\n isLoading,\n onClose,\n showGalleryPicker = false,\n showThumbnailStrip = false,\n}: LightboxViewerProps) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [isStripOpen, setIsStripOpen] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (isPlaying) {\n timerRef.current = setInterval(() => {\n onImageChange(imageIndex + 1);\n }, 2500);\n }\n return () => {\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, [isPlaying, imageIndex, onImageChange]);\n\n // Stop playing if dialog closes\n useEffect(() => {\n if (!isOpen) setIsPlaying(false);\n }, [isOpen]);\n\n const handleImageChange = async (index: number) => {\n if (!gallery) return;\n await onImageChange(index);\n };\n\n // Prepare actions for PannableImage\n const currentImage = gallery?.images[imageIndex];\n const pannableActions = currentImage\n ? actions\n .filter((action) => !action.isVisible || action.isVisible(currentImage))\n .map((action) => ({\n icon: action.icon,\n label: action.label,\n onClick: () => action.onClick(currentImage),\n }))\n : [];\n\n // Calculate bottom offset for controls based on strip state\n const controlsBottomOffset = showThumbnailStrip\n ? isStripOpen\n ? 180 // Strip open height + padding\n : 80 // Strip closed height + padding\n : 16; // Default padding\n\n return (\n <div className=\"flex flex-col w-full h-full relative min-h-max flex-1 focus:outline-none\">\n {/* Top Gallery Picker */}\n {showGalleryPicker && (\n <div className=\"absolute top-0 left-0 right-0 z-20 pointer-events-none\">\n <div className=\"pointer-events-auto\">\n <GalleryPicker\n currentGalleryId={gallery?.id}\n onGalleryChange={onGalleryChange}\n />\n </div>\n </div>\n )}\n\n <div className=\"absolute top-2 right-10 z-30 pointer-events-auto flex gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled\n className=\"px-4 flex items-center justify-center text-sm font-medium text-muted-foreground backdrop-blur-sm\"\n >\n {imageIndex + 1} /{\" \"}\n {gallery?.totalImages || gallery?.images.length || 0}\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={() => setIsPlaying(!isPlaying)}\n className=\" rounded-none bg-background/90 hover:bg-secondary/20 text-muted-foreground hover:text-foreground border-b border-l border-border backdrop-blur-sm\"\n title={isPlaying ? \"Pause slideshow\" : \"Start slideshow\"}\n >\n {isPlaying ? (\n <Pause className=\"h-4 w-4\" />\n ) : (\n <Play className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n\n {/* Main Image - Pannable Canvas */}\n <div className=\"flex-1 flex items-center justify-center relative w-full h-full min-h-full\">\n {isLoading && (\n <div className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/20 backdrop-blur-[1px]\">\n <Loader2 className=\"w-10 h-10 text-white animate-spin\" />\n </div>\n )}\n {imageSrc && (\n <PannableImage\n src={imageSrc}\n className=\"w-full h-full\"\n isOpen={isOpen}\n actions={pannableActions}\n controlsBottomOffset={controlsBottomOffset}\n />\n )}\n </div>\n\n {/* Close Button - positioned over content */}\n {onClose && (\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={onClose}\n className=\"cursor-pointer hover:bg-secondary/20 fixed top-2 right-1.5 z-50 flex items-center justify-center group\"\n aria-label=\"Close dialog\"\n >\n <X className=\" text-muted-foreground group-hover:text-foreground transition-colors\" />\n </Button>\n )}\n\n {/* Bottom Image Strip */}\n {showThumbnailStrip && (\n <div className=\"absolute bottom-0 left-0 right-0 z-20 select-none focus-visible:outline-none focus:ring-0 focus:ring-transparent\">\n {gallery && (\n <ImageThumbnailStrip\n gallery={gallery}\n currentIndex={imageIndex}\n onImageChange={handleImageChange}\n isOpen={isStripOpen}\n onToggle={() => setIsStripOpen(!isStripOpen)}\n />\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["LightboxViewer","imageSrc","gallery","imageIndex","onGalleryChange","onImageChange","isOpen","actions","isLoading","onClose","showGalleryPicker","showThumbnailStrip","isPlaying","setIsPlaying","useState","isStripOpen","setIsStripOpen","timerRef","useRef","useEffect","handleImageChange","index","currentImage","pannableActions","action","controlsBottomOffset","jsxs","jsx","GalleryPicker","Button","Pause","Play","Loader2","PannableImage","X","ImageThumbnailStrip"],"mappings":";;;;;;;;;;AAsBO,MAAMA,IAAiB,CAAC;AAAA,EAC7B,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC,IAAU,CAAA;AAAA,EACV,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,mBAAAC,IAAoB;AAAA,EACpB,oBAAAC,IAAqB;AACvB,MAA2B;AACzB,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1C,CAACC,GAAaC,CAAc,IAAIF,EAAS,EAAK,GAC9CG,IAAWC,EAA6C,IAAI;AAElE,EAAAC,EAAU,OACJP,MACFK,EAAS,UAAU,YAAY,MAAM;AACnC,IAAAZ,EAAcF,IAAa,CAAC;AAAA,EAC9B,GAAG,IAAI,IAEF,MAAM;AACX,IAAIc,EAAS,WAAS,cAAcA,EAAS,OAAO;AAAA,EACtD,IACC,CAACL,GAAWT,GAAYE,CAAa,CAAC,GAGzCc,EAAU,MAAM;AACd,IAAKb,KAAQO,EAAa,EAAK;AAAA,EACjC,GAAG,CAACP,CAAM,CAAC;AAEX,QAAMc,IAAoB,OAAOC,MAAkB;AACjD,IAAKnB,KACL,MAAMG,EAAcgB,CAAK;AAAA,EAC3B,GAGMC,IAAepB,GAAS,OAAOC,CAAU,GACzCoB,IAAkBD,IACpBf,EACG,OAAO,CAACiB,MAAW,CAACA,EAAO,aAAaA,EAAO,UAAUF,CAAY,CAAC,EACtE,IAAI,CAACE,OAAY;AAAA,IAChB,MAAMA,EAAO;AAAA,IACb,OAAOA,EAAO;AAAA,IACd,SAAS,MAAMA,EAAO,QAAQF,CAAY;AAAA,EAAA,EAC1C,IACJ,CAAA,GAGEG,IAAuBd,IACzBI,IACE,MACA,KACF;AAEJ,SACE,gBAAAW,EAAC,OAAA,EAAI,WAAU,4EAEZ,UAAA;AAAA,IAAAhB,uBACE,OAAA,EAAI,WAAU,0DACb,UAAA,gBAAAiB,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA,gBAAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,kBAAkB1B,GAAS;AAAA,QAC3B,iBAAAE;AAAA,MAAA;AAAA,IAAA,GAEJ,EAAA,CACF;AAAA,IAGF,gBAAAsB,EAAC,OAAA,EAAI,WAAU,+DACb,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,UAAQ;AAAA,UACR,WAAU;AAAA,UAET,UAAA;AAAA,YAAA1B,IAAa;AAAA,YAAE;AAAA,YAAG;AAAA,YAClBD,GAAS,eAAeA,GAAS,OAAO,UAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAErD,gBAAAyB;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,MAAMhB,EAAa,CAACD,CAAS;AAAA,UACtC,WAAU;AAAA,UACV,OAAOA,IAAY,oBAAoB;AAAA,UAEtC,UAAAA,sBACEkB,GAAA,EAAM,WAAU,WAAU,IAE3B,gBAAAH,EAACI,GAAA,EAAK,WAAU,UAAA,CAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IAE9B,GACF;AAAA,IAGA,gBAAAL,EAAC,OAAA,EAAI,WAAU,8EACZ,UAAA;AAAA,MAAAlB,KACC,gBAAAmB,EAAC,SAAI,WAAU,0FACb,4BAACK,GAAA,EAAQ,WAAU,qCAAoC,EAAA,CACzD;AAAA,MAED/B,KACC,gBAAA0B;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,KAAKhC;AAAA,UACL,WAAU;AAAA,UACV,QAAAK;AAAA,UACA,SAASiB;AAAA,UACT,sBAAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,GAEJ;AAAA,IAGChB,KACC,gBAAAkB;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAASpB;AAAA,QACT,WAAU;AAAA,QACV,cAAW;AAAA,QAEX,UAAA,gBAAAkB,EAACO,GAAA,EAAE,WAAU,uEAAA,CAAuE;AAAA,MAAA;AAAA,IAAA;AAAA,IAKvFvB,KACC,gBAAAgB,EAAC,OAAA,EAAI,WAAU,oHACZ,UAAAzB,KACC,gBAAAyB;AAAA,MAACQ;AAAA,MAAA;AAAA,QACC,SAAAjC;AAAA,QACA,cAAcC;AAAA,QACd,eAAeiB;AAAA,QACf,QAAQL;AAAA,QACR,UAAU,MAAMC,EAAe,CAACD,CAAW;AAAA,MAAA;AAAA,IAAA,EAC7C,CAEJ;AAAA,EAAA,GAEJ;AAEJ;"}