@navikt/ds-react 0.17.11 → 0.17.14
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/cjs/index.js +2 -0
- package/cjs/stepper/Step.js +63 -0
- package/cjs/stepper/Stepper.js +60 -0
- package/cjs/stepper/index.js +23 -0
- package/cjs/stepper/package.json +6 -0
- package/cjs/tabs/Tab.js +61 -0
- package/cjs/tabs/TabList.js +108 -0
- package/cjs/tabs/TabPanel.js +47 -0
- package/cjs/tabs/Tabs.js +58 -0
- package/cjs/tabs/index.js +8 -0
- package/cjs/tabs/package.json +6 -0
- package/esm/form/ConfirmationPanel.d.ts +1 -1
- package/esm/form/Select.d.ts +1 -1
- package/esm/index.d.ts +2 -0
- package/esm/index.js +2 -0
- package/esm/index.js.map +1 -1
- package/esm/stepper/Step.d.ts +16 -0
- package/esm/stepper/Step.js +36 -0
- package/esm/stepper/Step.js.map +1 -0
- package/esm/stepper/Stepper.d.ts +31 -0
- package/esm/stepper/Stepper.js +32 -0
- package/esm/stepper/Stepper.js.map +1 -0
- package/esm/stepper/index.d.ts +2 -0
- package/esm/stepper/index.js +3 -0
- package/esm/stepper/index.js.map +1 -0
- package/esm/tabs/Tab.d.ts +24 -0
- package/esm/tabs/Tab.js +34 -0
- package/esm/tabs/Tab.js.map +1 -0
- package/esm/tabs/TabList.d.ts +14 -0
- package/esm/tabs/TabList.js +81 -0
- package/esm/tabs/TabList.js.map +1 -0
- package/esm/tabs/TabPanel.d.ts +14 -0
- package/esm/tabs/TabPanel.js +20 -0
- package/esm/tabs/TabPanel.js.map +1 -0
- package/esm/tabs/Tabs.d.ts +43 -0
- package/esm/tabs/Tabs.js +30 -0
- package/esm/tabs/Tabs.js.map +1 -0
- package/esm/tabs/index.d.ts +2 -0
- package/esm/tabs/index.js +2 -0
- package/esm/tabs/index.js.map +1 -0
- package/package.json +3 -2
- package/src/form/ConfirmationPanel.tsx +1 -1
- package/src/form/Select.tsx +1 -1
- package/src/index.ts +2 -0
- package/src/step-indicator/stories/step-indicator.stories.mdx +1 -1
- package/src/stepper/Step.tsx +59 -0
- package/src/stepper/Stepper.tsx +73 -0
- package/src/stepper/index.ts +2 -0
- package/src/stepper/stories/Example.tsx +28 -0
- package/src/stepper/stories/stepper.stories.mdx +61 -0
- package/src/stepper/stories/stepper.stories.tsx +54 -0
- package/src/tabs/Tab.tsx +79 -0
- package/src/tabs/TabList.tsx +127 -0
- package/src/tabs/TabPanel.tsx +30 -0
- package/src/tabs/Tabs.stories.tsx +188 -0
- package/src/tabs/Tabs.tsx +89 -0
- package/src/tabs/index.ts +2 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stepper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { OverridableComponent } from "..";
|
|
3
|
+
export interface TabProps extends Omit<React.HTMLAttributes<HTMLButtonElement>, "children"> {
|
|
4
|
+
/**
|
|
5
|
+
* Content
|
|
6
|
+
*/
|
|
7
|
+
label?: React.ReactNode;
|
|
8
|
+
/**
|
|
9
|
+
* Icon
|
|
10
|
+
*/
|
|
11
|
+
icon?: React.ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* Value for state-handling
|
|
14
|
+
*/
|
|
15
|
+
value: string;
|
|
16
|
+
/**
|
|
17
|
+
* Icon position
|
|
18
|
+
* @default "left"
|
|
19
|
+
*/
|
|
20
|
+
iconPosition?: "left" | "top";
|
|
21
|
+
}
|
|
22
|
+
export declare type TabType = OverridableComponent<TabProps, HTMLButtonElement>;
|
|
23
|
+
declare const Tab: TabType;
|
|
24
|
+
export default Tab;
|
package/esm/tabs/Tab.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
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 * as RadixTabs from "@radix-ui/react-tabs";
|
|
13
|
+
import cl from "classnames";
|
|
14
|
+
import React, { forwardRef, useContext } from "react";
|
|
15
|
+
import { Label } from "..";
|
|
16
|
+
import { TabsContext } from "./Tabs";
|
|
17
|
+
const Tab = forwardRef((_a, ref) => {
|
|
18
|
+
var _b;
|
|
19
|
+
var { className, as: Component = "button", label, icon, iconPosition, value } = _a, rest = __rest(_a, ["className", "as", "label", "icon", "iconPosition", "value"]);
|
|
20
|
+
const context = useContext(TabsContext);
|
|
21
|
+
if (!label && !icon) {
|
|
22
|
+
console.error("<Tabs.Tab/> needs label/icon");
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return (React.createElement(RadixTabs.Trigger, { value: value, asChild: true },
|
|
26
|
+
React.createElement(Component, Object.assign({ ref: ref, className: cl("navds-tabs__tab", `navds-tabs__tab--${(_b = context === null || context === void 0 ? void 0 : context.size) !== null && _b !== void 0 ? _b : "medium"}`, `navds-tabs__tab-icon--${iconPosition}`, className, {
|
|
27
|
+
"navds-tabs__tab--icon-only": icon && !label,
|
|
28
|
+
}) }, rest),
|
|
29
|
+
React.createElement(Label, { as: "span", className: "navds-tabs__tab-inner", size: context === null || context === void 0 ? void 0 : context.size },
|
|
30
|
+
icon,
|
|
31
|
+
label))));
|
|
32
|
+
});
|
|
33
|
+
export default Tab;
|
|
34
|
+
//# sourceMappingURL=Tab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tab.js","sourceRoot":"","sources":["../../src/tabs/Tab.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,KAAK,EAAwB,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAyBrC,MAAM,GAAG,GAAY,UAAU,CAC7B,CACE,EAQC,EACD,GAAG,EACH,EAAE;;QAVF,EACE,SAAS,EACT,EAAE,EAAE,SAAS,GAAG,QAAQ,EACxB,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,KAAK,OAEN,EADI,IAAI,cAPT,6DAQC,CADQ;IAIT,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAExC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;KACb;IAED,OAAO,CACL,oBAAC,SAAS,CAAC,OAAO,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO;QACtC,oBAAC,SAAS,kBACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,iBAAiB,EACjB,oBAAoB,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,QAAQ,EAAE,EAC/C,yBAAyB,YAAY,EAAE,EACvC,SAAS,EACT;gBACE,4BAA4B,EAAE,IAAI,IAAI,CAAC,KAAK;aAC7C,CACF,IACG,IAAI;YAER,oBAAC,KAAK,IACJ,EAAE,EAAC,MAAM,EACT,SAAS,EAAC,uBAAuB,EACjC,IAAI,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI;gBAElB,IAAI;gBACJ,KAAK,CACA,CACE,CACM,CACrB,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface ListProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/**
|
|
4
|
+
* Tab elements
|
|
5
|
+
*/
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
/**
|
|
8
|
+
* Loops back to start when navigating past last item
|
|
9
|
+
*/
|
|
10
|
+
loop?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare type ListType = React.ForwardRefExoticComponent<ListProps & React.RefAttributes<HTMLDivElement>>;
|
|
13
|
+
declare const List: ListType;
|
|
14
|
+
export default List;
|
|
@@ -0,0 +1,81 @@
|
|
|
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 { debounce } from "@material-ui/core";
|
|
13
|
+
import { Back, Next } from "@navikt/ds-icons";
|
|
14
|
+
import { TabsList } from "@radix-ui/react-tabs";
|
|
15
|
+
import cl from "classnames";
|
|
16
|
+
import React, { forwardRef, useEffect, useMemo, useRef, useState } from "react";
|
|
17
|
+
import mergeRefs from "react-merge-refs";
|
|
18
|
+
const List = forwardRef((_a, ref) => {
|
|
19
|
+
var { className } = _a, rest = __rest(_a, ["className"]);
|
|
20
|
+
const listRef = useRef(null);
|
|
21
|
+
const mergedRef = mergeRefs([listRef, ref]);
|
|
22
|
+
const [displayScroll, setDisplayScroll] = useState({
|
|
23
|
+
start: false,
|
|
24
|
+
end: false,
|
|
25
|
+
});
|
|
26
|
+
const updateScrollButtonState = useMemo(() => debounce(() => {
|
|
27
|
+
var _a;
|
|
28
|
+
if (!(listRef === null || listRef === void 0 ? void 0 : listRef.current))
|
|
29
|
+
return;
|
|
30
|
+
const { scrollWidth, clientWidth } = listRef === null || listRef === void 0 ? void 0 : listRef.current;
|
|
31
|
+
let showStartScroll;
|
|
32
|
+
let showEndScroll;
|
|
33
|
+
const scrollLeft = (_a = listRef === null || listRef === void 0 ? void 0 : listRef.current) === null || _a === void 0 ? void 0 : _a.scrollLeft;
|
|
34
|
+
// use 1 for the potential rounding error with browser zooms.
|
|
35
|
+
showStartScroll = scrollLeft > 1;
|
|
36
|
+
showEndScroll = scrollLeft < scrollWidth - clientWidth - 1;
|
|
37
|
+
setDisplayScroll((displayScroll) => showStartScroll === displayScroll.start &&
|
|
38
|
+
showEndScroll === displayScroll.end
|
|
39
|
+
? displayScroll
|
|
40
|
+
: { start: showStartScroll, end: showEndScroll });
|
|
41
|
+
}), []);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
var _a, _b, _c;
|
|
44
|
+
const handleResize = () => updateScrollButtonState();
|
|
45
|
+
const win = (_c = (_b = (_a = listRef.current) === null || _a === void 0 ? void 0 : _a.ownerDocument) !== null && _b !== void 0 ? _b : document) !== null && _c !== void 0 ? _c : window;
|
|
46
|
+
win.addEventListener("resize", handleResize);
|
|
47
|
+
let resizeObserver;
|
|
48
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
49
|
+
resizeObserver = new ResizeObserver(handleResize);
|
|
50
|
+
resizeObserver.observe(listRef.current);
|
|
51
|
+
}
|
|
52
|
+
return () => {
|
|
53
|
+
win.removeEventListener("resize", handleResize);
|
|
54
|
+
if (resizeObserver) {
|
|
55
|
+
resizeObserver.disconnect();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}, [updateScrollButtonState]);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
updateScrollButtonState();
|
|
61
|
+
});
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
return () => {
|
|
64
|
+
updateScrollButtonState.clear();
|
|
65
|
+
};
|
|
66
|
+
}, [updateScrollButtonState]);
|
|
67
|
+
const ScrollButton = ({ dir, hidden, }) => (React.createElement("div", { className: cl("navds-tabs__scroll-button", {
|
|
68
|
+
"navds-tabs__scroll-button--hidden": hidden,
|
|
69
|
+
}), onClick: () => {
|
|
70
|
+
if (!listRef.current)
|
|
71
|
+
return;
|
|
72
|
+
listRef.current.scrollLeft += dir * 100;
|
|
73
|
+
} }, dir === -1 ? (React.createElement(Back, { title: "scroll tilbake" })) : (React.createElement(Next, { title: "scroll neste" }))));
|
|
74
|
+
const showSteppers = displayScroll.end || displayScroll.start;
|
|
75
|
+
return (React.createElement("div", { className: "navds-tabs__tablist-wrapper" },
|
|
76
|
+
showSteppers && (React.createElement(ScrollButton, { dir: -1, hidden: !displayScroll.start })),
|
|
77
|
+
React.createElement(TabsList, Object.assign({}, rest, { ref: mergedRef, onScroll: updateScrollButtonState, className: cl("navds-tabs__tablist", className) })),
|
|
78
|
+
showSteppers && React.createElement(ScrollButton, { dir: 1, hidden: !displayScroll.end })));
|
|
79
|
+
});
|
|
80
|
+
export default List;
|
|
81
|
+
//# sourceMappingURL=TabList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabList.js","sourceRoot":"","sources":["../../src/tabs/TabList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface PanelProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/**
|
|
4
|
+
* Tab panel
|
|
5
|
+
*/
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
/**
|
|
8
|
+
* Value for state-handling
|
|
9
|
+
*/
|
|
10
|
+
value: string;
|
|
11
|
+
}
|
|
12
|
+
export declare type PanelType = React.ForwardRefExoticComponent<PanelProps & React.RefAttributes<HTMLDivElement>>;
|
|
13
|
+
declare const Panel: PanelType;
|
|
14
|
+
export default Panel;
|
|
@@ -0,0 +1,20 @@
|
|
|
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 { TabsContent } from "@radix-ui/react-tabs";
|
|
13
|
+
import cl from "classnames";
|
|
14
|
+
import React, { forwardRef } from "react";
|
|
15
|
+
const Panel = forwardRef((_a, ref) => {
|
|
16
|
+
var { className } = _a, rest = __rest(_a, ["className"]);
|
|
17
|
+
return (React.createElement(TabsContent, Object.assign({}, rest, { ref: ref, className: cl("navds-tabs__tabpanel", className) })));
|
|
18
|
+
});
|
|
19
|
+
export default Panel;
|
|
20
|
+
//# sourceMappingURL=TabPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabPanel.js","sourceRoot":"","sources":["../../src/tabs/TabPanel.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAiB1C,MAAM,KAAK,GAAG,UAAU,CACtB,CAAC,EAAsB,EAAE,GAAG,EAAE,EAAE;QAA/B,EAAE,SAAS,OAAW,EAAN,IAAI,cAApB,aAAsB,CAAF;IAAY,OAAA,CAC/B,oBAAC,WAAW,oBACN,IAAI,IACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,SAAS,CAAC,IAChD,CACH,CAAA;CAAA,CACW,CAAC;AAEf,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React, { HTMLAttributes } from "react";
|
|
2
|
+
import { TabType } from "./Tab";
|
|
3
|
+
import { ListType } from "./TabList";
|
|
4
|
+
import { PanelType } from "./TabPanel";
|
|
5
|
+
export interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "dir"> {
|
|
6
|
+
/**
|
|
7
|
+
* Tabs elements
|
|
8
|
+
*/
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
/**
|
|
11
|
+
* Changes padding and font-size
|
|
12
|
+
* @default "medium"
|
|
13
|
+
*/
|
|
14
|
+
size?: "medium" | "small";
|
|
15
|
+
/**
|
|
16
|
+
* onChange
|
|
17
|
+
*/
|
|
18
|
+
onChange?: (value: string) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Controlled selected value
|
|
21
|
+
*/
|
|
22
|
+
value?: string;
|
|
23
|
+
/**
|
|
24
|
+
* If not controlled, a default-value needs to be set
|
|
25
|
+
*/
|
|
26
|
+
defaultValue?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Automatically activates tab on focus/navigation
|
|
29
|
+
* @default false
|
|
30
|
+
*/
|
|
31
|
+
selectionFollowsFocus?: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface TabsComponent extends React.ForwardRefExoticComponent<TabsProps & React.RefAttributes<HTMLDivElement>> {
|
|
34
|
+
Tab: TabType;
|
|
35
|
+
List: ListType;
|
|
36
|
+
Panel: PanelType;
|
|
37
|
+
}
|
|
38
|
+
interface TabsContextProps {
|
|
39
|
+
size: "medium" | "small";
|
|
40
|
+
}
|
|
41
|
+
export declare const TabsContext: React.Context<TabsContextProps | null>;
|
|
42
|
+
declare const Tabs: TabsComponent;
|
|
43
|
+
export default Tabs;
|
package/esm/tabs/Tabs.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
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, { createContext, forwardRef } from "react";
|
|
14
|
+
import * as RadixTabs from "@radix-ui/react-tabs";
|
|
15
|
+
import Tab from "./Tab";
|
|
16
|
+
import List from "./TabList";
|
|
17
|
+
import Panel from "./TabPanel";
|
|
18
|
+
export const TabsContext = createContext(null);
|
|
19
|
+
const Tabs = forwardRef((_a, ref) => {
|
|
20
|
+
var { className, children, onChange, size = "medium", selectionFollowsFocus = false } = _a, rest = __rest(_a, ["className", "children", "onChange", "size", "selectionFollowsFocus"]);
|
|
21
|
+
return (React.createElement(RadixTabs.Root, Object.assign({}, rest, { ref: ref, className: cl("navds-tabs", className, `navds-tabs--${size}`), activationMode: selectionFollowsFocus ? "automatic" : "manual", onValueChange: onChange }),
|
|
22
|
+
React.createElement(TabsContext.Provider, { value: {
|
|
23
|
+
size,
|
|
24
|
+
} }, children)));
|
|
25
|
+
});
|
|
26
|
+
Tabs.Tab = Tab;
|
|
27
|
+
Tabs.List = List;
|
|
28
|
+
Tabs.Panel = Panel;
|
|
29
|
+
export default Tabs;
|
|
30
|
+
//# sourceMappingURL=Tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../src/tabs/Tabs.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,GAAgB,MAAM,OAAO,CAAC;AACrC,OAAO,IAAkB,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAoB,MAAM,YAAY,CAAC;AA6C9C,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAExE,MAAM,IAAI,GAAG,UAAU,CACrB,CACE,EAOC,EACD,GAAG,EACH,EAAE;QATF,EACE,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,IAAI,GAAG,QAAQ,EACf,qBAAqB,GAAG,KAAK,OAE9B,EADI,IAAI,cANT,sEAOC,CADQ;IAIT,OAAO,CACL,oBAAC,SAAS,CAAC,IAAI,oBACT,IAAI,IACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,eAAe,IAAI,EAAE,CAAC,EAC7D,cAAc,EAAE,qBAAqB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAC9D,aAAa,EAAE,QAAQ;QAEvB,oBAAC,WAAW,CAAC,QAAQ,IACnB,KAAK,EAAE;gBACL,IAAI;aACL,IAEA,QAAQ,CACY,CACR,CAClB,CAAC;AACJ,CAAC,CACe,CAAC;AAEnB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AAEnB,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAa,MAAM,QAAQ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@navikt/ds-react",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.14",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "NAV designsystem react components",
|
|
6
6
|
"author": "NAV Designsystem team",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"@material-ui/core": "^4.12.3",
|
|
38
38
|
"@navikt/ds-icons": "^0.8.6",
|
|
39
39
|
"@popperjs/core": "^2.10.1",
|
|
40
|
+
"@radix-ui/react-tabs": "0.1.5",
|
|
40
41
|
"@radix-ui/react-toggle-group": "0.1.5",
|
|
41
42
|
"classnames": "^2.2.6",
|
|
42
43
|
"react-collapse": "^5.1.0",
|
|
@@ -67,5 +68,5 @@
|
|
|
67
68
|
"@types/react": "^17.0.30",
|
|
68
69
|
"react": "^17.0.0"
|
|
69
70
|
},
|
|
70
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "88e2c2b2fee9701bf1cb370538c22c84e448d62a"
|
|
71
72
|
}
|
package/src/form/Select.tsx
CHANGED
package/src/index.ts
CHANGED
|
@@ -16,9 +16,11 @@ export * from "./popover";
|
|
|
16
16
|
export * from "./read-more";
|
|
17
17
|
export * from "./speech-bubble";
|
|
18
18
|
export * from "./step-indicator";
|
|
19
|
+
export * from "./stepper";
|
|
19
20
|
export * from "./tag";
|
|
20
21
|
export * from "./toggle-group";
|
|
21
22
|
export * from "./table";
|
|
23
|
+
export * from "./tabs";
|
|
22
24
|
export * from "./typography";
|
|
23
25
|
export * from "./util";
|
|
24
26
|
|
|
@@ -28,7 +28,7 @@ Du må nå selv styre state med `activeStep` og `onStepChange`.
|
|
|
28
28
|
|
|
29
29
|
## responsive
|
|
30
30
|
|
|
31
|
-
Bruk `responsive`-prop for å skjule labels med en gang StepIndicator begynner å
|
|
31
|
+
Bruk `responsive`-prop for å skjule labels med en gang StepIndicator begynner å overflowe.
|
|
32
32
|
|
|
33
33
|
```jsx
|
|
34
34
|
<StepIndicator
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import cl from "classnames";
|
|
2
|
+
import React, { forwardRef, useContext } from "react";
|
|
3
|
+
import { StepperContext } from ".";
|
|
4
|
+
import { Label, OverridableComponent } from "..";
|
|
5
|
+
|
|
6
|
+
export interface StepperStepProps
|
|
7
|
+
extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
8
|
+
/**
|
|
9
|
+
* Text content under indicator
|
|
10
|
+
*/
|
|
11
|
+
children: string;
|
|
12
|
+
/**
|
|
13
|
+
* Handled by Stepper
|
|
14
|
+
*/
|
|
15
|
+
index?: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface StepperStepType
|
|
19
|
+
extends OverridableComponent<StepperStepProps, HTMLAnchorElement> {}
|
|
20
|
+
|
|
21
|
+
const StepComponent: OverridableComponent<
|
|
22
|
+
StepperStepProps,
|
|
23
|
+
HTMLAnchorElement
|
|
24
|
+
> = forwardRef(
|
|
25
|
+
({ className, children, as: Component = "a", index = 0, ...rest }, ref) => {
|
|
26
|
+
const context = useContext(StepperContext);
|
|
27
|
+
if (context === null) {
|
|
28
|
+
console.error(
|
|
29
|
+
"<StepIndicator.Step> has to be used within an <StepIndicator>"
|
|
30
|
+
);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const activeStep = context.activeStep === index;
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<Component
|
|
37
|
+
{...rest}
|
|
38
|
+
aria-current={Boolean(activeStep)}
|
|
39
|
+
ref={ref}
|
|
40
|
+
className={cl("navds-stepper__step", className, {
|
|
41
|
+
"navds-stepper__step--active": activeStep,
|
|
42
|
+
})}
|
|
43
|
+
onClick={(e) => {
|
|
44
|
+
context.onStepChange(index);
|
|
45
|
+
rest?.onClick?.(e);
|
|
46
|
+
}}
|
|
47
|
+
>
|
|
48
|
+
<Label className="navds-stepper__step-number" as="span">
|
|
49
|
+
{activeStep ? `${index + 1}` : index + 1}
|
|
50
|
+
</Label>
|
|
51
|
+
<Label className="navds-stepper__step-label">{children}</Label>
|
|
52
|
+
</Component>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const Step = StepComponent as StepperStepType;
|
|
58
|
+
|
|
59
|
+
export default Step;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import React, { createContext, forwardRef } from "react";
|
|
2
|
+
import cl from "classnames";
|
|
3
|
+
import Step, { StepperStepProps, StepperStepType } from "./Step";
|
|
4
|
+
|
|
5
|
+
export interface StepperProps extends React.HTMLAttributes<HTMLOListElement> {
|
|
6
|
+
/**
|
|
7
|
+
* <Stepper.Step /> elements
|
|
8
|
+
*/
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
/**
|
|
11
|
+
* Adds classname to wrapper
|
|
12
|
+
*/
|
|
13
|
+
className?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Current active step index
|
|
16
|
+
*/
|
|
17
|
+
activeStep: number;
|
|
18
|
+
/**
|
|
19
|
+
* Callback for clicked step index
|
|
20
|
+
*/
|
|
21
|
+
onStepChange?: (step: number) => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface StepperComponent
|
|
25
|
+
extends React.ForwardRefExoticComponent<
|
|
26
|
+
StepperProps & React.RefAttributes<HTMLOListElement>
|
|
27
|
+
> {
|
|
28
|
+
Step: StepperStepType;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface StepperContextProps {
|
|
32
|
+
activeStep: number;
|
|
33
|
+
onStepChange: (step: number) => void;
|
|
34
|
+
lastIndex: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const StepperContext = createContext<StepperContextProps | null>(null);
|
|
38
|
+
|
|
39
|
+
const Stepper: StepperComponent = forwardRef<HTMLOListElement, StepperProps>(
|
|
40
|
+
(
|
|
41
|
+
{ children, className, activeStep, onStepChange = () => {}, ...rest },
|
|
42
|
+
ref
|
|
43
|
+
) => {
|
|
44
|
+
return (
|
|
45
|
+
<ol {...rest} ref={ref} className={cl("navds-stepper", className)}>
|
|
46
|
+
<StepperContext.Provider
|
|
47
|
+
value={{
|
|
48
|
+
activeStep,
|
|
49
|
+
onStepChange,
|
|
50
|
+
lastIndex: React.Children.count(children),
|
|
51
|
+
}}
|
|
52
|
+
>
|
|
53
|
+
{React.Children.map(children, (step, index) => {
|
|
54
|
+
return (
|
|
55
|
+
<li
|
|
56
|
+
className={cl("navds-stepper__step-wrapper")}
|
|
57
|
+
key={index + (children?.toString?.() ?? "")}
|
|
58
|
+
>
|
|
59
|
+
{React.isValidElement<StepperStepProps>(step)
|
|
60
|
+
? React.cloneElement(step, { ...step.props, index })
|
|
61
|
+
: step}
|
|
62
|
+
</li>
|
|
63
|
+
);
|
|
64
|
+
})}
|
|
65
|
+
</StepperContext.Provider>
|
|
66
|
+
</ol>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
) as StepperComponent;
|
|
70
|
+
|
|
71
|
+
Stepper.Step = Step;
|
|
72
|
+
|
|
73
|
+
export default Stepper;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Stepper } from "..";
|
|
3
|
+
|
|
4
|
+
export const Example = (props) => {
|
|
5
|
+
const [activeStep, setActiveStep] = useState(
|
|
6
|
+
props.initialStep ? props.initialStep : 1
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
const anchorProps = {
|
|
10
|
+
href: "",
|
|
11
|
+
onClick: (e) => e.preventDefault(),
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<Stepper {...props} activeStep={activeStep} onStepChange={setActiveStep}>
|
|
16
|
+
<Stepper.Step {...anchorProps}>Start</Stepper.Step>
|
|
17
|
+
<Stepper.Step {...anchorProps}>
|
|
18
|
+
Sunt deserunt qui sit sunt culpa nisi
|
|
19
|
+
</Stepper.Step>
|
|
20
|
+
<Stepper.Step {...anchorProps}>
|
|
21
|
+
Nulla nisi pariatur nulla cupidatat elit.
|
|
22
|
+
</Stepper.Step>
|
|
23
|
+
<Stepper.Step {...anchorProps}>
|
|
24
|
+
Nulla laborum proident consequat laborum elit et dolore ut sunt.
|
|
25
|
+
</Stepper.Step>
|
|
26
|
+
</Stepper>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Meta, Canvas } from "@storybook/addon-docs";
|
|
2
|
+
import { Stepper } from "..";
|
|
3
|
+
import { Example } from "./Example";
|
|
4
|
+
|
|
5
|
+
<Meta title="ds-react/stepper/intro" />
|
|
6
|
+
|
|
7
|
+
# Hvordan ta i bruk Stepper
|
|
8
|
+
|
|
9
|
+
Stepper er det vertikale søskenet til step-indicator/stegindikator.
|
|
10
|
+
Du må nå selv styre state med `activeStep` og `onStepChange`.
|
|
11
|
+
|
|
12
|
+
## Eksempel
|
|
13
|
+
|
|
14
|
+
```jsx
|
|
15
|
+
<Stepper activeStep={activeStep} onStepChange={(x) => setActiveStep(x)}>
|
|
16
|
+
<Stepper.Step href="" onClick={(e) => e.preventDefault()}>
|
|
17
|
+
Start
|
|
18
|
+
</Stepper.Step>
|
|
19
|
+
<Stepper.Step href="" onClick={(e) => e.preventDefault()}>
|
|
20
|
+
Sunt deserunt qui sit sunt culpa nisi
|
|
21
|
+
</Stepper.Step>
|
|
22
|
+
<Stepper.Step href="" onClick={(e) => e.preventDefault()}>
|
|
23
|
+
Nulla nisi pariatur nulla cupidatat elit.
|
|
24
|
+
</Stepper.Step>
|
|
25
|
+
<Stepper.Step href="" onClick={(e) => e.preventDefault()}>
|
|
26
|
+
Nulla laborum proident consequat laborum elit et dolore ut sunt.
|
|
27
|
+
</Stepper.Step>
|
|
28
|
+
</Stepper>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
<Canvas>
|
|
32
|
+
<Example />
|
|
33
|
+
</Canvas>
|
|
34
|
+
|
|
35
|
+
## Override tags
|
|
36
|
+
|
|
37
|
+
`Stepper.Step` er implementert med Overridable-component noe som gjør at du kan endre taggen til
|
|
38
|
+
det du vil med `as`-prop. Merk at Step åakkes inn i en `<li>`-wrapper for tilgjengelighet.
|
|
39
|
+
|
|
40
|
+
```jsx
|
|
41
|
+
<Stepper activeStep={activeStep} onStepChange={(x) => setActiveStep(x)}>
|
|
42
|
+
{/* <button> er default */}
|
|
43
|
+
<Stepper.Step
|
|
44
|
+
href=""
|
|
45
|
+
onClick={(e) => e.preventDefault()}
|
|
46
|
+
>{`Dette er default, et <a>-element`}</Stepper.Step>
|
|
47
|
+
<Stepper.Step as="button">{`Dette er et <button>-element`}</Stepper.Step>
|
|
48
|
+
<Stepper.Step as="span">{`Dette er et <span>-element`}</Stepper.Step>
|
|
49
|
+
</Stepper>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
<Canvas>
|
|
53
|
+
<Stepper activeStep={1} onStepChange={console.log}>
|
|
54
|
+
<Stepper.Step
|
|
55
|
+
href=""
|
|
56
|
+
onClick={(e) => e.preventDefault()}
|
|
57
|
+
>{`Dette er default, et <a>-element`}</Stepper.Step>
|
|
58
|
+
<Stepper.Step as="button">{`Dette er et <button>-element`}</Stepper.Step>
|
|
59
|
+
<Stepper.Step as="span">{`Dette er et <span>-element`}</Stepper.Step>
|
|
60
|
+
</Stepper>
|
|
61
|
+
</Canvas>
|