@soyfri/shared-library 1.3.15 → 1.3.17

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.
@@ -36,6 +36,30 @@ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
36
36
  import { DatePicker as DatePicker$1 } from "@mui/x-date-pickers/DatePicker";
37
37
  import { styled } from "@mui/system";
38
38
  import { TextField, Box } from "@mui/material";
39
+ import require$$0 from "dayjs";
40
+ var enGb$1 = { exports: {} };
41
+ var enGb = enGb$1.exports;
42
+ var hasRequiredEnGb;
43
+ function requireEnGb() {
44
+ if (hasRequiredEnGb) return enGb$1.exports;
45
+ hasRequiredEnGb = 1;
46
+ (function(module, exports) {
47
+ !(function(e, a) {
48
+ module.exports = a(require$$0);
49
+ })(enGb, (function(e) {
50
+ function a(e2) {
51
+ return e2 && "object" == typeof e2 && "default" in e2 ? e2 : { default: e2 };
52
+ }
53
+ var t = a(e), _ = { name: "en-gb", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), weekdaysShort: "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), weekdaysMin: "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), monthsShort: "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), weekStart: 1, yearStart: 4, relativeTime: { future: "in %s", past: "%s ago", s: "a few seconds", m: "a minute", mm: "%d minutes", h: "an hour", hh: "%d hours", d: "a day", dd: "%d days", M: "a month", MM: "%d months", y: "a year", yy: "%d years" }, formats: { LT: "HH:mm", LTS: "HH:mm:ss", L: "DD/MM/YYYY", LL: "D MMMM YYYY", LLL: "D MMMM YYYY HH:mm", LLLL: "dddd, D MMMM YYYY HH:mm" }, ordinal: function(e2) {
54
+ var a2 = ["th", "st", "nd", "rd"], t2 = e2 % 100;
55
+ return "[" + e2 + (a2[(t2 - 20) % 10] || a2[t2] || a2[0]) + "]";
56
+ } };
57
+ return t.default.locale(_, null, true), _;
58
+ }));
59
+ })(enGb$1);
60
+ return enGb$1.exports;
61
+ }
62
+ requireEnGb();
39
63
  const StyledTextField = styled(TextField)(({ theme }) => ({
40
64
  "& .MuiInputBase-root": {
41
65
  maxHeight: "34px",
@@ -110,7 +134,7 @@ const DatePicker = (_a) => {
110
134
  }
111
135
  }
112
136
  }, [error]);
113
- return /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, children: /* @__PURE__ */ jsx(
137
+ return /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, adapterLocale: "en-gb", children: /* @__PURE__ */ jsx(
114
138
  Box,
115
139
  {
116
140
  sx: {
@@ -174,4 +198,4 @@ const DatePicker = (_a) => {
174
198
  export {
175
199
  DatePicker as D
176
200
  };
177
- //# sourceMappingURL=DatePicker-BS543Ayk.js.map
201
+ //# sourceMappingURL=DatePicker-BSNboVhN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePicker-BSNboVhN.js","sources":["../node_modules/dayjs/locale/en-gb.js","../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["!function(e,a){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=a(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],a):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_gb=a(e.dayjs)}(this,(function(e){\"use strict\";function a(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var t=a(e),_={name:\"en-gb\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),weekdaysShort:\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),weekdaysMin:\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),monthsShort:\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),weekStart:1,yearStart:4,relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY HH:mm\",LLLL:\"dddd, D MMMM YYYY HH:mm\"},ordinal:function(e){var a=[\"th\",\"st\",\"nd\",\"rd\"],t=e%100;return\"[\"+e+(a[(t-20)%10]||a[t]||a[0])+\"]\"}};return t.default.locale(_,null,!0),_}));","import React, { useMemo } from 'react';\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { DatePicker as MuiDatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { DateValidationError } from '@mui/x-date-pickers/models';\nimport { Dayjs } from 'dayjs';\nimport { styled } from '@mui/system';\nimport { Box, TextField } from '@mui/material';\nimport 'dayjs/locale/en-gb';\n\n// Define las props para el CustomDatePicker\ninterface DatePickerProps {\n label: string;\n selectedDate: Dayjs | null;\n onDateChange: (date: Dayjs | null) => void;\n minDate?: Dayjs;\n maxDate?: Dayjs;\n disabled?: boolean;\n readOnly?: boolean;\n slotProps?: any;\n}\n\n// 1. Reutilizar el componente estilizado del Input\n// El DatePicker renderiza un TextField por dentro, así que podemos usar el mismo componente estilizado.\nconst StyledTextField = styled(TextField)(({ theme }) => ({\n '& .MuiInputBase-root': {\n maxHeight: '34px',\n padding: '8px 10px',\n borderRadius: '10px',\n display: 'flex',\n alignItems: 'center',\n fontSize: '14px',\n },\n '& .MuiInputBase-input': {\n padding: '0 !important',\n height: '18px',\n display: 'flex',\n alignItems: 'center',\n marginTop: '-4px'\n },\n '& .MuiInputLabel-root': {\n top: '50%',\n transform: 'translate(14px, -50%)',\n '&.MuiInputLabel-shrink': {\n transform: 'translate(1px, -200%) scale(0.75)',\n fontSize: '16px !important',\n '> legend': {\n display: 'none',\n }\n },\n },\n '& .MuiOutlinedInput-notchedOutline': {\n border: '0.7px solid',\n borderColor: '#e0e0e0',\n },\n}));\n\n/**\n * Componente de DatePicker personalizado de Material UI.\n * Permite seleccionar una fecha y actualiza un estado Dayjs.\n */\nexport const DatePicker: React.FC<DatePickerProps> = ({\n label,\n selectedDate,\n onDateChange,\n minDate,\n maxDate,\n disabled,\n readOnly,\n slotProps,\n ...rest\n}) => {\n const [error, setError] = React.useState<DateValidationError | null>(null);\n\n const errorMessage = useMemo(() => {\n switch (error) {\n case 'minDate':\n case 'maxDate': {\n return 'Fecha fuera del rango permitido';\n }\n case 'invalidDate': {\n return 'Formato de fecha inválido';\n }\n case 'disableFuture': {\n return 'No se permiten fechas futuras';\n }\n case 'disablePast': {\n return 'No se permiten fechas pasadas';\n }\n default: {\n return '';\n }\n }\n }, [error]);\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale=\"en-gb\">\n <Box\n sx={{\n width: '100%',\n display: 'grid',\n marginBottom: '10px',\n marginTop: '10px'\n }}\n\n >\n <MuiDatePicker\n label={label}\n value={selectedDate}\n onChange={onDateChange}\n minDate={minDate}\n maxDate={maxDate}\n onError={(newError) => setError(newError)}\n disabled={disabled}\n readOnly={readOnly}\n className='date-picker-custom'\n sx={{\n \n \n '& .MuiPickersInputBase-root, .MuiPickersOutlinedInput-root': {\n maxHeight: '28px',\n borderRadius: '10px'\n },\n\n // 3. Sobreescribir el label para que esté centrado verticalmente\n '& .MuiInputLabel-root': {\n // El label se alinea con el padding del input base.\n top: '50%',\n transform: 'translate(14px, -50%)',\n \n // Estilo para el label \"encogido\" cuando el input está lleno o en foco\n '&.MuiInputLabel-shrink': {\n transform: 'translate(1px, -200%) scale(0.75)', // Ajustar la posición para que se vea por encima del input\n fontSize: '16px !important',\n '> legend': {\n display: 'none', // Ocultar el legend del outline\n }\n },\n },\n '& .MuiPickersInputBase-root > fieldset > legend':{\n display: 'none', // Ocultar el legend del outline\n },\n\n }}\n // 2. Usar 'slotProps' para pasar el componente estilizado al TextField\n slotProps={{\n ...slotProps,\n textField: {\n ...slotProps?.textField,\n helperText: errorMessage || slotProps?.textField?.helperText,\n error: !!errorMessage || slotProps?.textField?.error,\n InputProps: {\n ...slotProps?.textField?.InputProps,\n inputComponent: StyledTextField,\n },\n },\n }}\n {...rest}\n />\n </Box>\n </LocalizationProvider>\n );\n};\n\nexport default DatePicker;"],"names":["this","e","a","t","React","MuiDatePicker","_a","_b"],"mappings":"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","x_google_ignoreList":[0]}
@@ -37,6 +37,30 @@ const LocalizationProvider = require("@mui/x-date-pickers/LocalizationProvider")
37
37
  const DatePicker$1 = require("@mui/x-date-pickers/DatePicker");
38
38
  const system = require("@mui/system");
39
39
  const material = require("@mui/material");
40
+ const require$$0 = require("dayjs");
41
+ var enGb$1 = { exports: {} };
42
+ var enGb = enGb$1.exports;
43
+ var hasRequiredEnGb;
44
+ function requireEnGb() {
45
+ if (hasRequiredEnGb) return enGb$1.exports;
46
+ hasRequiredEnGb = 1;
47
+ (function(module2, exports2) {
48
+ !(function(e, a) {
49
+ module2.exports = a(require$$0);
50
+ })(enGb, (function(e) {
51
+ function a(e2) {
52
+ return e2 && "object" == typeof e2 && "default" in e2 ? e2 : { default: e2 };
53
+ }
54
+ var t = a(e), _ = { name: "en-gb", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), weekdaysShort: "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), weekdaysMin: "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), monthsShort: "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), weekStart: 1, yearStart: 4, relativeTime: { future: "in %s", past: "%s ago", s: "a few seconds", m: "a minute", mm: "%d minutes", h: "an hour", hh: "%d hours", d: "a day", dd: "%d days", M: "a month", MM: "%d months", y: "a year", yy: "%d years" }, formats: { LT: "HH:mm", LTS: "HH:mm:ss", L: "DD/MM/YYYY", LL: "D MMMM YYYY", LLL: "D MMMM YYYY HH:mm", LLLL: "dddd, D MMMM YYYY HH:mm" }, ordinal: function(e2) {
55
+ var a2 = ["th", "st", "nd", "rd"], t2 = e2 % 100;
56
+ return "[" + e2 + (a2[(t2 - 20) % 10] || a2[t2] || a2[0]) + "]";
57
+ } };
58
+ return t.default.locale(_, null, true), _;
59
+ }));
60
+ })(enGb$1);
61
+ return enGb$1.exports;
62
+ }
63
+ requireEnGb();
40
64
  const StyledTextField = system.styled(material.TextField)(({ theme }) => ({
41
65
  "& .MuiInputBase-root": {
42
66
  maxHeight: "34px",
@@ -111,7 +135,7 @@ const DatePicker = (_a) => {
111
135
  }
112
136
  }
113
137
  }, [error]);
114
- return /* @__PURE__ */ jsxRuntime.jsx(LocalizationProvider.LocalizationProvider, { dateAdapter: AdapterDayjs.AdapterDayjs, children: /* @__PURE__ */ jsxRuntime.jsx(
138
+ return /* @__PURE__ */ jsxRuntime.jsx(LocalizationProvider.LocalizationProvider, { dateAdapter: AdapterDayjs.AdapterDayjs, adapterLocale: "en-gb", children: /* @__PURE__ */ jsxRuntime.jsx(
115
139
  material.Box,
116
140
  {
117
141
  sx: {
@@ -173,4 +197,4 @@ const DatePicker = (_a) => {
173
197
  ) });
174
198
  };
175
199
  exports.DatePicker = DatePicker;
176
- //# sourceMappingURL=DatePicker-BXdDk2g_.cjs.map
200
+ //# sourceMappingURL=DatePicker-BoqxWAhj.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePicker-BoqxWAhj.cjs","sources":["../node_modules/dayjs/locale/en-gb.js","../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["!function(e,a){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=a(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],a):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_gb=a(e.dayjs)}(this,(function(e){\"use strict\";function a(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var t=a(e),_={name:\"en-gb\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),weekdaysShort:\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),weekdaysMin:\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),monthsShort:\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),weekStart:1,yearStart:4,relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY HH:mm\",LLLL:\"dddd, D MMMM YYYY HH:mm\"},ordinal:function(e){var a=[\"th\",\"st\",\"nd\",\"rd\"],t=e%100;return\"[\"+e+(a[(t-20)%10]||a[t]||a[0])+\"]\"}};return t.default.locale(_,null,!0),_}));","import React, { useMemo } from 'react';\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { DatePicker as MuiDatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { DateValidationError } from '@mui/x-date-pickers/models';\nimport { Dayjs } from 'dayjs';\nimport { styled } from '@mui/system';\nimport { Box, TextField } from '@mui/material';\nimport 'dayjs/locale/en-gb';\n\n// Define las props para el CustomDatePicker\ninterface DatePickerProps {\n label: string;\n selectedDate: Dayjs | null;\n onDateChange: (date: Dayjs | null) => void;\n minDate?: Dayjs;\n maxDate?: Dayjs;\n disabled?: boolean;\n readOnly?: boolean;\n slotProps?: any;\n}\n\n// 1. Reutilizar el componente estilizado del Input\n// El DatePicker renderiza un TextField por dentro, así que podemos usar el mismo componente estilizado.\nconst StyledTextField = styled(TextField)(({ theme }) => ({\n '& .MuiInputBase-root': {\n maxHeight: '34px',\n padding: '8px 10px',\n borderRadius: '10px',\n display: 'flex',\n alignItems: 'center',\n fontSize: '14px',\n },\n '& .MuiInputBase-input': {\n padding: '0 !important',\n height: '18px',\n display: 'flex',\n alignItems: 'center',\n marginTop: '-4px'\n },\n '& .MuiInputLabel-root': {\n top: '50%',\n transform: 'translate(14px, -50%)',\n '&.MuiInputLabel-shrink': {\n transform: 'translate(1px, -200%) scale(0.75)',\n fontSize: '16px !important',\n '> legend': {\n display: 'none',\n }\n },\n },\n '& .MuiOutlinedInput-notchedOutline': {\n border: '0.7px solid',\n borderColor: '#e0e0e0',\n },\n}));\n\n/**\n * Componente de DatePicker personalizado de Material UI.\n * Permite seleccionar una fecha y actualiza un estado Dayjs.\n */\nexport const DatePicker: React.FC<DatePickerProps> = ({\n label,\n selectedDate,\n onDateChange,\n minDate,\n maxDate,\n disabled,\n readOnly,\n slotProps,\n ...rest\n}) => {\n const [error, setError] = React.useState<DateValidationError | null>(null);\n\n const errorMessage = useMemo(() => {\n switch (error) {\n case 'minDate':\n case 'maxDate': {\n return 'Fecha fuera del rango permitido';\n }\n case 'invalidDate': {\n return 'Formato de fecha inválido';\n }\n case 'disableFuture': {\n return 'No se permiten fechas futuras';\n }\n case 'disablePast': {\n return 'No se permiten fechas pasadas';\n }\n default: {\n return '';\n }\n }\n }, [error]);\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale=\"en-gb\">\n <Box\n sx={{\n width: '100%',\n display: 'grid',\n marginBottom: '10px',\n marginTop: '10px'\n }}\n\n >\n <MuiDatePicker\n label={label}\n value={selectedDate}\n onChange={onDateChange}\n minDate={minDate}\n maxDate={maxDate}\n onError={(newError) => setError(newError)}\n disabled={disabled}\n readOnly={readOnly}\n className='date-picker-custom'\n sx={{\n \n \n '& .MuiPickersInputBase-root, .MuiPickersOutlinedInput-root': {\n maxHeight: '28px',\n borderRadius: '10px'\n },\n\n // 3. Sobreescribir el label para que esté centrado verticalmente\n '& .MuiInputLabel-root': {\n // El label se alinea con el padding del input base.\n top: '50%',\n transform: 'translate(14px, -50%)',\n \n // Estilo para el label \"encogido\" cuando el input está lleno o en foco\n '&.MuiInputLabel-shrink': {\n transform: 'translate(1px, -200%) scale(0.75)', // Ajustar la posición para que se vea por encima del input\n fontSize: '16px !important',\n '> legend': {\n display: 'none', // Ocultar el legend del outline\n }\n },\n },\n '& .MuiPickersInputBase-root > fieldset > legend':{\n display: 'none', // Ocultar el legend del outline\n },\n\n }}\n // 2. Usar 'slotProps' para pasar el componente estilizado al TextField\n slotProps={{\n ...slotProps,\n textField: {\n ...slotProps?.textField,\n helperText: errorMessage || slotProps?.textField?.helperText,\n error: !!errorMessage || slotProps?.textField?.error,\n InputProps: {\n ...slotProps?.textField?.InputProps,\n inputComponent: StyledTextField,\n },\n },\n }}\n {...rest}\n />\n </Box>\n </LocalizationProvider>\n );\n};\n\nexport default DatePicker;"],"names":["module","this","e","a","t","styled","TextField","useMemo","jsx","LocalizationProvider","AdapterDayjs","Box","MuiDatePicker","_a","_b"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const DatePicker = require("../../DatePicker-BXdDk2g_.cjs");
3
+ const DatePicker = require("../../DatePicker-BoqxWAhj.cjs");
4
4
  exports.DatePicker = DatePicker.DatePicker;
5
5
  //# sourceMappingURL=DatePicker.cjs.map
@@ -1,4 +1,4 @@
1
- import { D } from "../../DatePicker-BS543Ayk.js";
1
+ import { D } from "../../DatePicker-BSNboVhN.js";
2
2
  export {
3
3
  D as DatePicker
4
4
  };
@@ -252,61 +252,63 @@ const GalleryLightbox = ({
252
252
  {
253
253
  sx: {
254
254
  display: "flex",
255
- justifyContent: "space-between",
255
+ justifyContent: item.type === "image" ? "space-between" : "end",
256
256
  flexWrap: "wrap",
257
257
  gap: 1
258
258
  },
259
259
  children: [
260
- /* @__PURE__ */ jsxRuntime.jsxs(material.Stack, { direction: "row", spacing: 1, children: [
261
- /* @__PURE__ */ jsxRuntime.jsx(
262
- Button.Button,
263
- {
264
- variant: "outlined",
265
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(ZoomInIcon, {}),
266
- onClick: () => setZoom((z) => z + 0.25),
267
- children: "Zoom +"
268
- }
269
- ),
270
- /* @__PURE__ */ jsxRuntime.jsx(
271
- Button.Button,
272
- {
273
- variant: "outlined",
274
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(ZoomOutIcon, {}),
275
- onClick: () => setZoom((z) => Math.max(0.25, z - 0.25)),
276
- children: "Zoom −"
277
- }
278
- )
279
- ] }),
280
- /* @__PURE__ */ jsxRuntime.jsxs(material.Stack, { direction: "row", spacing: 1, children: [
281
- /* @__PURE__ */ jsxRuntime.jsx(
282
- Button.Button,
283
- {
284
- variant: "outlined",
285
- onClick: () => setRotation((r) => r - 90),
286
- children: /* @__PURE__ */ jsxRuntime.jsx(RotateLeftIcon, {})
287
- }
288
- ),
260
+ item.type === "image" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
261
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Stack, { direction: "row", spacing: 1, children: [
262
+ /* @__PURE__ */ jsxRuntime.jsx(
263
+ Button.Button,
264
+ {
265
+ variant: "outlined",
266
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(ZoomInIcon, {}),
267
+ onClick: () => setZoom((z) => z + 0.25),
268
+ children: "Zoom +"
269
+ }
270
+ ),
271
+ /* @__PURE__ */ jsxRuntime.jsx(
272
+ Button.Button,
273
+ {
274
+ variant: "outlined",
275
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(ZoomOutIcon, {}),
276
+ onClick: () => setZoom((z) => Math.max(0.25, z - 0.25)),
277
+ children: "Zoom −"
278
+ }
279
+ )
280
+ ] }),
281
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Stack, { direction: "row", spacing: 1, children: [
282
+ /* @__PURE__ */ jsxRuntime.jsx(
283
+ Button.Button,
284
+ {
285
+ variant: "outlined",
286
+ onClick: () => setRotation((r) => r - 90),
287
+ children: /* @__PURE__ */ jsxRuntime.jsx(RotateLeftIcon, {})
288
+ }
289
+ ),
290
+ /* @__PURE__ */ jsxRuntime.jsx(
291
+ Button.Button,
292
+ {
293
+ variant: "outlined",
294
+ onClick: () => setRotation((r) => r + 90),
295
+ children: /* @__PURE__ */ jsxRuntime.jsx(RotateRightIcon, {})
296
+ }
297
+ )
298
+ ] }),
289
299
  /* @__PURE__ */ jsxRuntime.jsx(
290
300
  Button.Button,
291
301
  {
292
302
  variant: "outlined",
293
- onClick: () => setRotation((r) => r + 90),
294
- children: /* @__PURE__ */ jsxRuntime.jsx(RotateRightIcon, {})
303
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(RestartAltIcon, {}),
304
+ onClick: () => {
305
+ setZoom(1);
306
+ setRotation(0);
307
+ },
308
+ children: "Reset"
295
309
  }
296
310
  )
297
311
  ] }),
298
- /* @__PURE__ */ jsxRuntime.jsx(
299
- Button.Button,
300
- {
301
- variant: "outlined",
302
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(RestartAltIcon, {}),
303
- onClick: () => {
304
- setZoom(1);
305
- setRotation(0);
306
- },
307
- children: "Reset"
308
- }
309
- ),
310
312
  /* @__PURE__ */ jsxRuntime.jsx(
311
313
  Button.Button,
312
314
  {
@@ -1 +1 @@
1
- {"version":3,"file":"Gallery.cjs","sources":["../../../src/components/Gallery/GalleryThumbnails.tsx","../../../src/components/Gallery/GalleryMain.tsx","../../../src/components/Gallery/GalleryLightbox.tsx","../../../src/components/Gallery/Gallery.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, IconButton } from \"@mui/material\";\nimport KeyboardArrowUpIcon from \"@mui/icons-material/KeyboardArrowUp\";\nimport KeyboardArrowDownIcon from \"@mui/icons-material/KeyboardArrowDown\";\nimport KeyboardArrowLeftIcon from \"@mui/icons-material/KeyboardArrowLeft\";\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\n\n\ninterface Props {\n items: Array<{\n url: string;\n type: string;\n title: string;\n thumbnail: string;\n }>;\n selectedIdx: number;\n onSelect: (idx: number) => void;\n thumbStartIdx: number;\n THUMB_VISIBLE_COUNT: number;\n handleThumbUp: () => void;\n handleThumbDown: () => void;\n isMobile: boolean;\n}\n\nexport const GalleryThumbnails = ({\n items,\n selectedIdx,\n onSelect,\n thumbStartIdx,\n THUMB_VISIBLE_COUNT,\n handleThumbUp,\n handleThumbDown,\n isMobile,\n}: Props) => (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: isMobile ? \"row\" : \"column\",\n alignItems: \"center\",\n minWidth: 70,\n width: 70,\n borderRadius: 1,\n bgcolor: \"#f8f9fa\",\n boxSizing: \"border-box\",\n py: 1,\n mb: isMobile ? 2 : 0,\n px: isMobile ? 1 : 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={handleThumbUp}\n disabled={thumbStartIdx === 0}\n sx={{ mb: isMobile ? 0 : 1, mr: isMobile ? 1 : 0 }}\n >\n {isMobile ? <KeyboardArrowLeftIcon /> : <KeyboardArrowUpIcon />}\n </IconButton>\n {items\n .slice(thumbStartIdx, thumbStartIdx + THUMB_VISIBLE_COUNT)\n .map((item, idx) => {\n const realIdx = thumbStartIdx + idx;\n return (\n <Box\n key={realIdx}\n onClick={() => onSelect(realIdx)}\n sx={{\n cursor: \"pointer\",\n width: 60,\n height: 60,\n borderRadius: 1,\n border:\n selectedIdx === realIdx\n ? \"2px solid #1976d2\"\n : \"2px solid #eee\",\n overflow: \"hidden\",\n bgcolor: \"#eee\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n m: isMobile ? \"0 4px\" : \"4px 0\",\n }}\n >\n <Box\n component=\"img\"\n src={item.thumbnail}\n alt={item.title}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n </Box>\n );\n })}\n <IconButton\n size=\"small\"\n onClick={handleThumbDown}\n disabled={thumbStartIdx + THUMB_VISIBLE_COUNT >= items.length}\n sx={{ mt: isMobile ? 0 : 1, ml: isMobile ? 1 : 0 }}\n >\n {isMobile ? <KeyboardArrowRightIcon /> : <KeyboardArrowDownIcon />}\n </IconButton>\n </Box>\n);","import React from \"react\";\nimport { Box, IconButton } from \"@mui/material\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\n\ninterface Props {\n item: {\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n};\n onOpenLightbox: () => void;\n isMobile: boolean;\n}\n\nexport const GalleryMain = ({ item, onOpenLightbox, isMobile }: Props) => (\n <Box\n sx={{\n width: isMobile ? \"80%\" : '100%',\n maxHeight: 431,\n maxWidth: isMobile ? \"80%\" : '100%',\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n position: \"relative\",\n borderRadius: 1,\n bgcolor: \"#f8f9fa\",\n overflow: \"hidden\",\n mx: \"auto\",\n }}\n >\n <Box\n sx={{\n width: \"100%\",\n height: \"100%\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onClick={onOpenLightbox}\n >\n {item.type === \"video\" ? (\n <Box\n component=\"video\"\n controls\n src={item.url}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n bgcolor: \"#000\",\n borderRadius: 1,\n }}\n />\n ) : (\n <Box\n component=\"img\"\n src={item.url}\n alt={item.title}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n borderRadius: 1,\n }}\n />\n )}\n </Box>\n <IconButton\n onClick={onOpenLightbox}\n sx={{\n position: \"absolute\",\n top: 16,\n right: 16,\n bgcolor: \"#1976d2\",\n \"&:hover\": { bgcolor: \"#1565c0\" },\n boxShadow: 2,\n }}\n >\n <FullscreenIcon sx={{ color: \"#fff\" }} />\n </IconButton>\n </Box>\n);","import React from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogActions,\n Stack,\n IconButton,\n Box,\n Typography,\n} from \"@mui/material\";\nimport ArrowBackIosNewIcon from \"@mui/icons-material/ArrowBackIosNew\";\nimport ArrowForwardIosIcon from \"@mui/icons-material/ArrowForwardIos\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport RotateLeftIcon from \"@mui/icons-material/RotateLeft\";\nimport RotateRightIcon from \"@mui/icons-material/RotateRight\";\nimport RestartAltIcon from \"@mui/icons-material/RestartAlt\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { Button } from \"../Button\";\n\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n item: {\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n};\n handlePrev: () => void;\n handleNext: () => void;\n zoom: number;\n setZoom: React.Dispatch<React.SetStateAction<number>>;\n rotation: number;\n setRotation: React.Dispatch<React.SetStateAction<number>>;\n videoRef?: React.RefObject<HTMLVideoElement | null>;\n}\n\nexport const GalleryLightbox = ({\n open,\n onClose,\n item,\n handlePrev,\n handleNext,\n zoom,\n setZoom,\n rotation,\n setRotation,\n videoRef,\n}: Props) => (\n <Dialog open={open} onClose={onClose} fullWidth maxWidth=\"lg\">\n <DialogContent\n sx={{\n minHeight: 431,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 2,\n }}\n >\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <IconButton onClick={handlePrev}>\n <ArrowBackIosNewIcon />\n </IconButton>\n <Typography variant=\"subtitle1\" fontWeight={600} sx={{ flex: 1, textAlign: \"center\" }}>\n {item.title}\n </Typography>\n <IconButton onClick={handleNext}>\n <ArrowForwardIosIcon />\n </IconButton>\n </Stack>\n {item.type === \"video\" ? (\n <Box\n component=\"video\"\n key={item.url}\n ref={videoRef}\n src={item.url}\n controls\n autoPlay\n sx={{\n width: \"100%\",\n maxWidth: \"900px\",\n maxHeight: \"70vh\",\n objectFit: \"contain\",\n bgcolor: \"#000\",\n borderRadius: 1,\n }}\n />\n ) : (\n <Box\n component=\"img\"\n src={item.url}\n alt={item.title}\n sx={{\n transform: `scale(${zoom}) rotate(${rotation}deg)`,\n transition: \"transform 0.2s ease\",\n width: \"100%\",\n maxWidth: \"900px\",\n maxHeight: \"70vh\",\n objectFit: \"contain\",\n borderRadius: 1,\n }}\n />\n )}\n </DialogContent>\n <DialogActions\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n flexWrap: \"wrap\",\n gap: 1,\n }}\n >\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n startIcon={<ZoomInIcon />}\n onClick={() => setZoom((z) => z + 0.25)}\n >\n Zoom +\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<ZoomOutIcon />}\n onClick={() => setZoom((z) => Math.max(0.25, z - 0.25))}\n >\n Zoom −\n </Button>\n </Stack>\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n onClick={() => setRotation((r) => r - 90)}\n >\n <RotateLeftIcon />\n </Button>\n <Button\n variant=\"outlined\"\n onClick={() => setRotation((r) => r + 90)}\n >\n <RotateRightIcon />\n </Button>\n </Stack>\n <Button\n variant=\"outlined\"\n startIcon={<RestartAltIcon />}\n onClick={() => {\n setZoom(1);\n setRotation(0);\n }}\n >\n Reset\n </Button>\n <Button\n variant=\"contained\"\n startIcon={<CloseIcon />}\n onClick={onClose}\n >\n Cerrar\n </Button>\n </DialogActions>\n </Dialog>\n);","import React, { useState, useRef, useEffect } from \"react\";\nimport { Stack, useMediaQuery } from \"@mui/material\";\nimport { GalleryThumbnails } from \"./GalleryThumbnails\";\nimport { GalleryMain } from \"./GalleryMain\";\nimport { GalleryLightbox } from \"./GalleryLightbox\";\n\nexport interface Props {\n items: Array<{\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n}>;\n maxWidth?: string;\n}\n\n\nexport const Gallery:React.FC<Props> = ({ items, maxWidth='600px' }: Props) => {\n const isMobile = useMediaQuery(\"(max-width:700px)\");\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [openLightbox, setOpenLightbox] = useState(false);\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n const [thumbStartIdx, setThumbStartIdx] = useState(0);\n const THUMB_VISIBLE_COUNT = isMobile ? 3 : 5;\n\n // Flechas para miniaturas\n const handleThumbUp = () => {\n setThumbStartIdx((prev) => Math.max(0, prev - 1));\n };\n const handleThumbDown = () => {\n setThumbStartIdx((prev) =>\n Math.min(items.length - THUMB_VISIBLE_COUNT, prev + 1)\n );\n };\n\n // Navegación entre imágenes\n const handlePrev = () => {\n setSelectedIdx((idx) => (idx === 0 ? items.length - 1 : idx - 1));\n };\n const handleNext = () => {\n setSelectedIdx((idx) =>\n idx === items.length - 1 ? 0 : idx + 1\n );\n };\n\n // Acciones de teclado\n useEffect(() => {\n if (!openLightbox) return;\n const handleKey = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowLeft\":\n handlePrev();\n break;\n case \"ArrowRight\":\n handleNext();\n break;\n case \"Escape\":\n setOpenLightbox(false);\n break;\n default:\n break;\n }\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [openLightbox, items.length]);\n\n // Reset zoom/rotación y autoplay video\n useEffect(() => {\n if (\n openLightbox &&\n items[selectedIdx]?.type === \"video\" &&\n videoRef.current\n ) {\n videoRef.current.currentTime = 0;\n videoRef.current.play();\n }\n setZoom(1);\n setRotation(0);\n }, [openLightbox, selectedIdx, items]);\n\n return (\n <Stack direction={isMobile ? \"column\" : \"row\"} gap={3} sx={{ maxWidth: maxWidth, mx: \"auto\", minHeight: 300 }}>\n <GalleryThumbnails\n items={items}\n selectedIdx={selectedIdx}\n onSelect={setSelectedIdx}\n thumbStartIdx={thumbStartIdx}\n THUMB_VISIBLE_COUNT={THUMB_VISIBLE_COUNT}\n handleThumbUp={handleThumbUp}\n handleThumbDown={handleThumbDown}\n isMobile={isMobile}\n />\n <GalleryMain\n item={items[selectedIdx]}\n onOpenLightbox={() => setOpenLightbox(true)}\n isMobile={isMobile}\n />\n <GalleryLightbox\n open={openLightbox}\n onClose={() => setOpenLightbox(false)}\n item={items[selectedIdx]}\n handlePrev={handlePrev}\n handleNext={handleNext}\n zoom={zoom}\n setZoom={setZoom}\n rotation={rotation}\n setRotation={setRotation}\n videoRef={videoRef}\n />\n </Stack>\n );\n};\n\nexport default Gallery;"],"names":["jsxs","Box","jsx","IconButton","Dialog","DialogContent","Stack","Typography","DialogActions","Button","useMediaQuery","useState","useRef","useEffect"],"mappings":"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"}
1
+ {"version":3,"file":"Gallery.cjs","sources":["../../../src/components/Gallery/GalleryThumbnails.tsx","../../../src/components/Gallery/GalleryMain.tsx","../../../src/components/Gallery/GalleryLightbox.tsx","../../../src/components/Gallery/Gallery.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, IconButton } from \"@mui/material\";\nimport KeyboardArrowUpIcon from \"@mui/icons-material/KeyboardArrowUp\";\nimport KeyboardArrowDownIcon from \"@mui/icons-material/KeyboardArrowDown\";\nimport KeyboardArrowLeftIcon from \"@mui/icons-material/KeyboardArrowLeft\";\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\n\n\ninterface Props {\n items: Array<{\n url: string;\n type: string;\n title: string;\n thumbnail: string;\n }>;\n selectedIdx: number;\n onSelect: (idx: number) => void;\n thumbStartIdx: number;\n THUMB_VISIBLE_COUNT: number;\n handleThumbUp: () => void;\n handleThumbDown: () => void;\n isMobile: boolean;\n}\n\nexport const GalleryThumbnails = ({\n items,\n selectedIdx,\n onSelect,\n thumbStartIdx,\n THUMB_VISIBLE_COUNT,\n handleThumbUp,\n handleThumbDown,\n isMobile,\n}: Props) => (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: isMobile ? \"row\" : \"column\",\n alignItems: \"center\",\n minWidth: 70,\n width: 70,\n borderRadius: 1,\n bgcolor: \"#f8f9fa\",\n boxSizing: \"border-box\",\n py: 1,\n mb: isMobile ? 2 : 0,\n px: isMobile ? 1 : 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={handleThumbUp}\n disabled={thumbStartIdx === 0}\n sx={{ mb: isMobile ? 0 : 1, mr: isMobile ? 1 : 0 }}\n >\n {isMobile ? <KeyboardArrowLeftIcon /> : <KeyboardArrowUpIcon />}\n </IconButton>\n {items\n .slice(thumbStartIdx, thumbStartIdx + THUMB_VISIBLE_COUNT)\n .map((item, idx) => {\n const realIdx = thumbStartIdx + idx;\n return (\n <Box\n key={realIdx}\n onClick={() => onSelect(realIdx)}\n sx={{\n cursor: \"pointer\",\n width: 60,\n height: 60,\n borderRadius: 1,\n border:\n selectedIdx === realIdx\n ? \"2px solid #1976d2\"\n : \"2px solid #eee\",\n overflow: \"hidden\",\n bgcolor: \"#eee\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n m: isMobile ? \"0 4px\" : \"4px 0\",\n }}\n >\n <Box\n component=\"img\"\n src={item.thumbnail}\n alt={item.title}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n </Box>\n );\n })}\n <IconButton\n size=\"small\"\n onClick={handleThumbDown}\n disabled={thumbStartIdx + THUMB_VISIBLE_COUNT >= items.length}\n sx={{ mt: isMobile ? 0 : 1, ml: isMobile ? 1 : 0 }}\n >\n {isMobile ? <KeyboardArrowRightIcon /> : <KeyboardArrowDownIcon />}\n </IconButton>\n </Box>\n);","import React from \"react\";\nimport { Box, IconButton } from \"@mui/material\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\n\ninterface Props {\n item: {\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n};\n onOpenLightbox: () => void;\n isMobile: boolean;\n}\n\nexport const GalleryMain = ({ item, onOpenLightbox, isMobile }: Props) => (\n <Box\n sx={{\n width: isMobile ? \"80%\" : '100%',\n maxHeight: 431,\n maxWidth: isMobile ? \"80%\" : '100%',\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n position: \"relative\",\n borderRadius: 1,\n bgcolor: \"#f8f9fa\",\n overflow: \"hidden\",\n mx: \"auto\",\n }}\n >\n <Box\n sx={{\n width: \"100%\",\n height: \"100%\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onClick={onOpenLightbox}\n >\n {item.type === \"video\" ? (\n <Box\n component=\"video\"\n controls\n src={item.url}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n bgcolor: \"#000\",\n borderRadius: 1,\n }}\n />\n ) : (\n <Box\n component=\"img\"\n src={item.url}\n alt={item.title}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n borderRadius: 1,\n }}\n />\n )}\n </Box>\n <IconButton\n onClick={onOpenLightbox}\n sx={{\n position: \"absolute\",\n top: 16,\n right: 16,\n bgcolor: \"#1976d2\",\n \"&:hover\": { bgcolor: \"#1565c0\" },\n boxShadow: 2,\n }}\n >\n <FullscreenIcon sx={{ color: \"#fff\" }} />\n </IconButton>\n </Box>\n);","import React from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogActions,\n Stack,\n IconButton,\n Box,\n Typography,\n} from \"@mui/material\";\nimport ArrowBackIosNewIcon from \"@mui/icons-material/ArrowBackIosNew\";\nimport ArrowForwardIosIcon from \"@mui/icons-material/ArrowForwardIos\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport RotateLeftIcon from \"@mui/icons-material/RotateLeft\";\nimport RotateRightIcon from \"@mui/icons-material/RotateRight\";\nimport RestartAltIcon from \"@mui/icons-material/RestartAlt\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { Button } from \"../Button\";\n\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n item: {\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n };\n handlePrev: () => void;\n handleNext: () => void;\n zoom: number;\n setZoom: React.Dispatch<React.SetStateAction<number>>;\n rotation: number;\n setRotation: React.Dispatch<React.SetStateAction<number>>;\n videoRef?: React.RefObject<HTMLVideoElement | null>;\n}\n\nexport const GalleryLightbox = ({\n open,\n onClose,\n item,\n handlePrev,\n handleNext,\n zoom,\n setZoom,\n rotation,\n setRotation,\n videoRef,\n}: Props) => (\n <Dialog open={open} onClose={onClose} fullWidth maxWidth=\"lg\">\n <DialogContent\n sx={{\n minHeight: 431,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 2,\n }}\n >\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <IconButton onClick={handlePrev}>\n <ArrowBackIosNewIcon />\n </IconButton>\n <Typography variant=\"subtitle1\" fontWeight={600} sx={{ flex: 1, textAlign: \"center\" }}>\n {item.title}\n </Typography>\n <IconButton onClick={handleNext}>\n <ArrowForwardIosIcon />\n </IconButton>\n </Stack>\n {item.type === \"video\" ? (\n <Box\n component=\"video\"\n key={item.url}\n ref={videoRef}\n src={item.url}\n controls\n autoPlay\n sx={{\n width: \"100%\",\n maxWidth: \"900px\",\n maxHeight: \"70vh\",\n objectFit: \"contain\",\n bgcolor: \"#000\",\n borderRadius: 1,\n }}\n />\n ) : (\n <Box\n component=\"img\"\n src={item.url}\n alt={item.title}\n sx={{\n transform: `scale(${zoom}) rotate(${rotation}deg)`,\n transition: \"transform 0.2s ease\",\n width: \"100%\",\n maxWidth: \"900px\",\n maxHeight: \"70vh\",\n objectFit: \"contain\",\n borderRadius: 1,\n }}\n />\n )}\n </DialogContent>\n <DialogActions\n sx={{\n display: \"flex\",\n justifyContent: item.type === 'image' ? \"space-between\" : \"end\",\n flexWrap: \"wrap\",\n gap: 1,\n }}\n >\n\n {item.type === 'image' && <>\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n startIcon={<ZoomInIcon />}\n onClick={() => setZoom((z) => z + 0.25)}\n >\n Zoom +\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<ZoomOutIcon />}\n onClick={() => setZoom((z) => Math.max(0.25, z - 0.25))}\n >\n Zoom −\n </Button>\n </Stack>\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n onClick={() => setRotation((r) => r - 90)}\n >\n <RotateLeftIcon />\n </Button>\n <Button\n variant=\"outlined\"\n onClick={() => setRotation((r) => r + 90)}\n >\n <RotateRightIcon />\n </Button>\n </Stack>\n <Button\n variant=\"outlined\"\n startIcon={<RestartAltIcon />}\n onClick={() => {\n setZoom(1);\n setRotation(0);\n }}\n >\n Reset\n </Button>\n\n </>\n }\n <Button\n variant=\"contained\"\n startIcon={<CloseIcon />}\n onClick={onClose}\n >\n Cerrar\n </Button>\n </DialogActions>\n </Dialog >\n);","import React, { useState, useRef, useEffect } from \"react\";\nimport { Stack, useMediaQuery } from \"@mui/material\";\nimport { GalleryThumbnails } from \"./GalleryThumbnails\";\nimport { GalleryMain } from \"./GalleryMain\";\nimport { GalleryLightbox } from \"./GalleryLightbox\";\n\nexport interface Props {\n items: Array<{\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n}>;\n maxWidth?: string;\n}\n\n\nexport const Gallery:React.FC<Props> = ({ items, maxWidth='600px' }: Props) => {\n const isMobile = useMediaQuery(\"(max-width:700px)\");\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [openLightbox, setOpenLightbox] = useState(false);\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n const [thumbStartIdx, setThumbStartIdx] = useState(0);\n const THUMB_VISIBLE_COUNT = isMobile ? 3 : 5;\n\n // Flechas para miniaturas\n const handleThumbUp = () => {\n setThumbStartIdx((prev) => Math.max(0, prev - 1));\n };\n const handleThumbDown = () => {\n setThumbStartIdx((prev) =>\n Math.min(items.length - THUMB_VISIBLE_COUNT, prev + 1)\n );\n };\n\n // Navegación entre imágenes\n const handlePrev = () => {\n setSelectedIdx((idx) => (idx === 0 ? items.length - 1 : idx - 1));\n };\n const handleNext = () => {\n setSelectedIdx((idx) =>\n idx === items.length - 1 ? 0 : idx + 1\n );\n };\n\n // Acciones de teclado\n useEffect(() => {\n if (!openLightbox) return;\n const handleKey = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowLeft\":\n handlePrev();\n break;\n case \"ArrowRight\":\n handleNext();\n break;\n case \"Escape\":\n setOpenLightbox(false);\n break;\n default:\n break;\n }\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [openLightbox, items.length]);\n\n // Reset zoom/rotación y autoplay video\n useEffect(() => {\n if (\n openLightbox &&\n items[selectedIdx]?.type === \"video\" &&\n videoRef.current\n ) {\n videoRef.current.currentTime = 0;\n videoRef.current.play();\n }\n setZoom(1);\n setRotation(0);\n }, [openLightbox, selectedIdx, items]);\n\n return (\n <Stack direction={isMobile ? \"column\" : \"row\"} gap={3} sx={{ maxWidth: maxWidth, mx: \"auto\", minHeight: 300 }}>\n <GalleryThumbnails\n items={items}\n selectedIdx={selectedIdx}\n onSelect={setSelectedIdx}\n thumbStartIdx={thumbStartIdx}\n THUMB_VISIBLE_COUNT={THUMB_VISIBLE_COUNT}\n handleThumbUp={handleThumbUp}\n handleThumbDown={handleThumbDown}\n isMobile={isMobile}\n />\n <GalleryMain\n item={items[selectedIdx]}\n onOpenLightbox={() => setOpenLightbox(true)}\n isMobile={isMobile}\n />\n <GalleryLightbox\n open={openLightbox}\n onClose={() => setOpenLightbox(false)}\n item={items[selectedIdx]}\n handlePrev={handlePrev}\n handleNext={handleNext}\n zoom={zoom}\n setZoom={setZoom}\n rotation={rotation}\n setRotation={setRotation}\n videoRef={videoRef}\n />\n </Stack>\n );\n};\n\nexport default Gallery;"],"names":["jsxs","Box","jsx","IconButton","Dialog","DialogContent","Stack","Typography","DialogActions","Fragment","Button","useMediaQuery","useState","useRef","useEffect"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { useState, useRef, useEffect } from "react";
3
3
  import { Box, IconButton, Dialog, DialogContent, Stack, Typography, DialogActions, useMediaQuery } from "@mui/material";
4
4
  import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp";
@@ -250,61 +250,63 @@ const GalleryLightbox = ({
250
250
  {
251
251
  sx: {
252
252
  display: "flex",
253
- justifyContent: "space-between",
253
+ justifyContent: item.type === "image" ? "space-between" : "end",
254
254
  flexWrap: "wrap",
255
255
  gap: 1
256
256
  },
257
257
  children: [
258
- /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
259
- /* @__PURE__ */ jsx(
260
- Button,
261
- {
262
- variant: "outlined",
263
- startIcon: /* @__PURE__ */ jsx(ZoomInIcon, {}),
264
- onClick: () => setZoom((z) => z + 0.25),
265
- children: "Zoom +"
266
- }
267
- ),
268
- /* @__PURE__ */ jsx(
269
- Button,
270
- {
271
- variant: "outlined",
272
- startIcon: /* @__PURE__ */ jsx(ZoomOutIcon, {}),
273
- onClick: () => setZoom((z) => Math.max(0.25, z - 0.25)),
274
- children: "Zoom −"
275
- }
276
- )
277
- ] }),
278
- /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
279
- /* @__PURE__ */ jsx(
280
- Button,
281
- {
282
- variant: "outlined",
283
- onClick: () => setRotation((r) => r - 90),
284
- children: /* @__PURE__ */ jsx(RotateLeftIcon, {})
285
- }
286
- ),
258
+ item.type === "image" && /* @__PURE__ */ jsxs(Fragment, { children: [
259
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
260
+ /* @__PURE__ */ jsx(
261
+ Button,
262
+ {
263
+ variant: "outlined",
264
+ startIcon: /* @__PURE__ */ jsx(ZoomInIcon, {}),
265
+ onClick: () => setZoom((z) => z + 0.25),
266
+ children: "Zoom +"
267
+ }
268
+ ),
269
+ /* @__PURE__ */ jsx(
270
+ Button,
271
+ {
272
+ variant: "outlined",
273
+ startIcon: /* @__PURE__ */ jsx(ZoomOutIcon, {}),
274
+ onClick: () => setZoom((z) => Math.max(0.25, z - 0.25)),
275
+ children: "Zoom −"
276
+ }
277
+ )
278
+ ] }),
279
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
280
+ /* @__PURE__ */ jsx(
281
+ Button,
282
+ {
283
+ variant: "outlined",
284
+ onClick: () => setRotation((r) => r - 90),
285
+ children: /* @__PURE__ */ jsx(RotateLeftIcon, {})
286
+ }
287
+ ),
288
+ /* @__PURE__ */ jsx(
289
+ Button,
290
+ {
291
+ variant: "outlined",
292
+ onClick: () => setRotation((r) => r + 90),
293
+ children: /* @__PURE__ */ jsx(RotateRightIcon, {})
294
+ }
295
+ )
296
+ ] }),
287
297
  /* @__PURE__ */ jsx(
288
298
  Button,
289
299
  {
290
300
  variant: "outlined",
291
- onClick: () => setRotation((r) => r + 90),
292
- children: /* @__PURE__ */ jsx(RotateRightIcon, {})
301
+ startIcon: /* @__PURE__ */ jsx(RestartAltIcon, {}),
302
+ onClick: () => {
303
+ setZoom(1);
304
+ setRotation(0);
305
+ },
306
+ children: "Reset"
293
307
  }
294
308
  )
295
309
  ] }),
296
- /* @__PURE__ */ jsx(
297
- Button,
298
- {
299
- variant: "outlined",
300
- startIcon: /* @__PURE__ */ jsx(RestartAltIcon, {}),
301
- onClick: () => {
302
- setZoom(1);
303
- setRotation(0);
304
- },
305
- children: "Reset"
306
- }
307
- ),
308
310
  /* @__PURE__ */ jsx(
309
311
  Button,
310
312
  {
@@ -1 +1 @@
1
- {"version":3,"file":"Gallery.js","sources":["../../../src/components/Gallery/GalleryThumbnails.tsx","../../../src/components/Gallery/GalleryMain.tsx","../../../src/components/Gallery/GalleryLightbox.tsx","../../../src/components/Gallery/Gallery.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, IconButton } from \"@mui/material\";\nimport KeyboardArrowUpIcon from \"@mui/icons-material/KeyboardArrowUp\";\nimport KeyboardArrowDownIcon from \"@mui/icons-material/KeyboardArrowDown\";\nimport KeyboardArrowLeftIcon from \"@mui/icons-material/KeyboardArrowLeft\";\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\n\n\ninterface Props {\n items: Array<{\n url: string;\n type: string;\n title: string;\n thumbnail: string;\n }>;\n selectedIdx: number;\n onSelect: (idx: number) => void;\n thumbStartIdx: number;\n THUMB_VISIBLE_COUNT: number;\n handleThumbUp: () => void;\n handleThumbDown: () => void;\n isMobile: boolean;\n}\n\nexport const GalleryThumbnails = ({\n items,\n selectedIdx,\n onSelect,\n thumbStartIdx,\n THUMB_VISIBLE_COUNT,\n handleThumbUp,\n handleThumbDown,\n isMobile,\n}: Props) => (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: isMobile ? \"row\" : \"column\",\n alignItems: \"center\",\n minWidth: 70,\n width: 70,\n borderRadius: 1,\n bgcolor: \"#f8f9fa\",\n boxSizing: \"border-box\",\n py: 1,\n mb: isMobile ? 2 : 0,\n px: isMobile ? 1 : 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={handleThumbUp}\n disabled={thumbStartIdx === 0}\n sx={{ mb: isMobile ? 0 : 1, mr: isMobile ? 1 : 0 }}\n >\n {isMobile ? <KeyboardArrowLeftIcon /> : <KeyboardArrowUpIcon />}\n </IconButton>\n {items\n .slice(thumbStartIdx, thumbStartIdx + THUMB_VISIBLE_COUNT)\n .map((item, idx) => {\n const realIdx = thumbStartIdx + idx;\n return (\n <Box\n key={realIdx}\n onClick={() => onSelect(realIdx)}\n sx={{\n cursor: \"pointer\",\n width: 60,\n height: 60,\n borderRadius: 1,\n border:\n selectedIdx === realIdx\n ? \"2px solid #1976d2\"\n : \"2px solid #eee\",\n overflow: \"hidden\",\n bgcolor: \"#eee\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n m: isMobile ? \"0 4px\" : \"4px 0\",\n }}\n >\n <Box\n component=\"img\"\n src={item.thumbnail}\n alt={item.title}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n </Box>\n );\n })}\n <IconButton\n size=\"small\"\n onClick={handleThumbDown}\n disabled={thumbStartIdx + THUMB_VISIBLE_COUNT >= items.length}\n sx={{ mt: isMobile ? 0 : 1, ml: isMobile ? 1 : 0 }}\n >\n {isMobile ? <KeyboardArrowRightIcon /> : <KeyboardArrowDownIcon />}\n </IconButton>\n </Box>\n);","import React from \"react\";\nimport { Box, IconButton } from \"@mui/material\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\n\ninterface Props {\n item: {\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n};\n onOpenLightbox: () => void;\n isMobile: boolean;\n}\n\nexport const GalleryMain = ({ item, onOpenLightbox, isMobile }: Props) => (\n <Box\n sx={{\n width: isMobile ? \"80%\" : '100%',\n maxHeight: 431,\n maxWidth: isMobile ? \"80%\" : '100%',\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n position: \"relative\",\n borderRadius: 1,\n bgcolor: \"#f8f9fa\",\n overflow: \"hidden\",\n mx: \"auto\",\n }}\n >\n <Box\n sx={{\n width: \"100%\",\n height: \"100%\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onClick={onOpenLightbox}\n >\n {item.type === \"video\" ? (\n <Box\n component=\"video\"\n controls\n src={item.url}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n bgcolor: \"#000\",\n borderRadius: 1,\n }}\n />\n ) : (\n <Box\n component=\"img\"\n src={item.url}\n alt={item.title}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n borderRadius: 1,\n }}\n />\n )}\n </Box>\n <IconButton\n onClick={onOpenLightbox}\n sx={{\n position: \"absolute\",\n top: 16,\n right: 16,\n bgcolor: \"#1976d2\",\n \"&:hover\": { bgcolor: \"#1565c0\" },\n boxShadow: 2,\n }}\n >\n <FullscreenIcon sx={{ color: \"#fff\" }} />\n </IconButton>\n </Box>\n);","import React from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogActions,\n Stack,\n IconButton,\n Box,\n Typography,\n} from \"@mui/material\";\nimport ArrowBackIosNewIcon from \"@mui/icons-material/ArrowBackIosNew\";\nimport ArrowForwardIosIcon from \"@mui/icons-material/ArrowForwardIos\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport RotateLeftIcon from \"@mui/icons-material/RotateLeft\";\nimport RotateRightIcon from \"@mui/icons-material/RotateRight\";\nimport RestartAltIcon from \"@mui/icons-material/RestartAlt\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { Button } from \"../Button\";\n\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n item: {\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n};\n handlePrev: () => void;\n handleNext: () => void;\n zoom: number;\n setZoom: React.Dispatch<React.SetStateAction<number>>;\n rotation: number;\n setRotation: React.Dispatch<React.SetStateAction<number>>;\n videoRef?: React.RefObject<HTMLVideoElement | null>;\n}\n\nexport const GalleryLightbox = ({\n open,\n onClose,\n item,\n handlePrev,\n handleNext,\n zoom,\n setZoom,\n rotation,\n setRotation,\n videoRef,\n}: Props) => (\n <Dialog open={open} onClose={onClose} fullWidth maxWidth=\"lg\">\n <DialogContent\n sx={{\n minHeight: 431,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 2,\n }}\n >\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <IconButton onClick={handlePrev}>\n <ArrowBackIosNewIcon />\n </IconButton>\n <Typography variant=\"subtitle1\" fontWeight={600} sx={{ flex: 1, textAlign: \"center\" }}>\n {item.title}\n </Typography>\n <IconButton onClick={handleNext}>\n <ArrowForwardIosIcon />\n </IconButton>\n </Stack>\n {item.type === \"video\" ? (\n <Box\n component=\"video\"\n key={item.url}\n ref={videoRef}\n src={item.url}\n controls\n autoPlay\n sx={{\n width: \"100%\",\n maxWidth: \"900px\",\n maxHeight: \"70vh\",\n objectFit: \"contain\",\n bgcolor: \"#000\",\n borderRadius: 1,\n }}\n />\n ) : (\n <Box\n component=\"img\"\n src={item.url}\n alt={item.title}\n sx={{\n transform: `scale(${zoom}) rotate(${rotation}deg)`,\n transition: \"transform 0.2s ease\",\n width: \"100%\",\n maxWidth: \"900px\",\n maxHeight: \"70vh\",\n objectFit: \"contain\",\n borderRadius: 1,\n }}\n />\n )}\n </DialogContent>\n <DialogActions\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n flexWrap: \"wrap\",\n gap: 1,\n }}\n >\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n startIcon={<ZoomInIcon />}\n onClick={() => setZoom((z) => z + 0.25)}\n >\n Zoom +\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<ZoomOutIcon />}\n onClick={() => setZoom((z) => Math.max(0.25, z - 0.25))}\n >\n Zoom −\n </Button>\n </Stack>\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n onClick={() => setRotation((r) => r - 90)}\n >\n <RotateLeftIcon />\n </Button>\n <Button\n variant=\"outlined\"\n onClick={() => setRotation((r) => r + 90)}\n >\n <RotateRightIcon />\n </Button>\n </Stack>\n <Button\n variant=\"outlined\"\n startIcon={<RestartAltIcon />}\n onClick={() => {\n setZoom(1);\n setRotation(0);\n }}\n >\n Reset\n </Button>\n <Button\n variant=\"contained\"\n startIcon={<CloseIcon />}\n onClick={onClose}\n >\n Cerrar\n </Button>\n </DialogActions>\n </Dialog>\n);","import React, { useState, useRef, useEffect } from \"react\";\nimport { Stack, useMediaQuery } from \"@mui/material\";\nimport { GalleryThumbnails } from \"./GalleryThumbnails\";\nimport { GalleryMain } from \"./GalleryMain\";\nimport { GalleryLightbox } from \"./GalleryLightbox\";\n\nexport interface Props {\n items: Array<{\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n}>;\n maxWidth?: string;\n}\n\n\nexport const Gallery:React.FC<Props> = ({ items, maxWidth='600px' }: Props) => {\n const isMobile = useMediaQuery(\"(max-width:700px)\");\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [openLightbox, setOpenLightbox] = useState(false);\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n const [thumbStartIdx, setThumbStartIdx] = useState(0);\n const THUMB_VISIBLE_COUNT = isMobile ? 3 : 5;\n\n // Flechas para miniaturas\n const handleThumbUp = () => {\n setThumbStartIdx((prev) => Math.max(0, prev - 1));\n };\n const handleThumbDown = () => {\n setThumbStartIdx((prev) =>\n Math.min(items.length - THUMB_VISIBLE_COUNT, prev + 1)\n );\n };\n\n // Navegación entre imágenes\n const handlePrev = () => {\n setSelectedIdx((idx) => (idx === 0 ? items.length - 1 : idx - 1));\n };\n const handleNext = () => {\n setSelectedIdx((idx) =>\n idx === items.length - 1 ? 0 : idx + 1\n );\n };\n\n // Acciones de teclado\n useEffect(() => {\n if (!openLightbox) return;\n const handleKey = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowLeft\":\n handlePrev();\n break;\n case \"ArrowRight\":\n handleNext();\n break;\n case \"Escape\":\n setOpenLightbox(false);\n break;\n default:\n break;\n }\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [openLightbox, items.length]);\n\n // Reset zoom/rotación y autoplay video\n useEffect(() => {\n if (\n openLightbox &&\n items[selectedIdx]?.type === \"video\" &&\n videoRef.current\n ) {\n videoRef.current.currentTime = 0;\n videoRef.current.play();\n }\n setZoom(1);\n setRotation(0);\n }, [openLightbox, selectedIdx, items]);\n\n return (\n <Stack direction={isMobile ? \"column\" : \"row\"} gap={3} sx={{ maxWidth: maxWidth, mx: \"auto\", minHeight: 300 }}>\n <GalleryThumbnails\n items={items}\n selectedIdx={selectedIdx}\n onSelect={setSelectedIdx}\n thumbStartIdx={thumbStartIdx}\n THUMB_VISIBLE_COUNT={THUMB_VISIBLE_COUNT}\n handleThumbUp={handleThumbUp}\n handleThumbDown={handleThumbDown}\n isMobile={isMobile}\n />\n <GalleryMain\n item={items[selectedIdx]}\n onOpenLightbox={() => setOpenLightbox(true)}\n isMobile={isMobile}\n />\n <GalleryLightbox\n open={openLightbox}\n onClose={() => setOpenLightbox(false)}\n item={items[selectedIdx]}\n handlePrev={handlePrev}\n handleNext={handleNext}\n zoom={zoom}\n setZoom={setZoom}\n rotation={rotation}\n setRotation={setRotation}\n videoRef={videoRef}\n />\n </Stack>\n );\n};\n\nexport default Gallery;"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Gallery.js","sources":["../../../src/components/Gallery/GalleryThumbnails.tsx","../../../src/components/Gallery/GalleryMain.tsx","../../../src/components/Gallery/GalleryLightbox.tsx","../../../src/components/Gallery/Gallery.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, IconButton } from \"@mui/material\";\nimport KeyboardArrowUpIcon from \"@mui/icons-material/KeyboardArrowUp\";\nimport KeyboardArrowDownIcon from \"@mui/icons-material/KeyboardArrowDown\";\nimport KeyboardArrowLeftIcon from \"@mui/icons-material/KeyboardArrowLeft\";\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\n\n\ninterface Props {\n items: Array<{\n url: string;\n type: string;\n title: string;\n thumbnail: string;\n }>;\n selectedIdx: number;\n onSelect: (idx: number) => void;\n thumbStartIdx: number;\n THUMB_VISIBLE_COUNT: number;\n handleThumbUp: () => void;\n handleThumbDown: () => void;\n isMobile: boolean;\n}\n\nexport const GalleryThumbnails = ({\n items,\n selectedIdx,\n onSelect,\n thumbStartIdx,\n THUMB_VISIBLE_COUNT,\n handleThumbUp,\n handleThumbDown,\n isMobile,\n}: Props) => (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: isMobile ? \"row\" : \"column\",\n alignItems: \"center\",\n minWidth: 70,\n width: 70,\n borderRadius: 1,\n bgcolor: \"#f8f9fa\",\n boxSizing: \"border-box\",\n py: 1,\n mb: isMobile ? 2 : 0,\n px: isMobile ? 1 : 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={handleThumbUp}\n disabled={thumbStartIdx === 0}\n sx={{ mb: isMobile ? 0 : 1, mr: isMobile ? 1 : 0 }}\n >\n {isMobile ? <KeyboardArrowLeftIcon /> : <KeyboardArrowUpIcon />}\n </IconButton>\n {items\n .slice(thumbStartIdx, thumbStartIdx + THUMB_VISIBLE_COUNT)\n .map((item, idx) => {\n const realIdx = thumbStartIdx + idx;\n return (\n <Box\n key={realIdx}\n onClick={() => onSelect(realIdx)}\n sx={{\n cursor: \"pointer\",\n width: 60,\n height: 60,\n borderRadius: 1,\n border:\n selectedIdx === realIdx\n ? \"2px solid #1976d2\"\n : \"2px solid #eee\",\n overflow: \"hidden\",\n bgcolor: \"#eee\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n m: isMobile ? \"0 4px\" : \"4px 0\",\n }}\n >\n <Box\n component=\"img\"\n src={item.thumbnail}\n alt={item.title}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n </Box>\n );\n })}\n <IconButton\n size=\"small\"\n onClick={handleThumbDown}\n disabled={thumbStartIdx + THUMB_VISIBLE_COUNT >= items.length}\n sx={{ mt: isMobile ? 0 : 1, ml: isMobile ? 1 : 0 }}\n >\n {isMobile ? <KeyboardArrowRightIcon /> : <KeyboardArrowDownIcon />}\n </IconButton>\n </Box>\n);","import React from \"react\";\nimport { Box, IconButton } from \"@mui/material\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\n\ninterface Props {\n item: {\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n};\n onOpenLightbox: () => void;\n isMobile: boolean;\n}\n\nexport const GalleryMain = ({ item, onOpenLightbox, isMobile }: Props) => (\n <Box\n sx={{\n width: isMobile ? \"80%\" : '100%',\n maxHeight: 431,\n maxWidth: isMobile ? \"80%\" : '100%',\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n position: \"relative\",\n borderRadius: 1,\n bgcolor: \"#f8f9fa\",\n overflow: \"hidden\",\n mx: \"auto\",\n }}\n >\n <Box\n sx={{\n width: \"100%\",\n height: \"100%\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onClick={onOpenLightbox}\n >\n {item.type === \"video\" ? (\n <Box\n component=\"video\"\n controls\n src={item.url}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n bgcolor: \"#000\",\n borderRadius: 1,\n }}\n />\n ) : (\n <Box\n component=\"img\"\n src={item.url}\n alt={item.title}\n sx={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n borderRadius: 1,\n }}\n />\n )}\n </Box>\n <IconButton\n onClick={onOpenLightbox}\n sx={{\n position: \"absolute\",\n top: 16,\n right: 16,\n bgcolor: \"#1976d2\",\n \"&:hover\": { bgcolor: \"#1565c0\" },\n boxShadow: 2,\n }}\n >\n <FullscreenIcon sx={{ color: \"#fff\" }} />\n </IconButton>\n </Box>\n);","import React from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogActions,\n Stack,\n IconButton,\n Box,\n Typography,\n} from \"@mui/material\";\nimport ArrowBackIosNewIcon from \"@mui/icons-material/ArrowBackIosNew\";\nimport ArrowForwardIosIcon from \"@mui/icons-material/ArrowForwardIos\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport RotateLeftIcon from \"@mui/icons-material/RotateLeft\";\nimport RotateRightIcon from \"@mui/icons-material/RotateRight\";\nimport RestartAltIcon from \"@mui/icons-material/RestartAlt\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { Button } from \"../Button\";\n\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n item: {\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n };\n handlePrev: () => void;\n handleNext: () => void;\n zoom: number;\n setZoom: React.Dispatch<React.SetStateAction<number>>;\n rotation: number;\n setRotation: React.Dispatch<React.SetStateAction<number>>;\n videoRef?: React.RefObject<HTMLVideoElement | null>;\n}\n\nexport const GalleryLightbox = ({\n open,\n onClose,\n item,\n handlePrev,\n handleNext,\n zoom,\n setZoom,\n rotation,\n setRotation,\n videoRef,\n}: Props) => (\n <Dialog open={open} onClose={onClose} fullWidth maxWidth=\"lg\">\n <DialogContent\n sx={{\n minHeight: 431,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 2,\n }}\n >\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <IconButton onClick={handlePrev}>\n <ArrowBackIosNewIcon />\n </IconButton>\n <Typography variant=\"subtitle1\" fontWeight={600} sx={{ flex: 1, textAlign: \"center\" }}>\n {item.title}\n </Typography>\n <IconButton onClick={handleNext}>\n <ArrowForwardIosIcon />\n </IconButton>\n </Stack>\n {item.type === \"video\" ? (\n <Box\n component=\"video\"\n key={item.url}\n ref={videoRef}\n src={item.url}\n controls\n autoPlay\n sx={{\n width: \"100%\",\n maxWidth: \"900px\",\n maxHeight: \"70vh\",\n objectFit: \"contain\",\n bgcolor: \"#000\",\n borderRadius: 1,\n }}\n />\n ) : (\n <Box\n component=\"img\"\n src={item.url}\n alt={item.title}\n sx={{\n transform: `scale(${zoom}) rotate(${rotation}deg)`,\n transition: \"transform 0.2s ease\",\n width: \"100%\",\n maxWidth: \"900px\",\n maxHeight: \"70vh\",\n objectFit: \"contain\",\n borderRadius: 1,\n }}\n />\n )}\n </DialogContent>\n <DialogActions\n sx={{\n display: \"flex\",\n justifyContent: item.type === 'image' ? \"space-between\" : \"end\",\n flexWrap: \"wrap\",\n gap: 1,\n }}\n >\n\n {item.type === 'image' && <>\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n startIcon={<ZoomInIcon />}\n onClick={() => setZoom((z) => z + 0.25)}\n >\n Zoom +\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<ZoomOutIcon />}\n onClick={() => setZoom((z) => Math.max(0.25, z - 0.25))}\n >\n Zoom −\n </Button>\n </Stack>\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n onClick={() => setRotation((r) => r - 90)}\n >\n <RotateLeftIcon />\n </Button>\n <Button\n variant=\"outlined\"\n onClick={() => setRotation((r) => r + 90)}\n >\n <RotateRightIcon />\n </Button>\n </Stack>\n <Button\n variant=\"outlined\"\n startIcon={<RestartAltIcon />}\n onClick={() => {\n setZoom(1);\n setRotation(0);\n }}\n >\n Reset\n </Button>\n\n </>\n }\n <Button\n variant=\"contained\"\n startIcon={<CloseIcon />}\n onClick={onClose}\n >\n Cerrar\n </Button>\n </DialogActions>\n </Dialog >\n);","import React, { useState, useRef, useEffect } from \"react\";\nimport { Stack, useMediaQuery } from \"@mui/material\";\nimport { GalleryThumbnails } from \"./GalleryThumbnails\";\nimport { GalleryMain } from \"./GalleryMain\";\nimport { GalleryLightbox } from \"./GalleryLightbox\";\n\nexport interface Props {\n items: Array<{\n url: string;\n type: \"image\" | \"video\" | string;\n title: string;\n thumbnail: string;\n}>;\n maxWidth?: string;\n}\n\n\nexport const Gallery:React.FC<Props> = ({ items, maxWidth='600px' }: Props) => {\n const isMobile = useMediaQuery(\"(max-width:700px)\");\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [openLightbox, setOpenLightbox] = useState(false);\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n const [thumbStartIdx, setThumbStartIdx] = useState(0);\n const THUMB_VISIBLE_COUNT = isMobile ? 3 : 5;\n\n // Flechas para miniaturas\n const handleThumbUp = () => {\n setThumbStartIdx((prev) => Math.max(0, prev - 1));\n };\n const handleThumbDown = () => {\n setThumbStartIdx((prev) =>\n Math.min(items.length - THUMB_VISIBLE_COUNT, prev + 1)\n );\n };\n\n // Navegación entre imágenes\n const handlePrev = () => {\n setSelectedIdx((idx) => (idx === 0 ? items.length - 1 : idx - 1));\n };\n const handleNext = () => {\n setSelectedIdx((idx) =>\n idx === items.length - 1 ? 0 : idx + 1\n );\n };\n\n // Acciones de teclado\n useEffect(() => {\n if (!openLightbox) return;\n const handleKey = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowLeft\":\n handlePrev();\n break;\n case \"ArrowRight\":\n handleNext();\n break;\n case \"Escape\":\n setOpenLightbox(false);\n break;\n default:\n break;\n }\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [openLightbox, items.length]);\n\n // Reset zoom/rotación y autoplay video\n useEffect(() => {\n if (\n openLightbox &&\n items[selectedIdx]?.type === \"video\" &&\n videoRef.current\n ) {\n videoRef.current.currentTime = 0;\n videoRef.current.play();\n }\n setZoom(1);\n setRotation(0);\n }, [openLightbox, selectedIdx, items]);\n\n return (\n <Stack direction={isMobile ? \"column\" : \"row\"} gap={3} sx={{ maxWidth: maxWidth, mx: \"auto\", minHeight: 300 }}>\n <GalleryThumbnails\n items={items}\n selectedIdx={selectedIdx}\n onSelect={setSelectedIdx}\n thumbStartIdx={thumbStartIdx}\n THUMB_VISIBLE_COUNT={THUMB_VISIBLE_COUNT}\n handleThumbUp={handleThumbUp}\n handleThumbDown={handleThumbDown}\n isMobile={isMobile}\n />\n <GalleryMain\n item={items[selectedIdx]}\n onOpenLightbox={() => setOpenLightbox(true)}\n isMobile={isMobile}\n />\n <GalleryLightbox\n open={openLightbox}\n onClose={() => setOpenLightbox(false)}\n item={items[selectedIdx]}\n handlePrev={handlePrev}\n handleNext={handleNext}\n zoom={zoom}\n setZoom={setZoom}\n rotation={rotation}\n setRotation={setRotation}\n videoRef={videoRef}\n />\n </Stack>\n );\n};\n\nexport default Gallery;"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ const material = require("@mui/material");
25
25
  const DatePicker = require("@mui/x-date-pickers/DatePicker");
26
26
  const Input = require("../../Input-c8MwNNPg.cjs");
27
27
  const Select = require("../../Select-BO2N56sm.cjs");
28
- const DatePicker$1 = require("../../DatePicker-BXdDk2g_.cjs");
28
+ const DatePicker$1 = require("../../DatePicker-BoqxWAhj.cjs");
29
29
  const InputGroup = ({ children }) => {
30
30
  const childrenArray = React.Children.toArray(children);
31
31
  const childrenWithDividers = childrenArray.map((child, index) => {
@@ -23,7 +23,7 @@ import { Box, TextField, Select } from "@mui/material";
23
23
  import { DatePicker } from "@mui/x-date-pickers/DatePicker";
24
24
  import { I as Input } from "../../Input-DFHs7cJ_.js";
25
25
  import { S as Select$1 } from "../../Select-BcLkyHSE.js";
26
- import { D as DatePicker$1 } from "../../DatePicker-BS543Ayk.js";
26
+ import { D as DatePicker$1 } from "../../DatePicker-BSNboVhN.js";
27
27
  const InputGroup = ({ children }) => {
28
28
  const childrenArray = Children.toArray(children);
29
29
  const childrenWithDividers = childrenArray.map((child, index) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soyfri/shared-library",
3
- "version": "1.3.15",
3
+ "version": "1.3.17",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"DatePicker-BS543Ayk.js","sources":["../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { DatePicker as MuiDatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { DateValidationError } from '@mui/x-date-pickers/models';\nimport { Dayjs } from 'dayjs';\nimport { styled } from '@mui/system';\nimport { Box, TextField, TextFieldProps } from '@mui/material';\n\n// Define las props para el CustomDatePicker\ninterface DatePickerProps {\n label: string;\n selectedDate: Dayjs | null;\n onDateChange: (date: Dayjs | null) => void;\n minDate?: Dayjs;\n maxDate?: Dayjs;\n disabled?: boolean;\n readOnly?: boolean;\n slotProps?: any;\n}\n\n// 1. Reutilizar el componente estilizado del Input\n// El DatePicker renderiza un TextField por dentro, así que podemos usar el mismo componente estilizado.\nconst StyledTextField = styled(TextField)(({ theme }) => ({\n '& .MuiInputBase-root': {\n maxHeight: '34px',\n padding: '8px 10px',\n borderRadius: '10px',\n display: 'flex',\n alignItems: 'center',\n fontSize: '14px',\n },\n '& .MuiInputBase-input': {\n padding: '0 !important',\n height: '18px',\n display: 'flex',\n alignItems: 'center',\n marginTop: '-4px'\n },\n '& .MuiInputLabel-root': {\n top: '50%',\n transform: 'translate(14px, -50%)',\n '&.MuiInputLabel-shrink': {\n transform: 'translate(1px, -200%) scale(0.75)',\n fontSize: '16px !important',\n '> legend': {\n display: 'none',\n }\n },\n },\n '& .MuiOutlinedInput-notchedOutline': {\n border: '0.7px solid',\n borderColor: '#e0e0e0',\n },\n}));\n\n/**\n * Componente de DatePicker personalizado de Material UI.\n * Permite seleccionar una fecha y actualiza un estado Dayjs.\n */\nexport const DatePicker: React.FC<DatePickerProps> = ({\n label,\n selectedDate,\n onDateChange,\n minDate,\n maxDate,\n disabled,\n readOnly,\n slotProps,\n ...rest\n}) => {\n const [error, setError] = React.useState<DateValidationError | null>(null);\n\n const errorMessage = useMemo(() => {\n switch (error) {\n case 'minDate':\n case 'maxDate': {\n return 'Fecha fuera del rango permitido';\n }\n case 'invalidDate': {\n return 'Formato de fecha inválido';\n }\n case 'disableFuture': {\n return 'No se permiten fechas futuras';\n }\n case 'disablePast': {\n return 'No se permiten fechas pasadas';\n }\n default: {\n return '';\n }\n }\n }, [error]);\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box\n sx={{\n width: '100%',\n display: 'grid',\n marginBottom: '10px',\n marginTop: '10px'\n }}\n\n >\n <MuiDatePicker\n label={label}\n value={selectedDate}\n onChange={onDateChange}\n minDate={minDate}\n maxDate={maxDate}\n onError={(newError) => setError(newError)}\n disabled={disabled}\n readOnly={readOnly}\n className='date-picker-custom'\n sx={{\n \n \n '& .MuiPickersInputBase-root, .MuiPickersOutlinedInput-root': {\n maxHeight: '28px',\n borderRadius: '10px'\n },\n\n // 3. Sobreescribir el label para que esté centrado verticalmente\n '& .MuiInputLabel-root': {\n // El label se alinea con el padding del input base.\n top: '50%',\n transform: 'translate(14px, -50%)',\n \n // Estilo para el label \"encogido\" cuando el input está lleno o en foco\n '&.MuiInputLabel-shrink': {\n transform: 'translate(1px, -200%) scale(0.75)', // Ajustar la posición para que se vea por encima del input\n fontSize: '16px !important',\n '> legend': {\n display: 'none', // Ocultar el legend del outline\n }\n },\n },\n '& .MuiPickersInputBase-root > fieldset > legend':{\n display: 'none', // Ocultar el legend del outline\n },\n\n }}\n // 2. Usar 'slotProps' para pasar el componente estilizado al TextField\n slotProps={{\n ...slotProps,\n textField: {\n ...slotProps?.textField,\n helperText: errorMessage || slotProps?.textField?.helperText,\n error: !!errorMessage || slotProps?.textField?.error,\n InputProps: {\n ...slotProps?.textField?.InputProps,\n inputComponent: StyledTextField,\n },\n },\n }}\n {...rest}\n />\n </Box>\n </LocalizationProvider>\n );\n};\n\nexport default DatePicker;"],"names":["React","MuiDatePicker","_a","_b"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DatePicker-BXdDk2g_.cjs","sources":["../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { DatePicker as MuiDatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { DateValidationError } from '@mui/x-date-pickers/models';\nimport { Dayjs } from 'dayjs';\nimport { styled } from '@mui/system';\nimport { Box, TextField, TextFieldProps } from '@mui/material';\n\n// Define las props para el CustomDatePicker\ninterface DatePickerProps {\n label: string;\n selectedDate: Dayjs | null;\n onDateChange: (date: Dayjs | null) => void;\n minDate?: Dayjs;\n maxDate?: Dayjs;\n disabled?: boolean;\n readOnly?: boolean;\n slotProps?: any;\n}\n\n// 1. Reutilizar el componente estilizado del Input\n// El DatePicker renderiza un TextField por dentro, así que podemos usar el mismo componente estilizado.\nconst StyledTextField = styled(TextField)(({ theme }) => ({\n '& .MuiInputBase-root': {\n maxHeight: '34px',\n padding: '8px 10px',\n borderRadius: '10px',\n display: 'flex',\n alignItems: 'center',\n fontSize: '14px',\n },\n '& .MuiInputBase-input': {\n padding: '0 !important',\n height: '18px',\n display: 'flex',\n alignItems: 'center',\n marginTop: '-4px'\n },\n '& .MuiInputLabel-root': {\n top: '50%',\n transform: 'translate(14px, -50%)',\n '&.MuiInputLabel-shrink': {\n transform: 'translate(1px, -200%) scale(0.75)',\n fontSize: '16px !important',\n '> legend': {\n display: 'none',\n }\n },\n },\n '& .MuiOutlinedInput-notchedOutline': {\n border: '0.7px solid',\n borderColor: '#e0e0e0',\n },\n}));\n\n/**\n * Componente de DatePicker personalizado de Material UI.\n * Permite seleccionar una fecha y actualiza un estado Dayjs.\n */\nexport const DatePicker: React.FC<DatePickerProps> = ({\n label,\n selectedDate,\n onDateChange,\n minDate,\n maxDate,\n disabled,\n readOnly,\n slotProps,\n ...rest\n}) => {\n const [error, setError] = React.useState<DateValidationError | null>(null);\n\n const errorMessage = useMemo(() => {\n switch (error) {\n case 'minDate':\n case 'maxDate': {\n return 'Fecha fuera del rango permitido';\n }\n case 'invalidDate': {\n return 'Formato de fecha inválido';\n }\n case 'disableFuture': {\n return 'No se permiten fechas futuras';\n }\n case 'disablePast': {\n return 'No se permiten fechas pasadas';\n }\n default: {\n return '';\n }\n }\n }, [error]);\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box\n sx={{\n width: '100%',\n display: 'grid',\n marginBottom: '10px',\n marginTop: '10px'\n }}\n\n >\n <MuiDatePicker\n label={label}\n value={selectedDate}\n onChange={onDateChange}\n minDate={minDate}\n maxDate={maxDate}\n onError={(newError) => setError(newError)}\n disabled={disabled}\n readOnly={readOnly}\n className='date-picker-custom'\n sx={{\n \n \n '& .MuiPickersInputBase-root, .MuiPickersOutlinedInput-root': {\n maxHeight: '28px',\n borderRadius: '10px'\n },\n\n // 3. Sobreescribir el label para que esté centrado verticalmente\n '& .MuiInputLabel-root': {\n // El label se alinea con el padding del input base.\n top: '50%',\n transform: 'translate(14px, -50%)',\n \n // Estilo para el label \"encogido\" cuando el input está lleno o en foco\n '&.MuiInputLabel-shrink': {\n transform: 'translate(1px, -200%) scale(0.75)', // Ajustar la posición para que se vea por encima del input\n fontSize: '16px !important',\n '> legend': {\n display: 'none', // Ocultar el legend del outline\n }\n },\n },\n '& .MuiPickersInputBase-root > fieldset > legend':{\n display: 'none', // Ocultar el legend del outline\n },\n\n }}\n // 2. Usar 'slotProps' para pasar el componente estilizado al TextField\n slotProps={{\n ...slotProps,\n textField: {\n ...slotProps?.textField,\n helperText: errorMessage || slotProps?.textField?.helperText,\n error: !!errorMessage || slotProps?.textField?.error,\n InputProps: {\n ...slotProps?.textField?.InputProps,\n inputComponent: StyledTextField,\n },\n },\n }}\n {...rest}\n />\n </Box>\n </LocalizationProvider>\n );\n};\n\nexport default DatePicker;"],"names":["styled","TextField","useMemo","jsx","LocalizationProvider","AdapterDayjs","Box","MuiDatePicker","_a","_b"],"mappings":"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"}