Skip to content

Commit de4562c

Browse files
committed
customize crop color, BES naming & padding
1 parent be09f89 commit de4562c

File tree

5 files changed

+53
-25
lines changed

5 files changed

+53
-25
lines changed

packages/feedback/src/constants/theme.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ export const LIGHT_THEME = {
3737

3838
formBorderRadius: '20px',
3939
formContentBorderRadius: '6px',
40+
41+
cropForeground: 'var(--submit-background)',
4042
};
4143

4244
export const DEFAULT_THEME = {

packages/feedback/src/core/createMainStyles.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ function getThemedCssVariables(theme: FeedbackTheme): string {
3333
3434
--form-border-radius: ${theme.formBorderRadius};
3535
--form-content-border-radius: ${theme.formContentBorderRadius};
36+
37+
--crop-foreground: ${theme.cropForeground};
3638
`;
3739
}
3840

packages/feedback/src/screenshot/components/ScreenshotEditor.tsx

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ export function makeScreenshotEditorComponent({ h, imageBuffer, dialog }: Factor
7171
const [croppingRect, setCroppingRect] = useState<Box>({ startX: 0, startY: 0, endX: 0, endY: 0 });
7272
const [confirmCrop, setConfirmCrop] = useState(false);
7373

74+
const cropStyle =
75+
croppingRef.current && getComputedStyle(croppingRef.current).getPropertyValue('--crop-foreground');
76+
7477
useEffect(() => {
7578
WINDOW.addEventListener('resize', resizeCropper, false);
7679
}, []);
@@ -115,7 +118,9 @@ export function makeScreenshotEditorComponent({ h, imageBuffer, dialog }: Factor
115118
ctx.clearRect(croppingBox.x, croppingBox.y, croppingBox.width, croppingBox.height);
116119

117120
// draw selection border
118-
ctx.strokeStyle = 'purple';
121+
if (cropStyle) {
122+
ctx.strokeStyle = cropStyle;
123+
}
119124
ctx.lineWidth = 3;
120125
ctx.strokeRect(croppingBox.x, croppingBox.y, croppingBox.width, croppingBox.height);
121126
}, [croppingRect]);
@@ -143,28 +148,28 @@ export function makeScreenshotEditorComponent({ h, imageBuffer, dialog }: Factor
143148
const mouseX = e.clientX - cropBoundingRect.x;
144149
const mouseY = e.clientY - cropBoundingRect.y;
145150
switch (corner) {
146-
case 'topleft':
151+
case 'top-left':
147152
setCroppingRect(prev => ({
148153
...prev,
149154
startX: Math.min(Math.max(0, mouseX), prev.endX - CROP_BUTTON_OFFSET),
150155
startY: Math.min(Math.max(0, mouseY), prev.endY - CROP_BUTTON_OFFSET),
151156
}));
152157
break;
153-
case 'topright':
158+
case 'top-right':
154159
setCroppingRect(prev => ({
155160
...prev,
156161
endX: Math.max(Math.min(mouseX, cropCanvas.width), prev.startX + CROP_BUTTON_OFFSET),
157162
startY: Math.min(Math.max(0, mouseY), prev.endY - CROP_BUTTON_OFFSET),
158163
}));
159164
break;
160-
case 'bottomleft':
165+
case 'bottom-left':
161166
setCroppingRect(prev => ({
162167
...prev,
163168
startX: Math.min(Math.max(0, mouseX), prev.endX - CROP_BUTTON_OFFSET),
164169
endY: Math.max(Math.min(mouseY, cropCanvas.height), prev.startY + CROP_BUTTON_OFFSET),
165170
}));
166171
break;
167-
case 'bottomright':
172+
case 'bottom-right':
168173
setCroppingRect(prev => ({
169174
...prev,
170175
endX: Math.max(Math.min(mouseX, cropCanvas.width), prev.startX + CROP_BUTTON_OFFSET),
@@ -240,32 +245,32 @@ export function makeScreenshotEditorComponent({ h, imageBuffer, dialog }: Factor
240245
return (
241246
<div class="editor">
242247
<style dangerouslySetInnerHTML={styles} />
243-
<div class="canvasContainer" ref={canvasContainerRef}>
244-
<div class="cropButtonContainer" style={{ position: 'absolute' }} ref={cropContainerRef}>
248+
<div class="container--canvas" ref={canvasContainerRef}>
249+
<div class="container--crop-btn" style={{ position: 'absolute' }} ref={cropContainerRef}>
245250
<canvas style={{ position: 'absolute' }} ref={croppingRef}></canvas>
246251
<CropCorner
247252
left={croppingRect.startX}
248253
top={croppingRect.startY}
249254
onGrabButton={onGrabButton}
250-
corner="topleft"
255+
corner="top-left"
251256
></CropCorner>
252257
<CropCorner
253258
left={croppingRect.endX - CROP_BUTTON_SIZE}
254259
top={croppingRect.startY}
255260
onGrabButton={onGrabButton}
256-
corner="topright"
261+
corner="top-right"
257262
></CropCorner>
258263
<CropCorner
259264
left={croppingRect.startX}
260265
top={croppingRect.endY - CROP_BUTTON_SIZE}
261266
onGrabButton={onGrabButton}
262-
corner="bottomleft"
267+
corner="bottom-left"
263268
></CropCorner>
264269
<CropCorner
265270
left={croppingRect.endX - CROP_BUTTON_SIZE}
266271
top={croppingRect.endY - CROP_BUTTON_SIZE}
267272
onGrabButton={onGrabButton}
268-
corner="bottomright"
273+
corner="bottom-right"
269274
></CropCorner>
270275
<div
271276
style={{
@@ -323,16 +328,10 @@ function CropCorner({
323328
}): VNode {
324329
return (
325330
<button
326-
class="crop-btn"
331+
class={`${corner} crop-btn`}
327332
style={{
328333
top: top,
329334
left: left,
330-
borderTop: corner === 'topleft' || corner === 'topright' ? 'solid purple' : 'none',
331-
borderLeft: corner === 'topleft' || corner === 'bottomleft' ? 'solid purple' : 'none',
332-
borderRight: corner === 'topright' || corner === 'bottomright' ? 'solid purple' : 'none',
333-
borderBottom: corner === 'bottomleft' || corner === 'bottomright' ? 'solid purple' : 'none',
334-
borderWidth: `${CROP_BUTTON_BORDER}px`,
335-
cursor: corner === 'topleft' || corner === 'bottomright' ? 'nwse-resize' : 'nesw-resize',
336335
}}
337336
onMouseDown={e => {
338337
e.preventDefault();

packages/feedback/src/screenshot/components/ScreenshotInput.css.ts

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ export function createScreenshotInputStyles(): HTMLStyleElement {
1616
}
1717
1818
.editor {
19+
padding: 10px;
20+
padding-top: 65px;
21+
padding-bottom: 65px;
1922
flex-grow: 1;
2023
2124
background-color: ${surface200};
@@ -35,23 +38,18 @@ export function createScreenshotInputStyles(): HTMLStyleElement {
3538
);
3639
}
3740
38-
.canvasContainer {
41+
.container--canvas {
3942
width: 100%;
4043
height: 100%;
4144
position: relative;
4245
}
4346
44-
.canvasContainer canvas {
47+
.container--canvas canvas {
4548
width: 100%;
4649
height: 100%;
4750
object-fit: contain;
4851
}
4952
50-
.cropper {
51-
width: 100%;
52-
height: 100%;
53-
}
54-
5553
.crop-btn-group {
5654
padding: 8px;
5755
gap: 8px;
@@ -66,6 +64,29 @@ export function createScreenshotInputStyles(): HTMLStyleElement {
6664
height: 30px;
6765
position: absolute;
6866
background: none;
67+
border: solid var(--crop-foreground);
68+
border-width: 3px;
69+
}
70+
71+
.top-left {
72+
cursor: nwse-resize;
73+
border-right: none;
74+
border-bottom: none;
75+
}
76+
.top-right {
77+
cursor: nesw-resize;
78+
border-left: none;
79+
border-bottom: none;
80+
}
81+
.bottom-left {
82+
cursor: nesw-resize;
83+
border-right: none;
84+
border-top: none;
85+
}
86+
.bottom-right {
87+
cursor: nwse-resize;
88+
border-left: none;
89+
border-top: none;
6990
}
7091
`;
7192

packages/feedback/src/types/theme.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,8 @@ export interface FeedbackTheme {
115115
* Border radius for form inputs
116116
*/
117117
formContentBorderRadius: string;
118+
/**
119+
* Foreground colour for cropping
120+
*/
121+
cropForeground: string;
118122
}

0 commit comments

Comments
 (0)