@safestrong/ppa-component-library 1.1.2 → 1.2.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/img/dark.png +0 -0
- package/dist/img/light.png +0 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +34 -31
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +34 -31
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +97 -55
- package/package.json +3 -2
- package/readme.md +144 -0
|
Binary file
|
|
Binary file
|
package/dist/index.d.mts
CHANGED
|
@@ -76,7 +76,7 @@ declare namespace Toast {
|
|
|
76
76
|
type Expandable = {
|
|
77
77
|
children: React.ReactNode;
|
|
78
78
|
title: string;
|
|
79
|
-
className
|
|
79
|
+
className?: string;
|
|
80
80
|
isOpen?: boolean;
|
|
81
81
|
};
|
|
82
82
|
declare function Expandable({ children, title, className, isOpen, }: Readonly<Expandable>): React.JSX.Element;
|
|
@@ -93,6 +93,6 @@ declare function MultiSelect({ list, state, }: Readonly<{
|
|
|
93
93
|
};
|
|
94
94
|
}>): React.JSX.Element;
|
|
95
95
|
|
|
96
|
-
declare function
|
|
96
|
+
declare function ThemeToggle(attr: Readonly<React.InputHTMLAttributes<HTMLInputElement>>): React.JSX.Element;
|
|
97
97
|
|
|
98
|
-
export { Button, Card,
|
|
98
|
+
export { Button, Card, Expandable, MultiSelect, NavTabClient, SingleSelect, Slider, TextInput, ThemeToggle, Toast, Tooltip };
|
package/dist/index.d.ts
CHANGED
|
@@ -76,7 +76,7 @@ declare namespace Toast {
|
|
|
76
76
|
type Expandable = {
|
|
77
77
|
children: React.ReactNode;
|
|
78
78
|
title: string;
|
|
79
|
-
className
|
|
79
|
+
className?: string;
|
|
80
80
|
isOpen?: boolean;
|
|
81
81
|
};
|
|
82
82
|
declare function Expandable({ children, title, className, isOpen, }: Readonly<Expandable>): React.JSX.Element;
|
|
@@ -93,6 +93,6 @@ declare function MultiSelect({ list, state, }: Readonly<{
|
|
|
93
93
|
};
|
|
94
94
|
}>): React.JSX.Element;
|
|
95
95
|
|
|
96
|
-
declare function
|
|
96
|
+
declare function ThemeToggle(attr: Readonly<React.InputHTMLAttributes<HTMLInputElement>>): React.JSX.Element;
|
|
97
97
|
|
|
98
|
-
export { Button, Card,
|
|
98
|
+
export { Button, Card, Expandable, MultiSelect, NavTabClient, SingleSelect, Slider, TextInput, ThemeToggle, Toast, Tooltip };
|
package/dist/index.js
CHANGED
|
@@ -61,13 +61,13 @@ var index_exports = {};
|
|
|
61
61
|
__export(index_exports, {
|
|
62
62
|
Button: () => Button,
|
|
63
63
|
Card: () => Card,
|
|
64
|
-
Dashboard: () => Dashboard,
|
|
65
64
|
Expandable: () => Expandable,
|
|
66
65
|
MultiSelect: () => MultiSelect,
|
|
67
66
|
NavTabClient: () => NavTabClient,
|
|
68
67
|
SingleSelect: () => SingleSelect,
|
|
69
68
|
Slider: () => Slider,
|
|
70
69
|
TextInput: () => TextInput,
|
|
70
|
+
ThemeToggle: () => ThemeToggle,
|
|
71
71
|
Toast: () => Toast,
|
|
72
72
|
Tooltip: () => Tooltip
|
|
73
73
|
});
|
|
@@ -75,8 +75,8 @@ module.exports = __toCommonJS(index_exports);
|
|
|
75
75
|
|
|
76
76
|
// src/components/Button.tsx
|
|
77
77
|
var import_react = __toESM(require("react"));
|
|
78
|
-
var import_free_solid_svg_icons = require("@fortawesome/free-solid-svg-icons");
|
|
79
78
|
var import_react_fontawesome = require("@fortawesome/react-fontawesome");
|
|
79
|
+
var import_free_solid_svg_icons = require("@fortawesome/free-solid-svg-icons");
|
|
80
80
|
function Button(_a) {
|
|
81
81
|
var _b = _a, {
|
|
82
82
|
label,
|
|
@@ -95,7 +95,7 @@ function Button(_a) {
|
|
|
95
95
|
return /* @__PURE__ */ import_react.default.createElement(
|
|
96
96
|
"button",
|
|
97
97
|
__spreadProps(__spreadValues({}, rest), {
|
|
98
|
-
className: `${!icon && "py-[0.
|
|
98
|
+
className: `${!icon && "py-[0.85rem]"} ${className} ${btnType == "secondary" && "btn__secondary"} btn__primary`
|
|
99
99
|
}),
|
|
100
100
|
buttonIcon && icon && /* @__PURE__ */ import_react.default.createElement(
|
|
101
101
|
import_react_fontawesome.FontAwesomeIcon,
|
|
@@ -111,7 +111,7 @@ function Button(_a) {
|
|
|
111
111
|
// src/components/TextInput.tsx
|
|
112
112
|
var import_react2 = __toESM(require("react"));
|
|
113
113
|
var import_react_fontawesome2 = require("@fortawesome/react-fontawesome");
|
|
114
|
-
var input__icon = "px-[0.
|
|
114
|
+
var input__icon = "px-[0.85rem] text-[1.1rem] text-[var(--color-icon-input)]";
|
|
115
115
|
function TextInput(_a) {
|
|
116
116
|
var _b = _a, {
|
|
117
117
|
label,
|
|
@@ -122,10 +122,10 @@ function TextInput(_a) {
|
|
|
122
122
|
"labelFor",
|
|
123
123
|
"icon"
|
|
124
124
|
]);
|
|
125
|
-
return /* @__PURE__ */ import_react2.default.createElement("div", { className: "group ..." }, label && /* @__PURE__ */ import_react2.default.createElement("label", { htmlFor: labelFor, className: "text-input__label" }, label), /* @__PURE__ */ import_react2.default.createElement("div", { className: "text-input__wrapper" }, icon && /* @__PURE__ */ import_react2.default.createElement(import_react_fontawesome2.FontAwesomeIcon, { icon, className: input__icon }), /* @__PURE__ */ import_react2.default.createElement(
|
|
125
|
+
return /* @__PURE__ */ import_react2.default.createElement("div", { className: "group ... w-full" }, label && /* @__PURE__ */ import_react2.default.createElement("label", { htmlFor: labelFor, className: "text-input__label" }, label), /* @__PURE__ */ import_react2.default.createElement("div", { className: "text-input__wrapper" }, icon && /* @__PURE__ */ import_react2.default.createElement(import_react_fontawesome2.FontAwesomeIcon, { icon, className: input__icon }), /* @__PURE__ */ import_react2.default.createElement(
|
|
126
126
|
"input",
|
|
127
127
|
__spreadProps(__spreadValues({}, attr), {
|
|
128
|
-
className: `text-input ${attr.className} ${icon && "!pl-0"}`
|
|
128
|
+
className: `text-input w-full ${attr.className} ${icon && "!pl-0"}`
|
|
129
129
|
})
|
|
130
130
|
)));
|
|
131
131
|
}
|
|
@@ -135,14 +135,14 @@ var import_react3 = __toESM(require("react"));
|
|
|
135
135
|
var import_free_solid_svg_icons2 = require("@fortawesome/free-solid-svg-icons");
|
|
136
136
|
var import_react_fontawesome3 = require("@fortawesome/react-fontawesome");
|
|
137
137
|
function Slider(attr) {
|
|
138
|
-
return /* @__PURE__ */ import_react3.default.createElement("div", { className: "slider__wrapper group" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
138
|
+
return /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex items-center h-[3rem]" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "slider__wrapper group" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
139
139
|
"input",
|
|
140
140
|
__spreadProps(__spreadValues({}, attr), {
|
|
141
141
|
id: "slider",
|
|
142
142
|
type: "checkbox",
|
|
143
143
|
className: "peer ... w-[2rem] opacity-[0] cursor-pointer"
|
|
144
144
|
})
|
|
145
|
-
), /* @__PURE__ */ import_react3.default.createElement("label", { htmlFor: "slider", className: "slider" }, /* @__PURE__ */ import_react3.default.createElement(import_react_fontawesome3.FontAwesomeIcon, { icon: import_free_solid_svg_icons2.faCheck, className: "text-[0.7rem]" })));
|
|
145
|
+
), /* @__PURE__ */ import_react3.default.createElement("label", { htmlFor: "slider", className: "slider" }, /* @__PURE__ */ import_react3.default.createElement(import_react_fontawesome3.FontAwesomeIcon, { icon: import_free_solid_svg_icons2.faCheck, className: "text-[0.7rem]" }))));
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
// src/components/SingleSelect.tsx
|
|
@@ -163,7 +163,7 @@ function SingleSelect(attr) {
|
|
|
163
163
|
setSelected({ label, value });
|
|
164
164
|
setKeyword("");
|
|
165
165
|
}
|
|
166
|
-
return /* @__PURE__ */ import_react4.default.createElement("div",
|
|
166
|
+
return /* @__PURE__ */ import_react4.default.createElement("div", { className: "w-full" }, attr.label && /* @__PURE__ */ import_react4.default.createElement("label", { className: "text-input__label", htmlFor: attr.labelHtml }, attr.label), /* @__PURE__ */ import_react4.default.createElement("div", { className: "text-input__wrapper relative" }, /* @__PURE__ */ import_react4.default.createElement(
|
|
167
167
|
"input",
|
|
168
168
|
__spreadProps(__spreadValues(__spreadValues({}, attr), attr.onChange ? { onChange: attr.onChange } : {}), {
|
|
169
169
|
value: (_a = attr.value) != null ? _a : selected.value,
|
|
@@ -175,7 +175,7 @@ function SingleSelect(attr) {
|
|
|
175
175
|
value: keyword,
|
|
176
176
|
type: "search",
|
|
177
177
|
onChange: (e) => setKeyword(e.target.value),
|
|
178
|
-
className: "text-input peer ...",
|
|
178
|
+
className: "text-input peer ... w-full",
|
|
179
179
|
placeholder: selected.value ? selected.label : "Cari opsi ..."
|
|
180
180
|
}, attr)
|
|
181
181
|
), /* @__PURE__ */ import_react4.default.createElement("div", { className: "select-item__wrapper" }, getFiltered().length == 0 && keyword != "" && /* @__PURE__ */ import_react4.default.createElement("button", { className: "select-item text-[var(--color-danger)]" }, "Tidak ada Item"), getFiltered().map(({ label, value }) => /* @__PURE__ */ import_react4.default.createElement(
|
|
@@ -202,7 +202,7 @@ var import_react5 = __toESM(require("react"));
|
|
|
202
202
|
function Tooltip({
|
|
203
203
|
children,
|
|
204
204
|
text,
|
|
205
|
-
position
|
|
205
|
+
position = "top"
|
|
206
206
|
}) {
|
|
207
207
|
function getAccent() {
|
|
208
208
|
const mapping = {
|
|
@@ -230,7 +230,7 @@ function NavTabClient({
|
|
|
230
230
|
"button",
|
|
231
231
|
{
|
|
232
232
|
key: value,
|
|
233
|
-
className: `navtab__item ${state.active == value
|
|
233
|
+
className: `navtab__item ${state.active == value ? "navtab__item__active" : "hover:bg-[var(--color-border)]"}`,
|
|
234
234
|
onClick: () => state.setActive(value)
|
|
235
235
|
},
|
|
236
236
|
label
|
|
@@ -257,7 +257,7 @@ var import_free_solid_svg_icons4 = require("@fortawesome/free-solid-svg-icons");
|
|
|
257
257
|
function Toast({
|
|
258
258
|
title,
|
|
259
259
|
description,
|
|
260
|
-
type,
|
|
260
|
+
type = "info",
|
|
261
261
|
className
|
|
262
262
|
}) {
|
|
263
263
|
return /* @__PURE__ */ import_react8.default.createElement("div", { className: `${className} toast__wrapper group` }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "toast__body" }, /* @__PURE__ */ import_react8.default.createElement(
|
|
@@ -335,13 +335,13 @@ var import_react10 = __toESM(require("react"));
|
|
|
335
335
|
var import_react_fontawesome7 = require("@fortawesome/react-fontawesome");
|
|
336
336
|
var import_free_solid_svg_icons6 = require("@fortawesome/free-solid-svg-icons");
|
|
337
337
|
function MultiSelect({
|
|
338
|
-
list
|
|
338
|
+
list,
|
|
339
339
|
state
|
|
340
340
|
}) {
|
|
341
341
|
const [keyword, setKeyword] = (0, import_react10.useState)("");
|
|
342
342
|
const inputKeyword = (0, import_react10.useDeferredValue)(keyword);
|
|
343
343
|
function getFiltered() {
|
|
344
|
-
return
|
|
344
|
+
return list.filter(
|
|
345
345
|
({ label, value }) => label.toLowerCase().includes(inputKeyword.toLowerCase()) || value.toLowerCase().includes(inputKeyword.toLowerCase())
|
|
346
346
|
);
|
|
347
347
|
}
|
|
@@ -358,8 +358,8 @@ function MultiSelect({
|
|
|
358
358
|
return state.value.find((item) => item.value == value);
|
|
359
359
|
}
|
|
360
360
|
const selectUnSelectAll = (0, import_react10.useCallback)(() => {
|
|
361
|
-
const isAllSelected = state.value.length ==
|
|
362
|
-
state.select(isAllSelected ? [] :
|
|
361
|
+
const isAllSelected = state.value.length == list.length;
|
|
362
|
+
state.select(isAllSelected ? [] : list);
|
|
363
363
|
}, [state.value]);
|
|
364
364
|
return /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-input__wrapper relative" }, /* @__PURE__ */ import_react10.default.createElement(
|
|
365
365
|
"input",
|
|
@@ -389,34 +389,37 @@ function MultiSelect({
|
|
|
389
389
|
}
|
|
390
390
|
var input__icon3 = "pr-[0.7rem] text-[var(--color-icon-input)]";
|
|
391
391
|
|
|
392
|
-
// src/components/
|
|
392
|
+
// src/components/ThemeToggle.tsx
|
|
393
393
|
var import_react11 = __toESM(require("react"));
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
{ label: "Option 3", value: "option3" }
|
|
398
|
-
];
|
|
399
|
-
function Dashboard() {
|
|
400
|
-
const [selectedItem, setSelectedItem] = (0, import_react11.useState)([]);
|
|
401
|
-
return /* @__PURE__ */ import_react11.default.createElement("div", null, /* @__PURE__ */ import_react11.default.createElement(
|
|
402
|
-
MultiSelect,
|
|
394
|
+
function ThemeToggle(attr) {
|
|
395
|
+
return /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex items-center h-[3rem]" }, /* @__PURE__ */ import_react11.default.createElement(
|
|
396
|
+
"label",
|
|
403
397
|
{
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
}
|
|
398
|
+
htmlFor: "theme-toggle",
|
|
399
|
+
className: "slider__wrapper slider-theme slider-theme-light"
|
|
400
|
+
},
|
|
401
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
402
|
+
"input",
|
|
403
|
+
__spreadProps(__spreadValues({}, attr), {
|
|
404
|
+
id: "theme-toggle",
|
|
405
|
+
type: "checkbox",
|
|
406
|
+
className: "peer ... w-[2rem] opacity-[0] cursor-pointer"
|
|
407
|
+
})
|
|
408
|
+
),
|
|
409
|
+
/* @__PURE__ */ import_react11.default.createElement("span", { className: "slider-theme__bullet" })
|
|
407
410
|
));
|
|
408
411
|
}
|
|
409
412
|
// Annotate the CommonJS export names for ESM import in node:
|
|
410
413
|
0 && (module.exports = {
|
|
411
414
|
Button,
|
|
412
415
|
Card,
|
|
413
|
-
Dashboard,
|
|
414
416
|
Expandable,
|
|
415
417
|
MultiSelect,
|
|
416
418
|
NavTabClient,
|
|
417
419
|
SingleSelect,
|
|
418
420
|
Slider,
|
|
419
421
|
TextInput,
|
|
422
|
+
ThemeToggle,
|
|
420
423
|
Toast,
|
|
421
424
|
Tooltip
|
|
422
425
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/Button.tsx","../src/components/TextInput.tsx","../src/components/Slider.tsx","../src/components/SingleSelect.tsx","../src/components/Tooltip.tsx","../src/components/NavTabClient.tsx","../src/components/Card.tsx","../src/components/Toast.tsx","../src/components/Expandable.tsx","../src/components/MultiSelect.tsx","../src/components/Dashboard.tsx"],"sourcesContent":["export { default as Button } from \"./components/Button\";\nexport { default as TextInput } from \"./components/TextInput\";\nexport { default as Slider } from \"./components/Slider\";\nexport { default as SingleSelect } from \"./components/SingleSelect\";\nexport { default as Tooltip } from \"./components/Tooltip\";\nexport { default as NavTabClient } from \"./components/NavTabClient\";\nexport { default as Card } from \"./components/Card\";\nexport { default as Toast } from \"./components/Toast\";\nexport { default as Expandable } from \"./components/Expandable\";\nexport { default as MultiSelect } from \"./components/MultiSelect\";\nexport { default as Dashboard } from \"./components/Dashboard\";\n","import React from \"react\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { faCircleNotch } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\ntype Button = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n icon?: IconProp;\n label: string;\n btnType?: \"primary\" | \"secondary\" | \"tertiary\";\n isLoading?: boolean;\n};\n\nexport default function Button({\n label,\n icon,\n isLoading,\n btnType,\n className,\n ...rest\n}: Readonly<Button>) {\n const buttonIcon = isLoading ? faCircleNotch : icon;\n return (\n <button\n {...rest}\n className={`${!icon && \"py-[0.67rem]\"} ${className} ${\n btnType == \"secondary\" && \"btn__secondary\"\n } btn__primary`}\n >\n {buttonIcon && icon && (\n <FontAwesomeIcon\n icon={buttonIcon}\n className={`text-[1.1rem] ${isLoading && \"animate-spin\"}`}\n />\n )}\n {isLoading ? \"Memproses ...\" : label}\n </button>\n );\n}\n","import React from \"react\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nconst input__icon = \"px-[0.7rem] text-[1.1rem] text-[var(--color-icon-input)]\";\n\nexport default function TextInput({\n label,\n labelFor,\n icon,\n ...attr\n}: Readonly<\n React.InputHTMLAttributes<HTMLInputElement> & {\n label?: string;\n labelFor?: string;\n icon?: IconProp;\n }\n>) {\n return (\n <div className=\"group ...\">\n {label && (\n <label htmlFor={labelFor} className=\"text-input__label\">\n {label}\n </label>\n )}\n <div className=\"text-input__wrapper\">\n {icon && <FontAwesomeIcon icon={icon} className={input__icon} />}\n <input\n {...attr}\n className={`text-input ${attr.className} ${icon && \"!pl-0\"}`}\n />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nexport default function Slider(\n attr: Readonly<React.InputHTMLAttributes<HTMLInputElement>>\n) {\n return (\n <div className=\"slider__wrapper group\">\n <input\n {...attr}\n id=\"slider\"\n type=\"checkbox\"\n className=\"peer ... w-[2rem] opacity-[0] cursor-pointer\"\n />\n <label htmlFor=\"slider\" className=\"slider\">\n <FontAwesomeIcon icon={faCheck} className=\"text-[0.7rem]\" />\n </label>\n </div>\n );\n}\n","\"use client\";\nimport React, { useDeferredValue, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faChevronDown } from \"@fortawesome/free-solid-svg-icons\";\n\ntype SingleSelect = React.InputHTMLAttributes<HTMLInputElement> & {\n label?: string;\n labelHtml?: string;\n options: {\n label: string;\n value: string;\n }[];\n};\n\nexport default function SingleSelect(attr: Readonly<SingleSelect>) {\n const [selected, setSelected] = useState({ label: \"\", value: \"\" });\n const [keyword, setKeyword] = useState(\"\");\n const inputKeyword = useDeferredValue(keyword);\n\n function getFiltered() {\n return attr.options.filter(\n ({ label, value }) =>\n label.toLowerCase().includes(inputKeyword.toLowerCase()) ||\n value.toLowerCase().includes(inputKeyword.toLowerCase())\n );\n }\n\n function selectItem({ label, value }: { label: string; value: string }) {\n setSelected({ label, value });\n setKeyword(\"\");\n }\n\n return (\n <div>\n {attr.label && (\n <label className=\"text-input__label\" htmlFor={attr.labelHtml}>\n {attr.label}\n </label>\n )}\n <div className=\"text-input__wrapper relative\">\n <input\n {...attr}\n {...(attr.onChange ? { onChange: attr.onChange } : {})}\n value={attr.value ?? selected.value}\n type=\"hidden\"\n />\n <input\n value={keyword}\n type=\"search\"\n onChange={(e) => setKeyword(e.target.value)}\n className=\"text-input peer ...\"\n placeholder={selected.value ? selected.label : \"Cari opsi ...\"}\n {...attr}\n />\n <div className=\"select-item__wrapper\">\n {getFiltered().length == 0 && keyword != \"\" && (\n <button className=\"select-item text-[var(--color-danger)]\">\n Tidak ada Item\n </button>\n )}\n {getFiltered().map(({ label, value }) => (\n <button\n onClick={() => selectItem({ label, value })}\n key={value}\n className=\"select-item\"\n >\n {label}\n {selected.value == value && (\n <FontAwesomeIcon\n icon={faCheck}\n className=\"text-[var(--color-primary)]\"\n />\n )}\n </button>\n ))}\n </div>\n <FontAwesomeIcon icon={faChevronDown} className={input__icon} />\n </div>\n </div>\n );\n}\n\nconst input__icon = \"pr-[0.7rem] text-[var(--color-icon-input)]\";\n","import React from \"react\";\n\ntype Tooltip = {\n children: React.ReactNode;\n text: string;\n position: \"top\" | \"bottom\" | \"right\" | \"left\";\n};\n\nexport default function Tooltip({\n children,\n text,\n position,\n}: Readonly<Tooltip>) {\n function getAccent() {\n const mapping = {\n top,\n bottom,\n left,\n right,\n };\n return mapping[position];\n }\n return (\n <div className=\"relative\">\n <div className=\"peer\">{children}</div>\n <span className={`tooltip-text ${getAccent()}`}>{text}</span>\n </div>\n );\n}\n\nconst top =\n \"bottom-full translate-y-[-0.3rem] right-0 after:bottom-0 after:translate-y-[0.25rem] \";\nconst bottom =\n \"right-0 top-full translate-y-[0.3rem] after:top-[-0.4rem] after:translate-y-[0.2rem] \";\nconst right =\n \"left-full w-[max-content] translate-x-[0.6rem] after:left-[-0.2rem] top-[-0.2rem] after:top-[0.6rem]\";\nconst left =\n \"right-full w-[max-content] translate-x-[-0.6rem] top-[-0.2rem] after:right-[-0.2rem] after:top-[0.6rem]\";\n","import React from \"react\";\n\ntype Option = {\n label: string;\n value: string;\n};\n\nexport default function NavTabClient({\n items,\n state,\n}: Readonly<{\n items: Option[];\n state: {\n active: string;\n setActive: (val: string) => void;\n };\n}>) {\n return (\n <nav className=\"navtab__wrapper\">\n {items.map(({ label, value }) => (\n <button\n key={value}\n className={`navtab__item ${\n state.active == value && \"navtab__item__active\"\n }`}\n onClick={() => state.setActive(value)}\n >\n {label}\n </button>\n ))}\n </nav>\n );\n}\n","import React from \"react\";\n\ntype Card = {\n children: React.ReactNode;\n className: string;\n};\n\nexport default function Card({ children, className }: Readonly<Card>) {\n return <div className={`card ${className}`}>{children}</div>;\n}\n\nconst Footer = ({\n className,\n children,\n}: {\n className?: string;\n children?: React.ReactNode;\n}) => {\n return (\n <div className={`${className} border-t border-t-[var(--color-border)]`}>\n {children}\n </div>\n );\n};\nCard.Footer = Footer;\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faCheckCircle,\n faInfoCircle,\n faQuestionCircle,\n faXmarkCircle,\n} from \"@fortawesome/free-solid-svg-icons\";\n\ntype ToastType = \"warning\" | \"success\" | \"info\" | \"danger\";\ntype Toast = {\n title: string;\n className?: string;\n description: string;\n type: ToastType;\n};\n\nexport default function Toast({\n title,\n description,\n type,\n className,\n}: Readonly<Toast>) {\n return (\n <div className={`${className} toast__wrapper group`}>\n <div className=\"toast__body\">\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"text-[1.2rem]\"\n style={{ color: getColor(type) }}\n />\n <div>\n <p className=\"toast__title\">{title}</p>\n <p className=\"toast__description\">{description}</p>\n </div>\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"toast-bg__icon\"\n style={{ color: getColor(type) }}\n />\n </div>\n <p className=\"toast__bar\" style={{ background: getColor(type) }}></p>\n </div>\n );\n}\n\nconst Inline = ({ text, type }: { text: string; type: ToastType }) => {\n return (\n <div\n className=\"toast__inline\"\n style={{ background: `var(--color-${type}-soft)`, opacity: 0.9 }}\n >\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"text-[1.1rem]\"\n style={{ color: getColor(type) }}\n />\n <p>{text}</p>\n </div>\n );\n};\n\nToast.Inline = Inline;\n\nfunction getColor(type: string) {\n return `var(--color-${type})`;\n}\n\nfunction getIcon(type: string) {\n const mapping = {\n warning: faQuestionCircle,\n info: faInfoCircle,\n danger: faXmarkCircle,\n success: faCheckCircle,\n };\n //@ts-expect-error call object using array index\n return mapping[type];\n}\n","import React from \"react\";\nimport { faCaretRight } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\ntype Expandable = {\n children: React.ReactNode;\n title: string;\n className: string;\n isOpen?: boolean;\n};\n\nexport default function Expandable({\n children,\n title,\n className,\n isOpen,\n}: Readonly<Expandable>) {\n const name = title.replace(\" \", \"\");\n return (\n <div className={`expandable ${className}`}>\n <input\n id={name}\n type=\"checkbox\"\n defaultChecked={isOpen}\n className=\"opacity-[0] peer absolute top-0 ex-title\"\n />\n <FontAwesomeIcon icon={faCaretRight} className=\"expandable__icon\" />\n <label htmlFor={name} className=\"expandable__title\">\n {title}\n </label>\n <div className=\"expandable__body\">\n <div className=\"p-[0.75rem] px-[1rem]\">{children}</div>\n </div>\n </div>\n );\n}\n","import React, { useCallback, useDeferredValue, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faListCheck } from \"@fortawesome/free-solid-svg-icons\";\n\ntype Option = {\n value: string;\n label: string;\n};\n\nexport default function MultiSelect({\n list,\n state,\n}: Readonly<{\n list: Option[];\n state: { value: Option[]; select: (newVal: Option[]) => void };\n}>) {\n const [keyword, setKeyword] = useState(\"\");\n const inputKeyword = useDeferredValue(keyword);\n\n function getFiltered() {\n return list.filter(\n ({ label, value }) =>\n label.toLowerCase().includes(inputKeyword.toLowerCase()) ||\n value.toLowerCase().includes(inputKeyword.toLowerCase())\n );\n }\n\n function selectItem({ label, value }: { label: string; value: string }) {\n //@ts-expect-error: avoid check\n state.select((prev) => {\n const isItemExist = prev.find((item: any) => item.value == value);\n if (isItemExist) {\n return prev.filter((item: any) => item.value != value);\n }\n return [...prev, { label, value }];\n });\n }\n\n function isItemExist(value: string) {\n return state.value.find((item: any) => item.value == value);\n }\n\n const selectUnSelectAll = useCallback(() => {\n const isAllSelected = state.value.length == list.length;\n state.select(isAllSelected ? [] : list);\n }, [state.value]);\n\n return (\n <div className=\"text-input__wrapper relative\">\n <input\n value={keyword}\n type=\"search\"\n placeholder={`${state.value.length} Dipilih`}\n className=\"text-input peer ...\"\n onChange={(e) => setKeyword(e.target.value)}\n />\n <div className=\"select-item__wrapper select-multiple__wrapper\">\n {getFiltered().length == 0 && keyword != \"\" && (\n <button className=\"select-item text-[var(--color-danger)]\">\n Tidak ada Item\n </button>\n )}\n {getFiltered().map(({ label, value }) => (\n <button\n onClick={() => selectItem({ label, value })}\n key={value}\n className=\"select-item\"\n >\n {label}\n {isItemExist(value) && (\n <FontAwesomeIcon\n icon={faCheck}\n className=\"text-[var(--color-primary)]\"\n />\n )}\n </button>\n ))}\n </div>\n <button className=\"cursor-pointer\" onClick={selectUnSelectAll}>\n <FontAwesomeIcon icon={faListCheck} className={input__icon} />\n </button>\n </div>\n );\n}\nconst input__icon = \"pr-[0.7rem] text-[var(--color-icon-input)]\";\n","import React, { useState } from \"react\";\nimport MultiSelect from \"./MultiSelect\";\n\nconst list = [\n { label: \"Option 1\", value: \"option1\" },\n { label: \"Option 2\", value: \"option2\" },\n { label: \"Option 3\", value: \"option3\" },\n];\nexport default function Dashboard() {\n const [selectedItem, setSelectedItem] = useState<\n { label: string; value: string }[]\n >([]);\n return (\n <div>\n <MultiSelect\n list={list}\n state={{ value: selectedItem, select: setSelectedItem }}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAkB;AAElB,kCAA8B;AAC9B,+BAAgC;AASjB,SAAR,OAAwB,IAOV;AAPU,eAC7B;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAjBF,IAY+B,IAM1B,iBAN0B,IAM1B;AAAA,IALH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGA,QAAM,aAAa,YAAY,4CAAgB;AAC/C,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA,qCACK,OADL;AAAA,MAEC,WAAW,GAAG,CAAC,QAAQ,cAAc,IAAI,SAAS,IAChD,WAAW,eAAe,gBAC5B;AAAA;AAAA,IAEC,cAAc,QACb,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,WAAW,iBAAiB,aAAa,cAAc;AAAA;AAAA,IACzD;AAAA,IAED,YAAY,kBAAkB;AAAA,EACjC;AAEJ;;;ACrCA,IAAAC,gBAAkB;AAElB,IAAAC,4BAAgC;AAChC,IAAM,cAAc;AAEL,SAAR,UAA2B,IAW/B;AAX+B,eAChC;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EARF,IAKkC,IAI7B,iBAJ6B,IAI7B;AAAA,IAHH;AAAA,IACA;AAAA,IACA;AAAA;AASA,SACE,8BAAAC,QAAA,cAAC,SAAI,WAAU,eACZ,SACC,8BAAAA,QAAA,cAAC,WAAM,SAAS,UAAU,WAAU,uBACjC,KACH,GAEF,8BAAAA,QAAA,cAAC,SAAI,WAAU,yBACZ,QAAQ,8BAAAA,QAAA,cAAC,6CAAgB,MAAY,WAAW,aAAa,GAC9D,8BAAAA,QAAA;AAAA,IAAC;AAAA,qCACK,OADL;AAAA,MAEC,WAAW,cAAc,KAAK,SAAS,IAAI,QAAQ,OAAO;AAAA;AAAA,EAC5D,CACF,CACF;AAEJ;;;ACjCA,IAAAC,gBAAkB;AAClB,IAAAC,+BAAwB;AACxB,IAAAC,4BAAgC;AAEjB,SAAR,OACL,MACA;AACA,SACE,8BAAAC,QAAA,cAAC,SAAI,WAAU,2BACb,8BAAAA,QAAA;AAAA,IAAC;AAAA,qCACK,OADL;AAAA,MAEC,IAAG;AAAA,MACH,MAAK;AAAA,MACL,WAAU;AAAA;AAAA,EACZ,GACA,8BAAAA,QAAA,cAAC,WAAM,SAAQ,UAAS,WAAU,YAChC,8BAAAA,QAAA,cAAC,6CAAgB,MAAM,sCAAS,WAAU,iBAAgB,CAC5D,CACF;AAEJ;;;ACnBA,IAAAC,gBAAkD;AAClD,IAAAC,4BAAgC;AAChC,IAAAC,+BAAuC;AAWxB,SAAR,aAA8B,MAA8B;AAdnE;AAeE,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,EAAE,OAAO,IAAI,OAAO,GAAG,CAAC;AACjE,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,EAAE;AACzC,QAAM,mBAAe,gCAAiB,OAAO;AAE7C,WAAS,cAAc;AACrB,WAAO,KAAK,QAAQ;AAAA,MAClB,CAAC,EAAE,OAAO,MAAM,MACd,MAAM,YAAY,EAAE,SAAS,aAAa,YAAY,CAAC,KACvD,MAAM,YAAY,EAAE,SAAS,aAAa,YAAY,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,WAAS,WAAW,EAAE,OAAO,MAAM,GAAqC;AACtE,gBAAY,EAAE,OAAO,MAAM,CAAC;AAC5B,eAAW,EAAE;AAAA,EACf;AAEA,SACE,8BAAAC,QAAA,cAAC,aACE,KAAK,SACJ,8BAAAA,QAAA,cAAC,WAAM,WAAU,qBAAoB,SAAS,KAAK,aAChD,KAAK,KACR,GAEF,8BAAAA,QAAA,cAAC,SAAI,WAAU,kCACb,8BAAAA,QAAA;AAAA,IAAC;AAAA,oDACK,OACC,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC,IAFrD;AAAA,MAGC,QAAO,UAAK,UAAL,YAAc,SAAS;AAAA,MAC9B,MAAK;AAAA;AAAA,EACP,GACA,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,MAAK;AAAA,MACL,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,MAC1C,WAAU;AAAA,MACV,aAAa,SAAS,QAAQ,SAAS,QAAQ;AAAA,OAC3C;AAAA,EACN,GACA,8BAAAA,QAAA,cAAC,SAAI,WAAU,0BACZ,YAAY,EAAE,UAAU,KAAK,WAAW,MACvC,8BAAAA,QAAA,cAAC,YAAO,WAAU,4CAAyC,gBAE3D,GAED,YAAY,EAAE,IAAI,CAAC,EAAE,OAAO,MAAM,MACjC,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,WAAW,EAAE,OAAO,MAAM,CAAC;AAAA,MAC1C,KAAK;AAAA,MACL,WAAU;AAAA;AAAA,IAET;AAAA,IACA,SAAS,SAAS,SACjB,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,WAAU;AAAA;AAAA,IACZ;AAAA,EAEJ,CACD,CACH,GACA,8BAAAA,QAAA,cAAC,6CAAgB,MAAM,4CAAe,WAAWC,cAAa,CAChE,CACF;AAEJ;AAEA,IAAMA,eAAc;;;AClFpB,IAAAC,gBAAkB;AAQH,SAAR,QAAyB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,WAAS,YAAY;AACnB,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACA,SACE,8BAAAC,QAAA,cAAC,SAAI,WAAU,cACb,8BAAAA,QAAA,cAAC,SAAI,WAAU,UAAQ,QAAS,GAChC,8BAAAA,QAAA,cAAC,UAAK,WAAW,gBAAgB,UAAU,CAAC,MAAK,IAAK,CACxD;AAEJ;AAEA,IAAM,MACJ;AACF,IAAM,SACJ;AACF,IAAM,QACJ;AACF,IAAM,OACJ;;;ACrCF,IAAAC,gBAAkB;AAOH,SAAR,aAA8B;AAAA,EACnC;AAAA,EACA;AACF,GAMI;AACF,SACE,8BAAAC,QAAA,cAAC,SAAI,WAAU,qBACZ,MAAM,IAAI,CAAC,EAAE,OAAO,MAAM,MACzB,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,gBACT,MAAM,UAAU,SAAS,sBAC3B;AAAA,MACA,SAAS,MAAM,MAAM,UAAU,KAAK;AAAA;AAAA,IAEnC;AAAA,EACH,CACD,CACH;AAEJ;;;AChCA,IAAAC,gBAAkB;AAOH,SAAR,KAAsB,EAAE,UAAU,UAAU,GAAmB;AACpE,SAAO,8BAAAC,QAAA,cAAC,SAAI,WAAW,QAAQ,SAAS,MAAK,QAAS;AACxD;AAEA,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AACF,MAGM;AACJ,SACE,8BAAAA,QAAA,cAAC,SAAI,WAAW,GAAG,SAAS,8CACzB,QACH;AAEJ;AACA,KAAK,SAAS;;;ACxBd,IAAAC,gBAAkB;AAClB,IAAAC,4BAAgC;AAChC,IAAAC,+BAKO;AAUQ,SAAR,MAAuB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,SACE,8BAAAC,QAAA,cAAC,SAAI,WAAW,GAAG,SAAS,2BAC1B,8BAAAA,QAAA,cAAC,SAAI,WAAU,iBACb,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,QAAQ,IAAI;AAAA,MAClB,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,SAAS,IAAI,EAAE;AAAA;AAAA,EACjC,GACA,8BAAAA,QAAA,cAAC,aACC,8BAAAA,QAAA,cAAC,OAAE,WAAU,kBAAgB,KAAM,GACnC,8BAAAA,QAAA,cAAC,OAAE,WAAU,wBAAsB,WAAY,CACjD,GACA,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,QAAQ,IAAI;AAAA,MAClB,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,SAAS,IAAI,EAAE;AAAA;AAAA,EACjC,CACF,GACA,8BAAAA,QAAA,cAAC,OAAE,WAAU,cAAa,OAAO,EAAE,YAAY,SAAS,IAAI,EAAE,GAAG,CACnE;AAEJ;AAEA,IAAM,SAAS,CAAC,EAAE,MAAM,KAAK,MAAyC;AACpE,SACE,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,YAAY,eAAe,IAAI,UAAU,SAAS,IAAI;AAAA;AAAA,IAE/D,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,QAAQ,IAAI;AAAA,QAClB,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,SAAS,IAAI,EAAE;AAAA;AAAA,IACjC;AAAA,IACA,8BAAAA,QAAA,cAAC,WAAG,IAAK;AAAA,EACX;AAEJ;AAEA,MAAM,SAAS;AAEf,SAAS,SAAS,MAAc;AAC9B,SAAO,eAAe,IAAI;AAC5B;AAEA,SAAS,QAAQ,MAAc;AAC7B,QAAM,UAAU;AAAA,IACd,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAEA,SAAO,QAAQ,IAAI;AACrB;;;AC7EA,IAAAC,gBAAkB;AAClB,IAAAC,+BAA6B;AAC7B,IAAAC,4BAAgC;AASjB,SAAR,WAA4B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,OAAO,MAAM,QAAQ,KAAK,EAAE;AAClC,SACE,8BAAAC,QAAA,cAAC,SAAI,WAAW,cAAc,SAAS,MACrC,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,gBAAgB;AAAA,MAChB,WAAU;AAAA;AAAA,EACZ,GACA,8BAAAA,QAAA,cAAC,6CAAgB,MAAM,2CAAc,WAAU,oBAAmB,GAClE,8BAAAA,QAAA,cAAC,WAAM,SAAS,MAAM,WAAU,uBAC7B,KACH,GACA,8BAAAA,QAAA,cAAC,SAAI,WAAU,sBACb,8BAAAA,QAAA,cAAC,SAAI,WAAU,2BAAyB,QAAS,CACnD,CACF;AAEJ;;;ACnCA,IAAAC,iBAA+D;AAC/D,IAAAC,4BAAgC;AAChC,IAAAC,+BAAqC;AAOtB,SAAR,YAA6B;AAAA,EAClC,MAAAC;AAAA,EACA;AACF,GAGI;AACF,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,EAAE;AACzC,QAAM,mBAAe,iCAAiB,OAAO;AAE7C,WAAS,cAAc;AACrB,WAAOA,MAAK;AAAA,MACV,CAAC,EAAE,OAAO,MAAM,MACd,MAAM,YAAY,EAAE,SAAS,aAAa,YAAY,CAAC,KACvD,MAAM,YAAY,EAAE,SAAS,aAAa,YAAY,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,WAAS,WAAW,EAAE,OAAO,MAAM,GAAqC;AAEtE,UAAM,OAAO,CAAC,SAAS;AACrB,YAAMC,eAAc,KAAK,KAAK,CAAC,SAAc,KAAK,SAAS,KAAK;AAChE,UAAIA,cAAa;AACf,eAAO,KAAK,OAAO,CAAC,SAAc,KAAK,SAAS,KAAK;AAAA,MACvD;AACA,aAAO,CAAC,GAAG,MAAM,EAAE,OAAO,MAAM,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,WAAS,YAAY,OAAe;AAClC,WAAO,MAAM,MAAM,KAAK,CAAC,SAAc,KAAK,SAAS,KAAK;AAAA,EAC5D;AAEA,QAAM,wBAAoB,4BAAY,MAAM;AAC1C,UAAM,gBAAgB,MAAM,MAAM,UAAUD,MAAK;AACjD,UAAM,OAAO,gBAAgB,CAAC,IAAIA,KAAI;AAAA,EACxC,GAAG,CAAC,MAAM,KAAK,CAAC;AAEhB,SACE,+BAAAE,QAAA,cAAC,SAAI,WAAU,kCACb,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,MAAK;AAAA,MACL,aAAa,GAAG,MAAM,MAAM,MAAM;AAAA,MAClC,WAAU;AAAA,MACV,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA;AAAA,EAC5C,GACA,+BAAAA,QAAA,cAAC,SAAI,WAAU,mDACZ,YAAY,EAAE,UAAU,KAAK,WAAW,MACvC,+BAAAA,QAAA,cAAC,YAAO,WAAU,4CAAyC,gBAE3D,GAED,YAAY,EAAE,IAAI,CAAC,EAAE,OAAO,MAAM,MACjC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,WAAW,EAAE,OAAO,MAAM,CAAC;AAAA,MAC1C,KAAK;AAAA,MACL,WAAU;AAAA;AAAA,IAET;AAAA,IACA,YAAY,KAAK,KAChB,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,WAAU;AAAA;AAAA,IACZ;AAAA,EAEJ,CACD,CACH,GACA,+BAAAA,QAAA,cAAC,YAAO,WAAU,kBAAiB,SAAS,qBAC1C,+BAAAA,QAAA,cAAC,6CAAgB,MAAM,0CAAa,WAAWC,cAAa,CAC9D,CACF;AAEJ;AACA,IAAMA,eAAc;;;ACpFpB,IAAAC,iBAAgC;AAGhC,IAAM,OAAO;AAAA,EACX,EAAE,OAAO,YAAY,OAAO,UAAU;AAAA,EACtC,EAAE,OAAO,YAAY,OAAO,UAAU;AAAA,EACtC,EAAE,OAAO,YAAY,OAAO,UAAU;AACxC;AACe,SAAR,YAA6B;AAClC,QAAM,CAAC,cAAc,eAAe,QAAI,yBAEtC,CAAC,CAAC;AACJ,SACE,+BAAAC,QAAA,cAAC,aACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO,EAAE,OAAO,cAAc,QAAQ,gBAAgB;AAAA;AAAA,EACxD,CACF;AAEJ;","names":["React","import_react","import_react_fontawesome","React","import_react","import_free_solid_svg_icons","import_react_fontawesome","React","import_react","import_react_fontawesome","import_free_solid_svg_icons","React","input__icon","import_react","React","import_react","React","import_react","React","import_react","import_react_fontawesome","import_free_solid_svg_icons","React","import_react","import_free_solid_svg_icons","import_react_fontawesome","React","import_react","import_react_fontawesome","import_free_solid_svg_icons","list","isItemExist","React","input__icon","import_react","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/Button.tsx","../src/components/TextInput.tsx","../src/components/Slider.tsx","../src/components/SingleSelect.tsx","../src/components/Tooltip.tsx","../src/components/NavTabClient.tsx","../src/components/Card.tsx","../src/components/Toast.tsx","../src/components/Expandable.tsx","../src/components/MultiSelect.tsx","../src/components/ThemeToggle.tsx"],"sourcesContent":["export { default as Button } from \"./components/Button\";\nexport { default as TextInput } from \"./components/TextInput\";\nexport { default as Slider } from \"./components/Slider\";\nexport { default as SingleSelect } from \"./components/SingleSelect\";\nexport { default as Tooltip } from \"./components/Tooltip\";\nexport { default as NavTabClient } from \"./components/NavTabClient\";\nexport { default as Card } from \"./components/Card\";\nexport { default as Toast } from \"./components/Toast\";\nexport { default as Expandable } from \"./components/Expandable\";\nexport { default as MultiSelect } from \"./components/MultiSelect\";\nexport { default as ThemeToggle } from \"./components/ThemeToggle\";\n","import React from \"react\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCircleNotch } from \"@fortawesome/free-solid-svg-icons\";\n\ntype Button = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n icon?: IconProp;\n label: string;\n btnType?: \"primary\" | \"secondary\" | \"tertiary\";\n isLoading?: boolean;\n};\n\nexport default function Button({\n label,\n icon,\n isLoading,\n btnType,\n className,\n ...rest\n}: Readonly<Button>) {\n const buttonIcon = isLoading ? faCircleNotch : icon;\n return (\n <button\n {...rest}\n className={`${!icon && \"py-[0.85rem]\"} ${className} ${\n btnType == \"secondary\" && \"btn__secondary\"\n } btn__primary`}\n >\n {buttonIcon && icon && (\n <FontAwesomeIcon\n icon={buttonIcon}\n className={`text-[1.1rem] ${isLoading && \"animate-spin\"}`}\n />\n )}\n {isLoading ? \"Memproses ...\" : label}\n </button>\n );\n}\n","import React from \"react\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nconst input__icon = \"px-[0.85rem] text-[1.1rem] text-[var(--color-icon-input)]\";\n\nexport default function TextInput({\n label,\n labelFor,\n icon,\n ...attr\n}: Readonly<\n React.InputHTMLAttributes<HTMLInputElement> & {\n label?: string;\n labelFor?: string;\n icon?: IconProp;\n }\n>) {\n return (\n <div className=\"group ... w-full\">\n {label && (\n <label htmlFor={labelFor} className=\"text-input__label\">\n {label}\n </label>\n )}\n <div className=\"text-input__wrapper\">\n {icon && <FontAwesomeIcon icon={icon} className={input__icon} />}\n <input\n {...attr}\n className={`text-input w-full ${attr.className} ${icon && \"!pl-0\"}`}\n />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nexport default function Slider(\n attr: Readonly<React.InputHTMLAttributes<HTMLInputElement>>\n) {\n return (\n <div className=\"flex items-center h-[3rem]\">\n <div className=\"slider__wrapper group\">\n <input\n {...attr}\n id=\"slider\"\n type=\"checkbox\"\n className=\"peer ... w-[2rem] opacity-[0] cursor-pointer\"\n />\n <label htmlFor=\"slider\" className=\"slider\">\n <FontAwesomeIcon icon={faCheck} className=\"text-[0.7rem]\" />\n </label>\n </div>\n </div>\n );\n}\n","\"use client\";\nimport React, { useDeferredValue, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faChevronDown } from \"@fortawesome/free-solid-svg-icons\";\n\ntype SingleSelect = React.InputHTMLAttributes<HTMLInputElement> & {\n label?: string;\n labelHtml?: string;\n options: {\n label: string;\n value: string;\n }[];\n};\n\nexport default function SingleSelect(attr: Readonly<SingleSelect>) {\n const [selected, setSelected] = useState({ label: \"\", value: \"\" });\n const [keyword, setKeyword] = useState(\"\");\n const inputKeyword = useDeferredValue(keyword);\n\n function getFiltered() {\n return attr.options.filter(\n ({ label, value }) =>\n label.toLowerCase().includes(inputKeyword.toLowerCase()) ||\n value.toLowerCase().includes(inputKeyword.toLowerCase())\n );\n }\n\n function selectItem({ label, value }: { label: string; value: string }) {\n setSelected({ label, value });\n setKeyword(\"\");\n }\n\n return (\n <div className=\"w-full\">\n {attr.label && (\n <label className=\"text-input__label\" htmlFor={attr.labelHtml}>\n {attr.label}\n </label>\n )}\n <div className=\"text-input__wrapper relative\">\n <input\n {...attr}\n {...(attr.onChange ? { onChange: attr.onChange } : {})}\n value={attr.value ?? selected.value}\n type=\"hidden\"\n />\n <input\n value={keyword}\n type=\"search\"\n onChange={(e) => setKeyword(e.target.value)}\n className=\"text-input peer ... w-full\"\n placeholder={selected.value ? selected.label : \"Cari opsi ...\"}\n {...attr}\n />\n <div className=\"select-item__wrapper\">\n {getFiltered().length == 0 && keyword != \"\" && (\n <button className=\"select-item text-[var(--color-danger)]\">\n Tidak ada Item\n </button>\n )}\n {getFiltered().map(({ label, value }) => (\n <button\n onClick={() => selectItem({ label, value })}\n key={value}\n className=\"select-item\"\n >\n {label}\n {selected.value == value && (\n <FontAwesomeIcon\n icon={faCheck}\n className=\"text-[var(--color-primary)]\"\n />\n )}\n </button>\n ))}\n </div>\n <FontAwesomeIcon icon={faChevronDown} className={input__icon} />\n </div>\n </div>\n );\n}\n\nconst input__icon = \"pr-[0.7rem] text-[var(--color-icon-input)]\";\n","import React from \"react\";\n\ntype Tooltip = {\n children: React.ReactNode;\n text: string;\n position: \"top\" | \"bottom\" | \"right\" | \"left\";\n};\n\nexport default function Tooltip({\n children,\n text,\n position = \"top\",\n}: Readonly<Tooltip>) {\n function getAccent() {\n const mapping = {\n top,\n bottom,\n left,\n right,\n };\n return mapping[position];\n }\n return (\n <div className=\"relative\">\n <div className=\"peer\">{children}</div>\n <span className={`tooltip-text ${getAccent()}`}>{text}</span>\n </div>\n );\n}\n\nconst top =\n \"bottom-full translate-y-[-0.3rem] right-0 after:bottom-0 after:translate-y-[0.25rem] \";\nconst bottom =\n \"right-0 top-full translate-y-[0.3rem] after:top-[-0.4rem] after:translate-y-[0.2rem] \";\nconst right =\n \"left-full w-[max-content] translate-x-[0.6rem] after:left-[-0.2rem] top-[-0.2rem] after:top-[0.6rem]\";\nconst left =\n \"right-full w-[max-content] translate-x-[-0.6rem] top-[-0.2rem] after:right-[-0.2rem] after:top-[0.6rem]\";\n","import React from \"react\";\n\ntype Option = {\n label: string;\n value: string;\n};\n\nexport default function NavTabClient({\n items,\n state,\n}: Readonly<{\n items: Option[];\n state: {\n active: string;\n setActive: (val: string) => void;\n };\n}>) {\n return (\n <nav className=\"navtab__wrapper\">\n {items.map(({ label, value }) => (\n <button\n key={value}\n className={`navtab__item ${\n state.active == value\n ? \"navtab__item__active\"\n : \"hover:bg-[var(--color-border)]\"\n }`}\n onClick={() => state.setActive(value)}\n >\n {label}\n </button>\n ))}\n </nav>\n );\n}\n","import React from \"react\";\n\ntype Card = {\n children: React.ReactNode;\n className: string;\n};\n\nexport default function Card({ children, className }: Readonly<Card>) {\n return <div className={`card ${className}`}>{children}</div>;\n}\n\nconst Footer = ({\n className,\n children,\n}: {\n className?: string;\n children?: React.ReactNode;\n}) => {\n return (\n <div className={`${className} border-t border-t-[var(--color-border)]`}>\n {children}\n </div>\n );\n};\nCard.Footer = Footer;\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faCheckCircle,\n faInfoCircle,\n faQuestionCircle,\n faXmarkCircle,\n} from \"@fortawesome/free-solid-svg-icons\";\n\ntype ToastType = \"warning\" | \"success\" | \"info\" | \"danger\";\ntype Toast = {\n title: string;\n className?: string;\n description: string;\n type: ToastType;\n};\n\nexport default function Toast({\n title,\n description,\n type = \"info\",\n className,\n}: Readonly<Toast>) {\n return (\n <div className={`${className} toast__wrapper group`}>\n <div className=\"toast__body\">\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"text-[1.2rem]\"\n style={{ color: getColor(type) }}\n />\n <div>\n <p className=\"toast__title\">{title}</p>\n <p className=\"toast__description\">{description}</p>\n </div>\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"toast-bg__icon\"\n style={{ color: getColor(type) }}\n />\n </div>\n <p className=\"toast__bar\" style={{ background: getColor(type) }}></p>\n </div>\n );\n}\n\nconst Inline = ({ text, type }: { text: string; type: ToastType }) => {\n return (\n <div\n className=\"toast__inline\"\n style={{ background: `var(--color-${type}-soft)`, opacity: 0.9 }}\n >\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"text-[1.1rem]\"\n style={{ color: getColor(type) }}\n />\n <p>{text}</p>\n </div>\n );\n};\n\nToast.Inline = Inline;\n\nfunction getColor(type: string) {\n return `var(--color-${type})`;\n}\n\nfunction getIcon(type: string) {\n const mapping = {\n warning: faQuestionCircle,\n info: faInfoCircle,\n danger: faXmarkCircle,\n success: faCheckCircle,\n };\n //@ts-expect-error call object using array index\n return mapping[type];\n}\n","import React from \"react\";\nimport { faCaretRight } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\ntype Expandable = {\n children: React.ReactNode;\n title: string;\n className?: string;\n isOpen?: boolean;\n};\n\nexport default function Expandable({\n children,\n title,\n className,\n isOpen,\n}: Readonly<Expandable>) {\n const name = title.replace(\" \", \"\");\n return (\n <div className={`expandable ${className}`}>\n <input\n id={name}\n type=\"checkbox\"\n defaultChecked={isOpen}\n className=\"opacity-[0] peer absolute top-0 ex-title\"\n />\n <FontAwesomeIcon icon={faCaretRight} className=\"expandable__icon\" />\n <label htmlFor={name} className=\"expandable__title\">\n {title}\n </label>\n <div className=\"expandable__body\">\n <div className=\"p-[0.75rem] px-[1rem]\">{children}</div>\n </div>\n </div>\n );\n}\n","import React, { useCallback, useDeferredValue, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faListCheck } from \"@fortawesome/free-solid-svg-icons\";\n\ntype Option = {\n value: string;\n label: string;\n};\n\nexport default function MultiSelect({\n list,\n state,\n}: Readonly<{\n list: Option[];\n state: { value: Option[]; select: (newVal: Option[]) => void };\n}>) {\n const [keyword, setKeyword] = useState(\"\");\n const inputKeyword = useDeferredValue(keyword);\n\n function getFiltered() {\n return list.filter(\n ({ label, value }) =>\n label.toLowerCase().includes(inputKeyword.toLowerCase()) ||\n value.toLowerCase().includes(inputKeyword.toLowerCase())\n );\n }\n\n function selectItem({ label, value }: { label: string; value: string }) {\n //@ts-expect-error: avoid check\n state.select((prev) => {\n const isItemExist = prev.find((item: any) => item.value == value);\n if (isItemExist) {\n return prev.filter((item: any) => item.value != value);\n }\n return [...prev, { label, value }];\n });\n }\n\n function isItemExist(value: string) {\n return state.value.find((item: any) => item.value == value);\n }\n\n const selectUnSelectAll = useCallback(() => {\n const isAllSelected = state.value.length == list.length;\n state.select(isAllSelected ? [] : list);\n }, [state.value]);\n\n return (\n <div className=\"text-input__wrapper relative\">\n <input\n value={keyword}\n type=\"search\"\n placeholder={`${state.value.length} Dipilih`}\n className=\"text-input peer ...\"\n onChange={(e) => setKeyword(e.target.value)}\n />\n <div className=\"select-item__wrapper select-multiple__wrapper\">\n {getFiltered().length == 0 && keyword != \"\" && (\n <button className=\"select-item text-[var(--color-danger)]\">\n Tidak ada Item\n </button>\n )}\n {getFiltered().map(({ label, value }) => (\n <button\n onClick={() => selectItem({ label, value })}\n key={value}\n className=\"select-item\"\n >\n {label}\n {isItemExist(value) && (\n <FontAwesomeIcon\n icon={faCheck}\n className=\"text-[var(--color-primary)]\"\n />\n )}\n </button>\n ))}\n </div>\n <button className=\"cursor-pointer\" onClick={selectUnSelectAll}>\n <FontAwesomeIcon icon={faListCheck} className={input__icon} />\n </button>\n </div>\n );\n}\nconst input__icon = \"pr-[0.7rem] text-[var(--color-icon-input)]\";\n","\"use client\";\nimport React from \"react\";\n\nexport default function ThemeToggle(\n attr: Readonly<React.InputHTMLAttributes<HTMLInputElement>>\n) {\n return (\n <div className=\"flex items-center h-[3rem]\">\n <label\n htmlFor=\"theme-toggle\"\n className=\"slider__wrapper slider-theme slider-theme-light\"\n >\n <input\n {...attr}\n id=\"theme-toggle\"\n type=\"checkbox\"\n className=\"peer ... w-[2rem] opacity-[0] cursor-pointer\"\n />\n <span className=\"slider-theme__bullet\"></span>\n </label>\n </div>\n );\n}\n"],"mappings":"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","names":["React","import_react","import_react_fontawesome","React","import_react","import_free_solid_svg_icons","import_react_fontawesome","React","import_react","import_react_fontawesome","import_free_solid_svg_icons","React","input__icon","import_react","React","import_react","React","import_react","React","import_react","import_react_fontawesome","import_free_solid_svg_icons","React","import_react","import_free_solid_svg_icons","import_react_fontawesome","React","import_react","import_react_fontawesome","import_free_solid_svg_icons","isItemExist","React","input__icon","import_react","React"]}
|
package/dist/index.mjs
CHANGED
|
@@ -32,8 +32,8 @@ var __objRest = (source, exclude) => {
|
|
|
32
32
|
|
|
33
33
|
// src/components/Button.tsx
|
|
34
34
|
import React from "react";
|
|
35
|
-
import { faCircleNotch } from "@fortawesome/free-solid-svg-icons";
|
|
36
35
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
36
|
+
import { faCircleNotch } from "@fortawesome/free-solid-svg-icons";
|
|
37
37
|
function Button(_a) {
|
|
38
38
|
var _b = _a, {
|
|
39
39
|
label,
|
|
@@ -52,7 +52,7 @@ function Button(_a) {
|
|
|
52
52
|
return /* @__PURE__ */ React.createElement(
|
|
53
53
|
"button",
|
|
54
54
|
__spreadProps(__spreadValues({}, rest), {
|
|
55
|
-
className: `${!icon && "py-[0.
|
|
55
|
+
className: `${!icon && "py-[0.85rem]"} ${className} ${btnType == "secondary" && "btn__secondary"} btn__primary`
|
|
56
56
|
}),
|
|
57
57
|
buttonIcon && icon && /* @__PURE__ */ React.createElement(
|
|
58
58
|
FontAwesomeIcon,
|
|
@@ -68,7 +68,7 @@ function Button(_a) {
|
|
|
68
68
|
// src/components/TextInput.tsx
|
|
69
69
|
import React2 from "react";
|
|
70
70
|
import { FontAwesomeIcon as FontAwesomeIcon2 } from "@fortawesome/react-fontawesome";
|
|
71
|
-
var input__icon = "px-[0.
|
|
71
|
+
var input__icon = "px-[0.85rem] text-[1.1rem] text-[var(--color-icon-input)]";
|
|
72
72
|
function TextInput(_a) {
|
|
73
73
|
var _b = _a, {
|
|
74
74
|
label,
|
|
@@ -79,10 +79,10 @@ function TextInput(_a) {
|
|
|
79
79
|
"labelFor",
|
|
80
80
|
"icon"
|
|
81
81
|
]);
|
|
82
|
-
return /* @__PURE__ */ React2.createElement("div", { className: "group ..." }, label && /* @__PURE__ */ React2.createElement("label", { htmlFor: labelFor, className: "text-input__label" }, label), /* @__PURE__ */ React2.createElement("div", { className: "text-input__wrapper" }, icon && /* @__PURE__ */ React2.createElement(FontAwesomeIcon2, { icon, className: input__icon }), /* @__PURE__ */ React2.createElement(
|
|
82
|
+
return /* @__PURE__ */ React2.createElement("div", { className: "group ... w-full" }, label && /* @__PURE__ */ React2.createElement("label", { htmlFor: labelFor, className: "text-input__label" }, label), /* @__PURE__ */ React2.createElement("div", { className: "text-input__wrapper" }, icon && /* @__PURE__ */ React2.createElement(FontAwesomeIcon2, { icon, className: input__icon }), /* @__PURE__ */ React2.createElement(
|
|
83
83
|
"input",
|
|
84
84
|
__spreadProps(__spreadValues({}, attr), {
|
|
85
|
-
className: `text-input ${attr.className} ${icon && "!pl-0"}`
|
|
85
|
+
className: `text-input w-full ${attr.className} ${icon && "!pl-0"}`
|
|
86
86
|
})
|
|
87
87
|
)));
|
|
88
88
|
}
|
|
@@ -92,14 +92,14 @@ import React3 from "react";
|
|
|
92
92
|
import { faCheck } from "@fortawesome/free-solid-svg-icons";
|
|
93
93
|
import { FontAwesomeIcon as FontAwesomeIcon3 } from "@fortawesome/react-fontawesome";
|
|
94
94
|
function Slider(attr) {
|
|
95
|
-
return /* @__PURE__ */ React3.createElement("div", { className: "slider__wrapper group" }, /* @__PURE__ */ React3.createElement(
|
|
95
|
+
return /* @__PURE__ */ React3.createElement("div", { className: "flex items-center h-[3rem]" }, /* @__PURE__ */ React3.createElement("div", { className: "slider__wrapper group" }, /* @__PURE__ */ React3.createElement(
|
|
96
96
|
"input",
|
|
97
97
|
__spreadProps(__spreadValues({}, attr), {
|
|
98
98
|
id: "slider",
|
|
99
99
|
type: "checkbox",
|
|
100
100
|
className: "peer ... w-[2rem] opacity-[0] cursor-pointer"
|
|
101
101
|
})
|
|
102
|
-
), /* @__PURE__ */ React3.createElement("label", { htmlFor: "slider", className: "slider" }, /* @__PURE__ */ React3.createElement(FontAwesomeIcon3, { icon: faCheck, className: "text-[0.7rem]" })));
|
|
102
|
+
), /* @__PURE__ */ React3.createElement("label", { htmlFor: "slider", className: "slider" }, /* @__PURE__ */ React3.createElement(FontAwesomeIcon3, { icon: faCheck, className: "text-[0.7rem]" }))));
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
// src/components/SingleSelect.tsx
|
|
@@ -120,7 +120,7 @@ function SingleSelect(attr) {
|
|
|
120
120
|
setSelected({ label, value });
|
|
121
121
|
setKeyword("");
|
|
122
122
|
}
|
|
123
|
-
return /* @__PURE__ */ React4.createElement("div",
|
|
123
|
+
return /* @__PURE__ */ React4.createElement("div", { className: "w-full" }, attr.label && /* @__PURE__ */ React4.createElement("label", { className: "text-input__label", htmlFor: attr.labelHtml }, attr.label), /* @__PURE__ */ React4.createElement("div", { className: "text-input__wrapper relative" }, /* @__PURE__ */ React4.createElement(
|
|
124
124
|
"input",
|
|
125
125
|
__spreadProps(__spreadValues(__spreadValues({}, attr), attr.onChange ? { onChange: attr.onChange } : {}), {
|
|
126
126
|
value: (_a = attr.value) != null ? _a : selected.value,
|
|
@@ -132,7 +132,7 @@ function SingleSelect(attr) {
|
|
|
132
132
|
value: keyword,
|
|
133
133
|
type: "search",
|
|
134
134
|
onChange: (e) => setKeyword(e.target.value),
|
|
135
|
-
className: "text-input peer ...",
|
|
135
|
+
className: "text-input peer ... w-full",
|
|
136
136
|
placeholder: selected.value ? selected.label : "Cari opsi ..."
|
|
137
137
|
}, attr)
|
|
138
138
|
), /* @__PURE__ */ React4.createElement("div", { className: "select-item__wrapper" }, getFiltered().length == 0 && keyword != "" && /* @__PURE__ */ React4.createElement("button", { className: "select-item text-[var(--color-danger)]" }, "Tidak ada Item"), getFiltered().map(({ label, value }) => /* @__PURE__ */ React4.createElement(
|
|
@@ -159,7 +159,7 @@ import React5 from "react";
|
|
|
159
159
|
function Tooltip({
|
|
160
160
|
children,
|
|
161
161
|
text,
|
|
162
|
-
position
|
|
162
|
+
position = "top"
|
|
163
163
|
}) {
|
|
164
164
|
function getAccent() {
|
|
165
165
|
const mapping = {
|
|
@@ -187,7 +187,7 @@ function NavTabClient({
|
|
|
187
187
|
"button",
|
|
188
188
|
{
|
|
189
189
|
key: value,
|
|
190
|
-
className: `navtab__item ${state.active == value
|
|
190
|
+
className: `navtab__item ${state.active == value ? "navtab__item__active" : "hover:bg-[var(--color-border)]"}`,
|
|
191
191
|
onClick: () => state.setActive(value)
|
|
192
192
|
},
|
|
193
193
|
label
|
|
@@ -219,7 +219,7 @@ import {
|
|
|
219
219
|
function Toast({
|
|
220
220
|
title,
|
|
221
221
|
description,
|
|
222
|
-
type,
|
|
222
|
+
type = "info",
|
|
223
223
|
className
|
|
224
224
|
}) {
|
|
225
225
|
return /* @__PURE__ */ React8.createElement("div", { className: `${className} toast__wrapper group` }, /* @__PURE__ */ React8.createElement("div", { className: "toast__body" }, /* @__PURE__ */ React8.createElement(
|
|
@@ -297,13 +297,13 @@ import React10, { useCallback, useDeferredValue as useDeferredValue2, useState a
|
|
|
297
297
|
import { FontAwesomeIcon as FontAwesomeIcon7 } from "@fortawesome/react-fontawesome";
|
|
298
298
|
import { faCheck as faCheck3, faListCheck } from "@fortawesome/free-solid-svg-icons";
|
|
299
299
|
function MultiSelect({
|
|
300
|
-
list
|
|
300
|
+
list,
|
|
301
301
|
state
|
|
302
302
|
}) {
|
|
303
303
|
const [keyword, setKeyword] = useState2("");
|
|
304
304
|
const inputKeyword = useDeferredValue2(keyword);
|
|
305
305
|
function getFiltered() {
|
|
306
|
-
return
|
|
306
|
+
return list.filter(
|
|
307
307
|
({ label, value }) => label.toLowerCase().includes(inputKeyword.toLowerCase()) || value.toLowerCase().includes(inputKeyword.toLowerCase())
|
|
308
308
|
);
|
|
309
309
|
}
|
|
@@ -320,8 +320,8 @@ function MultiSelect({
|
|
|
320
320
|
return state.value.find((item) => item.value == value);
|
|
321
321
|
}
|
|
322
322
|
const selectUnSelectAll = useCallback(() => {
|
|
323
|
-
const isAllSelected = state.value.length ==
|
|
324
|
-
state.select(isAllSelected ? [] :
|
|
323
|
+
const isAllSelected = state.value.length == list.length;
|
|
324
|
+
state.select(isAllSelected ? [] : list);
|
|
325
325
|
}, [state.value]);
|
|
326
326
|
return /* @__PURE__ */ React10.createElement("div", { className: "text-input__wrapper relative" }, /* @__PURE__ */ React10.createElement(
|
|
327
327
|
"input",
|
|
@@ -351,33 +351,36 @@ function MultiSelect({
|
|
|
351
351
|
}
|
|
352
352
|
var input__icon3 = "pr-[0.7rem] text-[var(--color-icon-input)]";
|
|
353
353
|
|
|
354
|
-
// src/components/
|
|
355
|
-
import React11
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
{ label: "Option 3", value: "option3" }
|
|
360
|
-
];
|
|
361
|
-
function Dashboard() {
|
|
362
|
-
const [selectedItem, setSelectedItem] = useState3([]);
|
|
363
|
-
return /* @__PURE__ */ React11.createElement("div", null, /* @__PURE__ */ React11.createElement(
|
|
364
|
-
MultiSelect,
|
|
354
|
+
// src/components/ThemeToggle.tsx
|
|
355
|
+
import React11 from "react";
|
|
356
|
+
function ThemeToggle(attr) {
|
|
357
|
+
return /* @__PURE__ */ React11.createElement("div", { className: "flex items-center h-[3rem]" }, /* @__PURE__ */ React11.createElement(
|
|
358
|
+
"label",
|
|
365
359
|
{
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
}
|
|
360
|
+
htmlFor: "theme-toggle",
|
|
361
|
+
className: "slider__wrapper slider-theme slider-theme-light"
|
|
362
|
+
},
|
|
363
|
+
/* @__PURE__ */ React11.createElement(
|
|
364
|
+
"input",
|
|
365
|
+
__spreadProps(__spreadValues({}, attr), {
|
|
366
|
+
id: "theme-toggle",
|
|
367
|
+
type: "checkbox",
|
|
368
|
+
className: "peer ... w-[2rem] opacity-[0] cursor-pointer"
|
|
369
|
+
})
|
|
370
|
+
),
|
|
371
|
+
/* @__PURE__ */ React11.createElement("span", { className: "slider-theme__bullet" })
|
|
369
372
|
));
|
|
370
373
|
}
|
|
371
374
|
export {
|
|
372
375
|
Button,
|
|
373
376
|
Card,
|
|
374
|
-
Dashboard,
|
|
375
377
|
Expandable,
|
|
376
378
|
MultiSelect,
|
|
377
379
|
NavTabClient,
|
|
378
380
|
SingleSelect,
|
|
379
381
|
Slider,
|
|
380
382
|
TextInput,
|
|
383
|
+
ThemeToggle,
|
|
381
384
|
Toast,
|
|
382
385
|
Tooltip
|
|
383
386
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Button.tsx","../src/components/TextInput.tsx","../src/components/Slider.tsx","../src/components/SingleSelect.tsx","../src/components/Tooltip.tsx","../src/components/NavTabClient.tsx","../src/components/Card.tsx","../src/components/Toast.tsx","../src/components/Expandable.tsx","../src/components/MultiSelect.tsx","../src/components/Dashboard.tsx"],"sourcesContent":["import React from \"react\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { faCircleNotch } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\ntype Button = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n icon?: IconProp;\n label: string;\n btnType?: \"primary\" | \"secondary\" | \"tertiary\";\n isLoading?: boolean;\n};\n\nexport default function Button({\n label,\n icon,\n isLoading,\n btnType,\n className,\n ...rest\n}: Readonly<Button>) {\n const buttonIcon = isLoading ? faCircleNotch : icon;\n return (\n <button\n {...rest}\n className={`${!icon && \"py-[0.67rem]\"} ${className} ${\n btnType == \"secondary\" && \"btn__secondary\"\n } btn__primary`}\n >\n {buttonIcon && icon && (\n <FontAwesomeIcon\n icon={buttonIcon}\n className={`text-[1.1rem] ${isLoading && \"animate-spin\"}`}\n />\n )}\n {isLoading ? \"Memproses ...\" : label}\n </button>\n );\n}\n","import React from \"react\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nconst input__icon = \"px-[0.7rem] text-[1.1rem] text-[var(--color-icon-input)]\";\n\nexport default function TextInput({\n label,\n labelFor,\n icon,\n ...attr\n}: Readonly<\n React.InputHTMLAttributes<HTMLInputElement> & {\n label?: string;\n labelFor?: string;\n icon?: IconProp;\n }\n>) {\n return (\n <div className=\"group ...\">\n {label && (\n <label htmlFor={labelFor} className=\"text-input__label\">\n {label}\n </label>\n )}\n <div className=\"text-input__wrapper\">\n {icon && <FontAwesomeIcon icon={icon} className={input__icon} />}\n <input\n {...attr}\n className={`text-input ${attr.className} ${icon && \"!pl-0\"}`}\n />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nexport default function Slider(\n attr: Readonly<React.InputHTMLAttributes<HTMLInputElement>>\n) {\n return (\n <div className=\"slider__wrapper group\">\n <input\n {...attr}\n id=\"slider\"\n type=\"checkbox\"\n className=\"peer ... w-[2rem] opacity-[0] cursor-pointer\"\n />\n <label htmlFor=\"slider\" className=\"slider\">\n <FontAwesomeIcon icon={faCheck} className=\"text-[0.7rem]\" />\n </label>\n </div>\n );\n}\n","\"use client\";\nimport React, { useDeferredValue, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faChevronDown } from \"@fortawesome/free-solid-svg-icons\";\n\ntype SingleSelect = React.InputHTMLAttributes<HTMLInputElement> & {\n label?: string;\n labelHtml?: string;\n options: {\n label: string;\n value: string;\n }[];\n};\n\nexport default function SingleSelect(attr: Readonly<SingleSelect>) {\n const [selected, setSelected] = useState({ label: \"\", value: \"\" });\n const [keyword, setKeyword] = useState(\"\");\n const inputKeyword = useDeferredValue(keyword);\n\n function getFiltered() {\n return attr.options.filter(\n ({ label, value }) =>\n label.toLowerCase().includes(inputKeyword.toLowerCase()) ||\n value.toLowerCase().includes(inputKeyword.toLowerCase())\n );\n }\n\n function selectItem({ label, value }: { label: string; value: string }) {\n setSelected({ label, value });\n setKeyword(\"\");\n }\n\n return (\n <div>\n {attr.label && (\n <label className=\"text-input__label\" htmlFor={attr.labelHtml}>\n {attr.label}\n </label>\n )}\n <div className=\"text-input__wrapper relative\">\n <input\n {...attr}\n {...(attr.onChange ? { onChange: attr.onChange } : {})}\n value={attr.value ?? selected.value}\n type=\"hidden\"\n />\n <input\n value={keyword}\n type=\"search\"\n onChange={(e) => setKeyword(e.target.value)}\n className=\"text-input peer ...\"\n placeholder={selected.value ? selected.label : \"Cari opsi ...\"}\n {...attr}\n />\n <div className=\"select-item__wrapper\">\n {getFiltered().length == 0 && keyword != \"\" && (\n <button className=\"select-item text-[var(--color-danger)]\">\n Tidak ada Item\n </button>\n )}\n {getFiltered().map(({ label, value }) => (\n <button\n onClick={() => selectItem({ label, value })}\n key={value}\n className=\"select-item\"\n >\n {label}\n {selected.value == value && (\n <FontAwesomeIcon\n icon={faCheck}\n className=\"text-[var(--color-primary)]\"\n />\n )}\n </button>\n ))}\n </div>\n <FontAwesomeIcon icon={faChevronDown} className={input__icon} />\n </div>\n </div>\n );\n}\n\nconst input__icon = \"pr-[0.7rem] text-[var(--color-icon-input)]\";\n","import React from \"react\";\n\ntype Tooltip = {\n children: React.ReactNode;\n text: string;\n position: \"top\" | \"bottom\" | \"right\" | \"left\";\n};\n\nexport default function Tooltip({\n children,\n text,\n position,\n}: Readonly<Tooltip>) {\n function getAccent() {\n const mapping = {\n top,\n bottom,\n left,\n right,\n };\n return mapping[position];\n }\n return (\n <div className=\"relative\">\n <div className=\"peer\">{children}</div>\n <span className={`tooltip-text ${getAccent()}`}>{text}</span>\n </div>\n );\n}\n\nconst top =\n \"bottom-full translate-y-[-0.3rem] right-0 after:bottom-0 after:translate-y-[0.25rem] \";\nconst bottom =\n \"right-0 top-full translate-y-[0.3rem] after:top-[-0.4rem] after:translate-y-[0.2rem] \";\nconst right =\n \"left-full w-[max-content] translate-x-[0.6rem] after:left-[-0.2rem] top-[-0.2rem] after:top-[0.6rem]\";\nconst left =\n \"right-full w-[max-content] translate-x-[-0.6rem] top-[-0.2rem] after:right-[-0.2rem] after:top-[0.6rem]\";\n","import React from \"react\";\n\ntype Option = {\n label: string;\n value: string;\n};\n\nexport default function NavTabClient({\n items,\n state,\n}: Readonly<{\n items: Option[];\n state: {\n active: string;\n setActive: (val: string) => void;\n };\n}>) {\n return (\n <nav className=\"navtab__wrapper\">\n {items.map(({ label, value }) => (\n <button\n key={value}\n className={`navtab__item ${\n state.active == value && \"navtab__item__active\"\n }`}\n onClick={() => state.setActive(value)}\n >\n {label}\n </button>\n ))}\n </nav>\n );\n}\n","import React from \"react\";\n\ntype Card = {\n children: React.ReactNode;\n className: string;\n};\n\nexport default function Card({ children, className }: Readonly<Card>) {\n return <div className={`card ${className}`}>{children}</div>;\n}\n\nconst Footer = ({\n className,\n children,\n}: {\n className?: string;\n children?: React.ReactNode;\n}) => {\n return (\n <div className={`${className} border-t border-t-[var(--color-border)]`}>\n {children}\n </div>\n );\n};\nCard.Footer = Footer;\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faCheckCircle,\n faInfoCircle,\n faQuestionCircle,\n faXmarkCircle,\n} from \"@fortawesome/free-solid-svg-icons\";\n\ntype ToastType = \"warning\" | \"success\" | \"info\" | \"danger\";\ntype Toast = {\n title: string;\n className?: string;\n description: string;\n type: ToastType;\n};\n\nexport default function Toast({\n title,\n description,\n type,\n className,\n}: Readonly<Toast>) {\n return (\n <div className={`${className} toast__wrapper group`}>\n <div className=\"toast__body\">\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"text-[1.2rem]\"\n style={{ color: getColor(type) }}\n />\n <div>\n <p className=\"toast__title\">{title}</p>\n <p className=\"toast__description\">{description}</p>\n </div>\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"toast-bg__icon\"\n style={{ color: getColor(type) }}\n />\n </div>\n <p className=\"toast__bar\" style={{ background: getColor(type) }}></p>\n </div>\n );\n}\n\nconst Inline = ({ text, type }: { text: string; type: ToastType }) => {\n return (\n <div\n className=\"toast__inline\"\n style={{ background: `var(--color-${type}-soft)`, opacity: 0.9 }}\n >\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"text-[1.1rem]\"\n style={{ color: getColor(type) }}\n />\n <p>{text}</p>\n </div>\n );\n};\n\nToast.Inline = Inline;\n\nfunction getColor(type: string) {\n return `var(--color-${type})`;\n}\n\nfunction getIcon(type: string) {\n const mapping = {\n warning: faQuestionCircle,\n info: faInfoCircle,\n danger: faXmarkCircle,\n success: faCheckCircle,\n };\n //@ts-expect-error call object using array index\n return mapping[type];\n}\n","import React from \"react\";\nimport { faCaretRight } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\ntype Expandable = {\n children: React.ReactNode;\n title: string;\n className: string;\n isOpen?: boolean;\n};\n\nexport default function Expandable({\n children,\n title,\n className,\n isOpen,\n}: Readonly<Expandable>) {\n const name = title.replace(\" \", \"\");\n return (\n <div className={`expandable ${className}`}>\n <input\n id={name}\n type=\"checkbox\"\n defaultChecked={isOpen}\n className=\"opacity-[0] peer absolute top-0 ex-title\"\n />\n <FontAwesomeIcon icon={faCaretRight} className=\"expandable__icon\" />\n <label htmlFor={name} className=\"expandable__title\">\n {title}\n </label>\n <div className=\"expandable__body\">\n <div className=\"p-[0.75rem] px-[1rem]\">{children}</div>\n </div>\n </div>\n );\n}\n","import React, { useCallback, useDeferredValue, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faListCheck } from \"@fortawesome/free-solid-svg-icons\";\n\ntype Option = {\n value: string;\n label: string;\n};\n\nexport default function MultiSelect({\n list,\n state,\n}: Readonly<{\n list: Option[];\n state: { value: Option[]; select: (newVal: Option[]) => void };\n}>) {\n const [keyword, setKeyword] = useState(\"\");\n const inputKeyword = useDeferredValue(keyword);\n\n function getFiltered() {\n return list.filter(\n ({ label, value }) =>\n label.toLowerCase().includes(inputKeyword.toLowerCase()) ||\n value.toLowerCase().includes(inputKeyword.toLowerCase())\n );\n }\n\n function selectItem({ label, value }: { label: string; value: string }) {\n //@ts-expect-error: avoid check\n state.select((prev) => {\n const isItemExist = prev.find((item: any) => item.value == value);\n if (isItemExist) {\n return prev.filter((item: any) => item.value != value);\n }\n return [...prev, { label, value }];\n });\n }\n\n function isItemExist(value: string) {\n return state.value.find((item: any) => item.value == value);\n }\n\n const selectUnSelectAll = useCallback(() => {\n const isAllSelected = state.value.length == list.length;\n state.select(isAllSelected ? [] : list);\n }, [state.value]);\n\n return (\n <div className=\"text-input__wrapper relative\">\n <input\n value={keyword}\n type=\"search\"\n placeholder={`${state.value.length} Dipilih`}\n className=\"text-input peer ...\"\n onChange={(e) => setKeyword(e.target.value)}\n />\n <div className=\"select-item__wrapper select-multiple__wrapper\">\n {getFiltered().length == 0 && keyword != \"\" && (\n <button className=\"select-item text-[var(--color-danger)]\">\n Tidak ada Item\n </button>\n )}\n {getFiltered().map(({ label, value }) => (\n <button\n onClick={() => selectItem({ label, value })}\n key={value}\n className=\"select-item\"\n >\n {label}\n {isItemExist(value) && (\n <FontAwesomeIcon\n icon={faCheck}\n className=\"text-[var(--color-primary)]\"\n />\n )}\n </button>\n ))}\n </div>\n <button className=\"cursor-pointer\" onClick={selectUnSelectAll}>\n <FontAwesomeIcon icon={faListCheck} className={input__icon} />\n </button>\n </div>\n );\n}\nconst input__icon = \"pr-[0.7rem] text-[var(--color-icon-input)]\";\n","import React, { useState } from \"react\";\nimport MultiSelect from \"./MultiSelect\";\n\nconst list = [\n { label: \"Option 1\", value: \"option1\" },\n { label: \"Option 2\", value: \"option2\" },\n { label: \"Option 3\", value: \"option3\" },\n];\nexport default function Dashboard() {\n const [selectedItem, setSelectedItem] = useState<\n { label: string; value: string }[]\n >([]);\n return (\n <div>\n <MultiSelect\n list={list}\n state={{ value: selectedItem, select: setSelectedItem }}\n />\n </div>\n );\n}\n"],"mappings":"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","names":["React","FontAwesomeIcon","React","FontAwesomeIcon","React","FontAwesomeIcon","React","FontAwesomeIcon","React","FontAwesomeIcon","faCheck","React","FontAwesomeIcon","faCheck","input__icon","React","React","React","React","FontAwesomeIcon","React","FontAwesomeIcon","React","useDeferredValue","useState","FontAwesomeIcon","faCheck","list","isItemExist","input__icon","React","useState","useState","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Button.tsx","../src/components/TextInput.tsx","../src/components/Slider.tsx","../src/components/SingleSelect.tsx","../src/components/Tooltip.tsx","../src/components/NavTabClient.tsx","../src/components/Card.tsx","../src/components/Toast.tsx","../src/components/Expandable.tsx","../src/components/MultiSelect.tsx","../src/components/ThemeToggle.tsx"],"sourcesContent":["import React from \"react\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCircleNotch } from \"@fortawesome/free-solid-svg-icons\";\n\ntype Button = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n icon?: IconProp;\n label: string;\n btnType?: \"primary\" | \"secondary\" | \"tertiary\";\n isLoading?: boolean;\n};\n\nexport default function Button({\n label,\n icon,\n isLoading,\n btnType,\n className,\n ...rest\n}: Readonly<Button>) {\n const buttonIcon = isLoading ? faCircleNotch : icon;\n return (\n <button\n {...rest}\n className={`${!icon && \"py-[0.85rem]\"} ${className} ${\n btnType == \"secondary\" && \"btn__secondary\"\n } btn__primary`}\n >\n {buttonIcon && icon && (\n <FontAwesomeIcon\n icon={buttonIcon}\n className={`text-[1.1rem] ${isLoading && \"animate-spin\"}`}\n />\n )}\n {isLoading ? \"Memproses ...\" : label}\n </button>\n );\n}\n","import React from \"react\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nconst input__icon = \"px-[0.85rem] text-[1.1rem] text-[var(--color-icon-input)]\";\n\nexport default function TextInput({\n label,\n labelFor,\n icon,\n ...attr\n}: Readonly<\n React.InputHTMLAttributes<HTMLInputElement> & {\n label?: string;\n labelFor?: string;\n icon?: IconProp;\n }\n>) {\n return (\n <div className=\"group ... w-full\">\n {label && (\n <label htmlFor={labelFor} className=\"text-input__label\">\n {label}\n </label>\n )}\n <div className=\"text-input__wrapper\">\n {icon && <FontAwesomeIcon icon={icon} className={input__icon} />}\n <input\n {...attr}\n className={`text-input w-full ${attr.className} ${icon && \"!pl-0\"}`}\n />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nexport default function Slider(\n attr: Readonly<React.InputHTMLAttributes<HTMLInputElement>>\n) {\n return (\n <div className=\"flex items-center h-[3rem]\">\n <div className=\"slider__wrapper group\">\n <input\n {...attr}\n id=\"slider\"\n type=\"checkbox\"\n className=\"peer ... w-[2rem] opacity-[0] cursor-pointer\"\n />\n <label htmlFor=\"slider\" className=\"slider\">\n <FontAwesomeIcon icon={faCheck} className=\"text-[0.7rem]\" />\n </label>\n </div>\n </div>\n );\n}\n","\"use client\";\nimport React, { useDeferredValue, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faChevronDown } from \"@fortawesome/free-solid-svg-icons\";\n\ntype SingleSelect = React.InputHTMLAttributes<HTMLInputElement> & {\n label?: string;\n labelHtml?: string;\n options: {\n label: string;\n value: string;\n }[];\n};\n\nexport default function SingleSelect(attr: Readonly<SingleSelect>) {\n const [selected, setSelected] = useState({ label: \"\", value: \"\" });\n const [keyword, setKeyword] = useState(\"\");\n const inputKeyword = useDeferredValue(keyword);\n\n function getFiltered() {\n return attr.options.filter(\n ({ label, value }) =>\n label.toLowerCase().includes(inputKeyword.toLowerCase()) ||\n value.toLowerCase().includes(inputKeyword.toLowerCase())\n );\n }\n\n function selectItem({ label, value }: { label: string; value: string }) {\n setSelected({ label, value });\n setKeyword(\"\");\n }\n\n return (\n <div className=\"w-full\">\n {attr.label && (\n <label className=\"text-input__label\" htmlFor={attr.labelHtml}>\n {attr.label}\n </label>\n )}\n <div className=\"text-input__wrapper relative\">\n <input\n {...attr}\n {...(attr.onChange ? { onChange: attr.onChange } : {})}\n value={attr.value ?? selected.value}\n type=\"hidden\"\n />\n <input\n value={keyword}\n type=\"search\"\n onChange={(e) => setKeyword(e.target.value)}\n className=\"text-input peer ... w-full\"\n placeholder={selected.value ? selected.label : \"Cari opsi ...\"}\n {...attr}\n />\n <div className=\"select-item__wrapper\">\n {getFiltered().length == 0 && keyword != \"\" && (\n <button className=\"select-item text-[var(--color-danger)]\">\n Tidak ada Item\n </button>\n )}\n {getFiltered().map(({ label, value }) => (\n <button\n onClick={() => selectItem({ label, value })}\n key={value}\n className=\"select-item\"\n >\n {label}\n {selected.value == value && (\n <FontAwesomeIcon\n icon={faCheck}\n className=\"text-[var(--color-primary)]\"\n />\n )}\n </button>\n ))}\n </div>\n <FontAwesomeIcon icon={faChevronDown} className={input__icon} />\n </div>\n </div>\n );\n}\n\nconst input__icon = \"pr-[0.7rem] text-[var(--color-icon-input)]\";\n","import React from \"react\";\n\ntype Tooltip = {\n children: React.ReactNode;\n text: string;\n position: \"top\" | \"bottom\" | \"right\" | \"left\";\n};\n\nexport default function Tooltip({\n children,\n text,\n position = \"top\",\n}: Readonly<Tooltip>) {\n function getAccent() {\n const mapping = {\n top,\n bottom,\n left,\n right,\n };\n return mapping[position];\n }\n return (\n <div className=\"relative\">\n <div className=\"peer\">{children}</div>\n <span className={`tooltip-text ${getAccent()}`}>{text}</span>\n </div>\n );\n}\n\nconst top =\n \"bottom-full translate-y-[-0.3rem] right-0 after:bottom-0 after:translate-y-[0.25rem] \";\nconst bottom =\n \"right-0 top-full translate-y-[0.3rem] after:top-[-0.4rem] after:translate-y-[0.2rem] \";\nconst right =\n \"left-full w-[max-content] translate-x-[0.6rem] after:left-[-0.2rem] top-[-0.2rem] after:top-[0.6rem]\";\nconst left =\n \"right-full w-[max-content] translate-x-[-0.6rem] top-[-0.2rem] after:right-[-0.2rem] after:top-[0.6rem]\";\n","import React from \"react\";\n\ntype Option = {\n label: string;\n value: string;\n};\n\nexport default function NavTabClient({\n items,\n state,\n}: Readonly<{\n items: Option[];\n state: {\n active: string;\n setActive: (val: string) => void;\n };\n}>) {\n return (\n <nav className=\"navtab__wrapper\">\n {items.map(({ label, value }) => (\n <button\n key={value}\n className={`navtab__item ${\n state.active == value\n ? \"navtab__item__active\"\n : \"hover:bg-[var(--color-border)]\"\n }`}\n onClick={() => state.setActive(value)}\n >\n {label}\n </button>\n ))}\n </nav>\n );\n}\n","import React from \"react\";\n\ntype Card = {\n children: React.ReactNode;\n className: string;\n};\n\nexport default function Card({ children, className }: Readonly<Card>) {\n return <div className={`card ${className}`}>{children}</div>;\n}\n\nconst Footer = ({\n className,\n children,\n}: {\n className?: string;\n children?: React.ReactNode;\n}) => {\n return (\n <div className={`${className} border-t border-t-[var(--color-border)]`}>\n {children}\n </div>\n );\n};\nCard.Footer = Footer;\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faCheckCircle,\n faInfoCircle,\n faQuestionCircle,\n faXmarkCircle,\n} from \"@fortawesome/free-solid-svg-icons\";\n\ntype ToastType = \"warning\" | \"success\" | \"info\" | \"danger\";\ntype Toast = {\n title: string;\n className?: string;\n description: string;\n type: ToastType;\n};\n\nexport default function Toast({\n title,\n description,\n type = \"info\",\n className,\n}: Readonly<Toast>) {\n return (\n <div className={`${className} toast__wrapper group`}>\n <div className=\"toast__body\">\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"text-[1.2rem]\"\n style={{ color: getColor(type) }}\n />\n <div>\n <p className=\"toast__title\">{title}</p>\n <p className=\"toast__description\">{description}</p>\n </div>\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"toast-bg__icon\"\n style={{ color: getColor(type) }}\n />\n </div>\n <p className=\"toast__bar\" style={{ background: getColor(type) }}></p>\n </div>\n );\n}\n\nconst Inline = ({ text, type }: { text: string; type: ToastType }) => {\n return (\n <div\n className=\"toast__inline\"\n style={{ background: `var(--color-${type}-soft)`, opacity: 0.9 }}\n >\n <FontAwesomeIcon\n icon={getIcon(type)}\n className=\"text-[1.1rem]\"\n style={{ color: getColor(type) }}\n />\n <p>{text}</p>\n </div>\n );\n};\n\nToast.Inline = Inline;\n\nfunction getColor(type: string) {\n return `var(--color-${type})`;\n}\n\nfunction getIcon(type: string) {\n const mapping = {\n warning: faQuestionCircle,\n info: faInfoCircle,\n danger: faXmarkCircle,\n success: faCheckCircle,\n };\n //@ts-expect-error call object using array index\n return mapping[type];\n}\n","import React from \"react\";\nimport { faCaretRight } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\ntype Expandable = {\n children: React.ReactNode;\n title: string;\n className?: string;\n isOpen?: boolean;\n};\n\nexport default function Expandable({\n children,\n title,\n className,\n isOpen,\n}: Readonly<Expandable>) {\n const name = title.replace(\" \", \"\");\n return (\n <div className={`expandable ${className}`}>\n <input\n id={name}\n type=\"checkbox\"\n defaultChecked={isOpen}\n className=\"opacity-[0] peer absolute top-0 ex-title\"\n />\n <FontAwesomeIcon icon={faCaretRight} className=\"expandable__icon\" />\n <label htmlFor={name} className=\"expandable__title\">\n {title}\n </label>\n <div className=\"expandable__body\">\n <div className=\"p-[0.75rem] px-[1rem]\">{children}</div>\n </div>\n </div>\n );\n}\n","import React, { useCallback, useDeferredValue, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faListCheck } from \"@fortawesome/free-solid-svg-icons\";\n\ntype Option = {\n value: string;\n label: string;\n};\n\nexport default function MultiSelect({\n list,\n state,\n}: Readonly<{\n list: Option[];\n state: { value: Option[]; select: (newVal: Option[]) => void };\n}>) {\n const [keyword, setKeyword] = useState(\"\");\n const inputKeyword = useDeferredValue(keyword);\n\n function getFiltered() {\n return list.filter(\n ({ label, value }) =>\n label.toLowerCase().includes(inputKeyword.toLowerCase()) ||\n value.toLowerCase().includes(inputKeyword.toLowerCase())\n );\n }\n\n function selectItem({ label, value }: { label: string; value: string }) {\n //@ts-expect-error: avoid check\n state.select((prev) => {\n const isItemExist = prev.find((item: any) => item.value == value);\n if (isItemExist) {\n return prev.filter((item: any) => item.value != value);\n }\n return [...prev, { label, value }];\n });\n }\n\n function isItemExist(value: string) {\n return state.value.find((item: any) => item.value == value);\n }\n\n const selectUnSelectAll = useCallback(() => {\n const isAllSelected = state.value.length == list.length;\n state.select(isAllSelected ? [] : list);\n }, [state.value]);\n\n return (\n <div className=\"text-input__wrapper relative\">\n <input\n value={keyword}\n type=\"search\"\n placeholder={`${state.value.length} Dipilih`}\n className=\"text-input peer ...\"\n onChange={(e) => setKeyword(e.target.value)}\n />\n <div className=\"select-item__wrapper select-multiple__wrapper\">\n {getFiltered().length == 0 && keyword != \"\" && (\n <button className=\"select-item text-[var(--color-danger)]\">\n Tidak ada Item\n </button>\n )}\n {getFiltered().map(({ label, value }) => (\n <button\n onClick={() => selectItem({ label, value })}\n key={value}\n className=\"select-item\"\n >\n {label}\n {isItemExist(value) && (\n <FontAwesomeIcon\n icon={faCheck}\n className=\"text-[var(--color-primary)]\"\n />\n )}\n </button>\n ))}\n </div>\n <button className=\"cursor-pointer\" onClick={selectUnSelectAll}>\n <FontAwesomeIcon icon={faListCheck} className={input__icon} />\n </button>\n </div>\n );\n}\nconst input__icon = \"pr-[0.7rem] text-[var(--color-icon-input)]\";\n","\"use client\";\nimport React from \"react\";\n\nexport default function ThemeToggle(\n attr: Readonly<React.InputHTMLAttributes<HTMLInputElement>>\n) {\n return (\n <div className=\"flex items-center h-[3rem]\">\n <label\n htmlFor=\"theme-toggle\"\n className=\"slider__wrapper slider-theme slider-theme-light\"\n >\n <input\n {...attr}\n id=\"theme-toggle\"\n type=\"checkbox\"\n className=\"peer ... w-[2rem] opacity-[0] cursor-pointer\"\n />\n <span className=\"slider-theme__bullet\"></span>\n </label>\n </div>\n );\n}\n"],"mappings":"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","names":["React","FontAwesomeIcon","React","FontAwesomeIcon","React","FontAwesomeIcon","React","FontAwesomeIcon","React","FontAwesomeIcon","faCheck","React","FontAwesomeIcon","faCheck","input__icon","React","React","React","React","FontAwesomeIcon","React","FontAwesomeIcon","React","useDeferredValue","useState","FontAwesomeIcon","faCheck","isItemExist","input__icon","React","React"]}
|
package/dist/styles.css
CHANGED
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
--color-white: #fff;
|
|
11
11
|
--spacing: 0.25rem;
|
|
12
12
|
--font-weight-semibold: 600;
|
|
13
|
-
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
14
13
|
--animate-spin: spin 1s linear infinite;
|
|
15
14
|
--default-transition-duration: 150ms;
|
|
16
15
|
--default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
@@ -212,21 +211,24 @@
|
|
|
212
211
|
.left-full {
|
|
213
212
|
left: 100%;
|
|
214
213
|
}
|
|
215
|
-
.my-\[0\.
|
|
216
|
-
margin-block: 0.
|
|
214
|
+
.my-\[0\.85rem\] {
|
|
215
|
+
margin-block: 0.85rem;
|
|
217
216
|
}
|
|
218
217
|
.mt-\[1\.5rem\] {
|
|
219
218
|
margin-top: 1.5rem;
|
|
220
219
|
}
|
|
220
|
+
.mt-\[1px\] {
|
|
221
|
+
margin-top: 1px;
|
|
222
|
+
}
|
|
221
223
|
.mt-\[1rem\] {
|
|
222
224
|
margin-top: 1rem;
|
|
223
225
|
}
|
|
224
|
-
.mt-\[2\.2rem\] {
|
|
225
|
-
margin-top: 2.2rem;
|
|
226
|
-
}
|
|
227
226
|
.mt-\[2\.5rem\] {
|
|
228
227
|
margin-top: 2.5rem;
|
|
229
228
|
}
|
|
229
|
+
.mt-\[2\.25rem\] {
|
|
230
|
+
margin-top: 2.25rem;
|
|
231
|
+
}
|
|
230
232
|
.mt-\[3rem\] {
|
|
231
233
|
margin-top: 3rem;
|
|
232
234
|
}
|
|
@@ -242,6 +244,9 @@
|
|
|
242
244
|
.inline-block {
|
|
243
245
|
display: inline-block;
|
|
244
246
|
}
|
|
247
|
+
.h-\[3rem\] {
|
|
248
|
+
height: 3rem;
|
|
249
|
+
}
|
|
245
250
|
.w-\[2rem\] {
|
|
246
251
|
width: 2rem;
|
|
247
252
|
}
|
|
@@ -254,6 +259,9 @@
|
|
|
254
259
|
.w-\[max-content\] {
|
|
255
260
|
width: max-content;
|
|
256
261
|
}
|
|
262
|
+
.w-full {
|
|
263
|
+
width: 100%;
|
|
264
|
+
}
|
|
257
265
|
.translate-x-\[-0\.6rem\] {
|
|
258
266
|
--tw-translate-x: -0.6rem;
|
|
259
267
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
@@ -279,6 +287,9 @@
|
|
|
279
287
|
.cursor-pointer {
|
|
280
288
|
cursor: pointer;
|
|
281
289
|
}
|
|
290
|
+
.items-center {
|
|
291
|
+
align-items: center;
|
|
292
|
+
}
|
|
282
293
|
.items-end {
|
|
283
294
|
align-items: flex-end;
|
|
284
295
|
}
|
|
@@ -311,14 +322,14 @@
|
|
|
311
322
|
.p-\[0\.75rem\] {
|
|
312
323
|
padding: 0.75rem;
|
|
313
324
|
}
|
|
314
|
-
.px-\[0\.
|
|
315
|
-
padding-inline: 0.
|
|
325
|
+
.px-\[0\.85rem\] {
|
|
326
|
+
padding-inline: 0.85rem;
|
|
316
327
|
}
|
|
317
328
|
.px-\[1rem\] {
|
|
318
329
|
padding-inline: 1rem;
|
|
319
330
|
}
|
|
320
|
-
.py-\[0\.
|
|
321
|
-
padding-block: 0.
|
|
331
|
+
.py-\[0\.85rem\] {
|
|
332
|
+
padding-block: 0.85rem;
|
|
322
333
|
}
|
|
323
334
|
.pr-\[0\.7rem\] {
|
|
324
335
|
padding-right: 0.7rem;
|
|
@@ -351,18 +362,6 @@
|
|
|
351
362
|
.opacity-\[0\] {
|
|
352
363
|
opacity: 0;
|
|
353
364
|
}
|
|
354
|
-
.duration-500 {
|
|
355
|
-
--tw-duration: 500ms;
|
|
356
|
-
transition-duration: 500ms;
|
|
357
|
-
}
|
|
358
|
-
.duration-2000 {
|
|
359
|
-
--tw-duration: 2000ms;
|
|
360
|
-
transition-duration: 2000ms;
|
|
361
|
-
}
|
|
362
|
-
.ease-in-out {
|
|
363
|
-
--tw-ease: var(--ease-in-out);
|
|
364
|
-
transition-timing-function: var(--ease-in-out);
|
|
365
|
-
}
|
|
366
365
|
.after\:top-\[-0\.4rem\] {
|
|
367
366
|
&::after {
|
|
368
367
|
content: var(--tw-content);
|
|
@@ -407,11 +406,24 @@
|
|
|
407
406
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
408
407
|
}
|
|
409
408
|
}
|
|
409
|
+
.hover\:bg-\[var\(--color-border\)\] {
|
|
410
|
+
&:hover {
|
|
411
|
+
@media (hover: hover) {
|
|
412
|
+
background-color: var(--color-border);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
410
416
|
}
|
|
411
|
-
|
|
412
|
-
font-size:
|
|
417
|
+
html {
|
|
418
|
+
font-size: 15px;
|
|
413
419
|
color: var(--color-text-primary);
|
|
414
420
|
}
|
|
421
|
+
.slider-theme-light {
|
|
422
|
+
background-image: url("../dist/img/light.png");
|
|
423
|
+
}
|
|
424
|
+
.slider-theme:has(:checked) {
|
|
425
|
+
background-image: url("../dist/img/dark.png") !important;
|
|
426
|
+
}
|
|
415
427
|
:root {
|
|
416
428
|
--color-bg-surface: #fff;
|
|
417
429
|
--color-bg-input: #fff;
|
|
@@ -426,13 +438,13 @@ body {
|
|
|
426
438
|
--color-border-soft: #f0f0f0;
|
|
427
439
|
--color-shadow: #e6e9ef78;
|
|
428
440
|
--color-danger: #ff4f60;
|
|
429
|
-
--color-danger-soft: #
|
|
441
|
+
--color-danger-soft: #ffedeed5;
|
|
430
442
|
--color-info: #1593db;
|
|
431
|
-
--color-info-soft: #
|
|
443
|
+
--color-info-soft: #ebf8ffd5;
|
|
432
444
|
--color-warning: #ffa22f;
|
|
433
|
-
--color-warning-soft: #
|
|
445
|
+
--color-warning-soft: #fff1e1d5;
|
|
434
446
|
--color-success: #2b9a62;
|
|
435
|
-
--color-success-soft: #
|
|
447
|
+
--color-success-soft: #eafff4d5;
|
|
436
448
|
}
|
|
437
449
|
@media (prefers-color-scheme: dark) {
|
|
438
450
|
:root {
|
|
@@ -443,17 +455,19 @@ body {
|
|
|
443
455
|
@layer components {
|
|
444
456
|
.btn__primary {
|
|
445
457
|
display: flex;
|
|
458
|
+
min-width: max-content;
|
|
446
459
|
cursor: pointer;
|
|
447
460
|
align-items: center;
|
|
448
|
-
|
|
461
|
+
justify-content: center;
|
|
462
|
+
gap: 0.6rem;
|
|
449
463
|
border-radius: 0.4rem;
|
|
450
464
|
border-style: var(--tw-border-style);
|
|
451
465
|
border-width: 1px;
|
|
452
466
|
border-color: var(--color-primary);
|
|
453
467
|
background-color: var(--color-primary);
|
|
454
|
-
padding: 0.
|
|
455
|
-
--tw-leading: 1.
|
|
456
|
-
line-height: 1.
|
|
468
|
+
padding: 0.84rem;
|
|
469
|
+
--tw-leading: 1.26;
|
|
470
|
+
line-height: 1.26;
|
|
457
471
|
color: var(--color-white);
|
|
458
472
|
transition-property: all;
|
|
459
473
|
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
|
@@ -481,6 +495,7 @@ body {
|
|
|
481
495
|
}
|
|
482
496
|
.text-input__wrapper {
|
|
483
497
|
display: flex;
|
|
498
|
+
width: 100%;
|
|
484
499
|
align-items: center;
|
|
485
500
|
border-radius: 0.4rem;
|
|
486
501
|
border-style: var(--tw-border-style);
|
|
@@ -495,7 +510,7 @@ body {
|
|
|
495
510
|
}
|
|
496
511
|
}
|
|
497
512
|
.text-input {
|
|
498
|
-
padding: 0.
|
|
513
|
+
padding: 0.89rem;
|
|
499
514
|
--tw-leading: 1.2;
|
|
500
515
|
line-height: 1.2;
|
|
501
516
|
&:focus {
|
|
@@ -512,8 +527,6 @@ body {
|
|
|
512
527
|
position: relative;
|
|
513
528
|
height: 0.5rem;
|
|
514
529
|
width: 2rem;
|
|
515
|
-
--tw-translate-y: -0.98rem;
|
|
516
|
-
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
517
530
|
cursor: pointer;
|
|
518
531
|
border-radius: 2rem;
|
|
519
532
|
background-color: var(--color-icon-input);
|
|
@@ -578,7 +591,7 @@ body {
|
|
|
578
591
|
z-index: 10000;
|
|
579
592
|
}
|
|
580
593
|
&:is(:where(.peer):focus ~ *) {
|
|
581
|
-
--tw-translate-y: 1.
|
|
594
|
+
--tw-translate-y: 1.9rem;
|
|
582
595
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
583
596
|
}
|
|
584
597
|
&:is(:where(.peer):focus ~ *) {
|
|
@@ -607,7 +620,7 @@ body {
|
|
|
607
620
|
z-index: 10000;
|
|
608
621
|
}
|
|
609
622
|
&:focus-within {
|
|
610
|
-
--tw-translate-y: 1.
|
|
623
|
+
--tw-translate-y: 1.9rem;
|
|
611
624
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
612
625
|
}
|
|
613
626
|
&:focus-within {
|
|
@@ -675,11 +688,6 @@ body {
|
|
|
675
688
|
padding: 0.52rem;
|
|
676
689
|
padding-inline: 1rem;
|
|
677
690
|
opacity: 0.5;
|
|
678
|
-
&:hover {
|
|
679
|
-
@media (hover: hover) {
|
|
680
|
-
background-color: var(--color-border);
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
691
|
}
|
|
684
692
|
.navtab__item__active {
|
|
685
693
|
border-bottom-color: var(--color-primary);
|
|
@@ -777,7 +785,7 @@ body {
|
|
|
777
785
|
cursor: pointer;
|
|
778
786
|
align-items: center;
|
|
779
787
|
gap: 0.5rem;
|
|
780
|
-
padding: 0.
|
|
788
|
+
padding: 0.95rem;
|
|
781
789
|
padding-inline: 1rem;
|
|
782
790
|
--tw-leading: 1;
|
|
783
791
|
line-height: 1;
|
|
@@ -809,8 +817,8 @@ body {
|
|
|
809
817
|
}
|
|
810
818
|
.expandable__icon {
|
|
811
819
|
position: absolute;
|
|
812
|
-
top: 0.
|
|
813
|
-
right: 0.
|
|
820
|
+
top: 0.9rem;
|
|
821
|
+
right: 0.9rem;
|
|
814
822
|
font-size: 1.1rem;
|
|
815
823
|
color: var(--color-icon-input);
|
|
816
824
|
transition-property: rotate;
|
|
@@ -820,6 +828,40 @@ body {
|
|
|
820
828
|
rotate: 90deg;
|
|
821
829
|
}
|
|
822
830
|
}
|
|
831
|
+
.slider-theme {
|
|
832
|
+
display: block;
|
|
833
|
+
height: 1.5rem !important;
|
|
834
|
+
width: 3rem !important;
|
|
835
|
+
border-radius: 5rem;
|
|
836
|
+
background-size: contain;
|
|
837
|
+
background-position: center;
|
|
838
|
+
--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
|
839
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
840
|
+
transition-property: all;
|
|
841
|
+
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
|
842
|
+
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
|
843
|
+
--tw-duration: 0.5s;
|
|
844
|
+
transition-duration: 0.5s;
|
|
845
|
+
}
|
|
846
|
+
.slider-theme__bullet {
|
|
847
|
+
position: absolute;
|
|
848
|
+
top: 0.2rem;
|
|
849
|
+
left: 0.2rem;
|
|
850
|
+
height: 1.1rem;
|
|
851
|
+
width: 1.1rem;
|
|
852
|
+
border-radius: 50%;
|
|
853
|
+
background-color: #fbd549;
|
|
854
|
+
transition-property: all;
|
|
855
|
+
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
|
856
|
+
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
|
857
|
+
&:is(:where(.peer):checked ~ *) {
|
|
858
|
+
--tw-translate-x: 1.47rem;
|
|
859
|
+
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
860
|
+
}
|
|
861
|
+
&:is(:where(.peer):checked ~ *) {
|
|
862
|
+
background-color: #eceff1;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
823
865
|
}
|
|
824
866
|
@property --tw-translate-x {
|
|
825
867
|
syntax: "*";
|
|
@@ -865,14 +907,6 @@ body {
|
|
|
865
907
|
syntax: "*";
|
|
866
908
|
inherits: false;
|
|
867
909
|
}
|
|
868
|
-
@property --tw-duration {
|
|
869
|
-
syntax: "*";
|
|
870
|
-
inherits: false;
|
|
871
|
-
}
|
|
872
|
-
@property --tw-ease {
|
|
873
|
-
syntax: "*";
|
|
874
|
-
inherits: false;
|
|
875
|
-
}
|
|
876
910
|
@property --tw-content {
|
|
877
911
|
syntax: "*";
|
|
878
912
|
initial-value: "";
|
|
@@ -952,6 +986,14 @@ body {
|
|
|
952
986
|
syntax: "*";
|
|
953
987
|
inherits: false;
|
|
954
988
|
}
|
|
989
|
+
@property --tw-duration {
|
|
990
|
+
syntax: "*";
|
|
991
|
+
inherits: false;
|
|
992
|
+
}
|
|
993
|
+
@property --tw-ease {
|
|
994
|
+
syntax: "*";
|
|
995
|
+
inherits: false;
|
|
996
|
+
}
|
|
955
997
|
@keyframes spin {
|
|
956
998
|
to {
|
|
957
999
|
transform: rotate(360deg);
|
|
@@ -970,8 +1012,6 @@ body {
|
|
|
970
1012
|
--tw-skew-y: initial;
|
|
971
1013
|
--tw-border-style: solid;
|
|
972
1014
|
--tw-leading: initial;
|
|
973
|
-
--tw-duration: initial;
|
|
974
|
-
--tw-ease: initial;
|
|
975
1015
|
--tw-content: "";
|
|
976
1016
|
--tw-outline-style: solid;
|
|
977
1017
|
--tw-shadow: 0 0 #0000;
|
|
@@ -989,6 +1029,8 @@ body {
|
|
|
989
1029
|
--tw-ring-offset-color: #fff;
|
|
990
1030
|
--tw-ring-offset-shadow: 0 0 #0000;
|
|
991
1031
|
--tw-font-weight: initial;
|
|
1032
|
+
--tw-duration: initial;
|
|
1033
|
+
--tw-ease: initial;
|
|
992
1034
|
}
|
|
993
1035
|
}
|
|
994
1036
|
}
|
package/package.json
CHANGED
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"react-dom": "^18.2.0"
|
|
33
33
|
},
|
|
34
34
|
"name": "@safestrong/ppa-component-library",
|
|
35
|
-
"version": "1.
|
|
35
|
+
"version": "1.2.0",
|
|
36
36
|
"description": "Collection of reusable components for any PPA web applications",
|
|
37
37
|
"main": "dist/index.cjs",
|
|
38
38
|
"module": "dist/index.js",
|
|
@@ -57,7 +57,8 @@
|
|
|
57
57
|
"import": "./dist/index.js",
|
|
58
58
|
"require": "./dist/index.cjs"
|
|
59
59
|
},
|
|
60
|
-
"./styles.css": "./dist/styles.css"
|
|
60
|
+
"./styles.css": "./dist/styles.css",
|
|
61
|
+
"./img/*": "./dist/img/*"
|
|
61
62
|
},
|
|
62
63
|
"sideEffects": [
|
|
63
64
|
"**/*.css"
|
package/readme.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# 📦 PPA Component Library
|
|
2
|
+
|
|
3
|
+
Reusable component for faster web development, simple and easy to use. Enabling user to define it's color theme, make the UI displayed consistently.
|
|
4
|
+
|
|
5
|
+
> You need additional package (mandatory) while using this component <br> > [Fontawesome](https://fontawesome.com/) and [Tailwind CSS](https://tailwindcss.com/)
|
|
6
|
+
|
|
7
|
+
## 💻 Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm i @safestrong/ppa-component-library
|
|
11
|
+
#OR
|
|
12
|
+
yarn add @safestrong/ppa-component-library
|
|
13
|
+
#OR
|
|
14
|
+
pnpm add @safestrong/ppa-component-library
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 🕹 Usage
|
|
18
|
+
|
|
19
|
+
Import the component first <br>
|
|
20
|
+
`import { Button } from "@safestrong/ppa-component-library"` <br><br>
|
|
21
|
+
Use component in your page or your own component <br>
|
|
22
|
+
`<Button label="Click me" />`
|
|
23
|
+
|
|
24
|
+
## 📂 List
|
|
25
|
+
|
|
26
|
+
### Button - `<Button />`
|
|
27
|
+
|
|
28
|
+
| Prop | Type | Required | Default | Description |
|
|
29
|
+
| ----------- | ---------- | -------- | ------- | ---------------------------------- |
|
|
30
|
+
| `label` | `string` | ✅ Yes | — | The text inside the button. |
|
|
31
|
+
| `isLoading` | `boolean` | ❌ No | false | Loading state waiting |
|
|
32
|
+
| `btnType` | `enum` | ❌ No | primary | `primary`, `secondary`, `tertiary` |
|
|
33
|
+
| `icon` | `IconProp` | ❌ No | — | Icon inside the button. |
|
|
34
|
+
| `className` | `string` | ❌ No | — | Additional class for button. |
|
|
35
|
+
|
|
36
|
+
<hr>
|
|
37
|
+
|
|
38
|
+
### Card - `<Card />`
|
|
39
|
+
|
|
40
|
+
| Prop | Type | Required | Default | Description |
|
|
41
|
+
| ----------- | ----------------- | -------- | ------- | ------------------------- |
|
|
42
|
+
| `children` | `React.ReactNode` | ✅ Yes | — | Content inside. |
|
|
43
|
+
| `className` | `string` | ❌ No | - | Additional class for card |
|
|
44
|
+
|
|
45
|
+
<hr>
|
|
46
|
+
|
|
47
|
+
### Text Input - `<TextInput />`
|
|
48
|
+
|
|
49
|
+
| Prop | Type | Required | Default | Description |
|
|
50
|
+
| ---------- | ---------- | -------- | ------- | ---------------------------------- |
|
|
51
|
+
| `icon` | `IconProp` | ❌ No | — | Icon inside text input |
|
|
52
|
+
| `label` | `string` | ❌ No | - | Additional label if needed |
|
|
53
|
+
| `labelFor` | `string` | ❌ No | - | Label (if any) `htmlFor` attribute |
|
|
54
|
+
|
|
55
|
+
<hr>
|
|
56
|
+
|
|
57
|
+
### Toast - `<Toast />`
|
|
58
|
+
|
|
59
|
+
| Prop | Type | Required | Default | Description |
|
|
60
|
+
| ------------- | -------- | -------- | ------- | ----------------------------------- |
|
|
61
|
+
| `title` | `string` | ✅ Yes | — | Toast Title |
|
|
62
|
+
| `description` | `string` | ✅ Yes | - | Description on toast body |
|
|
63
|
+
| `type` | `enum` | ❌ No | `info` | `info`,`warning`,`success`,`danger` |
|
|
64
|
+
| `className` | `string` | ❌ No | - | Additional className for Toast body |
|
|
65
|
+
|
|
66
|
+
<hr>
|
|
67
|
+
|
|
68
|
+
### Expandable - `<Expandable />`
|
|
69
|
+
|
|
70
|
+
| Prop | Type | Required | Default | Description |
|
|
71
|
+
| ----------- | ----------------- | -------- | ------- | ------------------------------- |
|
|
72
|
+
| `title` | `string` | ✅ Yes | — | Title |
|
|
73
|
+
| `children` | `React.ReactNode` | ✅ Yes | - | Content inside |
|
|
74
|
+
| `isOpen` | `boolean` | ❌ No | false | Auto show/expand content |
|
|
75
|
+
| `className` | `string` | ❌ No | - | Additional class for Expandable |
|
|
76
|
+
|
|
77
|
+
<hr>
|
|
78
|
+
|
|
79
|
+
### Tooltip - `<Tooltip />`
|
|
80
|
+
|
|
81
|
+
| Prop | Type | Required | Default | Description |
|
|
82
|
+
| ---------- | ----------------- | -------- | ------- | -------------------------------- |
|
|
83
|
+
| `children` | `React.ReactNode` | ✅ Yes | — | Text content |
|
|
84
|
+
| `text` | `string` | ✅ Yes | - | Tooltip text |
|
|
85
|
+
| `position` | `string` | ❌ No | `top` | `top`, `bottom`, `right`, `left` |
|
|
86
|
+
|
|
87
|
+
<hr>
|
|
88
|
+
|
|
89
|
+
### Single Select - `<SingleSelect />` ✅ Client Component
|
|
90
|
+
|
|
91
|
+
| Prop | Type | Required | Default | Description |
|
|
92
|
+
| ----------- | -------------------------------- | -------- | ------- | ---------------------------------- |
|
|
93
|
+
| `label` | `string` | ❌ No | — | Additional label |
|
|
94
|
+
| `labelHtml` | `string` | ❌ No | - | Label (if any) `htmlFor` attribute |
|
|
95
|
+
| `options` | `{label:string, value:string}[]` | ❌ No | - | List Option |
|
|
96
|
+
|
|
97
|
+
<hr>
|
|
98
|
+
|
|
99
|
+
### Multi Select - `<MultiSelect />` ✅ Client Component
|
|
100
|
+
|
|
101
|
+
| Prop | Type | Required | Default | Description |
|
|
102
|
+
| ------- | --------------------------------- | -------- | ------- | ------------ |
|
|
103
|
+
| `state` | `React.useState<{value, select}>` | ✅ Yes | — | Text content |
|
|
104
|
+
| `list` | `{label:string, value:string}[]` | ✅ Yes | - | List Option |
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
export default function Dashboard() {
|
|
110
|
+
const [selectedItem, setSelectedItem] = useState([]);
|
|
111
|
+
return (
|
|
112
|
+
<MultiSelect
|
|
113
|
+
list={list}
|
|
114
|
+
state={{ value: selectedItem, select: setSelectedItem }}
|
|
115
|
+
/>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
<hr>
|
|
121
|
+
|
|
122
|
+
### Slider - `<Slider />`
|
|
123
|
+
|
|
124
|
+
| Prop | Type | Required | Default | Description |
|
|
125
|
+
| --------------------- | --------------------- | -------- | ------- | ---------------------------------- |
|
|
126
|
+
| `InputHTMLAttributes` | `InputHTMLAttributes` | ❌ No | — | optinal attribute of input Element |
|
|
127
|
+
|
|
128
|
+
<hr>
|
|
129
|
+
|
|
130
|
+
### Theme Toggle - `<ThemeToggle />`
|
|
131
|
+
|
|
132
|
+
| Prop | Type | Required | Default | Description |
|
|
133
|
+
| --------------------- | --------------------- | -------- | ------- | ---------------------------------- |
|
|
134
|
+
| `InputHTMLAttributes` | `InputHTMLAttributes` | ❌ No | — | optinal attribute of input Element |
|
|
135
|
+
|
|
136
|
+
<hr>
|
|
137
|
+
|
|
138
|
+
### Tab Navigation - `<NavTabClient />` ✅ Client Component
|
|
139
|
+
|
|
140
|
+
| Prop | Type | Required | Default | Description |
|
|
141
|
+
| ---------- | -------------------------------- | -------- | ------- | ------------ |
|
|
142
|
+
| `children` | `React.ReactNode` | ✅ Yes | — | Text content |
|
|
143
|
+
| `state` | `string` | ✅ Yes | - | Tooltip text |
|
|
144
|
+
| `items` | `{label:string, value:string}[]` | ✅ Ye | - | List Option |
|