@yogiswara/honcho-editor-ui 2.8.10 → 2.9.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 (143) hide show
  1. package/dist/color.d.ts +9 -0
  2. package/dist/color.js +9 -0
  3. package/dist/components/editor/GalleryAlbum/AlbumImageGallery.d.ts +8 -0
  4. package/dist/components/editor/GalleryAlbum/AlbumImageGallery.js +28 -0
  5. package/dist/components/editor/GalleryAlbum/ImageItem.d.ts +10 -0
  6. package/dist/components/editor/GalleryAlbum/ImageItem.js +81 -0
  7. package/dist/components/editor/HAccordionAspectRatio.d.ts +14 -0
  8. package/dist/components/editor/HAccordionAspectRatio.js +102 -0
  9. package/dist/components/editor/HAccordionColor.d.ts +16 -0
  10. package/dist/components/editor/HAccordionColor.js +282 -0
  11. package/dist/components/editor/HAccordionColorAdjustment.d.ts +35 -0
  12. package/dist/components/editor/HAccordionColorAdjustment.js +31 -0
  13. package/dist/components/editor/HAccordionDetails.d.ts +12 -0
  14. package/dist/components/editor/HAccordionDetails.js +183 -0
  15. package/dist/components/editor/HAccordionLight.d.ts +20 -0
  16. package/dist/components/editor/HAccordionLight.js +414 -0
  17. package/dist/components/editor/HAccordionPreset.d.ts +23 -0
  18. package/dist/components/editor/HAccordionPreset.js +52 -0
  19. package/dist/components/editor/HAlertBox.d.ts +8 -0
  20. package/dist/components/editor/HAlertBox.js +55 -0
  21. package/dist/components/editor/HAspectRatioMobile.d.ts +0 -0
  22. package/dist/components/editor/HAspectRatioMobile.js +1 -0
  23. package/dist/components/editor/HBulkAccordionColorAdjustment.d.ts +55 -0
  24. package/dist/components/editor/HBulkAccordionColorAdjustment.js +31 -0
  25. package/dist/components/editor/HBulkAccordionColorAdjustmentColors.d.ts +20 -0
  26. package/dist/components/editor/HBulkAccordionColorAdjustmentColors.js +121 -0
  27. package/dist/components/editor/HBulkAccordionColorAdjustmentDetails.d.ts +12 -0
  28. package/dist/components/editor/HBulkAccordionColorAdjustmentDetails.js +65 -0
  29. package/dist/components/editor/HBulkAccordionColorAdjustmentLight.d.ts +28 -0
  30. package/dist/components/editor/HBulkAccordionColorAdjustmentLight.js +177 -0
  31. package/dist/components/editor/HBulkColorAdjustmentMobile.d.ts +53 -0
  32. package/dist/components/editor/HBulkColorAdjustmentMobile.js +16 -0
  33. package/dist/components/editor/HBulkColorMobile.d.ts +20 -0
  34. package/dist/components/editor/HBulkColorMobile.js +121 -0
  35. package/dist/components/editor/HBulkDetailsMobile.d.ts +12 -0
  36. package/dist/components/editor/HBulkDetailsMobile.js +65 -0
  37. package/dist/components/editor/HBulkLightMobile.d.ts +28 -0
  38. package/dist/components/editor/HBulkLightMobile.js +192 -0
  39. package/dist/components/editor/HBulkPreset.d.ts +24 -0
  40. package/dist/components/editor/HBulkPreset.js +43 -0
  41. package/dist/components/editor/HBulkPresetMobile.d.ts +15 -0
  42. package/dist/components/editor/HBulkPresetMobile.js +26 -0
  43. package/dist/components/editor/HDialogBox.d.ts +18 -0
  44. package/dist/components/editor/HDialogBox.js +51 -0
  45. package/dist/components/editor/HDialogCopy.d.ts +41 -0
  46. package/dist/components/editor/HDialogCopy.js +80 -0
  47. package/dist/components/editor/HFooter.d.ts +12 -0
  48. package/dist/components/editor/HFooter.js +24 -0
  49. package/dist/components/editor/HHeaderEditor.d.ts +19 -0
  50. package/dist/components/editor/HHeaderEditor.js +36 -0
  51. package/dist/components/editor/HImageEditorBulkDekstop.d.ts +15 -0
  52. package/dist/components/editor/HImageEditorBulkDekstop.js +29 -0
  53. package/dist/components/editor/HImageEditorBulkMobile.d.ts +72 -0
  54. package/dist/components/editor/HImageEditorBulkMobile.js +81 -0
  55. package/dist/components/editor/HImageEditorDekstop.d.ts +15 -0
  56. package/dist/components/editor/HImageEditorDekstop.js +29 -0
  57. package/dist/components/editor/HImageEditorMobile.d.ts +53 -0
  58. package/dist/components/editor/HImageEditorMobile.js +92 -0
  59. package/dist/components/editor/HImageEditorMobileLayout.d.ts +14 -0
  60. package/dist/components/editor/HImageEditorMobileLayout.js +58 -0
  61. package/dist/components/editor/HModalEditorDekstop.d.ts +13 -0
  62. package/dist/components/editor/HModalEditorDekstop.js +22 -0
  63. package/dist/components/editor/HModalMobile.d.ts +13 -0
  64. package/dist/components/editor/HModalMobile.js +9 -0
  65. package/dist/components/editor/HPresetDelete.d.ts +7 -0
  66. package/dist/components/editor/HPresetDelete.js +7 -0
  67. package/dist/components/editor/HPresetOptionMenu.d.ts +9 -0
  68. package/dist/components/editor/HPresetOptionMenu.js +20 -0
  69. package/dist/components/editor/HSliderColorMobile.d.ts +16 -0
  70. package/dist/components/editor/HSliderColorMobile.js +270 -0
  71. package/dist/components/editor/HSliderDetailsMobile.d.ts +12 -0
  72. package/dist/components/editor/HSliderDetailsMobile.js +154 -0
  73. package/dist/components/editor/HSliderLightMobile.d.ts +20 -0
  74. package/dist/components/editor/HSliderLightMobile.js +420 -0
  75. package/dist/components/editor/HTabAspectRatioMobile.d.ts +0 -0
  76. package/dist/components/editor/HTabAspectRatioMobile.js +1 -0
  77. package/dist/components/editor/HTabColorAdjustmentMobile.d.ts +35 -0
  78. package/dist/components/editor/HTabColorAdjustmentMobile.js +8 -0
  79. package/dist/components/editor/HTabPresetMobile.d.ts +14 -0
  80. package/dist/components/editor/HTabPresetMobile.js +10 -0
  81. package/dist/components/editor/HTextField.d.ts +14 -0
  82. package/dist/components/editor/HTextField.js +51 -0
  83. package/dist/components/editor/HWatermarkView.d.ts +6 -0
  84. package/dist/components/editor/HWatermarkView.js +16 -0
  85. package/dist/components/editor/svg/Tick.d.ts +2 -0
  86. package/dist/components/editor/svg/Tick.js +6 -0
  87. package/dist/components/modal/HModalDialog.d.ts +12 -0
  88. package/dist/components/modal/HModalDialog.js +18 -0
  89. package/dist/components/modal/HModalRename.d.ts +14 -0
  90. package/dist/components/modal/HModalRename.js +35 -0
  91. package/dist/hooks/demo/HonchoEditorBulkDemo.d.ts +3 -0
  92. package/dist/hooks/demo/HonchoEditorBulkDemo.js +410 -0
  93. package/dist/hooks/demo/HonchoEditorSingleCleanDemo.d.ts +3 -0
  94. package/dist/hooks/demo/HonchoEditorSingleCleanDemo.js +354 -0
  95. package/dist/hooks/demo/index.d.ts +2 -0
  96. package/dist/hooks/demo/index.js +2 -0
  97. package/dist/hooks/editor/type.d.ts +174 -0
  98. package/dist/hooks/editor/type.js +1 -0
  99. package/dist/hooks/editor/useHonchoEditorBulk.d.ts +96 -0
  100. package/dist/hooks/editor/useHonchoEditorBulk.js +427 -0
  101. package/dist/hooks/editor/useHonchoEditorSingle.d.ts +44 -0
  102. package/dist/hooks/editor/useHonchoEditorSingle.js +163 -0
  103. package/dist/hooks/useAdjustmentHistory.d.ts +95 -0
  104. package/dist/hooks/useAdjustmentHistory.js +578 -0
  105. package/dist/hooks/useAdjustmentHistoryBatch.d.ts +177 -0
  106. package/dist/hooks/useAdjustmentHistoryBatch.js +1189 -0
  107. package/dist/hooks/useGallerySwipe.d.ts +36 -0
  108. package/dist/hooks/useGallerySwipe.js +344 -0
  109. package/dist/hooks/usePaging.d.ts +89 -0
  110. package/dist/hooks/usePaging.js +211 -0
  111. package/dist/hooks/usePreset.d.ts +82 -0
  112. package/dist/hooks/usePreset.js +344 -0
  113. package/dist/index.d.ts +39 -1474
  114. package/dist/index.js +44 -10960
  115. package/dist/lib/context/EditorContext.d.ts +28 -0
  116. package/dist/lib/context/EditorContext.js +60 -0
  117. package/dist/lib/context/EditorProcessingService.d.ts +36 -0
  118. package/dist/lib/context/EditorProcessingService.js +249 -0
  119. package/dist/lib/editor/honcho-editor.d.ts +324 -0
  120. package/dist/lib/editor/honcho-editor.js +825 -0
  121. package/dist/lib/hooks/useEditor.d.ts +22 -0
  122. package/dist/lib/hooks/useEditor.js +35 -0
  123. package/dist/lib/hooks/useEditorHeadless.d.ts +34 -0
  124. package/dist/lib/hooks/useEditorHeadless.js +207 -0
  125. package/dist/lib/hooks/useImageProcessor.d.ts +18 -0
  126. package/dist/lib/hooks/useImageProcessor.js +113 -0
  127. package/dist/setupTests.d.ts +1 -0
  128. package/dist/setupTests.js +1 -0
  129. package/dist/themes/colors.d.ts +12 -0
  130. package/dist/themes/colors.js +12 -0
  131. package/dist/themes/honchoTheme.d.ts +25 -0
  132. package/dist/themes/honchoTheme.js +94 -0
  133. package/dist/utils/adjustment.d.ts +6 -0
  134. package/dist/utils/adjustment.js +48 -0
  135. package/dist/utils/imageLoader.d.ts +11 -0
  136. package/dist/utils/imageLoader.js +48 -0
  137. package/dist/utils/isMobile.d.ts +1 -0
  138. package/dist/utils/isMobile.js +5 -0
  139. package/package.json +6 -12
  140. package/dist/index.d.mts +0 -1474
  141. package/dist/index.js.map +0 -1
  142. package/dist/index.mjs +0 -10939
  143. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,9 @@
1
+ export declare const neutral: {
2
+ white: string;
3
+ 10: string;
4
+ 25: string;
5
+ 50: string;
6
+ 75: string;
7
+ 100: string;
8
+ 200: string;
9
+ };
package/dist/color.js ADDED
@@ -0,0 +1,9 @@
1
+ export const neutral = {
2
+ white: "#FFFFFF",
3
+ 10: "#F9F9F9",
4
+ 25: "#DBDBDB",
5
+ 50: "#8D8D8D",
6
+ 75: "#575757",
7
+ 100: "#0A0A1C",
8
+ 200: "#000000",
9
+ };
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import type { PhotoData } from "../../../hooks/editor/useHonchoEditorBulk";
3
+ interface ImageGalleryProps {
4
+ imageCollection: PhotoData[];
5
+ onToggleSelect: (photo: PhotoData) => void;
6
+ }
7
+ export declare const AlbumImageGallery: React.FC<ImageGalleryProps>;
8
+ export {};
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Box, Stack } from "@mui/material";
4
+ import Masonry, { ResponsiveMasonry } from "react-responsive-masonry";
5
+ import GalleryImageItem from "./ImageItem";
6
+ export const AlbumImageGallery = (props) => {
7
+ const { imageCollection, onToggleSelect } = props;
8
+ return (_jsx(Stack, { sx: { width: '100%', maxHeight: '100%', overflowY: 'auto' }, children: _jsx(ResponsiveMasonry, { columnsCountBreakPoints: { 750: 2, 900: 4 }, children: _jsx(Masonry, { children: imageCollection.map((photo, index) => {
9
+ // This guard clause is still important for runtime safety.
10
+ if (!photo.key || !photo.src) {
11
+ console.warn("Skipping item without a key or src:", photo);
12
+ return null;
13
+ }
14
+ // NEW: Create a new object that matches the 'PhotoProps' interface.
15
+ // This explicitly tells TypeScript that all required fields are present.
16
+ const imageItemPhotoProps = {
17
+ key: photo.key,
18
+ src: photo.src,
19
+ width: photo.width,
20
+ height: photo.height,
21
+ alt: photo.alt,
22
+ // We pass the original photo object in the generic 'photo' property
23
+ // in case ImageItem needs it for other operations.
24
+ photo: photo,
25
+ };
26
+ return (_jsx(Box, { sx: { m: 0.5 }, children: _jsx(GalleryImageItem, { margin: "0px", index: index, direction: "column", onToggleSelect: () => { onToggleSelect(photo); }, data: photo }) }, photo.key));
27
+ }) }) }) }));
28
+ };
@@ -0,0 +1,10 @@
1
+ import { PhotoData } from "../../../hooks/editor/useHonchoEditorBulk";
2
+ interface Props {
3
+ margin?: any;
4
+ index: number;
5
+ data: PhotoData;
6
+ direction: "row" | "column";
7
+ onToggleSelect: () => void;
8
+ }
9
+ declare const GalleryImageItem: (props: Props) => import("react/jsx-runtime").JSX.Element;
10
+ export default GalleryImageItem;
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo } from "react";
3
+ import { Box, CardMedia, useTheme } from "@mui/material";
4
+ import { neutral } from "../../../color";
5
+ const initialAdjustments = {
6
+ temperature: 0, tint: 0, saturation: 0, vibrance: 0, exposure: 0, contrast: 0,
7
+ highlights: 0, shadows: 0, whites: 0, blacks: 0, clarity: 0, sharpness: 0,
8
+ };
9
+ const imgStyle = {
10
+ transition: "transform .135s cubic-bezier(0.0,0.0,0.2,1),opacity linear .15s",
11
+ width: "100%",
12
+ // objectFit: "contain",
13
+ //height: "100%",
14
+ };
15
+ const selectedImgStyle = {
16
+ borderRadius: "8px",
17
+ transform: "translateZ(0px) scale3d(1, 1, 1)",
18
+ // transition: "transform .135s cubic-bezier(0.0,0.0,0.2,1),opacity linear .15s"
19
+ };
20
+ const GalleryImageItem = (props) => {
21
+ const { margin, data } = props;
22
+ const theme = useTheme();
23
+ const imageData = data;
24
+ const commonStyle = useMemo(() => {
25
+ return {
26
+ backgroundColor: neutral.white,
27
+ overflow: "hidden",
28
+ position: "relative",
29
+ width: "100%",
30
+ aspectRatio: `${imageData.width}/${imageData.height}`,
31
+ };
32
+ }, [props.direction, imageData]);
33
+ const imageSx = useMemo(() => {
34
+ const baseStyles = imageData.isSelected ? {
35
+ ...imgStyle,
36
+ ...selectedImgStyle,
37
+ aspectRatio: `${imageData.width}/${imageData.height}`,
38
+ } : {
39
+ ...imgStyle,
40
+ };
41
+ return {
42
+ ...baseStyles,
43
+ opacity: 1, // Previously depended on isProcessingComplete
44
+ transition: 'opacity 0.3s ease-in-out',
45
+ };
46
+ }, [props.data.isSelected, imageData.width, imageData.height]);
47
+ const boxNotSelected = useMemo(() => ({
48
+ margin,
49
+ // height: photo.height,
50
+ ...commonStyle,
51
+ transition: ".3s",
52
+ // "&:hover": { padding: "12px", backgroundColor: "primary.light1" },
53
+ "&:-webkit-transition": { transition: ".3s" },
54
+ "&:hover > .checkbox": { display: "block" },
55
+ cursor: "pointer",
56
+ backgroundColor: "transparent",
57
+ }), [margin, commonStyle]);
58
+ const boxSelected = useMemo(() => ({
59
+ margin,
60
+ // height: photo.height,
61
+ ...commonStyle,
62
+ cursor: "pointer",
63
+ transition: ".3s",
64
+ "&:-webkit-transition": { transition: ".3s" },
65
+ padding: { xs: "13px 12px", sm: "21.31px 25.56px 21.32px 27.68px" },
66
+ }), [
67
+ margin,
68
+ commonStyle,
69
+ theme.palette.light,
70
+ ]);
71
+ const boxOuterSx = useMemo(() => {
72
+ if (props.data.isSelected) {
73
+ return { ...boxSelected };
74
+ }
75
+ else {
76
+ return { ...boxNotSelected };
77
+ }
78
+ }, [imageData.height, imageData.width, commonStyle, boxSelected, boxNotSelected, margin]);
79
+ return (_jsx(Box, { id: "Box_image", sx: boxOuterSx, className: "image", children: _jsx(CardMedia, { id: "card_media", component: "img", className: "image", loading: "lazy", alt: imageData.alt ?? "Image", sx: imageSx, src: imageData.src, width: "100%", onClick: props.onToggleSelect }) }, imageData.key));
80
+ };
81
+ export default GalleryImageItem;
@@ -0,0 +1,14 @@
1
+ interface Props {
2
+ activeRatio: string;
3
+ activeSquareRatio: string;
4
+ activeWideRatio: string;
5
+ angelChange: number;
6
+ widthPX: number;
7
+ heightPX: number;
8
+ onRatioSelect: (ratio: string) => void;
9
+ onAngleChange: (angle: number) => void;
10
+ onWidthChange: (value: number) => void;
11
+ onHeightChange: (value: number) => void;
12
+ }
13
+ export default function HAccordionAspectRatio(props: Props): import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Accordion, AccordionDetails, AccordionSummary, Button, Stack, Slider, Typography, CardMedia, IconButton, TextField } from "@mui/material";
4
+ import useHonchoTypography from "../../themes/honchoTheme";
5
+ import useColors from '../../themes/colors';
6
+ export default function HAccordionAspectRatio(props) {
7
+ const typography = useHonchoTypography();
8
+ const colors = useColors();
9
+ const [isCustomExpanded, setIsCustomExpanded] = useState(false);
10
+ const handleCustomAccordionChange = (event, isExpanded) => {
11
+ setIsCustomExpanded(isExpanded);
12
+ if (isExpanded) {
13
+ props.onRatioSelect('original');
14
+ }
15
+ };
16
+ const handleAngleSliderChange = (_event, newValue) => {
17
+ props.onAngleChange(newValue);
18
+ };
19
+ const textFieldSx = {
20
+ width: "80px",
21
+ padding: "4px",
22
+ borderRadius: "4px",
23
+ alignItems: "center",
24
+ border: `1px solid ${colors.outlineVariant}`,
25
+ textAlign: "center",
26
+ '& .MuiFilledInput-root': {
27
+ backgroundColor: 'transparent',
28
+ border: 'none',
29
+ '&:before': {
30
+ borderBottom: 'none',
31
+ },
32
+ '&:after': {
33
+ borderBottom: 'none',
34
+ },
35
+ '&:hover:not(.Mui-disabled):before': {
36
+ borderBottom: 'none',
37
+ },
38
+ '&.Mui-focused:after': {
39
+ borderBottom: 'none',
40
+ },
41
+ },
42
+ '& .MuiFilledInput-input': {
43
+ textAlign: 'center',
44
+ padding: 0,
45
+ color: colors.surface,
46
+ }
47
+ };
48
+ const customAccordionStyle = {
49
+ backgroundColor: 'transparent',
50
+ boxShadow: 'none',
51
+ margin: '0px',
52
+ '&.MuiAccordion-root:before': {
53
+ display: 'none',
54
+ },
55
+ '& .MuiAccordionSummary-root': {
56
+ minHeight: '22px',
57
+ padding: '0px',
58
+ '& .MuiAccordionSummary-content': {
59
+ margin: '0px',
60
+ justifyContent: 'flex-start',
61
+ },
62
+ },
63
+ '& .MuiAccordionDetails-root': {
64
+ padding: '8px 0px 0px 0px',
65
+ },
66
+ '&.MuiAccordion-root.Mui-expanded': {
67
+ margin: '0px',
68
+ },
69
+ };
70
+ return (_jsx(_Fragment, { children: _jsxs(Stack, { direction: "column", spacing: 2, sx: { p: 2, color: colors.surface }, children: [_jsxs(Stack, { direction: "row", spacing: 2, justifyContent: "start", alignItems: "center", children: [_jsx(IconButton, { "aria-label": "potrait", onClick: () => props.onRatioSelect('potrait'), children: _jsx(CardMedia, { component: "img", image: props.activeRatio === 'potrait' ? "/v1/svg/aspect-ratio-potrait-activate-editor.svg" : "/v1/svg/aspect-ratio-potrait-inactive-editor.svg", sx: { width: "14px", height: "20px" } }) }), _jsx(IconButton, { "aria-label": "wide", onClick: () => props.onRatioSelect('wide'), children: _jsx(CardMedia, { component: "img", image: props.activeRatio === 'wide' ? "/v1/svg/aspect-ratio-potrait-activate-editor.svg" : "/v1/svg/aspect-ratio-potrait-inactive-editor.svg", sx: { width: "14px", height: "20px", rotate: "-90deg" } }) })] }), _jsxs(Stack, { direction: "row", justifyContent: "space-between", alignItems: "center", children: [_jsx(IconButton, { onClick: () => props.onRatioSelect('original'), sx: { justifyContent: 'flex-start', color: props.activeSquareRatio === 'original' ? colors.surface : colors.onSurfaceVariant1, ...typography.bodyMedium }, children: "Original" }), _jsx(CardMedia, { component: "img", image: "v1/svg/check-ratio-editor.svg", sx: { width: "20px", height: "20px" } })] }), _jsx(Button, { onClick: () => props.onRatioSelect('freeform'), sx: { justifyContent: 'flex-start', color: props.activeSquareRatio === 'freeform' ? colors.surface : colors.onSurfaceVariant1, ...typography.bodyMedium }, children: "Freeform" }), _jsxs(Accordion, { expanded: isCustomExpanded, onChange: handleCustomAccordionChange, sx: customAccordionStyle, children: [_jsx(AccordionSummary, { children: _jsx(Typography, { sx: {
71
+ ...typography.bodyMedium,
72
+ color: props.activeSquareRatio === 'custom' ? colors.surface : colors.onSurfaceVariant1,
73
+ width: '100%',
74
+ cursor: 'pointer',
75
+ paddingLeft: '8px'
76
+ }, children: "Custom" }) }), _jsx(AccordionDetails, { children: _jsx(Stack, { direction: "row", spacing: 4, justifyContent: "center", alignItems: "center", sx: { paddingLeft: '16px' }, children: _jsxs(Stack, { direction: "row", spacing: 2, justifyContent: "center", alignItems: "center", children: [_jsx(Stack, { direction: "column", spacing: 0.5, children: _jsx(TextField, { hiddenLabel: true, placeholder: "Width", id: "width-px-input", value: props.widthPX === 0 ? '' : props.widthPX, variant: "filled", onChange: (e) => props.onWidthChange(Number(e.target.value)), sx: textFieldSx }) }), _jsx(Typography, { sx: { ...typography.bodyMedium, color: colors.surface }, children: " : " }), _jsx(Stack, { direction: "column", spacing: 0.5, children: _jsx(TextField, { hiddenLabel: true, placeholder: "Height", id: "height-px-input", value: props.heightPX === 0 ? '' : props.heightPX, variant: "filled", onChange: (e) => props.onHeightChange(Number(e.target.value)), sx: textFieldSx }) })] }) }) })] }), _jsx(Button, { onClick: () => props.onRatioSelect('1:1'), sx: { justifyContent: 'flex-start', color: props.activeWideRatio === '1:1' ? colors.surface : colors.onSurfaceVariant1, ...typography.bodyMedium }, children: "1:1" }), _jsx(Button, { onClick: () => props.onRatioSelect(props.activeRatio === 'wide' ? '3:2' : '2:3'), sx: { justifyContent: 'flex-start', color: props.activeWideRatio === (props.activeRatio === 'wide' ? '3:2' : '2:3') ? colors.surface : colors.onSurfaceVariant1, ...typography.bodyMedium }, children: props.activeRatio === 'wide' ? '3:2' : '2:3' }), _jsx(Button, { onClick: () => props.onRatioSelect(props.activeRatio === 'wide' ? '16:9' : '9:16'), sx: { justifyContent: 'flex-start', color: props.activeWideRatio === (props.activeRatio === 'wide' ? '16:9' : '9:16') ? colors.surface : colors.onSurfaceVariant1, ...typography.bodyMedium }, children: props.activeRatio === 'wide' ? '16:9' : '9:16' }), _jsxs(Stack, { direction: "row", justifyContent: "space-between", children: [_jsx(Typography, { sx: { ...typography.bodyMedium }, children: "Angel:" }), _jsx(TextField, { hiddenLabel: true, id: "filled-hidden-label-small", value: props.angelChange, variant: "filled", onChange: (e) => props.onAngleChange(Number(e.target.value)), sx: {
77
+ width: "40px",
78
+ alignItems: "center",
79
+ textAlign: "center",
80
+ '& .MuiFilledInput-root': {
81
+ backgroundColor: 'transparent',
82
+ border: 'none',
83
+ '&:before': {
84
+ borderBottom: 'none',
85
+ },
86
+ '&:after': {
87
+ borderBottom: 'none',
88
+ },
89
+ '&:hover:not(.Mui-disabled):before': {
90
+ borderBottom: 'none',
91
+ },
92
+ '&.Mui-focused:after': {
93
+ borderBottom: 'none',
94
+ },
95
+ },
96
+ '& .MuiFilledInput-input': {
97
+ textAlign: 'center',
98
+ padding: 0,
99
+ color: colors.surface,
100
+ }
101
+ } })] }), _jsx(Slider, { sx: { width: "200px", color: colors.surface }, size: "small", value: props.angelChange, step: 1, min: -360, max: 360, onChange: handleAngleSliderChange })] }) }));
102
+ }
@@ -0,0 +1,16 @@
1
+ import { AdjustmentState } from '../../hooks/editor/type';
2
+ interface Props {
3
+ TempScore: number;
4
+ TintScore: number;
5
+ SaturationScore: number;
6
+ VibranceScore: number;
7
+ isBatchMode: boolean;
8
+ onTempChange: (field: keyof AdjustmentState, value: number) => void;
9
+ onTintChange: (field: keyof AdjustmentState, value: number) => void;
10
+ onSaturationChange: (field: keyof AdjustmentState, value: number) => void;
11
+ onVibranceChange: (field: keyof AdjustmentState, value: number) => void;
12
+ onDragStart: () => void;
13
+ onDragEnd: () => void;
14
+ }
15
+ export default function HAccordionColor(props: Props): import("react/jsx-runtime").JSX.Element;
16
+ export {};
@@ -0,0 +1,282 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Stack, Slider, Typography, TextField } from "@mui/material";
3
+ import useHonchoTypography from "../../themes/honchoTheme";
4
+ import useColors from '../../themes/colors';
5
+ export default function HAccordionColor(props) {
6
+ const typography = useHonchoTypography();
7
+ const colors = useColors();
8
+ const blueScale = '#292bc0'; // Blue color on left
9
+ const yellowScale = '#dfdc28'; // Yellow color on right
10
+ const greenScale = '#00ff04';
11
+ const purpleScale = '#b700ff';
12
+ // The gradient for the *entire* background of the slider bar
13
+ const tempGradient = `linear-gradient(to right, ${blueScale} 35%, ${yellowScale} 75%)`;
14
+ const tintGradient = `linear-gradient(to right, ${greenScale} 20%, ${purpleScale} 75%)`;
15
+ const spectrumColorsSaturation = ['yellow', 'lime', 'deepskyblue', 'magenta', 'red'];
16
+ const greyScaleStart = '#000000'; // Black at -100
17
+ const greyScaleEnd = '#ffffff'; // White at 0 (or a very light grey)
18
+ const colorStops = spectrumColorsSaturation.map((color, index) => {
19
+ const position = 50 + (index / (spectrumColorsSaturation.length - 1)) * 50;
20
+ return `${color} ${position}%`;
21
+ }).join(', ');
22
+ // The gradient for the *entire* background of the slider bar
23
+ const fullTrackGradient = `linear-gradient(to right, ${greyScaleStart} 0%, ${greyScaleEnd} 50%, ${colorStops})`;
24
+ const focusedInputStyle = {
25
+ backgroundColor: "#1C1B1FB2",
26
+ borderRadius: '5px 5px 0px 0px',
27
+ borderBottom: 'none',
28
+ pl: '2px',
29
+ };
30
+ const formatValue = (value) => {
31
+ if (value > 0)
32
+ return `+${value}`;
33
+ return value.toString();
34
+ };
35
+ const handleInputChange = (event, min, max, onChange) => {
36
+ const value = event.target.value;
37
+ if (value === '+' || value === '-')
38
+ return;
39
+ let numericValue = parseInt(value, 10);
40
+ if (isNaN(numericValue))
41
+ numericValue = 0;
42
+ const clampedValue = Math.max(min, Math.min(max, numericValue));
43
+ onChange(clampedValue);
44
+ };
45
+ return (_jsx(_Fragment, { children: _jsxs(Stack, { children: [_jsxs(Stack, { direction: "column", gap: "4px", sx: { pt: '6px', pb: '2px', px: '0px', mx: '0px', '&:focus-within .MuiFilledInput-input': focusedInputStyle }, children: [_jsxs(Stack, { direction: "row", justifyContent: "space-between", children: [_jsx(Typography, { component: "label", htmlFor: "temperature-input", onDoubleClick: () => props.onTempChange("tempScore", 0), sx: { ...typography.bodyMedium, userSelect: 'none' }, children: "Temperature" }), _jsx(TextField, { hiddenLabel: true, id: "temperature-input", value: formatValue(props.TempScore), variant: "filled", onChange: (e) => handleInputChange(e, -100, 100, (val) => props.onTempChange("tempScore", val)), className: "control-label", sx: {
46
+ width: "40px",
47
+ height: "10px",
48
+ alignItems: "center",
49
+ textAlign: "right",
50
+ display: "flex",
51
+ '& .MuiFilledInput-root': {
52
+ backgroundColor: 'transparent',
53
+ borderRadius: "0px",
54
+ border: 'none',
55
+ '&:before': {
56
+ borderBottom: 'none',
57
+ },
58
+ '&:after': {
59
+ borderBottom: 'none',
60
+ },
61
+ '&:hover:not(.Mui-disabled):before': {
62
+ borderBottom: 'none',
63
+ },
64
+ '&.Mui-focused:after': {
65
+ borderBottom: 'none',
66
+ },
67
+ },
68
+ '& .MuiFilledInput-input': {
69
+ textAlign: 'right',
70
+ padding: 0,
71
+ pr: '4px',
72
+ color: colors.surface,
73
+ fontSize: "14px",
74
+ },
75
+ } })] }), _jsx(Slider, { sx: {
76
+ width: "200px",
77
+ color: colors.surface,
78
+ '& .MuiSlider-rail': {
79
+ background: tempGradient,
80
+ opacity: 1,
81
+ },
82
+ '& .MuiSlider-track': {
83
+ background: 'transparent',
84
+ border: 'none',
85
+ },
86
+ '& .MuiSlider-thumb': {
87
+ boxShadow: 'none',
88
+ },
89
+ '& .MuiSlider-thumb:hover': {
90
+ boxShadow: 'none',
91
+ },
92
+ }, size: "small", value: props.TempScore, step: 1, min: -100, max: 100, onChange: (_event, newValue) => props.onTempChange("tempScore", newValue), onDoubleClick: () => props.onTempChange("tempScore", 0), onMouseDown: () => {
93
+ if (!props.isBatchMode) {
94
+ props.onDragStart();
95
+ }
96
+ }, onMouseUp: () => {
97
+ props.onDragEnd();
98
+ }, onTouchStart: () => {
99
+ if (!props.isBatchMode) {
100
+ props.onDragStart();
101
+ }
102
+ }, onTouchEnd: () => {
103
+ props.onDragEnd();
104
+ } })] }), _jsxs(Stack, { direction: "column", gap: "3px", sx: { pt: '10px', pb: '0px', px: '0px', mx: '0px', '&:focus-within .MuiFilledInput-input': focusedInputStyle }, children: [_jsxs(Stack, { direction: "row", justifyContent: "space-between", children: [_jsx(Typography, { component: "label", htmlFor: "tint-input", onDoubleClick: () => props.onTintChange("tintScore", 0), sx: { ...typography.bodyMedium, userSelect: 'none' }, children: "Tint" }), _jsx(TextField, { hiddenLabel: true, id: "tint-input", value: formatValue(props.TintScore), variant: "filled", onChange: (e) => handleInputChange(e, -100, 100, (val) => props.onTintChange("tintScore", val)), sx: {
105
+ width: "40px",
106
+ height: "10px",
107
+ alignItems: "center",
108
+ textAlign: "right",
109
+ display: "flex",
110
+ '& .MuiFilledInput-root': {
111
+ backgroundColor: 'transparent',
112
+ borderRadius: "0px",
113
+ border: 'none',
114
+ '&:before': {
115
+ borderBottom: 'none',
116
+ },
117
+ '&:after': {
118
+ borderBottom: 'none',
119
+ },
120
+ '&:hover:not(.Mui-disabled):before': {
121
+ borderBottom: 'none',
122
+ },
123
+ '&.Mui-focused:after': {
124
+ borderBottom: 'none',
125
+ },
126
+ },
127
+ '& .MuiFilledInput-input': {
128
+ textAlign: 'right',
129
+ padding: 0,
130
+ pr: '4px',
131
+ color: colors.surface,
132
+ fontSize: "14px",
133
+ },
134
+ } })] }), _jsx(Slider, { sx: {
135
+ width: "200px",
136
+ color: colors.surface,
137
+ '& .MuiSlider-rail': {
138
+ background: tintGradient,
139
+ opacity: 1,
140
+ },
141
+ '& .MuiSlider-track': {
142
+ background: 'transparent',
143
+ border: 'none',
144
+ },
145
+ '& .MuiSlider-thumb': {
146
+ boxShadow: 'none',
147
+ },
148
+ '& .MuiSlider-thumb:hover': {
149
+ boxShadow: 'none',
150
+ },
151
+ }, size: "small", value: props.TintScore, step: 1, min: -100, max: 100, onChange: (_event, newValue) => props.onTintChange("tintScore", newValue), onDoubleClick: () => props.onTintChange("tintScore", 0), onMouseDown: () => {
152
+ if (!props.isBatchMode) {
153
+ props.onDragStart();
154
+ }
155
+ }, onMouseUp: () => {
156
+ props.onDragEnd();
157
+ }, onTouchStart: () => {
158
+ if (!props.isBatchMode) {
159
+ props.onDragStart();
160
+ }
161
+ }, onTouchEnd: () => {
162
+ props.onDragEnd();
163
+ } })] }), _jsxs(Stack, { direction: "column", gap: "3px", sx: { pt: '10px', pb: '0px', px: '0px', mx: '0px', '&:focus-within .MuiFilledInput-input': focusedInputStyle }, children: [_jsxs(Stack, { direction: "row", justifyContent: "space-between", children: [_jsx(Typography, { component: "label", htmlFor: "vibrance-input", onDoubleClick: () => props.onVibranceChange("vibranceScore", 0), sx: { ...typography.bodyMedium, userSelect: 'none' }, children: "Vibrance" }), _jsx(TextField, { hiddenLabel: true, id: "vibrance-input", value: formatValue(props.VibranceScore), variant: "filled", onChange: (e) => handleInputChange(e, -100, 100, (val) => props.onVibranceChange("vibranceScore", val)), sx: {
164
+ width: "40px",
165
+ height: "10px",
166
+ alignItems: "center",
167
+ textAlign: "right",
168
+ display: "flex",
169
+ '& .MuiFilledInput-root': {
170
+ backgroundColor: 'transparent',
171
+ borderRadius: "0px",
172
+ border: 'none',
173
+ '&:before': {
174
+ borderBottom: 'none',
175
+ },
176
+ '&:after': {
177
+ borderBottom: 'none',
178
+ },
179
+ '&:hover:not(.Mui-disabled):before': {
180
+ borderBottom: 'none',
181
+ },
182
+ '&.Mui-focused:after': {
183
+ borderBottom: 'none',
184
+ },
185
+ },
186
+ '& .MuiFilledInput-input': {
187
+ textAlign: 'right',
188
+ padding: 0,
189
+ pr: '4px',
190
+ color: colors.surface,
191
+ fontSize: "14px",
192
+ },
193
+ } })] }), _jsx(Slider, { sx: {
194
+ width: "200px",
195
+ color: colors.surface,
196
+ '& .MuiSlider-rail': {
197
+ background: fullTrackGradient,
198
+ opacity: 1,
199
+ },
200
+ '& .MuiSlider-track': {
201
+ background: 'transparent',
202
+ border: 'none',
203
+ },
204
+ '& .MuiSlider-thumb': {
205
+ boxShadow: 'none',
206
+ },
207
+ '& .MuiSlider-thumb:hover': {
208
+ boxShadow: 'none',
209
+ },
210
+ }, size: "small", value: props.VibranceScore, step: 1, min: -100, max: 100, onChange: (_event, newValue) => props.onVibranceChange("vibranceScore", newValue), onDoubleClick: () => props.onVibranceChange("vibranceScore", 0), onMouseDown: () => {
211
+ if (!props.isBatchMode) {
212
+ props.onDragStart();
213
+ }
214
+ }, onMouseUp: () => {
215
+ props.onDragEnd();
216
+ }, onTouchStart: () => {
217
+ if (!props.isBatchMode) {
218
+ props.onDragStart();
219
+ }
220
+ }, onTouchEnd: () => {
221
+ props.onDragEnd();
222
+ } })] }), _jsxs(Stack, { direction: "column", gap: "3px", sx: { pt: '10px', pb: '0px', px: '0px', mx: '0px', '&:focus-within .MuiFilledInput-input': focusedInputStyle }, children: [_jsxs(Stack, { direction: "row", justifyContent: "space-between", children: [_jsx(Typography, { component: "label", htmlFor: "saturation-input", onDoubleClick: () => props.onSaturationChange("saturationScore", 0), sx: { ...typography.bodyMedium, userSelect: 'none' }, children: "Saturation" }), _jsx(TextField, { hiddenLabel: true, id: "saturation-input", value: formatValue(props.SaturationScore), variant: "filled", onChange: (e) => handleInputChange(e, -100, 100, (val) => props.onSaturationChange("saturationScore", val)), sx: {
223
+ width: "40px",
224
+ height: "10px",
225
+ alignItems: "center",
226
+ textAlign: "right",
227
+ display: "flex",
228
+ '& .MuiFilledInput-root': {
229
+ backgroundColor: 'transparent',
230
+ borderRadius: "0px",
231
+ border: 'none',
232
+ '&:before': {
233
+ borderBottom: 'none',
234
+ },
235
+ '&:after': {
236
+ borderBottom: 'none',
237
+ },
238
+ '&:hover:not(.Mui-disabled):before': {
239
+ borderBottom: 'none',
240
+ },
241
+ '&.Mui-focused:after': {
242
+ borderBottom: 'none',
243
+ },
244
+ },
245
+ '& .MuiFilledInput-input': {
246
+ textAlign: 'right',
247
+ padding: 0,
248
+ pr: '4px',
249
+ color: colors.surface,
250
+ fontSize: "14px",
251
+ },
252
+ } })] }), _jsx(Slider, { sx: {
253
+ width: "200px",
254
+ color: colors.surface,
255
+ '& .MuiSlider-rail': {
256
+ background: fullTrackGradient,
257
+ opacity: 1,
258
+ },
259
+ '& .MuiSlider-track': {
260
+ background: 'transparent',
261
+ border: 'none',
262
+ },
263
+ '& .': {
264
+ boxShadow: 'none',
265
+ },
266
+ '& .MuiSlider-thumb:hover': {
267
+ boxShadow: 'none',
268
+ },
269
+ }, size: "small", value: props.SaturationScore, step: 1, min: -100, max: 100, onChange: (_event, newValue) => props.onSaturationChange("saturationScore", newValue), onDoubleClick: () => props.onSaturationChange("saturationScore", 0), onMouseDown: () => {
270
+ if (!props.isBatchMode) {
271
+ props.onDragStart();
272
+ }
273
+ }, onMouseUp: () => {
274
+ props.onDragEnd();
275
+ }, onTouchStart: () => {
276
+ if (!props.isBatchMode) {
277
+ props.onDragStart();
278
+ }
279
+ }, onTouchEnd: () => {
280
+ props.onDragEnd();
281
+ } })] })] }) }));
282
+ }
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+ import { AdjustmentState } from '../../hooks/editor/type';
3
+ interface Props {
4
+ tempScore: number;
5
+ tintScore: number;
6
+ vibranceScore: number;
7
+ saturationScore: number;
8
+ exposureScore: number;
9
+ HighlightsScore: number;
10
+ shadowsScore: number;
11
+ whitesScore: number;
12
+ blacksScore: number;
13
+ contrastScore: number;
14
+ clarityScore: number;
15
+ sharpnessScore: number;
16
+ expandedPanels: string[];
17
+ setTempScore: (field: keyof AdjustmentState, value: number) => void;
18
+ setTintScore: (field: keyof AdjustmentState, value: number) => void;
19
+ setExposureScore: (field: keyof AdjustmentState, value: number) => void;
20
+ setVibranceScore: (field: keyof AdjustmentState, value: number) => void;
21
+ setSaturationScore: (field: keyof AdjustmentState, value: number) => void;
22
+ setHighlightsScore: (field: keyof AdjustmentState, value: number) => void;
23
+ setShadowsScore: (field: keyof AdjustmentState, value: number) => void;
24
+ setWhitesScore: (field: keyof AdjustmentState, value: number) => void;
25
+ setBlacksScore: (field: keyof AdjustmentState, value: number) => void;
26
+ setContrastScore: (field: keyof AdjustmentState, value: number) => void;
27
+ setClarityScore: (field: keyof AdjustmentState, value: number) => void;
28
+ setSharpnessScore: (field: keyof AdjustmentState, value: number) => void;
29
+ onPanelChange: (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => void;
30
+ isBatchMode: boolean;
31
+ onDragStart: () => void;
32
+ onDragEnd: () => void;
33
+ }
34
+ export default function HAccordionColorAdjustment(props: Props): import("react/jsx-runtime").JSX.Element;
35
+ export {};