@navikt/ds-react 0.17.16 → 0.17.19

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 (43) hide show
  1. package/cjs/form/search/Search.js +11 -17
  2. package/cjs/form/search/SearchButton.js +1 -1
  3. package/cjs/index.js +1 -0
  4. package/cjs/read-more/ReadMore.js +1 -1
  5. package/cjs/tooltip/Tooltip.js +153 -0
  6. package/cjs/tooltip/index.js +23 -0
  7. package/cjs/tooltip/package.json +6 -0
  8. package/cjs/tooltip/portal.js +17 -0
  9. package/cjs/util/index.js +11 -1
  10. package/esm/form/search/Search.d.ts +4 -4
  11. package/esm/form/search/Search.js +13 -19
  12. package/esm/form/search/Search.js.map +1 -1
  13. package/esm/form/search/SearchButton.js +1 -1
  14. package/esm/form/search/SearchButton.js.map +1 -1
  15. package/esm/index.d.ts +1 -0
  16. package/esm/index.js +1 -0
  17. package/esm/index.js.map +1 -1
  18. package/esm/read-more/ReadMore.js +1 -1
  19. package/esm/read-more/ReadMore.js.map +1 -1
  20. package/esm/tooltip/Tooltip.d.ts +51 -0
  21. package/esm/tooltip/Tooltip.js +126 -0
  22. package/esm/tooltip/Tooltip.js.map +1 -0
  23. package/esm/tooltip/index.d.ts +2 -0
  24. package/esm/tooltip/index.js +3 -0
  25. package/esm/tooltip/index.js.map +1 -0
  26. package/esm/tooltip/portal.d.ts +5 -0
  27. package/esm/tooltip/portal.js +13 -0
  28. package/esm/tooltip/portal.js.map +1 -0
  29. package/esm/util/index.d.ts +1 -0
  30. package/esm/util/index.js +9 -0
  31. package/esm/util/index.js.map +1 -1
  32. package/package.json +5 -4
  33. package/src/form/search/Search.tsx +22 -24
  34. package/src/form/search/SearchButton.tsx +1 -1
  35. package/src/form/search/search-themes.stories.tsx +52 -0
  36. package/src/form/search/search.stories.tsx +10 -3
  37. package/src/index.ts +1 -0
  38. package/src/read-more/ReadMore.tsx +1 -0
  39. package/src/tooltip/Tooltip.tsx +301 -0
  40. package/src/tooltip/index.ts +2 -0
  41. package/src/tooltip/portal.tsx +15 -0
  42. package/src/tooltip/tooltip.stories.tsx +144 -0
  43. package/src/util/index.ts +14 -0
@@ -0,0 +1,126 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import cl from "classnames";
13
+ import React, { cloneElement, forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from "react";
14
+ import { composeEventHandlers, Detail, useEventListener } from "..";
15
+ import { useFloating, arrow as flArrow, shift, autoUpdate, flip, hide, } from "@floating-ui/react-dom";
16
+ import mergeRefs from "react-merge-refs";
17
+ import Portal from "./portal";
18
+ import { useId } from "../util";
19
+ const Tooltip = forwardRef((_a, ref) => {
20
+ var { children, className, arrow: _arrow = true, placement: _placement = "top", open, defaultOpen = false, offset: _offset, content, delay = 150, id, keys, maxChar = 80 } = _a, rest = __rest(_a, ["children", "className", "arrow", "placement", "open", "defaultOpen", "offset", "content", "delay", "id", "keys", "maxChar"]);
21
+ const arrowRef = useRef(null);
22
+ const [isOpen, setIsOpen] = useState(defaultOpen);
23
+ const openTimerRef = useRef(0);
24
+ const leaveTimerRef = useRef(0);
25
+ const isMouseDownRef = useRef(false);
26
+ const ariaId = useId(id);
27
+ const { x, y, update, placement, refs, middlewareData: { arrow: { x: arrowX, y: arrowY } = {}, hide: { referenceHidden } = {}, }, } = useFloating({
28
+ placement: _placement,
29
+ middleware: [
30
+ shift(),
31
+ flip({ padding: 5, fallbackPlacements: ["bottom", "top"] }),
32
+ flArrow({ element: arrowRef, padding: 5 }),
33
+ hide(),
34
+ ],
35
+ });
36
+ /* https://floating-ui.com/docs/react-dom#updating */
37
+ useEffect(() => {
38
+ if (!refs.reference.current || !refs.floating.current) {
39
+ return;
40
+ }
41
+ // Only call this when the floating element is rendered
42
+ return autoUpdate(refs.reference.current, refs.floating.current, update);
43
+ }, [refs.reference, refs.floating, update, open, isOpen]);
44
+ const handleOpen = useCallback(() => {
45
+ window.clearTimeout(openTimerRef.current);
46
+ window.clearTimeout(leaveTimerRef.current);
47
+ setIsOpen(true);
48
+ }, [setIsOpen]);
49
+ const handleDelayedOpen = useCallback(() => {
50
+ window.clearTimeout(openTimerRef.current);
51
+ window.clearTimeout(leaveTimerRef.current);
52
+ openTimerRef.current = window.setTimeout(() => {
53
+ setIsOpen(true);
54
+ }, delay);
55
+ }, [delay, setIsOpen]);
56
+ const handleClose = useCallback(() => {
57
+ window.clearTimeout(openTimerRef.current);
58
+ leaveTimerRef.current = window.setTimeout(() => {
59
+ setIsOpen(false);
60
+ }, 50);
61
+ }, [setIsOpen]);
62
+ const handleMouseUp = useCallback(() => (isMouseDownRef.current = false), []);
63
+ useEffect(() => {
64
+ // eslint-disable-next-line react-hooks/exhaustive-deps
65
+ return () => window.clearTimeout(openTimerRef.current);
66
+ }, []);
67
+ useEffect(() => {
68
+ return () => document.removeEventListener("mouseup", handleMouseUp);
69
+ }, [handleMouseUp]);
70
+ useEventListener("keydown", useCallback((e) => e.key === "Escape" && handleClose(), [handleClose]), document);
71
+ /* https://floating-ui.com/docs/react-dom#stable-ref-prop */
72
+ const stableRef = useMemo(() => mergeRefs([ref, refs.floating]), [
73
+ ref,
74
+ refs.floating,
75
+ ]);
76
+ if (!children ||
77
+ (children === null || children === void 0 ? void 0 : children.type) === React.Fragment ||
78
+ children === React.Fragment) {
79
+ console.error("<Tooltip> children needs to be a single ReactElement and not <React.Fragment/>/<></>");
80
+ return null;
81
+ }
82
+ if ((content === null || content === void 0 ? void 0 : content.length) > maxChar) {
83
+ console.error(`Because of strict accessibility concers we encourage all Tooltips to have less than 80 characters. Can be overwritten with the maxChar-prop`);
84
+ return null;
85
+ }
86
+ return (React.createElement(React.Fragment, null,
87
+ cloneElement(children, Object.assign(Object.assign({}, children.props), { "aria-describedby": open || isOpen
88
+ ? cl(ariaId, children === null || children === void 0 ? void 0 : children.props["aria-describedby"])
89
+ : children === null || children === void 0 ? void 0 : children.props["aria-describedby"], ref: mergeRefs([children.ref, refs.reference]), onMouseEnter: composeEventHandlers(children.props.onMouseEnter, handleDelayedOpen), onMouseLeave: composeEventHandlers(children.props.onMouseLeave, handleClose), onMouseDown: composeEventHandlers(children.props.onMouseDown, () => {
90
+ isMouseDownRef.current = true;
91
+ document.addEventListener("mouseup", handleMouseUp, { once: true });
92
+ }), onFocus: composeEventHandlers(children.props.onFocus, () => !isMouseDownRef.current && handleOpen()), onBlur: composeEventHandlers(children.props.onBlur, handleClose) })),
93
+ (open !== null && open !== void 0 ? open : isOpen) && (React.createElement(Portal, null,
94
+ React.createElement("div", Object.assign({ ref: stableRef }, rest, { onMouseEnter: handleOpen, onMouseLeave: handleClose, role: "tooltip", id: ariaId, style: {
95
+ position: "absolute",
96
+ top: y !== null && y !== void 0 ? y : "",
97
+ left: x !== null && x !== void 0 ? x : "",
98
+ visibility: referenceHidden ? "hidden" : "visible",
99
+ }, "data-side": placement, className: cl("navds-tooltip", "navds-detail navds-detail--small", className) }),
100
+ React.createElement("div", { className: "navds-tooltip__inner", style: {
101
+ [{
102
+ top: "marginBottom",
103
+ right: "marginLeft",
104
+ bottom: "marginTop",
105
+ left: "marginRight",
106
+ }[placement]]: _offset ? _offset : _arrow ? 10 : 2,
107
+ } },
108
+ content,
109
+ keys && (React.createElement("span", { className: "navds-tooltip__keys" }, keys.map((key) => (React.createElement(Detail, { size: "small", as: "kbd", key: key, className: "navds-tooltip__key" }, key))))),
110
+ _arrow && (React.createElement("div", { ref: (node) => {
111
+ arrowRef.current = node;
112
+ }, className: "navds-tooltip__arrow", style: {
113
+ left: arrowX != null ? `${arrowX}px` : "",
114
+ top: arrowY != null ? `${arrowY}px` : "",
115
+ right: "",
116
+ bottom: "",
117
+ [{
118
+ top: "bottom",
119
+ right: "left",
120
+ bottom: "top",
121
+ left: "right",
122
+ }[placement]]: "-3.5px",
123
+ } }))))))));
124
+ });
125
+ export default Tooltip;
126
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","sourceRoot":"","sources":["../../src/tooltip/Tooltip.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { default as Tooltip } from "./Tooltip";
2
+ export * from "./Tooltip";
@@ -0,0 +1,3 @@
1
+ export { default as Tooltip } from "./Tooltip";
2
+ export * from "./Tooltip";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tooltip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,cAAc,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ declare const Portal: ({ children }: {
3
+ children: any;
4
+ }) => import("react").ReactPortal | null;
5
+ export default Portal;
@@ -0,0 +1,13 @@
1
+ /* https://github.com/radix-ui/primitives/blob/main/packages/react/portal/src/Portal.tsx */
2
+ import ReactDOM from "react-dom";
3
+ const Portal = ({ children }) => {
4
+ var _a;
5
+ const hostElement = (_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.document) === null || _a === void 0 ? void 0 : _a.body;
6
+ if (hostElement) {
7
+ return ReactDOM.createPortal(children, hostElement);
8
+ }
9
+ // bail out of ssr
10
+ return null;
11
+ };
12
+ export default Portal;
13
+ //# sourceMappingURL=portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/tooltip/portal.tsx"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;;IAC9B,MAAM,WAAW,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ,0CAAE,IAAI,CAAC;IAE/C,IAAI,WAAW,EAAE;QACf,OAAO,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;KACrD;IAED,kBAAkB;IAClB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -6,3 +6,4 @@ export interface ListenerT {
6
6
  removeEventListener(name: string, handler: (event?: any) => void, ...args: any[]): any;
7
7
  }
8
8
  export declare const useEventListener: <T extends ListenerT>(name: Parameters<ListenerT["addEventListener"]>[0], handler: Parameters<ListenerT["addEventListener"]>[1], target?: Window | T | null) => void;
9
+ export declare const composeEventHandlers: <E>(originalEventHandler?: ((event: E) => void) | undefined, ourEventHandler?: ((event: E) => void) | undefined) => (event: E) => void;
package/esm/util/index.js CHANGED
@@ -16,4 +16,13 @@ export const useEventListener = (name, handler, target = window) => {
16
16
  };
17
17
  }, [name, handler, target]);
18
18
  };
19
+ /* https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx */
20
+ export const composeEventHandlers = (originalEventHandler, ourEventHandler) => {
21
+ return function handleEvent(event) {
22
+ originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);
23
+ if (!event.defaultPrevented) {
24
+ return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);
25
+ }
26
+ };
27
+ };
19
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AAExB,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAAe,EAAE,EAAE,CACnD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;KAChB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;KACvC,MAAM,CACL,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,iCAClB,GAAG,KACN,CAAC,GAAG,CAAC,EAAE,KAAK,IACZ,EACF,EAAE,CACH,CAAC;AAgBN,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAkD,EAClD,OAAqD,EACrD,SAA4B,MAAM,EAC5B,EAAE;IACR,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE;YACX,OAAO;SACR;QACD,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AAExB,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAAe,EAAE,EAAE,CACnD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;KAChB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;KACvC,MAAM,CACL,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,iCAClB,GAAG,KACN,CAAC,GAAG,CAAC,EAAE,KAAK,IACZ,EACF,EAAE,CACH,CAAC;AAgBN,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAkD,EAClD,OAAqD,EACrD,SAA4B,MAAM,EAC5B,EAAE;IACR,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE;YACX,OAAO;SACR;QACD,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,oBAAyC,EACzC,eAAoC,EACpC,EAAE;IACF,OAAO,SAAS,WAAW,CAAC,KAAQ;QAClC,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAG,KAAK,CAAC,CAAC;QAE9B,IAAI,CAAG,KAA2B,CAAC,gBAAgB,EAAE;YACnD,OAAO,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAG,KAAK,CAAC,CAAC;SACjC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@navikt/ds-react",
3
- "version": "0.17.16",
3
+ "version": "0.17.19",
4
4
  "private": false,
5
5
  "description": "NAV designsystem react components",
6
6
  "author": "NAV Designsystem team",
@@ -27,15 +27,16 @@
27
27
  "/src"
28
28
  ],
29
29
  "scripts": {
30
- "create-package-json-pointers-to-esm": "node ../../../utilities/scripts/createPackageJsonsWithESMPointers.js",
30
+ "create-package-json-pointers-to-esm": "node ../../../scripts/createPackageJsonsWithESMPointers.js",
31
31
  "clean": "rimraf cjs esm",
32
32
  "build": "yarn run clean && tsc && tsc -p tsconfig.esm.json && yarn create-package-json-pointers-to-esm",
33
33
  "watch": "tsc --watch -p tsconfig.esm.json",
34
34
  "test": "jest"
35
35
  },
36
36
  "dependencies": {
37
+ "@floating-ui/react-dom": "0.6.0",
37
38
  "@material-ui/core": "^4.12.3",
38
- "@navikt/ds-icons": "^0.8.6",
39
+ "@navikt/ds-icons": "^0.8.7",
39
40
  "@popperjs/core": "^2.10.1",
40
41
  "@radix-ui/react-tabs": "0.1.5",
41
42
  "@radix-ui/react-toggle-group": "0.1.5",
@@ -68,5 +69,5 @@
68
69
  "@types/react": "^17.0.30",
69
70
  "react": "^17.0.0"
70
71
  },
71
- "gitHead": "61f6b62c9e20e095d220631b5c9fa1d7a7cada38"
72
+ "gitHead": "31bd40c02cde72ad9aeea011a2005ba8660718cc"
72
73
  }
@@ -1,10 +1,9 @@
1
- import { Close } from "@navikt/ds-icons";
1
+ import { Close, Search as SearchIcon } from "@navikt/ds-icons";
2
2
  import cl from "classnames";
3
3
  import React, {
4
4
  forwardRef,
5
5
  InputHTMLAttributes,
6
6
  useCallback,
7
- useEffect,
8
7
  useRef,
9
8
  useState,
10
9
  } from "react";
@@ -59,9 +58,9 @@ export interface SearchProps
59
58
  clearButton?: boolean;
60
59
  /**
61
60
  * Changes button-variant
62
- * @default "tertiary"
61
+ * @default "primary"
63
62
  */
64
- variant?: "tertiary" | "primary";
63
+ variant?: "primary" | "secondary" | "simple";
65
64
  }
66
65
 
67
66
  interface SearchComponent
@@ -74,8 +73,8 @@ interface SearchComponent
74
73
  export interface SearchContextProps {
75
74
  disabled?: boolean;
76
75
  size: "medium" | "small";
77
- variant?: "tertiary" | "primary";
78
- onSearch?: () => void;
76
+ variant: "primary" | "secondary" | "simple";
77
+ onSearch: () => void;
79
78
  }
80
79
 
81
80
  export const SearchContext = React.createContext<SearchContextProps | null>(
@@ -99,7 +98,9 @@ const Search = forwardRef<HTMLInputElement, SearchProps>((props, ref) => {
99
98
  clearButton = true,
100
99
  children,
101
100
  onSearch,
102
- variant = "tertiary",
101
+ variant = "primary",
102
+ defaultValue,
103
+ onChange,
103
104
  ...rest
104
105
  } = props;
105
106
 
@@ -107,26 +108,23 @@ const Search = forwardRef<HTMLInputElement, SearchProps>((props, ref) => {
107
108
  const mergedRef = mergeRefs([searchRef, ref]);
108
109
  const [wrapperRef, setWrapperRef] = useState<HTMLDivElement | null>(null);
109
110
 
110
- const [controlledValue, setControlledValue] = useState(value ?? "");
111
+ const [internalValue, setInternalValue] = useState(defaultValue ?? "");
111
112
 
112
113
  const handleChange = useCallback(
113
114
  (v: string) => {
114
- searchRef.current && value === undefined && setControlledValue(v);
115
- props?.onChange?.(v);
115
+ value === undefined && setInternalValue(v);
116
+ onChange?.(v);
116
117
  },
117
- [props, value]
118
+ [onChange, value]
118
119
  );
119
120
 
120
121
  const handleClear = useCallback(
121
122
  (event: SearchClearEvent) => {
122
123
  onClear?.(event);
123
124
  handleChange("");
124
- if (searchRef.current && value === undefined) {
125
- searchRef.current.value = "";
126
- }
127
125
  searchRef.current && searchRef.current?.focus?.();
128
126
  },
129
- [handleChange, onClear, value]
127
+ [handleChange, onClear]
130
128
  );
131
129
 
132
130
  useEventListener(
@@ -143,10 +141,6 @@ const Search = forwardRef<HTMLInputElement, SearchProps>((props, ref) => {
143
141
  wrapperRef
144
142
  );
145
143
 
146
- useEffect(() => {
147
- value !== undefined && setControlledValue(value);
148
- }, [value]);
149
-
150
144
  return (
151
145
  <div
152
146
  ref={setWrapperRef}
@@ -184,23 +178,27 @@ const Search = forwardRef<HTMLInputElement, SearchProps>((props, ref) => {
184
178
  )}
185
179
  <div className="navds-search__wrapper">
186
180
  <div className="navds-search__wrapper-inner">
181
+ {variant === "simple" && (
182
+ <SearchIcon aria-hidden className="navds-search__search-icon" />
183
+ )}
187
184
  <input
188
185
  ref={mergedRef}
189
186
  {...omit(rest, ["size"])}
190
187
  {...inputProps}
191
- {...(props.value !== undefined && { value: props.value })}
188
+ value={value ?? internalValue}
192
189
  onChange={(e) => handleChange(e.target.value)}
193
190
  type="search"
194
191
  role="searchbox"
195
192
  className={cl(
196
193
  className,
197
194
  "navds-search__input",
195
+ `navds-search__input--${variant}`,
198
196
  "navds-text-field__input",
199
197
  "navds-body-short",
200
- `navds-body-${size ?? "medium"}`
198
+ `navds-body-${size}`
201
199
  )}
202
200
  />
203
- {controlledValue && clearButton && (
201
+ {(value ?? internalValue) && clearButton && (
204
202
  <button
205
203
  type="button"
206
204
  onClick={(e) => handleClear({ trigger: "Click", event: e })}
@@ -218,10 +216,10 @@ const Search = forwardRef<HTMLInputElement, SearchProps>((props, ref) => {
218
216
  size,
219
217
  disabled: inputProps.disabled,
220
218
  variant,
221
- onSearch: () => onSearch?.(controlledValue),
219
+ onSearch: () => onSearch?.(value ?? internalValue),
222
220
  }}
223
221
  >
224
- {children ? children : <SearchButton />}
222
+ {children ? children : variant !== "simple" && <SearchButton />}
225
223
  </SearchContext.Provider>
226
224
  </div>
227
225
  </div>
@@ -33,7 +33,7 @@ const SearchButton: SearchButtonType = forwardRef(
33
33
  {...rest}
34
34
  ref={ref}
35
35
  size={size}
36
- variant={variant}
36
+ variant={variant === "secondary" ? "secondary" : "primary"}
37
37
  className={cl("navds-search__button-search", className)}
38
38
  disabled={context?.disabled ?? disabled}
39
39
  onClick={(e) => {
@@ -0,0 +1,52 @@
1
+ import { Meta } from "@storybook/react/types-6-0";
2
+ import React from "react";
3
+ import { Heading } from "../..";
4
+ import { Search } from "..";
5
+
6
+ export default {
7
+ title: "ds-react/form/search",
8
+ component: Search,
9
+ } as Meta;
10
+
11
+ export const LightTheme = () => (
12
+ <div
13
+ style={{ maxWidth: 400, display: "flex", flexDirection: "column", gap: 16 }}
14
+ >
15
+ <Heading size="xlarge">Search</Heading>
16
+ <Heading level="2" size="large">
17
+ size medium
18
+ </Heading>
19
+ <Search label="hidden label" placeholder="Søk" />
20
+ <Search label="hidden label" variant="secondary" defaultValue="dagpenger" />
21
+ <Search label="hidden label" variant="simple" placeholder="Søk" />
22
+ <Search label="with label" hideLabel={false} />
23
+
24
+ <Heading level="2" size="large">
25
+ size small
26
+ </Heading>
27
+ <Search label="hidden label" size="small" placeholder="Søk" />
28
+ <Search
29
+ label="hidden label"
30
+ variant="secondary"
31
+ size="small"
32
+ defaultValue="dagpenger"
33
+ />
34
+ <Search
35
+ label="hidden label"
36
+ variant="simple"
37
+ size="small"
38
+ placeholder="Søk"
39
+ />
40
+ <Search label="with label" hideLabel={false} size="small" />
41
+ </div>
42
+ );
43
+
44
+ export const DarkTheme = () => (
45
+ <div data-theme="dark">
46
+ <LightTheme />
47
+ </div>
48
+ );
49
+
50
+ DarkTheme.parameters = {
51
+ backgrounds: { default: "dark" },
52
+ };
@@ -21,11 +21,18 @@ export const All = () => {
21
21
  <h1>Search</h1>
22
22
 
23
23
  <Search label="Søk alle sider om X og Y" onSearch={console.log}></Search>
24
- <h2>Primary search</h2>
24
+ <h2>Secondary</h2>
25
25
  <Search
26
26
  label="Søk alle sider om X og Y"
27
27
  onSearch={console.log}
28
- variant="primary"
28
+ variant="secondary"
29
+ ></Search>
30
+
31
+ <h2>No button</h2>
32
+ <Search
33
+ label="Søk alle sider om X og Y"
34
+ onSearch={console.log}
35
+ variant="simple"
29
36
  ></Search>
30
37
 
31
38
  <h2>Search small</h2>
@@ -42,7 +49,7 @@ export const All = () => {
42
49
  description="Beskrivelse av søket"
43
50
  size="small"
44
51
  hideLabel
45
- variant="primary"
52
+ variant="secondary"
46
53
  >
47
54
  <Search.Button />
48
55
  </Search>
package/src/index.ts CHANGED
@@ -21,6 +21,7 @@ export * from "./tag";
21
21
  export * from "./toggle-group";
22
22
  export * from "./table";
23
23
  export * from "./tabs";
24
+ export * from "./tooltip";
24
25
  export * from "./typography";
25
26
  export * from "./util";
26
27
 
@@ -55,6 +55,7 @@ const ReadMore = forwardRef<HTMLButtonElement, ReadMoreProps>(
55
55
  return (
56
56
  <>
57
57
  <button
58
+ type="button"
58
59
  {...rest}
59
60
  className={cl(
60
61
  "navds-read-more",