@lateralus-ai/shipping-ui 1.4.13 → 1.4.14

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 (64) hide show
  1. package/README.md +108 -108
  2. package/dist/index.cjs +38 -38
  3. package/dist/index.esm.js +4495 -4489
  4. package/dist/tailwind-theme.d.ts +12 -0
  5. package/package.json +99 -99
  6. package/src/components/DocumentEditor/DocumentEditor.tsx +871 -871
  7. package/src/components/HelloWorld.tsx +3 -3
  8. package/src/components/InputPrompt.tsx +96 -96
  9. package/src/components/ModalPanel.tsx +49 -49
  10. package/src/components/PdfViewer/ImageViewer.tsx +211 -211
  11. package/src/components/PdfViewer/PdfViewer.tsx +232 -232
  12. package/src/components/PdfViewer/index.ts +2 -2
  13. package/src/components/PdfViewer/usePageManagement.ts +32 -32
  14. package/src/components/PdfViewer/usePanning.ts +42 -42
  15. package/src/components/PdfViewer/useRefDimensions.ts +16 -16
  16. package/src/components/PdfViewer/useRotation.ts +13 -13
  17. package/src/components/PdfViewer/useZoom.ts +26 -26
  18. package/src/components/SearchModal.tsx +320 -320
  19. package/src/components/Sidebar/Button.tsx +20 -20
  20. package/src/components/Sidebar/Container.tsx +31 -31
  21. package/src/components/Sidebar/Item.tsx +39 -39
  22. package/src/components/Sidebar/Layout.tsx +32 -32
  23. package/src/components/Sidebar/Provider.tsx +47 -47
  24. package/src/components/Sidebar/SecondaryItem.tsx +39 -39
  25. package/src/components/Sidebar/SideContainer.tsx +31 -31
  26. package/src/components/Sidebar/ToggleCollapseButton.tsx +24 -24
  27. package/src/components/Sidebar/index.ts +8 -8
  28. package/src/components/Tabs.tsx +43 -43
  29. package/src/components/icons/CloseSidebarIcon.tsx +19 -19
  30. package/src/components/icons/CloseSidebarMidIcon.tsx +19 -19
  31. package/src/components/icons/ExpandIcon.tsx +21 -21
  32. package/src/components/icons/SendArrowIcon.tsx +23 -23
  33. package/src/components/icons/SendArrowIconGreen.tsx +17 -17
  34. package/src/components/icons/SettingsIcon.tsx +33 -33
  35. package/src/components/icons/XIcon.tsx +21 -21
  36. package/src/components/index.ts +6 -6
  37. package/src/index.ts +4 -4
  38. package/src/material-theme.ts +477 -477
  39. package/src/stories/Buttons.stories.tsx +15 -15
  40. package/src/stories/Buttons.tsx +52 -52
  41. package/src/stories/Checkbox.stories.tsx +15 -15
  42. package/src/stories/Checkbox.tsx +56 -56
  43. package/src/stories/ColorPalette.stories.tsx +15 -15
  44. package/src/stories/ColorPalette.tsx +85 -72
  45. package/src/stories/DocumentEditor.stories.tsx +287 -287
  46. package/src/stories/Dropdowns.stories.tsx +15 -15
  47. package/src/stories/Dropdowns.tsx +52 -52
  48. package/src/stories/InputPrompt.stories.tsx +15 -15
  49. package/src/stories/InputPrompt.tsx +63 -63
  50. package/src/stories/ModalHeader.stories.tsx +35 -35
  51. package/src/stories/PDFViewer.stories.tsx +39 -39
  52. package/src/stories/SearchModal.stories.tsx +132 -132
  53. package/src/stories/SearchModal.tsx +82 -82
  54. package/src/stories/Sidebar.stories.tsx +15 -15
  55. package/src/stories/Sidebar.tsx +108 -108
  56. package/src/stories/Tabs.stories.tsx +51 -51
  57. package/src/stories/Typography.stories.tsx +15 -15
  58. package/src/stories/Typography.tsx +110 -110
  59. package/src/style.css +2 -2
  60. package/src/styles/tabs.css +55 -55
  61. package/src/tailwind-theme.ts +243 -231
  62. package/src/types/documentEditor.ts +55 -55
  63. package/src/utils/checkboxModule.ts +241 -241
  64. package/src/utils/cn.ts +11 -11
@@ -1,211 +1,211 @@
1
- import { IconButton, ButtonGroup, Tooltip } from "@material-tailwind/react"
2
- import { ModalPanel } from "../ModalPanel"
3
- import ExpandIcon from "../icons/ExpandIcon"
4
- import { Icon } from "@iconify/react"
5
- import { ChangeEvent, useEffect, useState } from "react"
6
- import { useZoom } from "./useZoom"
7
- import { useRotation } from "./useRotation"
8
- import { usePanning } from "./usePanning"
9
- import { usePageManagement } from "./usePageManagement"
10
- import { cn } from "../../utils/cn"
11
-
12
- interface ImageViewerProps {
13
- className?: string
14
- canvasClassName?: string
15
- documentUrl?: string
16
- mainCanvasClassname?: string
17
- initialPage?: number
18
- onClose: () => void
19
- totalPages: number
20
- getImageSrc: (page: number) => string | Promise<string>
21
- title?: string
22
- }
23
-
24
- export const ImageViewer = ({
25
- className,
26
- canvasClassName,
27
- mainCanvasClassname,
28
- initialPage = 1,
29
- onClose,
30
- totalPages,
31
- getImageSrc,
32
- documentUrl,
33
- title = "PDF Viewer",
34
- }: ImageViewerProps) => {
35
- const [zoom, zoomActions] = useZoom()
36
- const [rotation, rotationActions] = useRotation()
37
- const [{ pan, isDragging }, panActions] = usePanning()
38
- const [{ currentPage }, pageActions] = usePageManagement(
39
- totalPages,
40
- initialPage
41
- )
42
- const [imageSrc, setImageSrc] = useState<string>(() => {
43
- const initialResult = getImageSrc(currentPage)
44
- return typeof initialResult === "string" ? initialResult : ""
45
- })
46
-
47
- useEffect(() => {
48
- let isActive = true
49
-
50
- const loadImage = async () => {
51
- const result = getImageSrc(currentPage)
52
- const resolvedSrc = await Promise.resolve(result)
53
-
54
- if (isActive) {
55
- setImageSrc(resolvedSrc)
56
- }
57
- }
58
-
59
- void loadImage()
60
-
61
- return () => {
62
- isActive = false
63
- }
64
- }, [currentPage, getImageSrc])
65
-
66
- const rightButtons = (
67
- <IconButton variant="text" color="gray">
68
- <a href={documentUrl} target="_blank" rel="noopener noreferrer">
69
- <ExpandIcon className="size-4" />
70
- </a>
71
- </IconButton>
72
- )
73
-
74
- return (
75
- <div className={cn("shadow rounded-t-lg flex flex-col h-full", className)}>
76
- <ModalPanel.Header onClose={onClose} right={rightButtons}>
77
- {title}
78
- </ModalPanel.Header>
79
-
80
- <div className="flex flex-col h-full justify-between">
81
- <div className="grid relative h-full">
82
- <div
83
- className={`overflow-hidden col-start-1 row-start-1 bg-gray-200 h-full relative`}
84
- onMouseMove={panActions.handleMouseMove}
85
- onMouseUp={panActions.handleMouseUp}
86
- onMouseLeave={panActions.handleMouseUp}
87
- onWheel={zoomActions.handleWheel}
88
- >
89
- <div
90
- className={mainCanvasClassname}
91
- style={{
92
- transform: `translate(${pan.x}px, ${pan.y}px)`,
93
- cursor: isDragging ? "grabbing" : "grab",
94
- width: "100%",
95
- height: "100%",
96
- display: "flex",
97
- alignItems: "center",
98
- justifyContent: "center",
99
- }}
100
- onMouseDown={panActions.handleMouseDown}
101
- >
102
- <div
103
- style={{
104
- transform: `scale(${zoom / 100}) rotate(${rotation}deg)`,
105
- transformOrigin: "center",
106
- transition: isDragging ? "none" : "transform 0.3s ease",
107
- }}
108
- >
109
- {imageSrc ? (
110
- <img
111
- src={imageSrc}
112
- style={{ userSelect: "none", pointerEvents: "none" }}
113
- />
114
- ) : null}
115
- </div>
116
- </div>
117
- </div>
118
-
119
- <div
120
- className={`${canvasClassName} col-start-1 row-start-1 self-end p-4 flex gap-2 justify-between w-full z-10`}
121
- >
122
- <ButtonGroup className="divide-x-0 h-[52px]">
123
- <IconButton
124
- variant="filled"
125
- color="white"
126
- className="py-[26px]"
127
- onClick={zoomActions.zoomOut}
128
- >
129
- <Icon icon="lucide:minus" />
130
- </IconButton>
131
- <Tooltip content="Click to reset zoom and pan">
132
- <button
133
- className="!bg-white text-center cursor-pointer w-[60px]"
134
- onClick={() => {
135
- zoomActions.reset()
136
- panActions.reset()
137
- }}
138
- >
139
- {zoom}%
140
- </button>
141
- </Tooltip>
142
- <IconButton
143
- variant="filled"
144
- color="white"
145
- className="py-[26px]"
146
- onClick={zoomActions.zoomIn}
147
- >
148
- <Icon icon="lucide:plus" />
149
- </IconButton>
150
- </ButtonGroup>
151
- <ButtonGroup className="divide-x-0 h-[52px]">
152
- <IconButton
153
- variant="filled"
154
- color="white"
155
- className="py-[26px]"
156
- onClick={rotationActions.rotateClockwise}
157
- >
158
- <Icon icon="lucide:iteration-cw" />
159
- </IconButton>
160
-
161
- <IconButton
162
- variant="filled"
163
- color="white"
164
- className="py-[26px]"
165
- onClick={rotationActions.rotateCounterClockwise}
166
- >
167
- <Icon icon="lucide:iteration-ccw" />
168
- </IconButton>
169
- </ButtonGroup>
170
- <ButtonGroup className="divide-x-0 ">
171
- <IconButton
172
- variant="filled"
173
- color="white"
174
- className="py-[26px]"
175
- onClick={pageActions.prevPage}
176
- disabled={currentPage === 1}
177
- >
178
- <Icon icon="lucide:chevron-left" />
179
- </IconButton>
180
- <input
181
- className="bg-white pl-4 flex items-center w-[50px] text-center focus:outline-none w-[60px]"
182
- value={currentPage}
183
- onChange={(e: ChangeEvent<HTMLInputElement>) => {
184
- const page = parseInt(e.target.value)
185
- if (!isNaN(page)) {
186
- pageActions.goToPage(page)
187
- }
188
- }}
189
- type="number"
190
- min="1"
191
- max={totalPages}
192
- />
193
- <div className="flex items-center bg-white px-2">
194
- of {totalPages}
195
- </div>
196
- <IconButton
197
- variant="filled"
198
- color="white"
199
- className="py-[26px]"
200
- onClick={pageActions.nextPage}
201
- disabled={currentPage === totalPages}
202
- >
203
- <Icon icon="lucide:chevron-right" />
204
- </IconButton>
205
- </ButtonGroup>
206
- </div>
207
- </div>
208
- </div>
209
- </div>
210
- )
211
- }
1
+ import { IconButton, ButtonGroup, Tooltip } from "@material-tailwind/react"
2
+ import { ModalPanel } from "../ModalPanel"
3
+ import ExpandIcon from "../icons/ExpandIcon"
4
+ import { Icon } from "@iconify/react"
5
+ import { ChangeEvent, useEffect, useState } from "react"
6
+ import { useZoom } from "./useZoom"
7
+ import { useRotation } from "./useRotation"
8
+ import { usePanning } from "./usePanning"
9
+ import { usePageManagement } from "./usePageManagement"
10
+ import { cn } from "../../utils/cn"
11
+
12
+ interface ImageViewerProps {
13
+ className?: string
14
+ canvasClassName?: string
15
+ documentUrl?: string
16
+ mainCanvasClassname?: string
17
+ initialPage?: number
18
+ onClose: () => void
19
+ totalPages: number
20
+ getImageSrc: (page: number) => string | Promise<string>
21
+ title?: string
22
+ }
23
+
24
+ export const ImageViewer = ({
25
+ className,
26
+ canvasClassName,
27
+ mainCanvasClassname,
28
+ initialPage = 1,
29
+ onClose,
30
+ totalPages,
31
+ getImageSrc,
32
+ documentUrl,
33
+ title = "PDF Viewer",
34
+ }: ImageViewerProps) => {
35
+ const [zoom, zoomActions] = useZoom()
36
+ const [rotation, rotationActions] = useRotation()
37
+ const [{ pan, isDragging }, panActions] = usePanning()
38
+ const [{ currentPage }, pageActions] = usePageManagement(
39
+ totalPages,
40
+ initialPage
41
+ )
42
+ const [imageSrc, setImageSrc] = useState<string>(() => {
43
+ const initialResult = getImageSrc(currentPage)
44
+ return typeof initialResult === "string" ? initialResult : ""
45
+ })
46
+
47
+ useEffect(() => {
48
+ let isActive = true
49
+
50
+ const loadImage = async () => {
51
+ const result = getImageSrc(currentPage)
52
+ const resolvedSrc = await Promise.resolve(result)
53
+
54
+ if (isActive) {
55
+ setImageSrc(resolvedSrc)
56
+ }
57
+ }
58
+
59
+ void loadImage()
60
+
61
+ return () => {
62
+ isActive = false
63
+ }
64
+ }, [currentPage, getImageSrc])
65
+
66
+ const rightButtons = (
67
+ <IconButton variant="text" color="gray">
68
+ <a href={documentUrl} target="_blank" rel="noopener noreferrer">
69
+ <ExpandIcon className="size-4" />
70
+ </a>
71
+ </IconButton>
72
+ )
73
+
74
+ return (
75
+ <div className={cn("shadow rounded-t-lg flex flex-col h-full", className)}>
76
+ <ModalPanel.Header onClose={onClose} right={rightButtons}>
77
+ {title}
78
+ </ModalPanel.Header>
79
+
80
+ <div className="flex flex-col h-full justify-between">
81
+ <div className="grid relative h-full">
82
+ <div
83
+ className={`overflow-hidden col-start-1 row-start-1 bg-gray-200 h-full relative`}
84
+ onMouseMove={panActions.handleMouseMove}
85
+ onMouseUp={panActions.handleMouseUp}
86
+ onMouseLeave={panActions.handleMouseUp}
87
+ onWheel={zoomActions.handleWheel}
88
+ >
89
+ <div
90
+ className={mainCanvasClassname}
91
+ style={{
92
+ transform: `translate(${pan.x}px, ${pan.y}px)`,
93
+ cursor: isDragging ? "grabbing" : "grab",
94
+ width: "100%",
95
+ height: "100%",
96
+ display: "flex",
97
+ alignItems: "center",
98
+ justifyContent: "center",
99
+ }}
100
+ onMouseDown={panActions.handleMouseDown}
101
+ >
102
+ <div
103
+ style={{
104
+ transform: `scale(${zoom / 100}) rotate(${rotation}deg)`,
105
+ transformOrigin: "center",
106
+ transition: isDragging ? "none" : "transform 0.3s ease",
107
+ }}
108
+ >
109
+ {imageSrc ? (
110
+ <img
111
+ src={imageSrc}
112
+ style={{ userSelect: "none", pointerEvents: "none" }}
113
+ />
114
+ ) : null}
115
+ </div>
116
+ </div>
117
+ </div>
118
+
119
+ <div
120
+ className={`${canvasClassName} col-start-1 row-start-1 self-end p-4 flex gap-2 justify-between w-full z-10`}
121
+ >
122
+ <ButtonGroup className="divide-x-0 h-[52px]">
123
+ <IconButton
124
+ variant="filled"
125
+ color="white"
126
+ className="py-[26px]"
127
+ onClick={zoomActions.zoomOut}
128
+ >
129
+ <Icon icon="lucide:minus" />
130
+ </IconButton>
131
+ <Tooltip content="Click to reset zoom and pan">
132
+ <button
133
+ className="!bg-white text-center cursor-pointer w-[60px]"
134
+ onClick={() => {
135
+ zoomActions.reset()
136
+ panActions.reset()
137
+ }}
138
+ >
139
+ {zoom}%
140
+ </button>
141
+ </Tooltip>
142
+ <IconButton
143
+ variant="filled"
144
+ color="white"
145
+ className="py-[26px]"
146
+ onClick={zoomActions.zoomIn}
147
+ >
148
+ <Icon icon="lucide:plus" />
149
+ </IconButton>
150
+ </ButtonGroup>
151
+ <ButtonGroup className="divide-x-0 h-[52px]">
152
+ <IconButton
153
+ variant="filled"
154
+ color="white"
155
+ className="py-[26px]"
156
+ onClick={rotationActions.rotateClockwise}
157
+ >
158
+ <Icon icon="lucide:iteration-cw" />
159
+ </IconButton>
160
+
161
+ <IconButton
162
+ variant="filled"
163
+ color="white"
164
+ className="py-[26px]"
165
+ onClick={rotationActions.rotateCounterClockwise}
166
+ >
167
+ <Icon icon="lucide:iteration-ccw" />
168
+ </IconButton>
169
+ </ButtonGroup>
170
+ <ButtonGroup className="divide-x-0 ">
171
+ <IconButton
172
+ variant="filled"
173
+ color="white"
174
+ className="py-[26px]"
175
+ onClick={pageActions.prevPage}
176
+ disabled={currentPage === 1}
177
+ >
178
+ <Icon icon="lucide:chevron-left" />
179
+ </IconButton>
180
+ <input
181
+ className="bg-white pl-4 flex items-center w-[50px] text-center focus:outline-none w-[60px]"
182
+ value={currentPage}
183
+ onChange={(e: ChangeEvent<HTMLInputElement>) => {
184
+ const page = parseInt(e.target.value)
185
+ if (!isNaN(page)) {
186
+ pageActions.goToPage(page)
187
+ }
188
+ }}
189
+ type="number"
190
+ min="1"
191
+ max={totalPages}
192
+ />
193
+ <div className="flex items-center bg-white px-2">
194
+ of {totalPages}
195
+ </div>
196
+ <IconButton
197
+ variant="filled"
198
+ color="white"
199
+ className="py-[26px]"
200
+ onClick={pageActions.nextPage}
201
+ disabled={currentPage === totalPages}
202
+ >
203
+ <Icon icon="lucide:chevron-right" />
204
+ </IconButton>
205
+ </ButtonGroup>
206
+ </div>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ )
211
+ }