react-better-html 1.1.9 → 1.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +56 -0
  3. package/dist/components/BetterHtmlProvider.d.ts +13 -3
  4. package/dist/components/BetterHtmlProvider.js +103 -24
  5. package/dist/components/Button.d.ts +63 -0
  6. package/dist/components/Button.js +157 -0
  7. package/dist/components/Div.d.ts +9 -17
  8. package/dist/components/Div.js +2 -2
  9. package/dist/components/Divider.d.ts +21 -0
  10. package/dist/components/Divider.js +20 -0
  11. package/dist/components/Icon.d.ts +13 -0
  12. package/dist/components/Icon.js +36 -0
  13. package/dist/components/Image.d.ts +18 -0
  14. package/dist/components/Image.js +44 -0
  15. package/dist/components/Loader.d.ts +16 -1
  16. package/dist/components/Loader.js +11 -0
  17. package/dist/components/Modal.d.ts +41 -0
  18. package/dist/components/Modal.js +93 -0
  19. package/dist/components/PageHolder.d.ts +8 -0
  20. package/dist/components/PageHolder.js +15 -0
  21. package/dist/components/Text.d.ts +5 -11
  22. package/dist/constants/app.d.ts +2 -0
  23. package/dist/constants/app.js +6 -0
  24. package/dist/constants/assets.d.ts +2 -0
  25. package/dist/constants/assets.js +10 -0
  26. package/dist/constants/icons.d.ts +2 -0
  27. package/dist/constants/icons.js +35 -0
  28. package/dist/constants/theme.d.ts +2 -0
  29. package/dist/constants/theme.js +46 -0
  30. package/dist/index.d.ts +9 -1
  31. package/dist/index.js +21 -1
  32. package/dist/types/app.d.ts +1 -0
  33. package/dist/types/asset.d.ts +4 -2
  34. package/dist/types/components.d.ts +3 -0
  35. package/dist/types/config.d.ts +8 -7
  36. package/dist/types/icon.d.ts +6 -3
  37. package/dist/types/loader.d.ts +3 -0
  38. package/dist/types/theme.d.ts +7 -5
  39. package/dist/utils/hooks.d.ts +20 -0
  40. package/dist/utils/hooks.js +40 -0
  41. package/package.json +4 -4
@@ -0,0 +1,18 @@
1
+ import { AnyOtherString, OmitProps } from "../types/app";
2
+ import { ComponentHoverStyle, ComponentPropWithRef, ComponentStyle } from "../types/components";
3
+ import { AssetName } from "../types/asset";
4
+ type ImageProps = {
5
+ name?: AssetName | AnyOtherString;
6
+ } & OmitProps<React.ComponentProps<"img">, "style"> & ComponentStyle & ComponentHoverStyle;
7
+ type ImageComponent = {
8
+ (props: ComponentPropWithRef<HTMLImageElement, ImageProps>): React.ReactElement;
9
+ profileImage: (props: ComponentPropWithRef<HTMLImageElement, OmitProps<ImageProps, "width" | "height"> & {
10
+ /** @default 40 */
11
+ size?: number;
12
+ }>) => React.ReactElement;
13
+ };
14
+ declare const Image: ImageComponent;
15
+ declare const _default: ImageComponent & {
16
+ profileImage: typeof Image.profileImage;
17
+ };
18
+ export default _default;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const styled_components_1 = __importDefault(require("styled-components"));
9
+ const BetterHtmlProvider_1 = require("./BetterHtmlProvider");
10
+ const hooks_1 = require("../utils/hooks");
11
+ const ImageElement = styled_components_1.default.img.withConfig({
12
+ shouldForwardProp: (prop) => !["normalStyle", "hoverStyle"].includes(prop),
13
+ }) `
14
+ display: block;
15
+ user-select: none;
16
+ -webkit-user-drag: none;
17
+
18
+ ${(props) => props.normalStyle}
19
+
20
+ &:hover {
21
+ ${(props) => props.hoverStyle}
22
+ }
23
+ `;
24
+ const Image = (0, react_1.forwardRef)(function Image({ name, src, ...props }, ref) {
25
+ const theme = (0, BetterHtmlProvider_1.useTheme)();
26
+ const { assets } = (0, BetterHtmlProvider_1.useBetterHtmlContext)();
27
+ const styledComponentStyles = (0, hooks_1.useStyledComponentStyles)(props, theme);
28
+ const dataProps = (0, hooks_1.useComponentPropsWithPrefix)(props, "data");
29
+ const ariaProps = (0, hooks_1.useComponentPropsWithPrefix)(props, "aria");
30
+ const restProps = (0, hooks_1.useComponentPropsWithoutStyle)(props);
31
+ (0, react_1.useEffect)(() => {
32
+ if (!name)
33
+ return;
34
+ if (!assets[name.toString()])
35
+ console.warn(`The asset \`${name}\` you are trying to use does not exist. Make sure to add it to the \`assets\` object in \`<BetterHtmlProvider>\` config value prop.`);
36
+ }, [assets, name]);
37
+ return ((0, jsx_runtime_1.jsx)(ImageElement, { ...styledComponentStyles, src: name ? assets[name.toString()] : src, ...styledComponentStyles, ...dataProps, ...ariaProps, ...restProps, ref: ref }));
38
+ });
39
+ Image.profileImage = (0, react_1.forwardRef)(function ProfileImage({ size = 40, ...props }, ref) {
40
+ return (0, jsx_runtime_1.jsx)(Image, { width: size, height: size, borderRadius: "50%", objectFit: "cover", ref: ref, ...props });
41
+ });
42
+ const MemoizedImage = (0, react_1.memo)(Image);
43
+ MemoizedImage.profileImage = Image.profileImage;
44
+ exports.default = { Image: MemoizedImage }.Image;
@@ -13,7 +13,22 @@ type LoaderProps = {
13
13
  } & OmitProps<DivProps<unknown>, "width" | "height" | "color" | "background" | "borderRadius" | "mask" | "WebkitMask" | "padding" | "animation" | "animationName">;
14
14
  type LoaderComponentType = {
15
15
  (props: LoaderProps): React.ReactElement;
16
+ box: (props: OmitProps<LoaderProps, "size"> & {
17
+ /** @default "Loading..." */
18
+ text?: string;
19
+ /** @default 20 */
20
+ size?: number;
21
+ }) => React.ReactElement;
22
+ text: (props: OmitProps<LoaderProps, "size"> & {
23
+ /** @default "Loading..." */
24
+ text?: string;
25
+ /** @default 14 */
26
+ size?: number;
27
+ }) => React.ReactElement;
16
28
  };
17
29
  declare const LoaderComponent: LoaderComponentType;
18
- declare const Loader: typeof LoaderComponent & {};
30
+ declare const Loader: typeof LoaderComponent & {
31
+ box: typeof LoaderComponent.box;
32
+ text: typeof LoaderComponent.text;
33
+ };
19
34
  export default Loader;
@@ -7,6 +7,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const react_1 = require("react");
8
8
  const styled_components_1 = __importDefault(require("styled-components"));
9
9
  const Div_1 = __importDefault(require("./Div"));
10
+ const Text_1 = __importDefault(require("./Text"));
10
11
  const BetterHtmlProvider_1 = require("./BetterHtmlProvider");
11
12
  const StyledDiv = (0, styled_components_1.default)(Div_1.default) `
12
13
  @keyframes loaderAnimation {
@@ -28,5 +29,15 @@ const LoaderComponent = function Loader({ color, size = 16, width, disabled, ...
28
29
  const mask = `radial-gradient(farthest-side, #0000 calc(100% - ${readyWidth}px), #000 0)`;
29
30
  return ((0, jsx_runtime_1.jsx)(StyledDiv, { width: size + readyWidth * 2, height: size + readyWidth * 2, background: `radial-gradient(farthest-side, ${readyColor} 94%, #0000) top/${readyWidth}px ${readyWidth}px no-repeat, conic-gradient(#0000 30%, ${readyColor})`, borderRadius: 999, mask: mask, WebkitMask: mask, padding: readyWidth, animation: !disabled ? "loaderAnimation .6s infinite linear" : undefined, ...props }));
30
31
  };
32
+ LoaderComponent.box = function Box({ text = "Loading...", size = 20, ...props }) {
33
+ const theme = (0, BetterHtmlProvider_1.useTheme)();
34
+ return ((0, jsx_runtime_1.jsxs)(Div_1.default.column, { width: "100%", alignItems: "center", gap: theme.styles.gap, children: [(0, jsx_runtime_1.jsx)(Loader, { size: size, ...props }), text && ((0, jsx_runtime_1.jsx)(Text_1.default, { textAlign: "center", color: props.color ?? theme.colors.textSecondary, children: text }))] }));
35
+ };
36
+ LoaderComponent.text = function LoaderText({ text = "Loading...", size = 14, ...props }) {
37
+ const theme = (0, BetterHtmlProvider_1.useTheme)();
38
+ return ((0, jsx_runtime_1.jsxs)(Div_1.default.row, { alignItems: "center", gap: theme.styles.gap, children: [(0, jsx_runtime_1.jsx)(Loader, { size: size, ...props }), text && ((0, jsx_runtime_1.jsx)(Text_1.default, { textAlign: "center", color: props.color ?? theme.colors.textSecondary, children: text }))] }));
39
+ };
31
40
  const Loader = (0, react_1.memo)(LoaderComponent);
41
+ Loader.box = LoaderComponent.box;
42
+ Loader.text = LoaderComponent.text;
32
43
  exports.default = Loader;
@@ -0,0 +1,41 @@
1
+ import { ComponentPropWithRef } from "../types/components";
2
+ import { OmitProps } from "../types/app";
3
+ type ModalProps = {
4
+ /**
5
+ * If you want to have a small modal, you can use 660px as it looks good on most screens.
6
+ *
7
+ * @default 30% smaller than app.contentMaxWidth
8
+ * */
9
+ maxWidth?: number;
10
+ title?: string;
11
+ titleColor?: string;
12
+ description?: string;
13
+ descriptionColor?: string;
14
+ headerBackgroundColor?: string;
15
+ overflow?: React.CSSProperties["overflow"];
16
+ onOpen?: () => void;
17
+ onClose?: () => void;
18
+ children?: React.ReactNode;
19
+ };
20
+ export type ModalRef = {
21
+ open: () => void;
22
+ close: () => void;
23
+ isOpened: boolean;
24
+ };
25
+ type ModalComponent = {
26
+ (props: ComponentPropWithRef<ModalRef, ModalProps>): React.ReactElement;
27
+ confirmation: (props: ComponentPropWithRef<ModalRef, OmitProps<ModalProps, "maxWidth" | "children" | "overflow"> & {
28
+ onConfirm?: () => void;
29
+ onCancel?: () => void;
30
+ }>) => React.ReactElement;
31
+ destructive: (props: ComponentPropWithRef<ModalRef, OmitProps<ModalProps, "maxWidth" | "children" | "overflow"> & {
32
+ onDelete?: () => void;
33
+ onCancel?: () => void;
34
+ }>) => React.ReactElement;
35
+ };
36
+ declare const ModalComponent: ModalComponent;
37
+ declare const Modal: typeof ModalComponent & {
38
+ confirmation: typeof ModalComponent.confirmation;
39
+ destructive: typeof ModalComponent.destructive;
40
+ };
41
+ export default Modal;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const styled_components_1 = __importDefault(require("styled-components"));
9
+ const Div_1 = __importDefault(require("./Div"));
10
+ const Button_1 = __importDefault(require("./Button"));
11
+ const Text_1 = __importDefault(require("./Text"));
12
+ const Divider_1 = __importDefault(require("./Divider"));
13
+ const BetterHtmlProvider_1 = require("./BetterHtmlProvider");
14
+ const DialogStylesElement = styled_components_1.default.dialog.withConfig({
15
+ shouldForwardProp: (prop) => !["theme", "opacity"].includes(prop),
16
+ }) `
17
+ width: 100%;
18
+ max-width: none;
19
+ height: 100%;
20
+ max-height: none;
21
+ border: none;
22
+ outline: none;
23
+ background-color: transparent;
24
+ margin: auto auto;
25
+ padding-inline: ${(props) => props.theme.styles.gap}px;
26
+ opacity: ${(props) => props.opacity};
27
+ transition: ${(props) => props.theme.styles.transition};
28
+
29
+ &::backdrop {
30
+ background-color: #000000a0;
31
+ opacity: ${(props) => props.opacity};
32
+ transition: ${(props) => props.theme.styles.transition};
33
+ }
34
+
35
+ @keyframes fadeInAnimation {
36
+ from {
37
+ transform: translateY(${(props) => props.theme.styles.space}px);
38
+ }
39
+ to {
40
+ transform: translateY(0px);
41
+ }
42
+ }
43
+
44
+ @keyframes fadeOutAnimation {
45
+ from {
46
+ transform: translateY(0px);
47
+ }
48
+ to {
49
+ transform: translateY(${(props) => props.theme.styles.space}px);
50
+ }
51
+ }
52
+ `;
53
+ const ModalComponent = (0, react_1.forwardRef)(function Modal({ maxWidth, title, titleColor, description, descriptionColor, headerBackgroundColor, overflow, onOpen, onClose, children, }, ref) {
54
+ const theme = (0, BetterHtmlProvider_1.useTheme)();
55
+ const { app } = (0, BetterHtmlProvider_1.useBetterHtmlContext)();
56
+ const dialogRef = (0, react_1.useRef)(null);
57
+ const [isOpened, setIsOpened] = (0, react_1.useState)(false);
58
+ const [isOpenedLate, setIsOpenedLate] = (0, react_1.useState)(false);
59
+ const onClickOpen = (0, react_1.useCallback)(() => {
60
+ dialogRef.current?.showModal();
61
+ setIsOpened(true);
62
+ setIsOpenedLate(true);
63
+ onOpen?.();
64
+ }, [onOpen]);
65
+ const onClickClose = (0, react_1.useCallback)(() => {
66
+ setIsOpened(false);
67
+ onClose?.();
68
+ setTimeout(() => {
69
+ dialogRef.current?.close();
70
+ setIsOpenedLate(false);
71
+ }, 0.2 * 1000);
72
+ }, [onClose]);
73
+ (0, react_1.useImperativeHandle)(ref, () => {
74
+ return {
75
+ open: onClickOpen,
76
+ close: onClickClose,
77
+ isOpened,
78
+ };
79
+ }, [onClickOpen, onClickClose, isOpened]);
80
+ return ((0, jsx_runtime_1.jsx)(DialogStylesElement, { theme: theme, opacity: !isOpened ? 0 : 1, onClose: onClickClose, ref: dialogRef, children: isOpenedLate ? ((0, jsx_runtime_1.jsx)(Div_1.default.column, { position: "relative", width: "100%", maxWidth: maxWidth ?? app.contentMaxWidth / 1.3, minHeight: `calc(100% - ${theme.styles.space * 2}px)`, alignItems: "center", justifyContent: "center", marginBlock: theme.styles.space, marginInline: "auto", transform: `translateY(${theme.styles.space}px)`, transition: theme.styles.transition, animation: isOpened ? "fadeInAnimation 0.2s ease forwards" : "fadeOutAnimation 0.2s ease forwards", children: (0, jsx_runtime_1.jsxs)(Div_1.default, { position: "relative", width: "100%", minHeight: 32 + theme.styles.space * 2, backgroundColor: theme.colors.backgroundBase, borderRadius: theme.styles.borderRadius * 2, paddingInline: !title ? theme.styles.space : undefined, paddingBlock: !title ? theme.styles.gap : undefined, overflow: overflow, children: [title ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Div_1.default.row, { alignItems: "center", gap: theme.styles.gap, backgroundColor: headerBackgroundColor, borderTopLeftRadius: theme.styles.borderRadius * 2, borderTopRightRadius: theme.styles.borderRadius * 2, paddingInline: theme.styles.space, paddingBlock: theme.styles.gap, children: [(0, jsx_runtime_1.jsxs)(Div_1.default.column, { flex: 1, gap: theme.styles.gap / 2, children: [(0, jsx_runtime_1.jsx)(Text_1.default, { as: "h1", color: titleColor ?? theme.colors.textPrimary, children: title }), description && ((0, jsx_runtime_1.jsx)(Text_1.default, { color: descriptionColor ?? theme.colors.textSecondary, children: description }))] }), (0, jsx_runtime_1.jsx)(Button_1.default.icon, { icon: "XMark", marginTop: 1, iconColor: titleColor, onClick: onClickClose })] }), (0, jsx_runtime_1.jsx)(Divider_1.default.horizontal, {})] })) : ((0, jsx_runtime_1.jsx)(Div_1.default, { position: "absolute", top: theme.styles.space, right: theme.styles.space, children: (0, jsx_runtime_1.jsx)(Button_1.default.icon, { icon: "XMark", onClick: onClickClose }) })), (0, jsx_runtime_1.jsx)(Div_1.default, { paddingInline: title ? theme.styles.space : undefined, paddingBlock: title ? theme.styles.gap : undefined, children: children })] }) })) : undefined }));
81
+ });
82
+ ModalComponent.confirmation = (0, react_1.forwardRef)(function Confirmation({ onConfirm, onCancel, ...props }, ref) {
83
+ const theme = (0, BetterHtmlProvider_1.useTheme)();
84
+ return ((0, jsx_runtime_1.jsxs)(Modal, { title: "Are you sure?", maxWidth: 660, ...props, ref: ref, children: [(0, jsx_runtime_1.jsx)(Text_1.default, { color: theme.colors.textSecondary, children: "Do you really want to continue? This action may be irreversible." }), (0, jsx_runtime_1.jsxs)(Div_1.default.row, { alignItems: "center", justifyContent: "flex-end", gap: theme.styles.gap, marginTop: theme.styles.space * 2, children: [(0, jsx_runtime_1.jsx)(Button_1.default.secondary, { text: "Cancel", onClick: onCancel }), (0, jsx_runtime_1.jsx)(Button_1.default, { text: "Continue", onClick: onConfirm })] })] }));
85
+ });
86
+ ModalComponent.destructive = (0, react_1.forwardRef)(function Destructive({ onDelete, onCancel, ...props }, ref) {
87
+ const theme = (0, BetterHtmlProvider_1.useTheme)();
88
+ return ((0, jsx_runtime_1.jsxs)(Modal, { title: "Are you sure?", maxWidth: 660, ...props, ref: ref, children: [(0, jsx_runtime_1.jsx)(Text_1.default, { color: theme.colors.textSecondary, children: "Do you really want to continue with the deleting of the item? This action may be irreversible." }), (0, jsx_runtime_1.jsxs)(Div_1.default.row, { alignItems: "center", justifyContent: "flex-end", gap: theme.styles.gap, marginTop: theme.styles.space * 2, children: [(0, jsx_runtime_1.jsx)(Button_1.default.secondary, { text: "Cancel", onClick: onCancel }), (0, jsx_runtime_1.jsx)(Button_1.default.destructive, { icon: "trash", text: "Delete", onClick: onDelete })] })] }));
89
+ });
90
+ const Modal = (0, react_1.memo)(ModalComponent);
91
+ Modal.confirmation = ModalComponent.confirmation;
92
+ Modal.destructive = ModalComponent.destructive;
93
+ exports.default = Modal;
@@ -0,0 +1,8 @@
1
+ type PageHolderProps = {
2
+ /** @default false */
3
+ noMaxContentWidth?: boolean;
4
+ children?: React.ReactNode;
5
+ };
6
+ declare function PageHolder({ noMaxContentWidth, children }: PageHolderProps): import("react/jsx-runtime").JSX.Element;
7
+ declare const _default: import("react").MemoExoticComponent<typeof PageHolder>;
8
+ export default _default;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const Div_1 = __importDefault(require("./Div"));
9
+ const BetterHtmlProvider_1 = require("./BetterHtmlProvider");
10
+ function PageHolder({ noMaxContentWidth, children }) {
11
+ const theme = (0, BetterHtmlProvider_1.useTheme)();
12
+ const { app } = (0, BetterHtmlProvider_1.useBetterHtmlContext)();
13
+ return ((0, jsx_runtime_1.jsx)(Div_1.default, { as: "main", width: "100%", maxWidth: !noMaxContentWidth ? app.contentMaxWidth : undefined, margin: "0px auto", paddingBlock: theme.styles.gap, paddingInline: theme.styles.space, children: children }));
14
+ }
15
+ exports.default = (0, react_1.memo)(PageHolder);
@@ -1,19 +1,13 @@
1
- import { ComponentHoverStyle, ComponentStyle } from "../types/components";
1
+ import { ComponentHoverStyle, ComponentPropWithRef, ComponentStyle } from "../types/components";
2
2
  import { OmitProps } from "../types/app";
3
3
  export type TextProps = {
4
4
  /** @default "p" */
5
5
  as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | "span" | "label";
6
- } & OmitProps<React.ComponentProps<"div">, "style"> & ComponentStyle & ComponentHoverStyle;
6
+ } & OmitProps<React.ComponentProps<"p">, "style"> & ComponentStyle & ComponentHoverStyle;
7
7
  type TextComponentType = {
8
- (props: TextProps & {
9
- ref?: React.Ref<HTMLDivElement>;
10
- }): React.ReactElement;
11
- unknown: (props: TextProps & {
12
- ref?: React.Ref<HTMLDivElement>;
13
- }) => React.ReactElement;
14
- oneLine: (props: TextProps & {
15
- ref?: React.Ref<HTMLDivElement>;
16
- }) => React.ReactElement;
8
+ (props: ComponentPropWithRef<HTMLParagraphElement, TextProps>): React.ReactElement;
9
+ unknown: (props: ComponentPropWithRef<HTMLParagraphElement, TextProps>) => React.ReactElement;
10
+ oneLine: (props: ComponentPropWithRef<HTMLParagraphElement, TextProps>) => React.ReactElement;
17
11
  };
18
12
  declare const TextComponent: TextComponentType;
19
13
  declare const Text: typeof TextComponent & {
@@ -0,0 +1,2 @@
1
+ import { AppConfig } from "../types/config";
2
+ export declare const appConfig: AppConfig;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.appConfig = void 0;
4
+ exports.appConfig = {
5
+ contentMaxWidth: 1100,
6
+ };
@@ -0,0 +1,2 @@
1
+ import { AssetsConfig } from "../types/asset";
2
+ export declare const assets: AssetsConfig;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assets = void 0;
7
+ const logo_svg_1 = __importDefault(require("../assets/logo.svg"));
8
+ exports.assets = {
9
+ logo: logo_svg_1.default,
10
+ };
@@ -0,0 +1,2 @@
1
+ import { IconsConfig } from "../types/icon";
2
+ export declare const icons: IconsConfig;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.icons = void 0;
4
+ exports.icons = {
5
+ XMark: {
6
+ width: 384,
7
+ height: 512,
8
+ paths: [
9
+ {
10
+ d: "M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z",
11
+ type: "fill",
12
+ },
13
+ ],
14
+ },
15
+ uploadCloud: {
16
+ width: 640,
17
+ height: 512,
18
+ paths: [
19
+ {
20
+ d: "M144 480C64.5 480 0 415.5 0 336c0-62.8 40.2-116.2 96.2-135.9c-.1-2.7-.2-5.4-.2-8.1c0-88.4 71.6-160 160-160c59.3 0 111 32.2 138.7 80.2C409.9 102 428.3 96 448 96c53 0 96 43 96 96c0 12.2-2.3 23.8-6.4 34.6C596 238.4 640 290.1 640 352c0 70.7-57.3 128-128 128l-368 0zm79-217c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l39-39L296 392c0 13.3 10.7 24 24 24s24-10.7 24-24l0-134.1 39 39c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-80-80c-9.4-9.4-24.6-9.4-33.9 0l-80 80z",
21
+ type: "fill",
22
+ },
23
+ ],
24
+ },
25
+ trash: {
26
+ width: 448,
27
+ height: 512,
28
+ paths: [
29
+ {
30
+ d: "M135.2 17.7C140.6 6.8 151.7 0 163.8 0L284.2 0c12.1 0 23.2 6.8 28.6 17.7L320 32l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 7.2-14.3zM32 128l384 0 0 320c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-320zm96 64c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16s16-7.2 16-16l0-224c0-8.8-7.2-16-16-16zm96 0c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16s16-7.2 16-16l0-224c0-8.8-7.2-16-16-16zm96 0c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16s16-7.2 16-16l0-224c0-8.8-7.2-16-16-16z",
31
+ type: "fill",
32
+ },
33
+ ],
34
+ },
35
+ };
@@ -0,0 +1,2 @@
1
+ import { ThemeConfig } from "../types/theme";
2
+ export declare const theme: ThemeConfig;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.theme = void 0;
4
+ exports.theme = {
5
+ styles: {
6
+ space: 16,
7
+ gap: 8,
8
+ borderRadius: 10,
9
+ fontFamily: "Arial, sans-serif",
10
+ transition: "ease 0.2s",
11
+ },
12
+ colors: {
13
+ light: {
14
+ textPrimary: "#111111",
15
+ textSecondary: "#777777",
16
+ label: "#111111",
17
+ primary: "#6d466b",
18
+ secondary: "#412234",
19
+ success: "#28a745",
20
+ info: "#17a2b8",
21
+ warn: "#ffc107",
22
+ error: "#dc3545",
23
+ base: "#f8f8f8",
24
+ backgroundBase: "#f8f8f8",
25
+ backgroundSecondary: "#e8e8e8",
26
+ backgroundContent: "#ffffff",
27
+ border: "#ced4da",
28
+ },
29
+ dark: {
30
+ textPrimary: "#f8f8f8",
31
+ textSecondary: "#e8e8e8",
32
+ label: "#111111",
33
+ primary: "#9b6499",
34
+ secondary: "#6c466b",
35
+ success: "#28a745",
36
+ info: "#17a2b8",
37
+ warn: "#ffc107",
38
+ error: "#dc3545",
39
+ base: "#f8f8f8",
40
+ backgroundBase: "#111111",
41
+ backgroundSecondary: "#222222",
42
+ backgroundContent: "#333333",
43
+ border: "#777777",
44
+ },
45
+ },
46
+ };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,12 @@
1
1
  import Div from "./components/Div";
2
2
  import Text from "./components/Text";
3
3
  import Loader from "./components/Loader";
4
- export { Div, Text, Loader };
4
+ import Icon from "./components/Icon";
5
+ import Image from "./components/Image";
6
+ import Button from "./components/Button";
7
+ import Divider from "./components/Divider";
8
+ import Modal, { type ModalRef } from "./components/Modal";
9
+ import PageHolder from "./components/PageHolder";
10
+ import { useBetterHtmlContext, useTheme, useLoader, useLoaderControls } from "./components/BetterHtmlProvider";
11
+ import { usePageResize, useMediaQuery } from "./utils/hooks";
12
+ export { Div, Text, Loader, Icon, Image, Button, Divider, Modal, ModalRef, PageHolder, useBetterHtmlContext, useTheme, useLoader, useLoaderControls, usePageResize, useMediaQuery, };
package/dist/index.js CHANGED
@@ -3,10 +3,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Loader = exports.Text = exports.Div = void 0;
6
+ exports.useMediaQuery = exports.usePageResize = exports.useLoaderControls = exports.useLoader = exports.useTheme = exports.useBetterHtmlContext = exports.PageHolder = exports.Modal = exports.Divider = exports.Button = exports.Image = exports.Icon = exports.Loader = exports.Text = exports.Div = void 0;
7
7
  const Div_1 = __importDefault(require("./components/Div"));
8
8
  exports.Div = Div_1.default;
9
9
  const Text_1 = __importDefault(require("./components/Text"));
10
10
  exports.Text = Text_1.default;
11
11
  const Loader_1 = __importDefault(require("./components/Loader"));
12
12
  exports.Loader = Loader_1.default;
13
+ const Icon_1 = __importDefault(require("./components/Icon"));
14
+ exports.Icon = Icon_1.default;
15
+ const Image_1 = __importDefault(require("./components/Image"));
16
+ exports.Image = Image_1.default;
17
+ const Button_1 = __importDefault(require("./components/Button"));
18
+ exports.Button = Button_1.default;
19
+ const Divider_1 = __importDefault(require("./components/Divider"));
20
+ exports.Divider = Divider_1.default;
21
+ const Modal_1 = __importDefault(require("./components/Modal"));
22
+ exports.Modal = Modal_1.default;
23
+ const PageHolder_1 = __importDefault(require("./components/PageHolder"));
24
+ exports.PageHolder = PageHolder_1.default;
25
+ const BetterHtmlProvider_1 = require("./components/BetterHtmlProvider");
26
+ Object.defineProperty(exports, "useBetterHtmlContext", { enumerable: true, get: function () { return BetterHtmlProvider_1.useBetterHtmlContext; } });
27
+ Object.defineProperty(exports, "useTheme", { enumerable: true, get: function () { return BetterHtmlProvider_1.useTheme; } });
28
+ Object.defineProperty(exports, "useLoader", { enumerable: true, get: function () { return BetterHtmlProvider_1.useLoader; } });
29
+ Object.defineProperty(exports, "useLoaderControls", { enumerable: true, get: function () { return BetterHtmlProvider_1.useLoaderControls; } });
30
+ const hooks_1 = require("./utils/hooks");
31
+ Object.defineProperty(exports, "usePageResize", { enumerable: true, get: function () { return hooks_1.usePageResize; } });
32
+ Object.defineProperty(exports, "useMediaQuery", { enumerable: true, get: function () { return hooks_1.useMediaQuery; } });
@@ -12,3 +12,4 @@ export type DeepPartialRecord<T> = {
12
12
  };
13
13
  /** returns only the required props */
14
14
  export type PickAllRequired<T, K extends keyof T> = Required<Pick<T, K>>;
15
+ export type AnyOtherString = Omit<string & {}, "">;
@@ -1,2 +1,4 @@
1
- export type AssetsConfig = Record<AssetName, string>;
2
- export type AssetName = "";
1
+ export type AssetName = "logo";
2
+ export type AssetsConfig = Record<AssetName, string> & {
3
+ [key: string]: string;
4
+ };
@@ -4,3 +4,6 @@ export type ComponentHoverStyle = {
4
4
  };
5
5
  export type ComponentMarginProps = Pick<ComponentStyle, "margin" | "marginTop" | "marginBottom" | "marginLeft" | "marginRight" | "marginBlock" | "marginInline">;
6
6
  export type ComponentPaddingProps = Pick<ComponentStyle, "padding" | "paddingTop" | "paddingBottom" | "paddingLeft" | "paddingRight" | "paddingBlock" | "paddingInline">;
7
+ export type ComponentPropWithRef<ComponentRef, ComponentProps> = ComponentProps & {
8
+ ref?: React.Ref<ComponentRef>;
9
+ };
@@ -1,13 +1,14 @@
1
- import { PartialTheme, Theme } from "./theme";
1
+ import { ThemeConfig } from "./theme";
2
2
  import { AssetsConfig } from "./asset";
3
3
  import { IconsConfig } from "./icon";
4
+ import { LoaderConfig } from "./loader";
5
+ export type AppConfig = {
6
+ contentMaxWidth: number;
7
+ };
4
8
  export type BetterHtmlConfig = {
5
- theme: Theme;
9
+ app: AppConfig;
10
+ theme: ThemeConfig;
6
11
  icons: Partial<IconsConfig>;
7
12
  assets: Partial<AssetsConfig>;
8
- };
9
- export type PartialBetterHtmlConfig = {
10
- theme?: PartialTheme;
11
- icons?: Partial<IconsConfig>;
12
- assets?: Partial<AssetsConfig>;
13
+ loaders: Partial<LoaderConfig>;
13
14
  };
@@ -1,8 +1,11 @@
1
- export type IconsConfig = Record<IconName, {
1
+ export type IconName = "XMark" | "uploadCloud" | "trash";
2
+ export type IconData = {
2
3
  width: number;
3
4
  height: number;
4
5
  paths: (React.ComponentProps<"path"> & {
5
6
  type: "fill" | "stroke";
6
7
  })[];
7
- }>;
8
- export type IconName = "";
8
+ };
9
+ export type IconsConfig = Record<IconName, IconData> & {
10
+ [key: string]: IconData;
11
+ };
@@ -1 +1,4 @@
1
1
  export type LoaderName = "";
2
+ export type LoaderConfig = Record<LoaderName, boolean | undefined> & {
3
+ [key: string]: boolean | undefined;
4
+ };
@@ -1,3 +1,6 @@
1
+ export type Color = `#${string}` | "transparent";
2
+ export type ColorName = "textPrimary" | "textSecondary" | "label" | "primary" | "secondary" | "success" | "info" | "warn" | "error" | "base" | "backgroundBase" | "backgroundSecondary" | "backgroundContent" | "border";
3
+ export type ColorTheme = "light" | "dark";
1
4
  export type Styles = {
2
5
  space: number;
3
6
  gap: number;
@@ -5,13 +8,12 @@ export type Styles = {
5
8
  fontFamily: string;
6
9
  transition: string;
7
10
  };
8
- export type Color = `#${string}` | "transparent";
9
- export type Colors = Record<"textPrimary" | "textSecondary" | "label" | "primary" | "secondary" | "success" | "info" | "warn" | "error" | "backgroundBase" | "backgroundSecondary" | "backgroundContent" | "border", Color>;
11
+ export type Colors = Record<ColorName, Color>;
10
12
  export type Theme = {
11
13
  styles: Styles;
12
14
  colors: Colors;
13
15
  };
14
- export type PartialTheme = {
15
- styles?: Partial<Styles>;
16
- colors?: Partial<Colors>;
16
+ export type ThemeConfig = {
17
+ styles: Styles;
18
+ colors: Record<ColorTheme, Colors>;
17
19
  };
@@ -6,3 +6,23 @@ export declare function useStyledComponentStyles(props: ComponentStyle & Compone
6
6
  };
7
7
  export declare function useComponentPropsWithPrefix<Props extends Record<string, any>, Prefix extends string>(props: Props, prefix: Prefix): Record<`${Prefix}-${string}`, any>;
8
8
  export declare function useComponentPropsWithoutStyle<Props extends Record<string, any>>(props: Props): Partial<Props>;
9
+ export declare function usePageResize(): {
10
+ width: number;
11
+ height: number;
12
+ };
13
+ export declare function useMediaQuery(): {
14
+ size320: boolean;
15
+ size400: boolean;
16
+ size500: boolean;
17
+ size600: boolean;
18
+ size700: boolean;
19
+ size800: boolean;
20
+ size900: boolean;
21
+ size1000: boolean;
22
+ size1100: boolean;
23
+ size1200: boolean;
24
+ size1300: boolean;
25
+ size1400: boolean;
26
+ size1500: boolean;
27
+ size1600: boolean;
28
+ };
@@ -3,9 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useStyledComponentStyles = useStyledComponentStyles;
4
4
  exports.useComponentPropsWithPrefix = useComponentPropsWithPrefix;
5
5
  exports.useComponentPropsWithoutStyle = useComponentPropsWithoutStyle;
6
+ exports.usePageResize = usePageResize;
7
+ exports.useMediaQuery = useMediaQuery;
6
8
  const react_1 = require("react");
7
9
  const cssProps = Object.keys(document.documentElement.style).reduce((previousValue, currentValue) => {
8
10
  previousValue[currentValue.toLowerCase()] = true;
11
+ previousValue[`${currentValue}Hover`.toLowerCase()] = true;
9
12
  return previousValue;
10
13
  }, {});
11
14
  function useStyledComponentStyles(props, theme) {
@@ -52,3 +55,40 @@ function useComponentPropsWithoutStyle(props) {
52
55
  return previousValue;
53
56
  }, {}), [props]);
54
57
  }
58
+ function usePageResize() {
59
+ const [width, setWidth] = (0, react_1.useState)(window.innerWidth);
60
+ const [height, setHeight] = (0, react_1.useState)(window.innerHeight);
61
+ (0, react_1.useEffect)(() => {
62
+ const onResize = () => {
63
+ setWidth(window.innerWidth);
64
+ setHeight(window.innerHeight);
65
+ };
66
+ window.addEventListener("resize", onResize);
67
+ return () => {
68
+ window.removeEventListener("resize", onResize);
69
+ };
70
+ }, []);
71
+ return {
72
+ width,
73
+ height,
74
+ };
75
+ }
76
+ function useMediaQuery() {
77
+ const { width } = usePageResize();
78
+ return {
79
+ size320: width <= 320,
80
+ size400: width <= 400,
81
+ size500: width <= 500,
82
+ size600: width <= 600,
83
+ size700: width <= 700,
84
+ size800: width <= 800,
85
+ size900: width <= 900,
86
+ size1000: width <= 1000,
87
+ size1100: width <= 1100,
88
+ size1200: width <= 1200,
89
+ size1300: width <= 1300,
90
+ size1400: width <= 1400,
91
+ size1500: width <= 1500,
92
+ size1600: width <= 1600,
93
+ };
94
+ }