Skip to content

Commit 96b912e

Browse files
committed
feat: brought the view templates component into a modal overlay
1 parent ff64163 commit 96b912e

3 files changed

Lines changed: 97 additions & 55 deletions

File tree

packages/imagekit-editor-dev/src/components/common/MultiSelectListField.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,10 @@ export const MultiSelectListField: React.FC<MultiSelectListFieldProps> = ({
142142
<Box
143143
id={id}
144144
role="group"
145-
borderWidth="1px"
146-
borderColor="gray.200"
145+
borderWidth="0"
147146
borderRadius="md"
148147
overflow="hidden"
149-
bg="white"
148+
bg="transparent"
150149
>
151150
{isSearchable ? (
152151
<Box px="3" py="2.5" borderBottomWidth="1px" borderBottomColor="gray.100">
@@ -158,12 +157,14 @@ export const MultiSelectListField: React.FC<MultiSelectListFieldProps> = ({
158157
placeholder={searchPlaceholder}
159158
value={query}
160159
onChange={(e) => setQuery(e.target.value)}
161-
bg="gray.50"
162-
borderColor="gray.200"
163-
_hover={{ borderColor: "gray.300" }}
160+
variant="unstyled"
161+
pl="8"
162+
bg="transparent"
163+
borderColor="transparent"
164+
_hover={{ borderColor: "transparent" }}
164165
_focus={{
165-
borderColor: "blue.500",
166-
boxShadow: "0 0 0 1px #3182ce",
166+
borderColor: "transparent",
167+
boxShadow: "none",
167168
}}
168169
/>
169170
</InputGroup>
Lines changed: 82 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { Flex } from "@chakra-ui/react"
2-
import { useState } from "react"
1+
import { Box, Flex, IconButton } from "@chakra-ui/react"
2+
import { PiX } from "@react-icons/all-files/pi/PiX"
3+
import { useEffect, useState } from "react"
34
import { useAutoSaveTemplate } from "../../hooks/useAutoSaveTemplate"
45
import { useSaveTemplate } from "../../hooks/useSaveTemplate"
56
import { Header, type HeaderProps } from "../header"
@@ -18,9 +19,22 @@ interface Props {
1819
export function EditorLayout({ onAddImage, onClose, exportOptions }: Props) {
1920
const [viewMode, setViewMode] = useState<"list" | "grid">("list")
2021
const [gridImageSize, setGridImageSize] = useState<number>(300)
21-
const [layoutMode, setLayoutMode] = useState<"editor" | "templates">(
22-
"templates",
23-
)
22+
const [isTemplatesOpen, setIsTemplatesOpen] = useState(false)
23+
24+
// Close templates modal on Escape while it's open
25+
useEffect(() => {
26+
if (!isTemplatesOpen) return
27+
const handleKeyDown = (event: KeyboardEvent) => {
28+
if (event.key === "Escape") {
29+
event.stopPropagation()
30+
setIsTemplatesOpen(false)
31+
}
32+
}
33+
window.addEventListener("keydown", handleKeyDown)
34+
return () => {
35+
window.removeEventListener("keydown", handleKeyDown)
36+
}
37+
}, [isTemplatesOpen])
2438

2539
useAutoSaveTemplate()
2640
useSaveTemplate()
@@ -30,32 +44,74 @@ export function EditorLayout({ onAddImage, onClose, exportOptions }: Props) {
3044
<Header
3145
onClose={onClose}
3246
exportOptions={exportOptions}
33-
onViewAllTemplates={() => setLayoutMode("templates")}
47+
onViewAllTemplates={() => setIsTemplatesOpen(true)}
3448
/>
35-
{layoutMode === "templates" ? (
36-
<TemplatesLibraryView onBack={() => setLayoutMode("editor")} />
37-
) : (
38-
<Flex flexDirection="row" width="full" height="full" flexGrow={0}>
39-
<Sidebar />
40-
<Flex
41-
flex="1 0 0"
42-
background="editorGray.200"
49+
<Flex flexDirection="row" width="full" height="full" flexGrow={0}>
50+
<Sidebar />
51+
<Flex
52+
flex="1 0 0"
53+
background="editorGray.200"
54+
flexDirection="column"
55+
position="relative"
56+
>
57+
<ActionBar
58+
viewMode={viewMode}
59+
setViewMode={setViewMode}
60+
gridImageSize={gridImageSize}
61+
setGridImageSize={setGridImageSize}
62+
/>
63+
{viewMode === "list" && <ListView onAddImage={onAddImage} />}
64+
{viewMode === "grid" && (
65+
<GridView imageSize={gridImageSize} onAddImage={onAddImage} />
66+
)}
67+
</Flex>
68+
</Flex>
69+
{isTemplatesOpen ? (
70+
<Box
71+
position="fixed"
72+
inset={0}
73+
bg="blackAlpha.400"
74+
display="flex"
75+
alignItems="center"
76+
justifyContent="center"
77+
zIndex={1400}
78+
>
79+
<Box
80+
w="80vw"
81+
h="80vh"
82+
maxW="80vw"
83+
maxH="80vh"
84+
bg="white"
85+
borderRadius="xl"
86+
overflow="hidden"
87+
boxShadow="xl"
88+
display="flex"
4389
flexDirection="column"
4490
position="relative"
4591
>
46-
<ActionBar
47-
viewMode={viewMode}
48-
setViewMode={setViewMode}
49-
gridImageSize={gridImageSize}
50-
setGridImageSize={setGridImageSize}
92+
<IconButton
93+
aria-label="Close templates"
94+
icon={<PiX />}
95+
size="sm"
96+
variant="ghost"
97+
position="absolute"
98+
top="3"
99+
right="3"
100+
zIndex={1}
101+
onClick={() => setIsTemplatesOpen(false)}
51102
/>
52-
{viewMode === "list" && <ListView onAddImage={onAddImage} />}
53-
{viewMode === "grid" && (
54-
<GridView imageSize={gridImageSize} onAddImage={onAddImage} />
55-
)}
56-
</Flex>
57-
</Flex>
58-
)}
103+
<Box
104+
flex="1 1 0"
105+
minH={0}
106+
display="flex"
107+
flexDirection="column"
108+
paddingY="2"
109+
>
110+
<TemplatesLibraryView onClose={() => setIsTemplatesOpen(false)} />
111+
</Box>
112+
</Box>
113+
</Box>
114+
) : null}
59115
</>
60116
)
61117
}

packages/imagekit-editor-dev/src/components/templates/TemplatesLibraryView.tsx

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import {
1616
Spinner,
1717
Text,
1818
} from "@chakra-ui/react"
19-
import { PiArrowLeft } from "@react-icons/all-files/pi/PiArrowLeft"
2019
import { PiCaretDown } from "@react-icons/all-files/pi/PiCaretDown"
2120
import { PiGlobe } from "@react-icons/all-files/pi/PiGlobe"
2221
import { PiLock } from "@react-icons/all-files/pi/PiLock"
@@ -33,14 +32,14 @@ import FilterChipsField from "../common/FilterChipsField"
3332
import MultiSelectListField from "../common/MultiSelectListField"
3433

3534
interface Props {
36-
onBack(): void
35+
onClose(): void
3736
}
3837

3938
function formatRelativeTime(ts: number): string {
4039
return humanDate.relativeTime(new Date(ts))
4140
}
4241

43-
export function TemplatesLibraryView({ onBack }: Props) {
42+
export function TemplatesLibraryView({ onClose }: Props) {
4443
const provider = useTemplateStorage()
4544
const [templates, setTemplates] = useState<TemplateRecord[]>([])
4645
const [loading, setLoading] = useState(true)
@@ -126,7 +125,7 @@ export function TemplatesLibraryView({ onBack }: Props) {
126125
loadTemplate(record.transformations)
127126
setTemplateName(record.name)
128127
setTemplateId(record.id)
129-
onBack()
128+
onClose()
130129
}
131130
}
132131

@@ -170,29 +169,15 @@ export function TemplatesLibraryView({ onBack }: Props) {
170169
background="white"
171170
overflowY="hidden"
172171
>
173-
{/* Static top section: back button, title, filters */}
172+
{/* Static top section: title, filters */}
174173
<Box px="6" pt="4" pb="3" flexShrink={0}>
175174
<Box
176-
width="70%"
175+
width="100%"
177176
mx="auto"
178177
display="flex"
179178
flexDirection="column"
180179
gap="4"
181180
>
182-
{/* Page header */}
183-
<Button
184-
onClick={onBack}
185-
variant="ghost"
186-
size="xs"
187-
alignSelf="flex-start"
188-
leftIcon={<Icon as={PiArrowLeft} boxSize={4} />}
189-
color="editorBattleshipGrey.500"
190-
_hover={{ color: "editorBattleshipGrey.700", bg: "transparent" }}
191-
px="0"
192-
>
193-
Go back
194-
</Button>
195-
196181
<Box>
197182
<Text
198183
fontSize="lg"
@@ -350,7 +335,7 @@ export function TemplatesLibraryView({ onBack }: Props) {
350335
overflowY="hidden"
351336
>
352337
<Box
353-
width="70%"
338+
width="100%"
354339
mx="auto"
355340
display="flex"
356341
flexDirection="column"

0 commit comments

Comments
 (0)