@geoinsight/react-components 0.4.4 → 0.5.0
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.
- package/dist/cjs/index.css +13 -3
- package/dist/cjs/index.js +56 -58
- package/dist/esm/index.css +13 -3
- package/dist/esm/index.js +57 -59
- package/package.json +2 -1
package/dist/cjs/index.css
CHANGED
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
[palette
|
|
82
|
+
[data-palette="water"] {
|
|
83
83
|
--color-primary-100: #d6efff;
|
|
84
84
|
--color-primary-200: #ade0ff;
|
|
85
85
|
--color-primary-300: #85d0ff;
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
--color-primary-900: #00588f;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
[palette
|
|
94
|
+
[data-palette="earth"]{
|
|
95
95
|
--color-primary-100: #f6e3cb;
|
|
96
96
|
--color-primary-200: #edc897;
|
|
97
97
|
--color-primary-300: #eabe86;
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
--color-primary-900: #684312;
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
[palette
|
|
106
|
+
[data-palette="forest"] {
|
|
107
107
|
--color-primary-100: #bee8b0;
|
|
108
108
|
--color-primary-200: #a4df90;
|
|
109
109
|
--color-primary-300: #8ad671;
|
|
@@ -295,14 +295,18 @@ transition: var(--transition-bg-cubic-bezier), var(--transition-box-shadow-cubic
|
|
|
295
295
|
display: flex;
|
|
296
296
|
flex-direction: column;
|
|
297
297
|
align-items: flex-start;
|
|
298
|
+
width: 100%;
|
|
298
299
|
}
|
|
299
300
|
|
|
300
301
|
.input {
|
|
302
|
+
box-sizing: border-box;
|
|
301
303
|
background-color: var(--color-white);
|
|
302
304
|
border-radius: var(--spacing-8);
|
|
303
305
|
border: 2px solid var(--color-primary);
|
|
304
306
|
color: var(--color-black);
|
|
305
307
|
padding: var(--spacing-16) var(--spacing-24);
|
|
308
|
+
font-size:var(--font-size-16);
|
|
309
|
+
width: 100%;
|
|
306
310
|
}
|
|
307
311
|
|
|
308
312
|
.input:hover {
|
|
@@ -318,6 +322,11 @@ transition: var(--transition-bg-cubic-bezier), var(--transition-box-shadow-cubic
|
|
|
318
322
|
border: 3px solid var(--color-danger);
|
|
319
323
|
}
|
|
320
324
|
|
|
325
|
+
.input--error:focus {
|
|
326
|
+
border: 3px solid var(--color-danger);
|
|
327
|
+
outline: none;
|
|
328
|
+
}
|
|
329
|
+
|
|
321
330
|
.error {
|
|
322
331
|
font-size: 12px;
|
|
323
332
|
color: var(--color-danger);
|
|
@@ -326,6 +335,7 @@ transition: var(--transition-bg-cubic-bezier), var(--transition-box-shadow-cubic
|
|
|
326
335
|
.textarea {
|
|
327
336
|
margin-bottom: var(--spacing-8);
|
|
328
337
|
position: relative;
|
|
338
|
+
width: 100%;
|
|
329
339
|
}
|
|
330
340
|
|
|
331
341
|
.textarea__input {
|
package/dist/cjs/index.js
CHANGED
|
@@ -80,7 +80,7 @@ function Accordion({ children, expanded = "all",
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
function AccordionItem({ children, label, isExpanded = false, }) {
|
|
83
|
-
const { toggle
|
|
83
|
+
const { toggle } = useAccordion();
|
|
84
84
|
return (jsxRuntime.jsx("div", { className: "accordion-item", style: {
|
|
85
85
|
paddingLeft: toggle && label && toggle[label].paddingLeft,
|
|
86
86
|
}, children: react.Children.map(children, (child) => react.cloneElement(child, {
|
|
@@ -98,12 +98,57 @@ function Button({ children = "Click me", className = "", icon = undefined, isNew
|
|
|
98
98
|
return as === "link" ? (jsxRuntime.jsxs(Anchor, { Custom: CustomAnchor, ...(isNewWindow && { target: "_blank" }), className: clsx(`button ${className}`, mode === "secondary" ? `button button__${mode}` : "button__link", `button__${size}`), ...rest, children: [children, icon] })) : (jsxRuntime.jsxs("button", { className: clsx("button", `button__${mode}`, `button__${size}`, className), ...rest, children: [children, icon] }));
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
const ThemeContext = react.createContext(undefined);
|
|
102
|
+
function ThemeProvider({ children, dataTheme: dataThemeProp, dataPalette: dataPaletteProp = "water", }) {
|
|
103
|
+
const [dataTheme, setDataTheme] = react.useState();
|
|
104
|
+
const [dataPalette, setDataPalette] = react.useState();
|
|
105
|
+
react.useEffect(() => {
|
|
106
|
+
if (dataPaletteProp) {
|
|
107
|
+
switchDataPalette(dataPaletteProp);
|
|
108
|
+
}
|
|
109
|
+
}, [dataPaletteProp]);
|
|
110
|
+
react.useEffect(() => {
|
|
111
|
+
if (dataThemeProp) {
|
|
112
|
+
switchDataTheme(dataThemeProp);
|
|
113
|
+
}
|
|
114
|
+
}, [dataThemeProp]);
|
|
115
|
+
react.useEffect(() => {
|
|
116
|
+
if (window.matchMedia) {
|
|
117
|
+
if (localStorage.getItem("data-theme")) {
|
|
118
|
+
document.documentElement.setAttribute("data-theme", localStorage.getItem("data-theme"));
|
|
119
|
+
setDataTheme(localStorage.getItem("data-theme"));
|
|
120
|
+
}
|
|
121
|
+
else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
|
|
122
|
+
document.documentElement.setAttribute("data-theme", "dark");
|
|
123
|
+
setDataTheme("dark");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}, []);
|
|
127
|
+
const switchDataTheme = (mode) => {
|
|
128
|
+
document.documentElement.setAttribute("data-theme", mode);
|
|
129
|
+
setDataTheme(mode);
|
|
130
|
+
localStorage.setItem("data-theme", mode);
|
|
131
|
+
};
|
|
132
|
+
const switchDataPalette = (mode) => {
|
|
133
|
+
document.documentElement.setAttribute("data-palette", mode);
|
|
134
|
+
setDataPalette(mode);
|
|
135
|
+
localStorage.setItem("palette-theme", mode);
|
|
136
|
+
};
|
|
137
|
+
return (jsxRuntime.jsx(ThemeContext.Provider, { value: { dataTheme, switchDataTheme, dataPalette, switchDataPalette }, children: children }));
|
|
138
|
+
}
|
|
139
|
+
function useTheme() {
|
|
140
|
+
const context = react.useContext(ThemeContext);
|
|
141
|
+
if (context === undefined) {
|
|
142
|
+
throw new Error("useTheme must be used within a ThemeProvider");
|
|
143
|
+
}
|
|
144
|
+
return context;
|
|
145
|
+
}
|
|
146
|
+
|
|
102
147
|
function AccordionButton({ children, is = "link", label,
|
|
103
148
|
// toggle,
|
|
104
149
|
// setToggle = (prev: any) => void,
|
|
105
150
|
...rest }) {
|
|
106
|
-
|
|
151
|
+
const { dataTheme } = useTheme();
|
|
107
152
|
const { toggle, setToggle } = useAccordion();
|
|
108
153
|
const handleToggle = () => {
|
|
109
154
|
setToggle((prev) => {
|
|
@@ -121,9 +166,7 @@ function AccordionButton({ children, is = "link", label,
|
|
|
121
166
|
}
|
|
122
167
|
});
|
|
123
168
|
};
|
|
124
|
-
return (jsxRuntime.jsx(Button, { as: is, className: clsx("accordion-button", `accordion-button__${is}`
|
|
125
|
-
// `accordion-button__${is}--${dataTheme}`
|
|
126
|
-
), ...(is !== "link" && {
|
|
169
|
+
return (jsxRuntime.jsx(Button, { as: is, className: clsx("accordion-button", `accordion-button__${is}`, `accordion-button__${is}--${dataTheme}`), ...(is !== "link" && {
|
|
127
170
|
icon: label && toggle && toggle[label].isToggle ? (jsxRuntime.jsx(tfi.TfiAngleDown, {})) : (jsxRuntime.jsx(tfi.TfiAngleUp, {})),
|
|
128
171
|
}), ...(is !== "link" && { onClick: handleToggle }), ...rest, children: children }));
|
|
129
172
|
}
|
|
@@ -134,11 +177,14 @@ const AccordionContent = function AccordionContent({ children, label, toggle, })
|
|
|
134
177
|
toggle[label].isToggle && (jsxRuntime.jsx("div", { className: "accordion-content", children: children })));
|
|
135
178
|
};
|
|
136
179
|
|
|
137
|
-
function Input({ className = "", classNameGroup = "",
|
|
138
|
-
|
|
180
|
+
function Input({ className = "", classNameGroup = "", error = {
|
|
181
|
+
is: false,
|
|
182
|
+
message: "",
|
|
183
|
+
}, inputRef, styleGroup, placeholder = "Insert value", isRequired, ...rest }) {
|
|
184
|
+
return (jsxRuntime.jsxs("div", { className: clsx("input-group", classNameGroup), style: styleGroup, children: [jsxRuntime.jsx("input", { ref: inputRef, className: clsx("input", error.is ? "input--error" : "", className), placeholder: placeholder, ...rest }), error && error.is && jsxRuntime.jsx("span", { className: "error", children: error.message })] }));
|
|
139
185
|
}
|
|
140
186
|
|
|
141
|
-
function TextArea({ className = "", disabled = true, hasToggleButton = true, hideHeight = "5rem", placeholder = "", showHeight = "10rem", style = {}, textareaClassName = "", ...rest }) {
|
|
187
|
+
function TextArea({ className = "", disabled = true, hasToggleButton = true, hideHeight = "5rem", placeholder = "Insert value", showHeight = "10rem", style = {}, textareaClassName = "", ...rest }) {
|
|
142
188
|
const ref = react.useRef();
|
|
143
189
|
const [isShow, setIsShow] = react.useState(false);
|
|
144
190
|
const handleClickToggle = () => {
|
|
@@ -154,7 +200,7 @@ function TextArea({ className = "", disabled = true, hasToggleButton = true, hid
|
|
|
154
200
|
};
|
|
155
201
|
return (jsxRuntime.jsxs("div", { className: clsx("textarea", className), style: style, children: [jsxRuntime.jsx("textarea", { ref: ref, className: clsx("textarea__input", textareaClassName), style: {
|
|
156
202
|
height: hasToggleButton ? hideHeight : showHeight,
|
|
157
|
-
}, placeholder: placeholder, disabled: disabled, ...rest }), hasToggleButton && (jsxRuntime.jsx("button", { className: clsx("textarea__button", isShow && "textarea__button--show"), onClick: handleClickToggle, disabled: disabled, children: jsxRuntime.jsx(tb.TbArrowsDiagonal2, { size: "1.5rem" }) }))] }));
|
|
203
|
+
}, placeholder: placeholder, disabled: disabled, ...rest }), hasToggleButton && (jsxRuntime.jsx("button", { type: "button", className: clsx("textarea__button", isShow && "textarea__button--show"), onClick: handleClickToggle, disabled: disabled, children: jsxRuntime.jsx(tb.TbArrowsDiagonal2, { size: "1.5rem" }) }))] }));
|
|
158
204
|
}
|
|
159
205
|
|
|
160
206
|
function Modal({ modalref, children, title, subtitle, footer, hasCloseButton = true, handleClose, }) {
|
|
@@ -165,54 +211,6 @@ function Loading({ img, children }) {
|
|
|
165
211
|
return (jsxRuntime.jsxs("div", { className: "loading", children: [jsxRuntime.jsx("img", { src: img ? img : "../../stories/assets/loading.gif" }), children] }));
|
|
166
212
|
}
|
|
167
213
|
|
|
168
|
-
const ThemeContext = react.createContext(undefined);
|
|
169
|
-
function ThemeProvider({ children }) {
|
|
170
|
-
const [dataTheme, setDataTheme] = react.useState();
|
|
171
|
-
const [paletteTheme, setPaletteTheme] = react.useState();
|
|
172
|
-
react.useEffect(() => {
|
|
173
|
-
if (window.matchMedia) {
|
|
174
|
-
if (localStorage.getItem("data-theme")) {
|
|
175
|
-
document.documentElement.setAttribute("data-theme", localStorage.getItem("data-theme"));
|
|
176
|
-
setDataTheme(localStorage.getItem("data-theme"));
|
|
177
|
-
}
|
|
178
|
-
else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
|
|
179
|
-
document.documentElement.setAttribute("data-theme", "dark");
|
|
180
|
-
setDataTheme("dark");
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}, []);
|
|
184
|
-
const switchDataTheme = (mode) => {
|
|
185
|
-
document.documentElement.setAttribute("data-theme", mode);
|
|
186
|
-
setDataTheme(mode);
|
|
187
|
-
localStorage.setItem("data-theme", mode);
|
|
188
|
-
};
|
|
189
|
-
const switchPaletteTheme = (mode) => {
|
|
190
|
-
document.documentElement.setAttribute("palette-theme", mode);
|
|
191
|
-
setPaletteTheme(mode);
|
|
192
|
-
localStorage.setItem("palette-theme", mode);
|
|
193
|
-
};
|
|
194
|
-
return (jsxRuntime.jsx(ThemeContext.Provider, { value: { dataTheme, switchDataTheme, paletteTheme, switchPaletteTheme }, children: children }));
|
|
195
|
-
}
|
|
196
|
-
function useTheme({ dataTheme = undefined, paletteTheme = "water", } = {}) {
|
|
197
|
-
const context = react.useContext(ThemeContext);
|
|
198
|
-
// only happens if there is an initial mode value.
|
|
199
|
-
react.useEffect(() => {
|
|
200
|
-
if (dataTheme && !localStorage.getItem("data-theme")) {
|
|
201
|
-
context?.switchDataTheme(dataTheme);
|
|
202
|
-
}
|
|
203
|
-
else if (!dataTheme && localStorage.getItem("data-theme")) {
|
|
204
|
-
localStorage.removeItem("data-theme");
|
|
205
|
-
}
|
|
206
|
-
}, []);
|
|
207
|
-
react.useEffect(() => {
|
|
208
|
-
context?.switchPaletteTheme(paletteTheme);
|
|
209
|
-
}, []);
|
|
210
|
-
if (context === undefined) {
|
|
211
|
-
throw new Error("useTheme must be used within a ThemeProvider");
|
|
212
|
-
}
|
|
213
|
-
return context;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
214
|
const LoadingContext = react.createContext(undefined);
|
|
217
215
|
function loadingReducer(state, action) {
|
|
218
216
|
switch (action.type) {
|
package/dist/esm/index.css
CHANGED
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
[palette
|
|
82
|
+
[data-palette="water"] {
|
|
83
83
|
--color-primary-100: #d6efff;
|
|
84
84
|
--color-primary-200: #ade0ff;
|
|
85
85
|
--color-primary-300: #85d0ff;
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
--color-primary-900: #00588f;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
[palette
|
|
94
|
+
[data-palette="earth"]{
|
|
95
95
|
--color-primary-100: #f6e3cb;
|
|
96
96
|
--color-primary-200: #edc897;
|
|
97
97
|
--color-primary-300: #eabe86;
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
--color-primary-900: #684312;
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
[palette
|
|
106
|
+
[data-palette="forest"] {
|
|
107
107
|
--color-primary-100: #bee8b0;
|
|
108
108
|
--color-primary-200: #a4df90;
|
|
109
109
|
--color-primary-300: #8ad671;
|
|
@@ -295,14 +295,18 @@ transition: var(--transition-bg-cubic-bezier), var(--transition-box-shadow-cubic
|
|
|
295
295
|
display: flex;
|
|
296
296
|
flex-direction: column;
|
|
297
297
|
align-items: flex-start;
|
|
298
|
+
width: 100%;
|
|
298
299
|
}
|
|
299
300
|
|
|
300
301
|
.input {
|
|
302
|
+
box-sizing: border-box;
|
|
301
303
|
background-color: var(--color-white);
|
|
302
304
|
border-radius: var(--spacing-8);
|
|
303
305
|
border: 2px solid var(--color-primary);
|
|
304
306
|
color: var(--color-black);
|
|
305
307
|
padding: var(--spacing-16) var(--spacing-24);
|
|
308
|
+
font-size:var(--font-size-16);
|
|
309
|
+
width: 100%;
|
|
306
310
|
}
|
|
307
311
|
|
|
308
312
|
.input:hover {
|
|
@@ -318,6 +322,11 @@ transition: var(--transition-bg-cubic-bezier), var(--transition-box-shadow-cubic
|
|
|
318
322
|
border: 3px solid var(--color-danger);
|
|
319
323
|
}
|
|
320
324
|
|
|
325
|
+
.input--error:focus {
|
|
326
|
+
border: 3px solid var(--color-danger);
|
|
327
|
+
outline: none;
|
|
328
|
+
}
|
|
329
|
+
|
|
321
330
|
.error {
|
|
322
331
|
font-size: 12px;
|
|
323
332
|
color: var(--color-danger);
|
|
@@ -326,6 +335,7 @@ transition: var(--transition-bg-cubic-bezier), var(--transition-box-shadow-cubic
|
|
|
326
335
|
.textarea {
|
|
327
336
|
margin-bottom: var(--spacing-8);
|
|
328
337
|
position: relative;
|
|
338
|
+
width: 100%;
|
|
329
339
|
}
|
|
330
340
|
|
|
331
341
|
.textarea__input {
|
package/dist/esm/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { Children, isValidElement, cloneElement, createContext, useState, useContext,
|
|
2
|
+
import { Children, isValidElement, cloneElement, createContext, useState, useContext, useEffect, useRef, useReducer } from 'react';
|
|
3
3
|
import clsx from 'clsx';
|
|
4
4
|
import { TfiAngleDown, TfiAngleUp } from 'react-icons/tfi';
|
|
5
5
|
import { TbArrowsDiagonal2 } from 'react-icons/tb';
|
|
@@ -78,7 +78,7 @@ function Accordion({ children, expanded = "all",
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
function AccordionItem({ children, label, isExpanded = false, }) {
|
|
81
|
-
const { toggle
|
|
81
|
+
const { toggle } = useAccordion();
|
|
82
82
|
return (jsx("div", { className: "accordion-item", style: {
|
|
83
83
|
paddingLeft: toggle && label && toggle[label].paddingLeft,
|
|
84
84
|
}, children: Children.map(children, (child) => cloneElement(child, {
|
|
@@ -96,12 +96,57 @@ function Button({ children = "Click me", className = "", icon = undefined, isNew
|
|
|
96
96
|
return as === "link" ? (jsxs(Anchor, { Custom: CustomAnchor, ...(isNewWindow && { target: "_blank" }), className: clsx(`button ${className}`, mode === "secondary" ? `button button__${mode}` : "button__link", `button__${size}`), ...rest, children: [children, icon] })) : (jsxs("button", { className: clsx("button", `button__${mode}`, `button__${size}`, className), ...rest, children: [children, icon] }));
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
const ThemeContext = createContext(undefined);
|
|
100
|
+
function ThemeProvider({ children, dataTheme: dataThemeProp, dataPalette: dataPaletteProp = "water", }) {
|
|
101
|
+
const [dataTheme, setDataTheme] = useState();
|
|
102
|
+
const [dataPalette, setDataPalette] = useState();
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (dataPaletteProp) {
|
|
105
|
+
switchDataPalette(dataPaletteProp);
|
|
106
|
+
}
|
|
107
|
+
}, [dataPaletteProp]);
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (dataThemeProp) {
|
|
110
|
+
switchDataTheme(dataThemeProp);
|
|
111
|
+
}
|
|
112
|
+
}, [dataThemeProp]);
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
if (window.matchMedia) {
|
|
115
|
+
if (localStorage.getItem("data-theme")) {
|
|
116
|
+
document.documentElement.setAttribute("data-theme", localStorage.getItem("data-theme"));
|
|
117
|
+
setDataTheme(localStorage.getItem("data-theme"));
|
|
118
|
+
}
|
|
119
|
+
else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
|
|
120
|
+
document.documentElement.setAttribute("data-theme", "dark");
|
|
121
|
+
setDataTheme("dark");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}, []);
|
|
125
|
+
const switchDataTheme = (mode) => {
|
|
126
|
+
document.documentElement.setAttribute("data-theme", mode);
|
|
127
|
+
setDataTheme(mode);
|
|
128
|
+
localStorage.setItem("data-theme", mode);
|
|
129
|
+
};
|
|
130
|
+
const switchDataPalette = (mode) => {
|
|
131
|
+
document.documentElement.setAttribute("data-palette", mode);
|
|
132
|
+
setDataPalette(mode);
|
|
133
|
+
localStorage.setItem("palette-theme", mode);
|
|
134
|
+
};
|
|
135
|
+
return (jsx(ThemeContext.Provider, { value: { dataTheme, switchDataTheme, dataPalette, switchDataPalette }, children: children }));
|
|
136
|
+
}
|
|
137
|
+
function useTheme() {
|
|
138
|
+
const context = useContext(ThemeContext);
|
|
139
|
+
if (context === undefined) {
|
|
140
|
+
throw new Error("useTheme must be used within a ThemeProvider");
|
|
141
|
+
}
|
|
142
|
+
return context;
|
|
143
|
+
}
|
|
144
|
+
|
|
100
145
|
function AccordionButton({ children, is = "link", label,
|
|
101
146
|
// toggle,
|
|
102
147
|
// setToggle = (prev: any) => void,
|
|
103
148
|
...rest }) {
|
|
104
|
-
|
|
149
|
+
const { dataTheme } = useTheme();
|
|
105
150
|
const { toggle, setToggle } = useAccordion();
|
|
106
151
|
const handleToggle = () => {
|
|
107
152
|
setToggle((prev) => {
|
|
@@ -119,9 +164,7 @@ function AccordionButton({ children, is = "link", label,
|
|
|
119
164
|
}
|
|
120
165
|
});
|
|
121
166
|
};
|
|
122
|
-
return (jsx(Button, { as: is, className: clsx("accordion-button", `accordion-button__${is}`
|
|
123
|
-
// `accordion-button__${is}--${dataTheme}`
|
|
124
|
-
), ...(is !== "link" && {
|
|
167
|
+
return (jsx(Button, { as: is, className: clsx("accordion-button", `accordion-button__${is}`, `accordion-button__${is}--${dataTheme}`), ...(is !== "link" && {
|
|
125
168
|
icon: label && toggle && toggle[label].isToggle ? (jsx(TfiAngleDown, {})) : (jsx(TfiAngleUp, {})),
|
|
126
169
|
}), ...(is !== "link" && { onClick: handleToggle }), ...rest, children: children }));
|
|
127
170
|
}
|
|
@@ -132,11 +175,14 @@ const AccordionContent = function AccordionContent({ children, label, toggle, })
|
|
|
132
175
|
toggle[label].isToggle && (jsx("div", { className: "accordion-content", children: children })));
|
|
133
176
|
};
|
|
134
177
|
|
|
135
|
-
function Input({ className = "", classNameGroup = "",
|
|
136
|
-
|
|
178
|
+
function Input({ className = "", classNameGroup = "", error = {
|
|
179
|
+
is: false,
|
|
180
|
+
message: "",
|
|
181
|
+
}, inputRef, styleGroup, placeholder = "Insert value", isRequired, ...rest }) {
|
|
182
|
+
return (jsxs("div", { className: clsx("input-group", classNameGroup), style: styleGroup, children: [jsx("input", { ref: inputRef, className: clsx("input", error.is ? "input--error" : "", className), placeholder: placeholder, ...rest }), error && error.is && jsx("span", { className: "error", children: error.message })] }));
|
|
137
183
|
}
|
|
138
184
|
|
|
139
|
-
function TextArea({ className = "", disabled = true, hasToggleButton = true, hideHeight = "5rem", placeholder = "", showHeight = "10rem", style = {}, textareaClassName = "", ...rest }) {
|
|
185
|
+
function TextArea({ className = "", disabled = true, hasToggleButton = true, hideHeight = "5rem", placeholder = "Insert value", showHeight = "10rem", style = {}, textareaClassName = "", ...rest }) {
|
|
140
186
|
const ref = useRef();
|
|
141
187
|
const [isShow, setIsShow] = useState(false);
|
|
142
188
|
const handleClickToggle = () => {
|
|
@@ -152,7 +198,7 @@ function TextArea({ className = "", disabled = true, hasToggleButton = true, hid
|
|
|
152
198
|
};
|
|
153
199
|
return (jsxs("div", { className: clsx("textarea", className), style: style, children: [jsx("textarea", { ref: ref, className: clsx("textarea__input", textareaClassName), style: {
|
|
154
200
|
height: hasToggleButton ? hideHeight : showHeight,
|
|
155
|
-
}, placeholder: placeholder, disabled: disabled, ...rest }), hasToggleButton && (jsx("button", { className: clsx("textarea__button", isShow && "textarea__button--show"), onClick: handleClickToggle, disabled: disabled, children: jsx(TbArrowsDiagonal2, { size: "1.5rem" }) }))] }));
|
|
201
|
+
}, placeholder: placeholder, disabled: disabled, ...rest }), hasToggleButton && (jsx("button", { type: "button", className: clsx("textarea__button", isShow && "textarea__button--show"), onClick: handleClickToggle, disabled: disabled, children: jsx(TbArrowsDiagonal2, { size: "1.5rem" }) }))] }));
|
|
156
202
|
}
|
|
157
203
|
|
|
158
204
|
function Modal({ modalref, children, title, subtitle, footer, hasCloseButton = true, handleClose, }) {
|
|
@@ -163,54 +209,6 @@ function Loading({ img, children }) {
|
|
|
163
209
|
return (jsxs("div", { className: "loading", children: [jsx("img", { src: img ? img : "../../stories/assets/loading.gif" }), children] }));
|
|
164
210
|
}
|
|
165
211
|
|
|
166
|
-
const ThemeContext = createContext(undefined);
|
|
167
|
-
function ThemeProvider({ children }) {
|
|
168
|
-
const [dataTheme, setDataTheme] = useState();
|
|
169
|
-
const [paletteTheme, setPaletteTheme] = useState();
|
|
170
|
-
useEffect(() => {
|
|
171
|
-
if (window.matchMedia) {
|
|
172
|
-
if (localStorage.getItem("data-theme")) {
|
|
173
|
-
document.documentElement.setAttribute("data-theme", localStorage.getItem("data-theme"));
|
|
174
|
-
setDataTheme(localStorage.getItem("data-theme"));
|
|
175
|
-
}
|
|
176
|
-
else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
|
|
177
|
-
document.documentElement.setAttribute("data-theme", "dark");
|
|
178
|
-
setDataTheme("dark");
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}, []);
|
|
182
|
-
const switchDataTheme = (mode) => {
|
|
183
|
-
document.documentElement.setAttribute("data-theme", mode);
|
|
184
|
-
setDataTheme(mode);
|
|
185
|
-
localStorage.setItem("data-theme", mode);
|
|
186
|
-
};
|
|
187
|
-
const switchPaletteTheme = (mode) => {
|
|
188
|
-
document.documentElement.setAttribute("palette-theme", mode);
|
|
189
|
-
setPaletteTheme(mode);
|
|
190
|
-
localStorage.setItem("palette-theme", mode);
|
|
191
|
-
};
|
|
192
|
-
return (jsx(ThemeContext.Provider, { value: { dataTheme, switchDataTheme, paletteTheme, switchPaletteTheme }, children: children }));
|
|
193
|
-
}
|
|
194
|
-
function useTheme({ dataTheme = undefined, paletteTheme = "water", } = {}) {
|
|
195
|
-
const context = useContext(ThemeContext);
|
|
196
|
-
// only happens if there is an initial mode value.
|
|
197
|
-
useEffect(() => {
|
|
198
|
-
if (dataTheme && !localStorage.getItem("data-theme")) {
|
|
199
|
-
context?.switchDataTheme(dataTheme);
|
|
200
|
-
}
|
|
201
|
-
else if (!dataTheme && localStorage.getItem("data-theme")) {
|
|
202
|
-
localStorage.removeItem("data-theme");
|
|
203
|
-
}
|
|
204
|
-
}, []);
|
|
205
|
-
useEffect(() => {
|
|
206
|
-
context?.switchPaletteTheme(paletteTheme);
|
|
207
|
-
}, []);
|
|
208
|
-
if (context === undefined) {
|
|
209
|
-
throw new Error("useTheme must be used within a ThemeProvider");
|
|
210
|
-
}
|
|
211
|
-
return context;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
212
|
const LoadingContext = createContext(undefined);
|
|
215
213
|
function loadingReducer(state, action) {
|
|
216
214
|
switch (action.type) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geoinsight/react-components",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "This library is the main UI component library for geoinsight",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"clsx": "^1.2.1",
|
|
19
19
|
"react": "^18.2.0",
|
|
20
20
|
"react-dom": "^18.2.0",
|
|
21
|
+
"react-hook-form": "^7.45.2",
|
|
21
22
|
"react-icons": "^4.7.1",
|
|
22
23
|
"typescript": "^4.9.4"
|
|
23
24
|
},
|