@helpdice/theme 1.0.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.
Files changed (134) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +37 -0
  3. package/dist/css-baseline/css-baseline.d.ts +9 -0
  4. package/dist/css-baseline/index.d.ts +1 -0
  5. package/dist/css-baseline/index.js +868 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.js +1516 -0
  8. package/dist/shared/css-transition.d.ts +13 -0
  9. package/dist/styled-jsx.cjs.js +748 -0
  10. package/dist/themes/index.d.ts +4 -0
  11. package/dist/themes/index.js +299 -0
  12. package/dist/themes/presets/dark.d.ts +8 -0
  13. package/dist/themes/presets/default.d.ts +8 -0
  14. package/dist/themes/presets/index.d.ts +90 -0
  15. package/dist/themes/presets/shared.d.ts +4 -0
  16. package/dist/themes/themes.d.ts +18 -0
  17. package/dist/ui-provider/index.d.ts +3 -0
  18. package/dist/ui-provider/index.js +1425 -0
  19. package/dist/ui-provider/theme-provider.d.ts +8 -0
  20. package/dist/ui-provider/ui-provider.d.ts +8 -0
  21. package/dist/use-all-themes/all-themes-context.d.ts +7 -0
  22. package/dist/use-all-themes/index.d.ts +3 -0
  23. package/dist/use-all-themes/index.js +311 -0
  24. package/dist/use-classes/index.d.ts +2 -0
  25. package/dist/use-classes/index.js +48 -0
  26. package/dist/use-classes/use-classes.d.ts +4 -0
  27. package/dist/use-current-state/index.d.ts +2 -0
  28. package/dist/use-current-state/index.js +72 -0
  29. package/dist/use-current-state/use-current-state.d.ts +4 -0
  30. package/dist/use-media-query/index.js +444 -0
  31. package/dist/use-theme/index.d.ts +2 -0
  32. package/dist/use-theme/index.js +309 -0
  33. package/dist/use-theme/theme-context.d.ts +4 -0
  34. package/dist/use-toasts/helpers.d.ts +18 -0
  35. package/dist/use-toasts/index.js +204 -0
  36. package/dist/use-toasts/toast-container.d.ts +3 -0
  37. package/dist/use-toasts/toast-item.d.ts +8 -0
  38. package/dist/use-toasts/use-toast.d.ts +40 -0
  39. package/dist/utils/collections.d.ts +15 -0
  40. package/dist/utils/layouts.d.ts +20 -0
  41. package/dist/utils/prop-types.d.ts +19 -0
  42. package/dist/utils/types.d.ts +3 -0
  43. package/dist/utils/use-current-state.d.ts +2 -0
  44. package/dist/utils/use-hd-ui-context.d.ts +16 -0
  45. package/dist/utils/use-portal.d.ts +2 -0
  46. package/dist/utils/use-ssr.d.ts +6 -0
  47. package/esm/css-baseline/css-baseline.d.ts +9 -0
  48. package/esm/css-baseline/css-baseline.js +23 -0
  49. package/esm/css-baseline/index.d.ts +1 -0
  50. package/esm/css-baseline/index.js +2 -0
  51. package/esm/index.d.ts +12 -0
  52. package/esm/index.js +11 -0
  53. package/esm/shared/backdrop.js +66 -0
  54. package/esm/shared/css-transition.d.ts +13 -0
  55. package/esm/shared/css-transition.js +65 -0
  56. package/esm/shared/dropdown.js +99 -0
  57. package/esm/shared/ellipsis.js +13 -0
  58. package/esm/shared/expand.js +86 -0
  59. package/esm/shared/highlight.js +46 -0
  60. package/esm/styled-jsx-server.es.js +5 -0
  61. package/esm/styled-jsx.es.js +737 -0
  62. package/esm/themes/index.d.ts +4 -0
  63. package/esm/themes/index.js +2 -0
  64. package/esm/themes/presets/dark.d.ts +8 -0
  65. package/esm/themes/presets/dark.js +64 -0
  66. package/esm/themes/presets/default.d.ts +8 -0
  67. package/esm/themes/presets/default.js +64 -0
  68. package/esm/themes/presets/index.d.ts +90 -0
  69. package/esm/themes/presets/index.js +1 -0
  70. package/esm/themes/presets/shared.d.ts +4 -0
  71. package/esm/themes/presets/shared.js +42 -0
  72. package/esm/themes/themes.d.ts +18 -0
  73. package/esm/themes/themes.js +77 -0
  74. package/esm/ui-provider/index.d.ts +3 -0
  75. package/esm/ui-provider/index.js +4 -0
  76. package/esm/ui-provider/theme-provider.d.ts +8 -0
  77. package/esm/ui-provider/theme-provider.js +45 -0
  78. package/esm/ui-provider/ui-provider.d.ts +8 -0
  79. package/esm/ui-provider/ui-provider.js +55 -0
  80. package/esm/use-all-themes/all-themes-context.d.ts +7 -0
  81. package/esm/use-all-themes/all-themes-context.js +11 -0
  82. package/esm/use-all-themes/index.d.ts +3 -0
  83. package/esm/use-all-themes/index.js +2 -0
  84. package/esm/use-classes/index.d.ts +2 -0
  85. package/esm/use-classes/index.js +2 -0
  86. package/esm/use-classes/use-classes.d.ts +4 -0
  87. package/esm/use-classes/use-classes.js +34 -0
  88. package/esm/use-current-state/index.d.ts +2 -0
  89. package/esm/use-current-state/index.js +2 -0
  90. package/esm/use-current-state/use-current-state.d.ts +4 -0
  91. package/esm/use-current-state/use-current-state.js +23 -0
  92. package/esm/use-media-query/index.js +2 -0
  93. package/esm/use-media-query/use-media-query.js +81 -0
  94. package/esm/use-theme/index.d.ts +2 -0
  95. package/esm/use-theme/index.js +2 -0
  96. package/esm/use-theme/theme-context.d.ts +4 -0
  97. package/esm/use-theme/theme-context.js +9 -0
  98. package/esm/use-toasts/helpers.d.ts +18 -0
  99. package/esm/use-toasts/helpers.js +66 -0
  100. package/esm/use-toasts/index.js +2 -0
  101. package/esm/use-toasts/toast-container.d.ts +3 -0
  102. package/esm/use-toasts/toast-container.js +120 -0
  103. package/esm/use-toasts/toast-item.d.ts +8 -0
  104. package/esm/use-toasts/toast-item.js +45 -0
  105. package/esm/use-toasts/use-toast.d.ts +40 -0
  106. package/esm/use-toasts/use-toast.js +103 -0
  107. package/esm/utils/calculations.js +29 -0
  108. package/esm/utils/collections.d.ts +15 -0
  109. package/esm/utils/collections.js +128 -0
  110. package/esm/utils/color.js +35 -0
  111. package/esm/utils/layouts.d.ts +20 -0
  112. package/esm/utils/layouts.js +73 -0
  113. package/esm/utils/prop-types.d.ts +19 -0
  114. package/esm/utils/prop-types.js +20 -0
  115. package/esm/utils/types.d.ts +3 -0
  116. package/esm/utils/types.js +1 -0
  117. package/esm/utils/use-click-anywhere.js +15 -0
  118. package/esm/utils/use-context-state/create-ui-context.js +50 -0
  119. package/esm/utils/use-context-state/use-context-state.js +40 -0
  120. package/esm/utils/use-current-state.d.ts +2 -0
  121. package/esm/utils/use-current-state.js +2 -0
  122. package/esm/utils/use-default-props.js +17 -0
  123. package/esm/utils/use-dom-observer.js +26 -0
  124. package/esm/utils/use-hd-ui-context.d.ts +16 -0
  125. package/esm/utils/use-hd-ui-context.js +27 -0
  126. package/esm/utils/use-portal.d.ts +2 -0
  127. package/esm/utils/use-portal.js +34 -0
  128. package/esm/utils/use-previous.js +11 -0
  129. package/esm/utils/use-real-shape.js +47 -0
  130. package/esm/utils/use-resize.js +19 -0
  131. package/esm/utils/use-ssr.d.ts +6 -0
  132. package/esm/utils/use-ssr.js +19 -0
  133. package/esm/utils/use-warning.js +13 -0
  134. package/package.json +111 -0
@@ -0,0 +1,81 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ /* "use client" */
3
+
4
+ import { useEffect, useMemo, useState } from 'react';
5
+ import useTheme from '../use-theme';
6
+ import { tuple } from '../utils/prop-types';
7
+ var breakpoints = tuple('xs', 'sm', 'md', 'lg', 'xl', 'mobile');
8
+ var matchType = tuple('up', 'down', 'default');
9
+ var defaultResponsiveOptions = {
10
+ match: 'default'
11
+ };
12
+ var makeQueries = function makeQueries(bp, up, down) {
13
+ var queryString = function queryString(item) {
14
+ var upQuery = "(min-width: ".concat(item.min, ")");
15
+ var downQuery = "(max-width: ".concat(item.max, ")");
16
+ return up ? upQuery : down ? downQuery : "".concat(upQuery, " and ").concat(downQuery);
17
+ };
18
+ var xs = queryString(bp.xs);
19
+ return {
20
+ xs: xs,
21
+ mobile: xs,
22
+ sm: queryString(bp.sm),
23
+ md: queryString(bp.md),
24
+ lg: queryString(bp.lg),
25
+ xl: queryString(bp.xl)
26
+ };
27
+ };
28
+ var useMediaQuery = function useMediaQuery(breakpoint) {
29
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultResponsiveOptions;
30
+ var _options$match = options.match,
31
+ matchType = _options$match === void 0 ? 'default' : _options$match,
32
+ _options$ssrMatchMedi = options.ssrMatchMedia,
33
+ ssrMatchMedia = _options$ssrMatchMedi === void 0 ? null : _options$ssrMatchMedi;
34
+ var supportMedia = typeof window !== 'undefined' && typeof window.matchMedia !== 'undefined';
35
+ var theme = useTheme();
36
+ var mediaQueries = useMemo(function () {
37
+ var up = matchType === 'up';
38
+ var down = matchType === 'down';
39
+ return makeQueries(theme.breakpoints, up, down);
40
+ }, [theme.breakpoints, options]);
41
+ var query = useMemo(function () {
42
+ return mediaQueries[breakpoint];
43
+ }, [mediaQueries, breakpoint]);
44
+ var matchQuery = function matchQuery(q) {
45
+ return window.matchMedia(q);
46
+ };
47
+
48
+ /**
49
+ * Do nothing in the server-side rendering.
50
+ * If server match query fucntion is simulated, return user-defined value first.
51
+ */
52
+ var _useState = useState(function () {
53
+ if (supportMedia) return matchQuery(query).matches;
54
+ if (ssrMatchMedia && typeof ssrMatchMedia === 'function') {
55
+ return ssrMatchMedia(query).matches;
56
+ }
57
+ return false;
58
+ }),
59
+ _useState2 = _slicedToArray(_useState, 2),
60
+ state = _useState2[0],
61
+ setState = _useState2[1];
62
+ useEffect(function () {
63
+ if (!supportMedia) return;
64
+ var queryList = matchQuery(query);
65
+ var update = function update() {
66
+ return setState(matchQuery(query).matches);
67
+ };
68
+ update();
69
+
70
+ /**
71
+ * addListener is deprecated. EventTarget.addEventListener is recommended.
72
+ * But in some old browsers, MediaQueryList does not inherit from EventTarget.
73
+ */
74
+ queryList.addListener(update);
75
+ return function () {
76
+ queryList.removeListener(update);
77
+ };
78
+ }, [supportMedia]);
79
+ return state;
80
+ };
81
+ export default useMediaQuery;
@@ -0,0 +1,2 @@
1
+ import { useTheme } from './theme-context';
2
+ export default useTheme;
@@ -0,0 +1,2 @@
1
+ import { useTheme } from './theme-context';
2
+ export default useTheme;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { HUIThemes } from '../themes/presets';
3
+ export declare const ThemeContext: React.Context<HUIThemes>;
4
+ export declare const useTheme: () => HUIThemes;
@@ -0,0 +1,9 @@
1
+ /* "use client" */
2
+
3
+ import React from 'react';
4
+ import Themes from '../themes';
5
+ var defaultTheme = Themes.getPresetStaticTheme();
6
+ export var ThemeContext = /*#__PURE__*/React.createContext(defaultTheme);
7
+ export var useTheme = function useTheme() {
8
+ return React.useContext(ThemeContext);
9
+ };
@@ -0,0 +1,18 @@
1
+ import { Toast } from './use-toast';
2
+ import React from 'react';
3
+ import { HUIThemesPalette } from '../themes';
4
+ import { NormalTypes } from '../utils/prop-types';
5
+ export declare const makeToastActions: (actions: Toast["actions"], cancelHandle: () => void) => React.JSX.Element[] | null;
6
+ export declare const getColors: (palette: HUIThemesPalette, type?: NormalTypes) => {
7
+ bgColor: string;
8
+ color: string;
9
+ };
10
+ declare const toastPlacement: ["topLeft", "topRight", "bottomLeft", "bottomRight"];
11
+ export type ToastPlacement = typeof toastPlacement[number];
12
+ export declare const isTopPlacement: (placement: ToastPlacement) => boolean;
13
+ export declare const isLeftPlacement: (placement: ToastPlacement) => boolean;
14
+ export declare const getTranslateByPlacement: (placement: ToastPlacement) => {
15
+ enter: string;
16
+ leave: string;
17
+ };
18
+ export {};
@@ -0,0 +1,66 @@
1
+ import React from 'react';
2
+ // import Button from '../button'
3
+
4
+ import { tuple } from '../utils/prop-types';
5
+ export var makeToastActions = function makeToastActions(actions, cancelHandle) {
6
+ var handler = function handler(event, userHandler) {
7
+ userHandler && userHandler(event, cancelHandle);
8
+ };
9
+ if (!actions || !actions.length) return null;
10
+ return actions.map(function (action, index) {
11
+ return /*#__PURE__*/React.createElement("button", {
12
+ color: action.passive ? 'default' : 'secondary',
13
+ key: "action-".concat(index),
14
+ onClick: function onClick(event) {
15
+ return handler(event, action.handler);
16
+ }
17
+ }, action.name);
18
+ });
19
+ };
20
+ export var getColors = function getColors(palette, type) {
21
+ var colors = {
22
+ "default": palette.background,
23
+ secondary: palette.secondary,
24
+ success: palette.success,
25
+ warning: palette.warning,
26
+ error: palette.error
27
+ };
28
+ var isDefault = !type || type === 'default';
29
+ if (isDefault) return {
30
+ bgColor: colors["default"],
31
+ color: palette.foreground
32
+ };
33
+ /**
34
+ * Prevent main color change in special types.
35
+ * The color will only follow the theme when it is in the default type.
36
+ */
37
+ return {
38
+ bgColor: colors[type],
39
+ color: 'white'
40
+ };
41
+ };
42
+ var toastPlacement = tuple('topLeft', 'topRight', 'bottomLeft', 'bottomRight');
43
+ export var isTopPlacement = function isTopPlacement(placement) {
44
+ return "".concat(placement).toLowerCase().startsWith('top');
45
+ };
46
+ export var isLeftPlacement = function isLeftPlacement(placement) {
47
+ return "".concat(placement).toLowerCase().endsWith('left');
48
+ };
49
+ export var getTranslateByPlacement = function getTranslateByPlacement(placement) {
50
+ var translateInByPlacement = {
51
+ topLeft: 'translate(-60px, -60px)',
52
+ topRight: 'translate(60px, -60px)',
53
+ bottomLeft: 'translate(-60px, 60px)',
54
+ bottomRight: 'translate(60px, 60px)'
55
+ };
56
+ var translateOutByPlacement = {
57
+ topLeft: 'translate(-50px, 15px) scale(0.85)',
58
+ topRight: 'translate(50px, 15px) scale(0.85)',
59
+ bottomLeft: 'translate(-50px, -15px) scale(0.85)',
60
+ bottomRight: 'translate(50px, -15px) scale(0.85)'
61
+ };
62
+ return {
63
+ enter: translateInByPlacement[placement],
64
+ leave: translateOutByPlacement[placement]
65
+ };
66
+ };
@@ -0,0 +1,2 @@
1
+ import useToasts from './use-toast';
2
+ export default useToasts;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const ToastContainer: React.FC<React.PropsWithChildren<unknown>>;
3
+ export default ToastContainer;
@@ -0,0 +1,120 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import _JSXStyle from "../styled-jsx.es.js";
4
+ /* "use client" */
5
+
6
+ import React, { useEffect, useMemo } from 'react';
7
+ import { createPortal } from 'react-dom';
8
+ import usePortal from '../utils/use-portal';
9
+ import useTheme from '../use-theme';
10
+ import { useHUIContext } from '../utils/use-hd-ui-context';
11
+ import ToastItem from './toast-item';
12
+ import useClasses from '../use-classes';
13
+ import { isLeftPlacement, isTopPlacement } from './helpers';
14
+ import useCurrentState from '../utils/use-current-state';
15
+ var ToastContainer = function ToastContainer() {
16
+ var theme = useTheme();
17
+ var portal = usePortal('toast');
18
+ var _useCurrentState = useCurrentState(false),
19
+ _useCurrentState2 = _slicedToArray(_useCurrentState, 3),
20
+ setHovering = _useCurrentState2[1],
21
+ hoveringRef = _useCurrentState2[2];
22
+ var _useHUIContext = useHUIContext(),
23
+ toasts = _useHUIContext.toasts,
24
+ updateToasts = _useHUIContext.updateToasts,
25
+ toastLayout = _useHUIContext.toastLayout,
26
+ lastUpdateToastId = _useHUIContext.lastUpdateToastId;
27
+ var memoizedLayout = useMemo(function () {
28
+ return toastLayout;
29
+ }, [toastLayout]);
30
+ var toastElements = useMemo(function () {
31
+ return toasts.map(function (toast) {
32
+ return /*#__PURE__*/React.createElement(ToastItem, {
33
+ toast: toast,
34
+ layout: memoizedLayout,
35
+ key: toast._internalIdent
36
+ });
37
+ });
38
+ }, [toasts, memoizedLayout]);
39
+ var classNames = useMemo(function () {
40
+ return useClasses('toasts', {
41
+ top: isTopPlacement(toastLayout.placement),
42
+ left: isLeftPlacement(toastLayout.placement)
43
+ });
44
+ }, [memoizedLayout]);
45
+ var hoverHandler = function hoverHandler(isHovering) {
46
+ setHovering(isHovering);
47
+ if (isHovering) {
48
+ return updateToasts(function (last) {
49
+ return last.map(function (toast) {
50
+ if (!toast.visible) return toast;
51
+ toast._timeout && window.clearTimeout(toast._timeout);
52
+ return _extends({}, toast, {
53
+ timeout: null
54
+ });
55
+ });
56
+ });
57
+ }
58
+ updateToasts(function (last) {
59
+ return last.map(function (toast, index) {
60
+ if (!toast.visible) return toast;
61
+ toast._timeout && window.clearTimeout(toast._timeout);
62
+ return _extends({}, toast, {
63
+ _timeout: function () {
64
+ var timer = window.setTimeout(function () {
65
+ toast.cancel();
66
+ window.clearTimeout(timer);
67
+ }, toast.delay + index * 100);
68
+ return timer;
69
+ }()
70
+ });
71
+ });
72
+ });
73
+ };
74
+ useEffect(function () {
75
+ var index = toasts.findIndex(function (r) {
76
+ return r._internalIdent === lastUpdateToastId;
77
+ });
78
+ var toast = toasts[index];
79
+ if (!toast || toast.visible || !hoveringRef.current) return;
80
+ var hasVisible = toasts.find(function (r, i) {
81
+ return i < index && r.visible;
82
+ });
83
+ if (hasVisible || !hoveringRef.current) return;
84
+ hoverHandler(false);
85
+ }, [toasts, lastUpdateToastId]);
86
+ useEffect(function () {
87
+ var timeout = null;
88
+ var timer = window.setInterval(function () {
89
+ if (toasts.length === 0) return;
90
+ timeout = window.setTimeout(function () {
91
+ var allInvisible = !toasts.find(function (r) {
92
+ return r.visible;
93
+ });
94
+ allInvisible && updateToasts(function () {
95
+ return [];
96
+ });
97
+ timeout && clearTimeout(timeout);
98
+ }, 350);
99
+ }, 5000);
100
+ return function () {
101
+ timer && clearInterval(timer);
102
+ timeout && clearTimeout(timeout);
103
+ };
104
+ }, [toasts]);
105
+ if (!portal) return null;
106
+ if (!toasts || toasts.length === 0) return null;
107
+ return /*#__PURE__*/createPortal(/*#__PURE__*/React.createElement("div", {
108
+ onMouseEnter: function onMouseEnter() {
109
+ return hoverHandler(true);
110
+ },
111
+ onMouseLeave: function onMouseLeave() {
112
+ return hoverHandler(false);
113
+ },
114
+ className: _JSXStyle.dynamic([["622610754", [theme.layout.gap, theme.layout.gap, theme.layout.gap, theme.layout.gap]]]) + " " + (classNames || "")
115
+ }, toastElements, /*#__PURE__*/React.createElement(_JSXStyle, {
116
+ id: "622610754",
117
+ dynamic: [theme.layout.gap, theme.layout.gap, theme.layout.gap, theme.layout.gap]
118
+ }, ".toasts.__jsx-style-dynamic-selector{position:fixed;width:auto;max-width:100%;right:".concat(theme.layout.gap, ";bottom:").concat(theme.layout.gap, ";z-index:2000;-webkit-transition:all 400ms ease;transition:all 400ms ease;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.top.__jsx-style-dynamic-selector{bottom:unset;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;top:").concat(theme.layout.gap, ";}.left.__jsx-style-dynamic-selector{right:unset;left:").concat(theme.layout.gap, ";}"))), portal);
119
+ };
120
+ export default ToastContainer;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { Toast, ToastLayout } from './use-toast';
3
+ export interface ToastItemProps {
4
+ toast: Toast;
5
+ layout: Required<ToastLayout>;
6
+ }
7
+ declare const ToastItem: React.FC<ToastItemProps>;
8
+ export default ToastItem;
@@ -0,0 +1,45 @@
1
+ import _JSXStyle from "../styled-jsx.es.js";
2
+ /* "use client" */
3
+
4
+ import React, { useMemo } from 'react';
5
+ import useTheme from '../use-theme';
6
+ import CssTransition from '../shared/css-transition';
7
+ import { makeToastActions, getColors, getTranslateByPlacement } from './helpers';
8
+ var ToastItem = /*#__PURE__*/React.memo(function (_ref) {
9
+ var toast = _ref.toast,
10
+ layout = _ref.layout;
11
+ var theme = useTheme();
12
+ var _useMemo = useMemo(function () {
13
+ return getColors(theme.palette, toast.type);
14
+ }, [theme.palette, toast.type]),
15
+ color = _useMemo.color,
16
+ bgColor = _useMemo.bgColor;
17
+ var isReactNode = typeof toast.text !== 'string';
18
+ var padding = layout.padding,
19
+ margin = layout.margin,
20
+ maxHeight = layout.maxHeight,
21
+ maxWidth = layout.maxWidth,
22
+ width = layout.width,
23
+ placement = layout.placement;
24
+ var _useMemo2 = useMemo(function () {
25
+ return getTranslateByPlacement(placement);
26
+ }, [placement]),
27
+ enter = _useMemo2.enter,
28
+ leave = _useMemo2.leave;
29
+ return /*#__PURE__*/React.createElement(CssTransition, {
30
+ name: "toast",
31
+ visible: toast.visible,
32
+ clearTime: 350
33
+ }, /*#__PURE__*/React.createElement("div", {
34
+ key: toast.id,
35
+ className: _JSXStyle.dynamic([["1407001838", [width, maxWidth, maxHeight, theme.palette.foreground, bgColor, color, theme.layout.radius, theme.expressiveness.shadowSmall, theme.layout.gapHalf, enter, margin, padding, margin, padding, leave]]]) + " " + "toast"
36
+ }, isReactNode ? toast.text : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
37
+ className: _JSXStyle.dynamic([["1407001838", [width, maxWidth, maxHeight, theme.palette.foreground, bgColor, color, theme.layout.radius, theme.expressiveness.shadowSmall, theme.layout.gapHalf, enter, margin, padding, margin, padding, leave]]]) + " " + "message"
38
+ }, toast.text), /*#__PURE__*/React.createElement("div", {
39
+ className: _JSXStyle.dynamic([["1407001838", [width, maxWidth, maxHeight, theme.palette.foreground, bgColor, color, theme.layout.radius, theme.expressiveness.shadowSmall, theme.layout.gapHalf, enter, margin, padding, margin, padding, leave]]]) + " " + "action"
40
+ }, makeToastActions(toast.actions, toast.cancel))), /*#__PURE__*/React.createElement(_JSXStyle, {
41
+ id: "1407001838",
42
+ dynamic: [width, maxWidth, maxHeight, theme.palette.foreground, bgColor, color, theme.layout.radius, theme.expressiveness.shadowSmall, theme.layout.gapHalf, enter, margin, padding, margin, padding, leave]
43
+ }, ".toast.__jsx-style-dynamic-selector{width:".concat(width, ";max-width:").concat(maxWidth, ";max-height:").concat(maxHeight, ";display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:").concat(theme.palette.foreground, ";background-color:").concat(bgColor, ";color:").concat(color, ";border:0;border-radius:").concat(theme.layout.radius, ";opacity:1;box-shadow:").concat(theme.expressiveness.shadowSmall, ";-webkit-transition:all 350ms cubic-bezier(0.1,0.2,0.1,1);transition:all 350ms cubic-bezier(0.1,0.2,0.1,1);overflow:hidden;}.message.__jsx-style-dynamic-selector{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;font-size:0.875em;display:-webkit-box;word-break:break-all;padding-right:").concat(theme.layout.gapHalf, ";overflow:hidden;max-height:100%;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-height:1.1rem;}.toast-enter.__jsx-style-dynamic-selector{opacity:0;height:0;padding:0;margin:0;-webkit-transform:").concat(enter, ";-ms-transform:").concat(enter, ";transform:").concat(enter, ";}.toast-enter-active.__jsx-style-dynamic-selector{opacity:1;height:auto;margin:").concat(margin, ";padding:").concat(padding, ";-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0);}.toast-leave.__jsx-style-dynamic-selector{opacity:1;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0);height:auto;margin:").concat(margin, ";padding:").concat(padding, ";}.toast-leave-active.__jsx-style-dynamic-selector{opacity:0;-webkit-transform:").concat(leave, ";-ms-transform:").concat(leave, ";transform:").concat(leave, ";}"))));
44
+ });
45
+ export default ToastItem;
@@ -0,0 +1,40 @@
1
+ import React, { CSSProperties } from 'react';
2
+ import type { NormalTypes } from '../utils/prop-types';
3
+ import { ToastPlacement } from '../use-toasts/helpers';
4
+ export interface ToastAction {
5
+ name: string;
6
+ handler: (event: React.MouseEvent<HTMLButtonElement>, cancel: () => void) => void;
7
+ passive?: boolean;
8
+ }
9
+ export type ToastTypes = NormalTypes;
10
+ export type ToastLayout = {
11
+ padding?: CSSProperties['padding'];
12
+ margin?: CSSProperties['margin'];
13
+ width?: CSSProperties['width'];
14
+ maxWidth?: CSSProperties['maxWidth'];
15
+ maxHeight?: CSSProperties['maxHeight'];
16
+ placement?: ToastPlacement;
17
+ };
18
+ export interface ToastInput {
19
+ text: string | React.ReactNode;
20
+ type?: ToastTypes;
21
+ id?: string;
22
+ delay?: number;
23
+ actions?: Array<ToastAction>;
24
+ }
25
+ export type ToastInstance = {
26
+ visible: boolean;
27
+ cancel: () => void;
28
+ _timeout: null | number;
29
+ _internalIdent: string;
30
+ };
31
+ export type Toast = Required<ToastInput> & ToastInstance;
32
+ export type ToastHooksResult = {
33
+ toasts: Array<Toast>;
34
+ setToast: (toast: ToastInput) => void;
35
+ removeAll: () => void;
36
+ findToastOneByID: (ident: string) => Toast | undefined;
37
+ removeToastOneByID: (ident: string) => void;
38
+ };
39
+ declare const useToasts: (layout?: ToastLayout) => ToastHooksResult;
40
+ export default useToasts;
@@ -0,0 +1,103 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ /* "use client" */
4
+
5
+ import { useEffect } from 'react';
6
+ import { defaultToastLayout, useHUIContext } from '../utils/use-hd-ui-context';
7
+ import { getId } from '../utils/collections';
8
+ var defaultToast = {
9
+ delay: 2000,
10
+ type: 'default'
11
+ };
12
+ var useToasts = function useToasts(layout) {
13
+ var _useHUIContext = useHUIContext(),
14
+ updateToasts = _useHUIContext.updateToasts,
15
+ toasts = _useHUIContext.toasts,
16
+ updateToastLayout = _useHUIContext.updateToastLayout,
17
+ updateLastToastId = _useHUIContext.updateLastToastId;
18
+ useEffect(function () {
19
+ if (!layout) return;
20
+ updateToastLayout(function () {
21
+ return layout ? _extends({}, defaultToastLayout, layout) : defaultToastLayout;
22
+ });
23
+ }, []);
24
+ var _cancel = function cancel(internalId) {
25
+ updateToasts(function (currentToasts) {
26
+ return currentToasts.map(function (item) {
27
+ if (item._internalIdent !== internalId) return item;
28
+ return _extends({}, item, {
29
+ visible: false
30
+ });
31
+ });
32
+ });
33
+ updateLastToastId(function () {
34
+ return internalId;
35
+ });
36
+ };
37
+ var removeAll = function removeAll() {
38
+ updateToasts(function (last) {
39
+ return last.map(function (toast) {
40
+ return _extends({}, toast, {
41
+ visible: false
42
+ });
43
+ });
44
+ });
45
+ };
46
+ var findToastOneByID = function findToastOneByID(id) {
47
+ return toasts.find(function (t) {
48
+ return t.id === id;
49
+ });
50
+ };
51
+ var removeToastOneByID = function removeToastOneByID(id) {
52
+ updateToasts(function (last) {
53
+ return last.map(function (toast) {
54
+ if (toast.id !== id) return toast;
55
+ return _extends({}, toast, {
56
+ visible: false
57
+ });
58
+ });
59
+ });
60
+ };
61
+ var setToast = function setToast(toast) {
62
+ var internalIdent = "toast-".concat(getId());
63
+ var delay = toast.delay || defaultToast.delay;
64
+ if (toast.id) {
65
+ var hasIdent = toasts.find(function (t) {
66
+ return t.id === toast.id;
67
+ });
68
+ if (hasIdent) {
69
+ throw new Error('Toast: Already have the same key: "ident"');
70
+ }
71
+ }
72
+ updateToasts(function (last) {
73
+ var newToast = {
74
+ delay: delay,
75
+ text: toast.text,
76
+ visible: true,
77
+ type: toast.type || defaultToast.type,
78
+ id: toast.id || internalIdent,
79
+ actions: toast.actions || [],
80
+ _internalIdent: internalIdent,
81
+ _timeout: window.setTimeout(function () {
82
+ _cancel(internalIdent);
83
+ if (newToast._timeout) {
84
+ window.clearTimeout(newToast._timeout);
85
+ newToast._timeout = null;
86
+ }
87
+ }, delay),
88
+ cancel: function cancel() {
89
+ return _cancel(internalIdent);
90
+ }
91
+ };
92
+ return [].concat(_toConsumableArray(last), [newToast]);
93
+ });
94
+ };
95
+ return {
96
+ toasts: toasts,
97
+ setToast: setToast,
98
+ removeAll: removeAll,
99
+ findToastOneByID: findToastOneByID,
100
+ removeToastOneByID: removeToastOneByID
101
+ };
102
+ };
103
+ export default useToasts;
@@ -0,0 +1,29 @@
1
+ /* "use client" */
2
+
3
+ import { useMemo } from 'react';
4
+
5
+ /**
6
+ * Calculate the ratio of two numbers, maximum decimal length can be specified.
7
+ *
8
+ * (0, 100) => 0
9
+ * (50, 100) => 50
10
+ * (11.22, 100) => 11.22
11
+ * (11.22, 100, 4) => 11.2200
12
+ */
13
+ export var getProportions = function getProportions(value, max) {
14
+ var maxFixed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
15
+ var val = value / max;
16
+ var couldBeDecimalValue = (Number.isNaN(val) ? 0 : val) * 100;
17
+ if (couldBeDecimalValue > 100) return 100;
18
+ if (couldBeDecimalValue < 0) return 0;
19
+ if (!"".concat(couldBeDecimalValue).includes('.')) return couldBeDecimalValue;
20
+ var decimal = "".concat(couldBeDecimalValue).split('.')[1];
21
+ if (decimal.length < maxFixed) return couldBeDecimalValue;
22
+ return +couldBeDecimalValue.toFixed(maxFixed);
23
+ };
24
+ export var useProportions = function useProportions(value, max) {
25
+ var maxFixed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
26
+ return useMemo(function () {
27
+ return getProportions(value, max, maxFixed);
28
+ }, [value, max, maxFixed]);
29
+ };
@@ -0,0 +1,15 @@
1
+ import React, { ReactNode } from 'react';
2
+ export declare const getId: () => string;
3
+ export declare const capitalize: (str: string | symbol | number | undefined | null) => string;
4
+ export declare const hasChild: (children: ReactNode | undefined, child: React.ElementType) => boolean;
5
+ export declare const pickChild: (children: ReactNode | undefined, targetChild: React.ElementType) => [ReactNode | undefined, ReactNode | undefined];
6
+ export declare const pickChildByProps: (children: ReactNode | undefined, key: string, value: any) => [ReactNode | undefined, ReactNode | undefined];
7
+ export declare const pickChildrenFirst: (children: ReactNode | undefined) => ReactNode | undefined;
8
+ export declare const setChildrenProps: (children: ReactNode | undefined, props: Record<string, unknown>, targetComponents?: Array<React.ElementType>) => ReactNode | undefined;
9
+ export declare const setChildrenIndex: (children: ReactNode | undefined, targetComponents?: Array<React.ElementType>) => ReactNode | undefined;
10
+ export declare const getReactNode: (node?: React.ReactNode | (() => React.ReactNode)) => React.ReactNode;
11
+ export declare const isChildElement: (parent: Element | null | undefined, child: Element | null | undefined) => boolean;
12
+ export declare const isUiElement: (el?: HTMLElement) => boolean;
13
+ export declare const isBrowser: () => boolean;
14
+ export declare const isMac: () => boolean;
15
+ export declare const isCSSNumberValue: (value?: string | number) => boolean;