@reykjavik/hanna-react 0.10.80 → 0.10.81

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/CHANGELOG.md CHANGED
@@ -4,6 +4,15 @@
4
4
 
5
5
  - ... <!-- Add new lines here. -->
6
6
 
7
+ ## 0.10.81
8
+
9
+ _2023-02-16_
10
+
11
+ - feat: Add component `Tooltip`
12
+ - fix(ts): Make `MainMenu` onClick handlers return `void`, not `undefined`
13
+ - fix: Suppress accidental dev-mode warnings for
14
+ `CheckboxButton`/`RadioButtonGroup`s
15
+
7
16
  ## 0.10.80
8
17
 
9
18
  _2023-02-08_
package/MainMenu.d.ts CHANGED
@@ -22,7 +22,7 @@ export type MainMenuItem = {
22
22
  * "Hamburger menu" (a.k.a. "Mobile menu")
23
23
  * … unless the `onClick` function explicitly returns `false`.
24
24
  */
25
- onClick?: (index: number, item: MainMenuItem) => undefined | boolean;
25
+ onClick?: (index: number, item: MainMenuItem) => void | boolean;
26
26
  controlsId?: string;
27
27
  };
28
28
  export type MainMenuSeparator = '---';
@@ -50,7 +50,7 @@ export type MainMenuProps = {
50
50
  * "Hamburger menu" (a.k.a. "Mobile menu")
51
51
  * … unless the `onItemClick` function explicitly returns `false`.
52
52
  */
53
- onItemClick?: (index: number, item: MainMenuItem) => undefined | boolean;
53
+ onItemClick?: (index: number, item: MainMenuItem) => void | boolean;
54
54
  activePanelId?: string;
55
55
  texts?: MainMenuI18n;
56
56
  lang?: string;
package/Tooltip.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export type TooltipProps = {
2
+ label: string;
3
+ text: string | JSX.Element;
4
+ iconOnly?: boolean;
5
+ };
6
+ declare const ToolTip: (props: TooltipProps) => JSX.Element;
7
+ export default ToolTip;
package/Tooltip.js ADDED
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const react_2 = require("@floating-ui/react");
6
+ const hooks_1 = require("@hugsmidjan/react/hooks");
7
+ const getBemClass_1 = tslib_1.__importDefault(require("@hugsmidjan/react/utils/getBemClass"));
8
+ const getSide = (placement) => placement.split('-')[0];
9
+ const ToolTip = (props) => {
10
+ const { text, label, iconOnly } = props;
11
+ const arrowRef = (0, react_1.useRef)(null);
12
+ const [isOpen, setIsOpen] = (0, hooks_1.useLaggedState)(false, 300);
13
+ const { x, y, reference, floating, middlewareData, placement } = (0, react_2.useFloating)({
14
+ placement: 'top',
15
+ middleware: [(0, react_2.offset)(10), (0, react_2.flip)(), (0, react_2.shift)(), (0, react_2.arrow)({ element: arrowRef })],
16
+ whileElementsMounted: react_2.autoUpdate,
17
+ });
18
+ const { arrow } = middlewareData;
19
+ const arrowX = arrow === null || arrow === void 0 ? void 0 : arrow.x;
20
+ const arrowY = arrow === null || arrow === void 0 ? void 0 : arrow.y;
21
+ (0, hooks_1.useCallbackOnEsc)(() => {
22
+ setIsOpen(false);
23
+ });
24
+ return (react_1.default.createElement("details", { className: `Tooltip Tooltip--${getSide(placement)}`, open: isOpen, onMouseEnter: () => setIsOpen(true, 100), onFocus: () => {
25
+ if (isOpen) {
26
+ setIsOpen(true, 0);
27
+ }
28
+ }, onBlur: () => setIsOpen(false), onClick: (e) => {
29
+ e.preventDefault();
30
+ setIsOpen(!isOpen, 0);
31
+ }, onMouseDown: () => {
32
+ if (isOpen) {
33
+ setTimeout(() => {
34
+ setIsOpen(true, 0);
35
+ }, 100);
36
+ }
37
+ }, onMouseLeave: (e) => {
38
+ if (e.currentTarget.$contextClicked_firefox_fix) {
39
+ return;
40
+ }
41
+ setIsOpen(false);
42
+ }, onContextMenu: (e) => {
43
+ const elm = e.currentTarget;
44
+ clearTimeout(elm.$contextClicked_firefox_fix);
45
+ elm.$contextClicked_firefox_fix = setTimeout(() => {
46
+ delete elm.$contextClicked_firefox_fix;
47
+ }, 300);
48
+ }, style: x == null
49
+ ? undefined
50
+ : {
51
+ '--tooltip-content-pos-y': `${y}px`,
52
+ '--tooltip-content-pos-x': `${x}px`,
53
+ '--tooltip-arrow-pos-x': `${arrowX}px`,
54
+ '--tooltip-arrow-pos-y': `${arrowY}px`,
55
+ } },
56
+ react_1.default.createElement("summary", { className: (0, getBemClass_1.default)('Tooltip__trigger', iconOnly && 'icononly'), ref: reference }, label),
57
+ react_1.default.createElement("div", { className: "Tooltip__content", onClick: (e) => e.stopPropagation(), ref: floating },
58
+ x !== null && (react_1.default.createElement("div", { "data-floating-ui-hack-plz-ignore": "", style: { position: 'absolute', display: 'none' }, ref: arrowRef })),
59
+ text)));
60
+ };
61
+ exports.default = ToolTip;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TogglerInput = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const react_1 = tslib_1.__importStar(require("react"));
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
6
  const hooks_1 = require("@hugsmidjan/react/hooks");
7
7
  const getBemClass_1 = tslib_1.__importDefault(require("@hugsmidjan/react/utils/getBemClass"));
8
8
  const TogglerInput = (props) => {
@@ -12,17 +12,16 @@ const TogglerInput = (props) => {
12
12
  const reqStar = required && reqText !== false && (react_1.default.createElement("abbr", { className: bem + '__label__reqstar',
13
13
  // TODO: add mo-better i18n thinking
14
14
  title: (reqText || 'Þarf að haka í') + ': ' }, "*"));
15
- const InnerWrap = innerWrap ? 'span' : react_1.Fragment;
15
+ const labelContent = (react_1.default.createElement(react_1.default.Fragment, null,
16
+ ' ',
17
+ reqStar,
18
+ " ",
19
+ label,
20
+ ' '));
16
21
  return (react_1.default.createElement(Wrapper, { className: (0, getBemClass_1.default)(bem, modifier, className) },
17
22
  react_1.default.createElement("input", Object.assign({ className: bem + '__input', type: type, id: domid, "aria-invalid": invalid || !!errorMessage || undefined, "aria-describedby": errorId }, inputProps)),
18
23
  ' ',
19
- react_1.default.createElement("label", { className: bem + '__label', htmlFor: domid },
20
- react_1.default.createElement(InnerWrap, { className: bem + '__label__wrap' },
21
- ' ',
22
- reqStar,
23
- " ",
24
- label,
25
- ' ')),
24
+ react_1.default.createElement("label", { className: bem + '__label', htmlFor: domid }, innerWrap ? (react_1.default.createElement("span", { className: bem + '__label__wrap' }, labelContent)) : (labelContent)),
26
25
  errorMessage && (react_1.default.createElement("div", { className: bem + '__error', id: errorId }, errorMessage))));
27
26
  };
28
27
  exports.TogglerInput = TogglerInput;
package/index.d.ts CHANGED
@@ -86,6 +86,7 @@
86
86
  /// <reference path="./TextBlock.d.tsx" />
87
87
  /// <reference path="./TextButton.d.tsx" />
88
88
  /// <reference path="./TextInput.d.tsx" />
89
+ /// <reference path="./Tooltip.d.tsx" />
89
90
  /// <reference path="./utils.d.ts" />
90
91
  /// <reference path="./VerticalTabsTOC.d.tsx" />
91
92
  /// <reference path="./VSpacer.d.tsx" />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reykjavik/hanna-react",
3
- "version": "0.10.80",
3
+ "version": "0.10.81",
4
4
  "author": "Reykjavík (http://www.reykjavik.is)",
5
5
  "contributors": [
6
6
  "Hugsmiðjan ehf (http://www.hugsmidjan.is)",
@@ -13,10 +13,11 @@
13
13
  "homepage": "https://github.com/rvk-utd/hanna/blob/main/modules/hanna-react/README.md",
14
14
  "license": "MIT",
15
15
  "dependencies": {
16
+ "@floating-ui/react": "^0.19.2",
16
17
  "@hugsmidjan/qj": "^4.10.2",
17
18
  "@hugsmidjan/react": "^0.4.23",
18
19
  "@reykjavik/hanna-css": "^0.3.13",
19
- "@reykjavik/hanna-utils": "^0.2.1",
20
+ "@reykjavik/hanna-utils": "^0.2.3",
20
21
  "@types/react": "^17.0.24",
21
22
  "@types/react-autosuggest": "^10.1.0",
22
23
  "@types/react-datepicker": "^4.8.0",