Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ead0378644 | ||
|
|
10a6bc18c4 | ||
|
|
68d4b60f0e | ||
|
|
106e37bc54 | ||
|
|
78080293d3 | ||
|
|
d511210582 | ||
|
|
78b103bb3e | ||
|
|
9c78338164 | ||
|
|
08c9069879 | ||
|
|
3ab1645994 | ||
|
|
a64fc8905d | ||
|
|
5d83818c1b | ||
|
|
1148825a99 | ||
|
|
778b1a4932 | ||
|
|
74b77c0bba | ||
|
|
5fc4ea483d | ||
|
|
d002c03647 | ||
|
|
da1ffe8318 | ||
|
|
0128f5a467 | ||
|
|
0a61ab629a | ||
|
|
4ea5face0c | ||
|
|
248a83221a | ||
|
|
eceaa7e659 | ||
|
|
811c0024c5 | ||
|
|
aaefaddb13 | ||
|
|
f464347f6e | ||
|
|
6608d01c1e | ||
|
|
335bc62922 | ||
|
|
3c230d8f4c | ||
|
|
5bb7de3b4c | ||
|
|
9597c24328 | ||
|
|
2642c2914e | ||
|
|
74d0b0cf1f | ||
|
|
55ca4d26a7 | ||
|
|
474ea81bbd | ||
|
|
ae8ee87897 | ||
|
|
ecf96dac16 | ||
|
|
982e1dce2c | ||
|
|
f910ca1c15 | ||
|
|
1c161d1403 | ||
|
|
279c89195e | ||
|
|
260085f026 | ||
|
|
c70a3a78e8 | ||
|
|
236feb37e8 | ||
|
|
29ea9f4cb3 | ||
|
|
ebb04c4a56 | ||
|
|
438c844221 | ||
|
|
656de64a4d | ||
|
|
777f3ec95b | ||
|
|
adebf90f68 | ||
|
|
77fc400688 | ||
|
|
004dfb90f1 | ||
|
|
327c92131b | ||
|
|
6b1f395df8 | ||
|
|
381adf6cb1 | ||
|
|
47ef162268 |
No files matched your search
@@ -1,10 +1,16 @@
|
||||
const getStories = () => {
|
||||
return process.env.stories
|
||||
? [`../@navikt/**/${process.env.stories}.stories.@(js|jsx|ts|tsx|mdx)`]
|
||||
: ["../@navikt/**/*.stories.@(js|jsx|ts|tsx|mdx)"];
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
webpackFinal: async (config, { configType }) => {
|
||||
config.devServer = { stats: "errors-only" };
|
||||
return config;
|
||||
},
|
||||
devServer: { stats: "errors-only" },
|
||||
stories: ["../@navikt/**/*.stories.@(js|jsx|ts|tsx|mdx)"],
|
||||
stories: () => getStories(),
|
||||
addons: [
|
||||
"@storybook/addon-docs",
|
||||
"@storybook/addon-a11y",
|
||||
@@ -24,4 +30,7 @@ module.exports = {
|
||||
},
|
||||
},
|
||||
],
|
||||
core: {
|
||||
builder: "webpack5",
|
||||
},
|
||||
};
|
||||
@@ -1,105 +0,0 @@
|
||||
:root {
|
||||
--navds-accordion-menu-color-text: var(--navds-semantic-color-link);
|
||||
--navds-accordion-menu-color-text-focus: var(--navds-semantic-color-text);
|
||||
--navds-accordion-menu-color-background-hover: var(
|
||||
--navds-global-color-blue-50
|
||||
);
|
||||
--navds-accordion-menu-color-text-active: var(--navds-semantic-color-text);
|
||||
--navds-accordion-menu-outline-focus: var(--navds-semantic-color-focus);
|
||||
}
|
||||
|
||||
.navds-accordion-menu__list {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-weight: var(--navds-font-weight-bold);
|
||||
}
|
||||
|
||||
.navds-accordion-menu-collapsable__button {
|
||||
cursor: pointer;
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
font: inherit;
|
||||
text-align: inherit;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-weight: var(--navds-font-weight-bold);
|
||||
color: var(--navds-accordion-menu-color-text);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.navds-accordion-menu-item,
|
||||
.navds-accordion-menu-collapsable__button {
|
||||
display: flex;
|
||||
padding: var(--navds-spacing-3) var(--navds-spacing-4);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.navds-accordion-menu-collapsable__expand-icon {
|
||||
font-size: 1.5rem;
|
||||
color: var(--navds-accordion-menu-color);
|
||||
flex-shrink: 0;
|
||||
margin-left: var(--navds-spacing-2);
|
||||
}
|
||||
|
||||
.navds-accordion-menu-collapsable--open
|
||||
> .navds-accordion-menu-collapsable__button
|
||||
> .navds-accordion-menu-collapsable__expand-icon {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.navds-accordion-menu-collapsable .navds-accordion-menu-item,
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable__button {
|
||||
padding-left: var(--navds-spacing-8);
|
||||
}
|
||||
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-item,
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable__button {
|
||||
padding-left: var(--navds-spacing-12);
|
||||
}
|
||||
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-item,
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable
|
||||
.navds-accordion-menu-collapsable__button {
|
||||
padding-left: var(--navds-spacing-16);
|
||||
}
|
||||
|
||||
.navds-accordion-menu-item:focus,
|
||||
.navds-accordion-menu-collapsable__button:focus {
|
||||
outline: 3px solid var(--navds-accordion-menu-outline-focus);
|
||||
outline-offset: -3px;
|
||||
color: var(--navds-accordion-menu-color-text-focus);
|
||||
}
|
||||
|
||||
.navds-accordion-menu-collapsable__button:focus
|
||||
> .navds-accordion-menu-collapsable__expand-icon {
|
||||
color: var(--navds-accordion-menu-color-focus);
|
||||
}
|
||||
|
||||
.navds-accordion-menu-item:hover,
|
||||
.navds-accordion-menu-collapsable__button:hover {
|
||||
background-color: var(--navds-accordion-menu-color-background-hover);
|
||||
}
|
||||
|
||||
.navds-accordion-menu-item--active {
|
||||
box-shadow: inset 0.5rem 0 var(--navds-semantic-color-link);
|
||||
color: var(--navds-accordion-menu-color-text-active);
|
||||
text-decoration: none;
|
||||
}
|
||||
@@ -4,11 +4,16 @@
|
||||
---navds-semantic-color-component-background-light
|
||||
);
|
||||
--navds-accordion-color-text-hover: var(--navds-semantic-color-link);
|
||||
--navds-accordion-color-border: var(--navds-semantic-color-border-muted);
|
||||
--navds-accordion-color-border-hover: var(
|
||||
--navds-semantic-color-interaction-primary
|
||||
);
|
||||
--navds-accordion-color-border-focus: var(
|
||||
---navds-semantic-color-component-background-light
|
||||
--navds-accordion-color-text-open: var(--navds-semantic-color-text);
|
||||
--navds-accordion-color-text-open-hover: var(
|
||||
--navds-semantic-color-interaction-primary
|
||||
);
|
||||
--navds-accordion-color-background-open: var(
|
||||
--navds-semantic-color-interaction-primary-hover-subtle
|
||||
);
|
||||
}
|
||||
|
||||
@@ -20,16 +25,53 @@
|
||||
background: var(--navds-accordion-color-background);
|
||||
}
|
||||
|
||||
.navds-accordion__header {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: var(--navds-spacing-4);
|
||||
padding: var(--navds-spacing-4) var(--navds-spacing-3);
|
||||
margin: 0;
|
||||
text-align: left;
|
||||
background: transparent;
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
border-bottom: 2px solid var(--navds-accordion-color-border);
|
||||
}
|
||||
|
||||
.navds-accordion__header:focus {
|
||||
outline: none;
|
||||
box-shadow: var(--navds-shadow-focus);
|
||||
border-color: var(--navds-accordion-color-border-focus);
|
||||
}
|
||||
|
||||
.navds-accordion__header:hover {
|
||||
color: var(--navds-accordion-color-text-hover);
|
||||
border-color: var(--navds-accordion-color-border-hover);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.navds-accordion__item--open > .navds-accordion__header {
|
||||
background-color: var(--navds-accordion-color-background-open);
|
||||
color: var(--navds-accordion-color-text-open);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.navds-accordion__item--open > .navds-accordion__header:hover {
|
||||
border-color: transparent;
|
||||
color: var(--navds-accordion-color-text-open-hover);
|
||||
}
|
||||
|
||||
.navds-accordion__content {
|
||||
color: var(--navds-accordion-color-text);
|
||||
padding: var(--navds-spacing-5) var(--navds-spacing-3) var(--navds-spacing-10);
|
||||
border-bottom: 2px solid var(--navds-accordion-color-border);
|
||||
}
|
||||
|
||||
.navds-accordion__item--open
|
||||
> .navds-accordion__header:hover
|
||||
+ *
|
||||
.navds-accordion__content {
|
||||
border-color: var(--navds-accordion-color-border-hover);
|
||||
}
|
||||
|
||||
.navds-accordion__expand-icon {
|
||||
@@ -42,26 +84,6 @@
|
||||
transform: rotateZ(180deg);
|
||||
}
|
||||
|
||||
.navds-accordion__header {
|
||||
padding: var(--navds-spacing-4) var(--navds-spacing-3);
|
||||
background: transparent;
|
||||
text-align: left;
|
||||
border: none;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
border-bottom: 2px solid #a0a0a0;
|
||||
gap: var(--navds-spacing-4);
|
||||
}
|
||||
|
||||
.navds-accordion__content {
|
||||
color: var(--navds-accordion-color-text);
|
||||
padding: var(--navds-spacing-5) var(--navds-spacing-3) var(--navds-spacing-10);
|
||||
}
|
||||
|
||||
.navds-accordion__expand-icon--filled {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -74,6 +74,10 @@
|
||||
--navds-button-color-danger-border-focus: var(
|
||||
--navds-semantic-color-component-background-light
|
||||
);
|
||||
|
||||
/* Loader */
|
||||
--navds-loader-color-on-button-background: rgba(255, 255, 255, 0.3);
|
||||
--navds-loader-color-on-button-foreground: currentColor;
|
||||
}
|
||||
|
||||
.navds-button {
|
||||
@@ -255,7 +259,18 @@
|
||||
**************************/
|
||||
|
||||
.navds-button:disabled {
|
||||
opacity: 0.3;
|
||||
cursor: not-allowed;
|
||||
transform: none;
|
||||
}
|
||||
|
||||
.navds-button:disabled:not(.navds-button--loading) {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.navds-button .navds-loader .navds-loader__foreground {
|
||||
stroke: var(--navds-loader-color-on-button-foreground);
|
||||
}
|
||||
|
||||
.navds-button--primary .navds-loader .navds-loader__background,
|
||||
.navds-button--danger .navds-loader .navds-loader__background {
|
||||
stroke: var(--navds-loader-color-on-button-background);
|
||||
}
|
||||
@@ -14,7 +14,7 @@
|
||||
}
|
||||
|
||||
/* Applied when hideLegend is applied to fieldset */
|
||||
.navds-fieldset > .sr-only + :not(:first-child):not(:empty) {
|
||||
.navds-fieldset > .navds-sr-only + :not(:first-child):not(:empty) {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
}
|
||||
|
||||
/* Applied when hideLabel is applied to form-element */
|
||||
.navds-form-field > .sr-only + :not(:first-child):not(:empty),
|
||||
.navds-form-field > .sr-only + input:not(:first-child) {
|
||||
.navds-form-field > .navds-sr-only + :not(:first-child):not(:empty),
|
||||
.navds-form-field > .navds-sr-only + input:not(:first-child) {
|
||||
margin-top: 0;
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
:root {
|
||||
--navds-radio-checkbox-color-background: var(
|
||||
--navds-semantic-color-canvas-background-light
|
||||
--navds-semantic-color-component-background-light
|
||||
);
|
||||
--navds-radio-checkbox-color-text: var(--navds-semantic-color-text);
|
||||
--navds-radio-checkbox-color-background-hover: var(
|
||||
--navds-semantic-color-interaction-primary-hover-subtle
|
||||
);
|
||||
@@ -73,7 +74,7 @@
|
||||
|
||||
.navds-checkbox__description,
|
||||
.navds-radio__description {
|
||||
color: var(--navds-color-text-primary);
|
||||
color: var(--navds-radio-checkbox-color-text);
|
||||
}
|
||||
|
||||
.navds-checkbox--small > .navds-checkbox__input,
|
||||
@@ -107,6 +108,29 @@
|
||||
var(--navds-shadow-focus);
|
||||
}
|
||||
|
||||
.navds-checkbox__input:indeterminate + .navds-checkbox__label::before {
|
||||
box-shadow: none;
|
||||
background-color: var(--navds-radio-checkbox-color-background-checked);
|
||||
}
|
||||
|
||||
.navds-checkbox__input:indeterminate + .navds-checkbox__label::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translate(0.375rem, -50%);
|
||||
background-color: var(--navds-radio-checkbox-color-background);
|
||||
width: 0.75rem;
|
||||
height: 0.25rem;
|
||||
border-radius: 1px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.navds-checkbox--small
|
||||
.navds-checkbox__input:indeterminate
|
||||
+ .navds-checkbox__label::after {
|
||||
transform: translate(0.25rem, -50%);
|
||||
}
|
||||
|
||||
.navds-checkbox__input:checked + .navds-checkbox__label::before {
|
||||
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMyAxMCI+ICAgIDxnPiAgICA8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNNCwxMGMtMC40LDAtMC44LTAuMS0xLjEtMC40TDAuNCw3LjFDMC4xLDYuOCwwLDYuNCwwLDZzMC4yLTAuOCwwLjUtMS4xQzEsNC40LDIsNC40LDIuNSw0LjlMNCw2LjRsNi40LTYgICAgQzEwLjgsMC4xLDExLjEsMCwxMS41LDBjMC40LDAsMC44LDAuMiwxLDAuNWMwLjYsMC42LDAuNSwxLjYtMC4xLDIuMXYwTDUsOS42QzQuNyw5LjksNC40LDEwLDQsMTB6IE0xMS44LDEuOUwxMS44LDEuOSAgICBDMTEuOCwxLjksMTEuOCwxLjksMTEuOCwxLjl6IE0xMS4yLDEuMUMxMS4yLDEuMSwxMS4yLDEuMSwxMS4yLDEuMUwxMS4yLDEuMXoiLz4gICAgPC9nPjwvc3ZnPg==);
|
||||
background-position: 6px center;
|
||||
@@ -121,7 +145,7 @@
|
||||
+ .navds-checkbox__label::before {
|
||||
background-position: 4px center;
|
||||
}
|
||||
|
||||
.navds-checkbox__input:indeterminate:focus + .navds-checkbox__label::before,
|
||||
.navds-checkbox__input:checked:focus + .navds-checkbox__label::before {
|
||||
box-shadow: inset 0 0 0 1px white, var(--navds-shadow-focus);
|
||||
}
|
||||
@@ -142,28 +166,28 @@
|
||||
color: var(--navds-radio-checkbox-color-label-hover);
|
||||
}
|
||||
|
||||
.navds-checkbox__input:hover:not(:disabled):not(:checked):not(:focus)
|
||||
.navds-checkbox__input:hover:not(:disabled):not(:checked):not(:indeterminate):not(:focus)
|
||||
+ .navds-checkbox__label::before,
|
||||
.navds-radio__input:hover:not(:disabled):not(:checked):not(:focus)
|
||||
.navds-radio__input:hover:not(:disabled):not(:checked):not(:indeterminate):not(:focus)
|
||||
+ .navds-radio__label::before {
|
||||
box-shadow: inset 0 0 0 2px var(--navds-radio-checkbox-color-shadow-hover);
|
||||
background-color: var(--navds-radio-checkbox-color-background-hover);
|
||||
}
|
||||
|
||||
.navds-checkbox--error
|
||||
> .navds-checkbox__input:not(:hover):not(:disabled):not(:checked)
|
||||
> .navds-checkbox__input:not(:hover):not(:disabled):not(:checked):not(:indeterminate)
|
||||
+ .navds-checkbox__label::before,
|
||||
.navds-radio--error
|
||||
> .navds-radio__input:not(:hover):not(:disabled):not(:checked)
|
||||
> .navds-radio__input:not(:hover):not(:disabled):not(:checked):not(:indeterminate)
|
||||
+ .navds-radio__label::before {
|
||||
box-shadow: inset 0 0 0 2px var(--navds-radio-checkbox-color-shadow-error);
|
||||
}
|
||||
|
||||
.navds-checkbox--error
|
||||
> .navds-checkbox__input:focus:not(:hover):not(:disabled):not(:checked)
|
||||
> .navds-checkbox__input:focus:not(:hover):not(:disabled):not(:checked):not(:indeterminate)
|
||||
+ .navds-checkbox__label::before,
|
||||
.navds-radio--error
|
||||
> .navds-radio__input:focus:not(:hover):not(:disabled):not(:checked)
|
||||
> .navds-radio__input:focus:not(:hover):not(:disabled):not(:checked):not(:indeterminate)
|
||||
+ .navds-radio__label::before {
|
||||
box-shadow: inset 0 0 0 2px var(--navds-radio-checkbox-color-shadow-error),
|
||||
var(--navds-shadow-focus);
|
||||
|
||||
@@ -210,7 +210,7 @@
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
.navds-switch--disabled {
|
||||
.navds-switch--disabled:not(.navds-switch--loading) {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
padding: 0.5rem;
|
||||
background-color: var(--navds-text-field-color-background);
|
||||
border-radius: 4px;
|
||||
border: 2px solid var(--navds-text-field-color-border);
|
||||
border: 1px solid var(--navds-text-field-color-border);
|
||||
min-height: 48px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.navds-form-field--small > .navds-text-field__input {
|
||||
padding: 0 0.15rem;
|
||||
padding: 0 0.25rem;
|
||||
min-height: 32px;
|
||||
}
|
||||
|
||||
@@ -52,6 +52,13 @@
|
||||
*/
|
||||
.navds-text-field--error > .navds-text-field__input:not(:hover):not(:disabled) {
|
||||
border-color: var(--navds-text-field-color-border-error);
|
||||
box-shadow: 0 0 0 1px var(--navds-text-field-color-border-error);
|
||||
}
|
||||
|
||||
.navds-text-field--error
|
||||
> .navds-text-field__input:focus:not(:hover):not(:disabled) {
|
||||
box-shadow: 0 0 0 1px var(--navds-text-field-color-border-error),
|
||||
var(--navds-shadow-focus);
|
||||
}
|
||||
|
||||
/* Disabled handling */
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
@import "grid.css";
|
||||
|
||||
@import "accordion.css";
|
||||
@import "accordion-menu.css";
|
||||
@import "alert.css";
|
||||
@import "button.css";
|
||||
@import "content-container.css";
|
||||
@@ -12,6 +11,7 @@
|
||||
@import "help-text.css";
|
||||
@import "link.css";
|
||||
@import "loader.css";
|
||||
@import "menu.css";
|
||||
@import "modal.css";
|
||||
@import "popover.css";
|
||||
@import "tag.css";
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
);
|
||||
--navds-loader-color-inverted-background: rgba(255, 255, 255, 0.3);
|
||||
--navds-loader-color-transparent-background: transparent;
|
||||
--navds-loader-color-on-button-background: rgba(255, 255, 255, 0.3);
|
||||
--navds-loader-color-on-button-foreground: currentColor;
|
||||
}
|
||||
|
||||
.navds-loader {
|
||||
@@ -78,27 +76,6 @@
|
||||
width: 1rem;
|
||||
}
|
||||
|
||||
/*
|
||||
* Button spesific styling
|
||||
*/
|
||||
|
||||
.navds-button .navds-loader .navds-loader__foreground {
|
||||
stroke: var(--navds-loader-color-on-button-foreground);
|
||||
}
|
||||
|
||||
.navds-button:hover .navds-loader .navds-loader__background {
|
||||
stroke: var(--navds-loader-color-on-button-background);
|
||||
}
|
||||
|
||||
.navds-button:active .navds-loader .navds-loader__background {
|
||||
stroke: var(--navds-loader-color-on-button-background);
|
||||
}
|
||||
|
||||
.navds-button--primary .navds-loader .navds-loader__background,
|
||||
.navds-button--danger .navds-loader .navds-loader__background {
|
||||
stroke: var(--navds-loader-color-on-button-background);
|
||||
}
|
||||
|
||||
@keyframes loader-rotate {
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
:root {
|
||||
--navds-menu-color-text: var(--navds-semantic-color-link);
|
||||
--navds-menu-color-text-hover: var(--navds-semantic-color-text);
|
||||
--navds-menu-color-text-focus: var(--navds-semantic-color-text);
|
||||
--navds-menu-color-background-hover: var(--navds-global-color-blue-50);
|
||||
--navds-menu-color-text-active: var(--navds-semantic-color-text);
|
||||
--navds-menu-outline-focus: var(--navds-semantic-color-focus);
|
||||
}
|
||||
|
||||
.navds-menu__list {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
padding: 0 0.5rem;
|
||||
}
|
||||
|
||||
.navds-menu__list--inner {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.navds-menu-collapse__button {
|
||||
cursor: pointer;
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
font: inherit;
|
||||
text-align: inherit;
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-weight: var(--navds-font-weight-bold);
|
||||
color: var(--navds-menu-color-text);
|
||||
}
|
||||
|
||||
.navds-menu-item,
|
||||
.navds-menu-collapse__button {
|
||||
font-weight: var(--navds-font-weight-bold);
|
||||
display: flex;
|
||||
padding: var(--navds-spacing-3) var(--navds-spacing-2);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.navds-menu-item:focus,
|
||||
.navds-menu-collapse__button:focus {
|
||||
outline: 3px solid var(--navds-menu-outline-focus);
|
||||
outline-offset: -3px;
|
||||
color: var(--navds-menu-color-text-focus);
|
||||
}
|
||||
|
||||
.navds-menu-collapse__button:focus > .navds-menu-collapse__expand-icon {
|
||||
color: var(--navds-menu-color-focus);
|
||||
}
|
||||
|
||||
.navds-menu-item:hover,
|
||||
.navds-menu-collapse__button:hover {
|
||||
background-color: var(--navds-menu-color-background-hover);
|
||||
color: var(--navds-menu-color-text-hover);
|
||||
}
|
||||
|
||||
.navds-menu-item--active {
|
||||
box-shadow: -0.5rem 0 var(--navds-semantic-color-link);
|
||||
color: var(--navds-menu-color-text-active);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Collapse icon */
|
||||
.navds-menu-collapse__expand-icon {
|
||||
font-size: 1.5rem;
|
||||
flex-shrink: 0;
|
||||
margin-left: var(--navds-spacing-2);
|
||||
}
|
||||
|
||||
.navds-menu-collapse__expand-icon--filled,
|
||||
.navds-menu-collapse__button:hover > .navds-menu-collapse__expand-icon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.navds-menu-collapse__button:hover > .navds-menu-collapse__expand-icon--filled {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.navds-menu-collapse--open
|
||||
> .navds-menu-collapse__button
|
||||
> .navds-menu-collapse__expand-icon {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
/* Nesting levels */
|
||||
.navds-menu__list[data-depth="1"] .navds-menu-collapse__button,
|
||||
.navds-menu__list[data-depth="1"] .navds-menu-item {
|
||||
padding-left: var(--navds-spacing-6);
|
||||
}
|
||||
|
||||
.navds-menu__list[data-depth="2"] .navds-menu-collapse__button,
|
||||
.navds-menu__list[data-depth="2"] .navds-menu-item {
|
||||
padding-left: var(--navds-spacing-10);
|
||||
}
|
||||
|
||||
.navds-menu__list[data-depth="3"] .navds-menu-collapse__button,
|
||||
.navds-menu__list[data-depth="3"] .navds-menu-item {
|
||||
padding-left: var(--navds-spacing-14);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-css",
|
||||
"version": "0.12.9",
|
||||
"version": "0.15.2",
|
||||
"private": false,
|
||||
"description": "Css for NAV Designsystem components",
|
||||
"author": "NAV Designsystem team",
|
||||
@@ -21,7 +21,7 @@
|
||||
"watch": "postcss --watch --use postcss-import -o dist/index.css index.css"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@navikt/ds-tokens": "^0.7.1",
|
||||
"@navikt/ds-tokens": "^0.8.1",
|
||||
"normalize.css": "^8.0.1",
|
||||
"postcss": "^8.3.6",
|
||||
"postcss-cli": "^8.3.1",
|
||||
|
||||
@@ -4,34 +4,47 @@
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.navds-heading--2xlarge {
|
||||
.navds-heading--xlarge {
|
||||
font-size: var(--navds-font-size-heading-2xlarge);
|
||||
letter-spacing: -0.01em;
|
||||
line-height: var(--navds-font-line-height-heading-2xlarge);
|
||||
}
|
||||
|
||||
.navds-heading--2xlarge.navds-typo--spacing {
|
||||
.navds-heading--xlarge.navds-typo--spacing {
|
||||
margin-bottom: var(--navds-spacing-5);
|
||||
}
|
||||
|
||||
.navds-heading--xlarge {
|
||||
.navds-heading--large {
|
||||
font-size: var(--navds-font-size-heading-xlarge);
|
||||
letter-spacing: -0.008em;
|
||||
line-height: var(--navds-font-line-height-heading-xlarge);
|
||||
}
|
||||
|
||||
.navds-heading--xlarge.navds-typo--spacing {
|
||||
.navds-heading--large.navds-typo--spacing {
|
||||
margin-bottom: var(--navds-spacing-4);
|
||||
}
|
||||
|
||||
.navds-heading--large {
|
||||
font-size: var(--navds-font-size-heading-large);
|
||||
letter-spacing: -0.004em;
|
||||
line-height: var(--navds-font-line-height-heading-large);
|
||||
}
|
||||
/* Mobile scale */
|
||||
@media (max-width: 480px) {
|
||||
.navds-heading--xlarge {
|
||||
font-size: var(--navds-font-size-heading-xlarge);
|
||||
letter-spacing: -0.008em;
|
||||
line-height: var(--navds-font-line-height-heading-xlarge);
|
||||
}
|
||||
|
||||
.navds-heading--large.navds-typo--spacing {
|
||||
margin-bottom: var(--navds-spacing-3);
|
||||
.navds-heading--xlarge.navds-typo--spacing {
|
||||
margin-bottom: var(--navds-spacing-4);
|
||||
}
|
||||
|
||||
.navds-heading--large {
|
||||
font-size: var(--navds-font-size-heading-large);
|
||||
letter-spacing: -0.004em;
|
||||
line-height: var(--navds-font-line-height-heading-large);
|
||||
}
|
||||
|
||||
.navds-heading--large.navds-typo--spacing {
|
||||
margin-bottom: var(--navds-spacing-3);
|
||||
}
|
||||
}
|
||||
|
||||
.navds-heading--medium {
|
||||
|
||||
@@ -22,9 +22,10 @@ export const getPublishedIcons = async () => {
|
||||
throw e;
|
||||
});
|
||||
|
||||
return data?.meta?.components?.filter(
|
||||
(component: any) => component?.containing_frame?.pageName !== "🔆Pictogram"
|
||||
);
|
||||
return data?.meta?.components?.filter((component: any) => {
|
||||
const page = component?.containing_frame?.pageName;
|
||||
return page !== "🔆Pictogram" && page !== "🧩Placeholder";
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,7 +2,7 @@ import React from "react";
|
||||
import { storiesOf } from "@storybook/react";
|
||||
import isChromatic from "chromatic/isChromatic";
|
||||
|
||||
import * as Icons from "../src";
|
||||
import * as Icons from "./src";
|
||||
export default {
|
||||
title: "ds-icons/Ikoner",
|
||||
argTypes: {
|
||||
@@ -743,6 +743,18 @@
|
||||
"created_at": "2021-01-11T13:37:55.499Z",
|
||||
"pageName": "Status"
|
||||
},
|
||||
{
|
||||
"name": "Eu",
|
||||
"description": "",
|
||||
"created_at": "2022-02-08T11:45:47.104Z",
|
||||
"pageName": "International"
|
||||
},
|
||||
{
|
||||
"name": "EuFilled",
|
||||
"description": "",
|
||||
"created_at": "2022-02-08T11:45:47.109Z",
|
||||
"pageName": "International"
|
||||
},
|
||||
{
|
||||
"name": "Expand",
|
||||
"description": "",
|
||||
@@ -857,6 +869,18 @@
|
||||
"created_at": "2021-01-11T13:37:55.491Z",
|
||||
"pageName": "File"
|
||||
},
|
||||
{
|
||||
"name": "FileError",
|
||||
"description": "",
|
||||
"created_at": "2022-01-27T12:48:37.583Z",
|
||||
"pageName": "File"
|
||||
},
|
||||
{
|
||||
"name": "FileErrorFilled",
|
||||
"description": "",
|
||||
"created_at": "2022-01-27T12:48:37.605Z",
|
||||
"pageName": "File"
|
||||
},
|
||||
{
|
||||
"name": "FileFilled",
|
||||
"description": "",
|
||||
@@ -875,6 +899,30 @@
|
||||
"created_at": "2021-04-26T09:24:37.951Z",
|
||||
"pageName": "File"
|
||||
},
|
||||
{
|
||||
"name": "FileProgressFilled",
|
||||
"description": "",
|
||||
"created_at": "2022-01-27T12:48:37.592Z",
|
||||
"pageName": "File"
|
||||
},
|
||||
{
|
||||
"name": "Files",
|
||||
"description": "",
|
||||
"created_at": "2022-01-27T12:48:37.567Z",
|
||||
"pageName": "File"
|
||||
},
|
||||
{
|
||||
"name": "FileSuccess",
|
||||
"description": "",
|
||||
"created_at": "2022-01-27T12:48:37.575Z",
|
||||
"pageName": "File"
|
||||
},
|
||||
{
|
||||
"name": "FileSuccessFilled",
|
||||
"description": "",
|
||||
"created_at": "2022-01-27T12:48:37.598Z",
|
||||
"pageName": "File"
|
||||
},
|
||||
{
|
||||
"name": "FillForms",
|
||||
"description": "",
|
||||
@@ -893,6 +941,18 @@
|
||||
"created_at": "2020-07-01T10:37:42.891Z",
|
||||
"pageName": "Interface"
|
||||
},
|
||||
{
|
||||
"name": "Filter2",
|
||||
"description": "",
|
||||
"created_at": "2022-01-14T09:16:08.202Z",
|
||||
"pageName": "Interface"
|
||||
},
|
||||
{
|
||||
"name": "Filter2Filled",
|
||||
"description": "",
|
||||
"created_at": "2022-01-14T09:16:08.197Z",
|
||||
"pageName": "Interface"
|
||||
},
|
||||
{
|
||||
"name": "FilterFilled",
|
||||
"description": "",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-icons",
|
||||
"version": "0.7.2",
|
||||
"version": "0.8.3",
|
||||
"private": false,
|
||||
"description": "NAVs egne ikoner i SVG og React format",
|
||||
"repository": {
|
||||
@@ -42,6 +42,7 @@
|
||||
"devDependencies": {
|
||||
"@svgr/cli": "^5.5.0",
|
||||
"@types/lodash.startcase": "^4.4.6",
|
||||
"@types/rimraf": "3.0.2",
|
||||
"@types/uuid": "^8.3.1",
|
||||
"axios": "^0.21.3",
|
||||
"copyfiles": "^2.4.1",
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
import { Meta } from "@storybook/addon-docs";
|
||||
|
||||
<Meta title="ds-icons/Kom i gang" />
|
||||
|
||||
# Ta i bruk ikonpakken `@navikt/ds-icons`
|
||||
|
||||
Alle ikoner kan bli funnet her https://design.nav.no/designsystem/resources/icons
|
||||
|
||||
## Oppsett
|
||||
|
||||
```bash
|
||||
yarn add @navikt/ds-icons
|
||||
```
|
||||
|
||||
```jsx
|
||||
Import { Expand } from `@navikt/ds-icons`;
|
||||
|
||||
<Expand
|
||||
title="Åpne meny"
|
||||
/>
|
||||
```
|
||||
|
||||
Note: Det kan være tilfeller der oppsettet ditt ikke har støtte for SVG, og det må da legges til manuelt i eks en webpack config basert på hva som blir brukt.
|
||||
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.4858 7.11515C20.7324 5.94459 20.7324 4.04674 19.4858 2.87619C18.2838 1.74743 16.3616 1.70712 15.1081 2.75525L14.9716 2.87619L3.6862 13.4736L3.52649 13.6301C1.61004 15.5902 1.66328 18.6389 3.6862 20.5385C5.70912 22.4381 8.95584 22.4881 11.0432 20.6885L11.2098 20.5385L22.4953 9.94113L24 11.3541L12.7146 21.9515L12.5304 22.1187C9.61022 24.6816 5.02951 24.6259 2.18147 21.9515C-0.666561 19.2771 -0.725895 14.9757 2.00347 12.2335L2.18147 12.0606L13.4669 1.4632C15.5445 -0.487732 18.913 -0.487732 20.9905 1.4632C23.0135 3.36279 23.0667 6.41157 21.1503 8.37164L20.9905 8.52814L9.7051 19.1255L9.56865 19.2465C8.31517 20.2946 6.39296 20.2543 5.19092 19.1255C3.98889 17.9968 3.94596 16.1918 5.06214 15.0147L5.19092 14.8866L16.4764 4.28917L17.9811 5.70216L6.69565 16.2996L6.61297 16.3867C6.28225 16.7789 6.30981 17.3502 6.69565 17.7126C7.08149 18.0749 7.68993 18.1008 8.10757 17.7902L8.20038 17.7126L19.4858 7.11515Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.8634 1.00122C18.1639 0.974609 19.5426 1.3819 20.5704 2.35845C21.5981 3.33501 22.0267 4.64511 21.9987 5.88083C21.9709 7.10846 21.4908 8.35534 20.5704 9.22999L11.1693 18.163C10.6021 18.7019 9.81338 18.9683 9.05641 18.9838C8.29093 18.9995 7.45868 18.76 6.83035 18.163C6.20202 17.5659 5.95004 16.7751 5.96653 16.0478C5.98283 15.3285 6.26318 14.579 6.83035 14.0401L13.3388 7.85568C13.7382 7.47618 14.3857 7.47618 14.7851 7.85568C15.1845 8.23518 15.1845 8.85048 14.7851 9.22999L8.27667 15.4144C8.13723 15.5469 8.01819 15.7922 8.01145 16.0896C8.0049 16.3789 8.10622 16.6267 8.27667 16.7887C8.44712 16.9506 8.70788 17.0469 9.01237 17.0407C9.32537 17.0343 9.58355 16.9212 9.72299 16.7887L19.1241 7.85568C19.6168 7.38747 19.9355 6.64474 19.9538 5.83898C19.9719 5.0413 19.6939 4.27422 19.1241 3.73276C18.5542 3.19129 17.7469 2.92716 16.9075 2.94433C16.0595 2.96168 15.2778 3.26454 14.7851 3.73276L5.38403 12.6658C4.6945 13.321 4.13449 14.5364 4.05489 15.8977C3.9765 17.2386 4.37172 18.5754 5.38403 19.5373C7.5157 21.5628 10.484 21.5628 12.6156 19.5373L19.1519 13.3265C19.5513 12.947 20.1988 12.947 20.5982 13.3265C20.9976 13.706 20.9976 14.3213 20.5982 14.7008L14.0619 20.9116C11.1315 23.6961 6.86816 23.6961 3.93772 20.9116C2.41897 19.4685 1.91025 17.5412 2.01264 15.7899C2.11384 14.0591 2.81936 12.3541 3.93772 11.2914L13.3388 2.35845C14.2593 1.4838 15.5715 1.02766 16.8634 1.00122Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.4858 7.11888C20.7324 5.94771 20.7324 4.04887 19.4858 2.87769C18.2838 1.74835 16.3616 1.70802 15.1081 2.75669L14.9716 2.87769L3.6862 13.4807L3.52649 13.6372C1.61004 15.5983 1.66328 18.6487 3.6862 20.5493C4.61095 21.4181 5.79143 21.9002 7 21.9956V22H24V24L7 24C5.24586 23.9013 3.52179 23.2223 2.18147 21.963C-0.666561 19.2872 -0.725895 14.9835 2.00347 12.2399L2.18147 12.0669L13.4669 1.46396C15.5445 -0.487988 18.913 -0.487988 20.9905 1.46396C23.0135 3.36455 23.0667 6.41493 21.1503 8.37603L20.9905 8.53261L9.7051 19.1356L9.56865 19.2566C8.31517 20.3053 6.39296 20.2649 5.19092 19.1356C3.98889 18.0062 3.94596 16.2003 5.06214 15.0226L5.19092 14.8944L16.4764 4.29142L17.9811 5.70515L6.69565 16.3081L6.61297 16.3953C6.28225 16.7877 6.30981 17.3593 6.69565 17.7219C7.08149 18.0844 7.68993 18.1103 8.10757 17.7995L8.20038 17.7219L19.4858 7.11888Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.3472 0.00138792C17.7614 -0.0288776 19.2813 0.434034 20.4223 1.56794L19.3387 2.6448L20.4223 1.56794C21.5633 2.70184 22.0291 4.21243 21.9986 5.61786C21.9684 7.01063 21.4486 8.445 20.4223 9.46495L11.0314 18.7978C10.358 19.467 9.43759 19.7854 8.57056 19.8039C7.69079 19.8227 6.71672 19.5352 5.97471 18.7978C5.23271 18.0604 4.94338 17.0923 4.96233 16.218C4.981 15.3563 5.30134 14.4416 5.97472 13.7724L12.4761 7.31122C13.0746 6.71649 14.0448 6.71649 14.6433 7.31122C15.2417 7.90596 15.2417 8.87022 14.6433 9.46495L8.14185 15.9261C8.10938 15.9584 8.03076 16.083 8.02641 16.2836C8.02234 16.4715 8.08594 16.5885 8.14185 16.6441C8.19777 16.6996 8.31553 16.7628 8.50458 16.7588C8.70636 16.7545 8.83176 16.6763 8.86423 16.6441L18.2552 7.31122C18.6406 6.92821 18.9187 6.28392 18.9345 5.55228C18.9501 4.8333 18.71 4.17373 18.2552 3.72167C17.8003 3.26961 17.1366 3.03104 16.4132 3.04652C15.677 3.06227 15.0287 3.33865 14.6433 3.72167L5.25234 13.0545C4.67063 13.6326 4.14756 14.7746 4.07345 16.1004C4.00113 17.3941 4.36759 18.6364 5.25234 19.5157C7.18223 21.4337 9.82386 21.4337 11.7538 19.5157L18.2829 13.0269C18.8814 12.4322 19.8516 12.4322 20.4501 13.0269C21.0485 13.6216 21.0485 14.5859 20.4501 15.1806L13.9209 21.6694C10.7941 24.7769 6.21196 24.7769 3.0852 21.6694C1.44161 20.036 0.9051 17.8683 1.01337 15.9314C1.11986 14.0266 1.86096 12.1174 3.0852 10.9008L12.4761 1.56794C13.5024 0.547983 14.9457 0.0313808 16.3472 0.00138792Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1015 B After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,10 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M11.6836 0.585361C11.7435 0.401105 12.0041 0.401105 12.064 0.585362L12.5383 2.04506C12.5651 2.12746 12.6419 2.18325 12.7286 2.18325H14.2632C14.4569 2.18325 14.5375 2.43117 14.3807 2.54505L13.1391 3.44712C13.069 3.49805 13.0397 3.58833 13.0664 3.67074L13.5407 5.13034C13.6006 5.3146 13.3897 5.46783 13.233 5.35394L11.9914 4.45183C11.9213 4.4009 11.8263 4.4009 11.7563 4.45183L10.5146 5.35397C10.3578 5.46785 10.1469 5.31462 10.2068 5.13036L10.6811 3.67074C10.7079 3.58833 10.6785 3.49805 10.6084 3.44712L9.36682 2.54505C9.21008 2.43117 9.29063 2.18325 9.48438 2.18325H11.0191C11.1057 2.18325 11.1825 2.12746 11.2093 2.04506L11.6836 0.585361Z" fill="#262626"/>
|
||||
<path d="M3.72187 3.991C3.63391 3.81837 3.81823 3.63404 3.99086 3.72199L5.38403 4.43175C5.46122 4.47108 5.55497 4.45623 5.61623 4.39497L6.72162 3.28964C6.85862 3.15264 7.09089 3.271 7.06057 3.46236L6.81595 5.00634C6.80239 5.09192 6.84548 5.1765 6.92269 5.21584L8.31573 5.92562C8.48835 6.01358 8.44758 6.27105 8.25622 6.30136L6.71211 6.54594C6.62654 6.55949 6.55942 6.62661 6.54587 6.71219L6.30129 8.25637C6.27098 8.44773 6.01351 8.48851 5.92555 8.31588L5.21577 6.92284C5.17643 6.84564 5.09185 6.80254 5.00627 6.8161L3.46232 7.06072C3.27095 7.09104 3.1526 6.85877 3.2896 6.72177L4.39497 5.61639C4.45624 5.55513 4.47109 5.46137 4.43175 5.38417L3.72187 3.991Z" fill="#262626"/>
|
||||
<path d="M0.585361 12.2186C0.401105 12.1587 0.401105 11.898 0.585362 11.8381L2.15739 11.3273C2.23979 11.3005 2.29558 11.2238 2.29558 11.1371V9.48437C2.29558 9.29062 2.54351 9.21007 2.65739 9.36682L3.62879 10.704C3.67971 10.7741 3.76999 10.8034 3.8524 10.7767L5.42439 10.2659C5.60866 10.206 5.76189 10.4169 5.64799 10.5737L4.6764 11.9108C4.62546 11.9809 4.62546 12.0758 4.6764 12.1459L5.64802 13.4831C5.76191 13.6398 5.60869 13.8507 5.42442 13.7909L3.85239 13.2801C3.76999 13.2533 3.67971 13.2827 3.62879 13.3528L2.65739 14.6899C2.54351 14.8467 2.29558 14.7661 2.29558 14.5724V12.9196C2.29558 12.8329 2.23979 12.7562 2.15739 12.7294L0.585361 12.2186Z" fill="#262626"/>
|
||||
<path d="M3.99086 20.0891C3.81823 20.177 3.63391 19.9927 3.72186 19.8201L4.43169 18.4269C4.47103 18.3497 4.45618 18.2559 4.39492 18.1947L3.28959 17.0893C3.15259 16.9523 3.27096 16.72 3.46232 16.7503L5.00638 16.995C5.09197 17.0086 5.17655 16.9655 5.21589 16.8883L5.92553 15.4953C6.01348 15.3226 6.27096 15.3634 6.30128 15.5548L6.54591 17.0989C6.55947 17.1845 6.62659 17.2516 6.71216 17.2651L8.25628 17.5097C8.44763 17.54 8.48841 17.7975 8.31579 17.8854L6.92289 18.5952C6.8457 18.6346 6.80261 18.7191 6.81616 18.8047L7.06069 20.3488C7.09099 20.5401 6.85872 20.6585 6.72173 20.5215L5.61627 19.416C5.55501 19.3548 5.46126 19.3399 5.38406 19.3793L3.99086 20.0891Z" fill="#262626"/>
|
||||
<path d="M12.064 23.1204C12.0041 23.3047 11.7435 23.3047 11.6836 23.1205L11.2092 21.6608C11.1824 21.5784 11.1056 21.5226 11.019 21.5226H9.4844C9.29066 21.5226 9.2101 21.2746 9.36685 21.1608L10.6085 20.2587C10.6786 20.2078 10.7079 20.1175 10.6812 20.0351L10.2068 18.5756C10.1469 18.3914 10.3578 18.2381 10.5146 18.352L11.7563 19.254C11.8264 19.3049 11.9213 19.3049 11.9914 19.254L13.233 18.352C13.3897 18.2381 13.6006 18.3914 13.5407 18.5756L13.0665 20.0351C13.0397 20.1175 13.069 20.2078 13.1391 20.2587L14.3807 21.1608C14.5375 21.2746 14.4569 21.5226 14.2632 21.5226H12.7285C12.6418 21.5226 12.565 21.5784 12.5383 21.6608L12.064 23.1204Z" fill="#262626"/>
|
||||
<path d="M20.0891 19.8201C20.177 19.9928 19.9927 20.1771 19.8201 20.0892L18.427 19.3794C18.3498 19.3401 18.2561 19.3549 18.1948 19.4162L17.0893 20.5217C16.9523 20.6587 16.72 20.5403 16.7503 20.3489L16.995 18.8047C17.0085 18.7191 16.9654 18.6345 16.8882 18.5952L15.4953 17.8855C15.3227 17.7975 15.3634 17.54 15.5548 17.5097L17.0989 17.2652C17.1845 17.2516 17.2516 17.1845 17.2651 17.0989L17.5097 15.5548C17.54 15.3634 17.7975 15.3226 17.8854 15.4953L18.5952 16.8883C18.6345 16.9655 18.7191 17.0086 18.8047 16.9951L20.3487 16.7504C20.5401 16.72 20.6584 16.9523 20.5214 17.0893L19.416 18.1949C19.3547 18.2562 19.3399 18.3499 19.3792 18.4271L20.0891 19.8201Z" fill="#262626"/>
|
||||
<path d="M23.4144 11.8382C23.5987 11.8981 23.5987 12.1588 23.4145 12.2187L21.8424 12.7295C21.76 12.7563 21.7042 12.8331 21.7042 12.9197V14.5726C21.7042 14.7663 21.4563 14.8469 21.3424 14.6901L20.3709 13.3528C20.3199 13.2827 20.2297 13.2534 20.1473 13.2802L18.5754 13.791C18.3912 13.8508 18.2379 13.64 18.3518 13.4832L19.3233 12.146C19.3743 12.0759 19.3743 11.981 19.3233 11.9109L18.3518 10.5737C18.2379 10.4169 18.3912 10.206 18.5754 10.2659L20.1473 10.7767C20.2297 10.8035 20.32 10.7742 20.371 10.7041L21.3424 9.36682C21.4563 9.21007 21.7042 9.29062 21.7042 9.48437V11.1373C21.7042 11.2239 21.76 11.3007 21.8424 11.3275L23.4144 11.8382Z" fill="#262626"/>
|
||||
<path d="M19.82 3.72203C19.9927 3.63407 20.177 3.8184 20.089 3.99102L19.3792 5.38419C19.3399 5.46139 19.3547 5.55514 19.416 5.61641L20.5214 6.72179C20.6584 6.85879 20.54 7.09107 20.3487 7.06075L18.8045 6.81606C18.719 6.8025 18.6344 6.8456 18.595 6.92281L17.8854 8.31578C17.7975 8.48842 17.54 8.44765 17.5097 8.25629L17.2651 6.71221C17.2515 6.62664 17.1844 6.55952 17.0988 6.54596L15.5547 6.30132C15.3634 6.271 15.3226 6.01354 15.4952 5.92558L16.8882 5.21585C16.9654 5.17652 17.0085 5.09194 16.9949 5.00635L16.7503 3.46238C16.72 3.27102 16.9522 3.15266 17.0892 3.28965L18.1948 4.39506C18.2561 4.45632 18.3498 4.47116 18.427 4.43183L19.82 3.72203Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.3 KiB |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2C0 0.89543 0.895431 0 2 0H22C23.1046 0 24 0.895431 24 2V22C24 23.1046 23.1046 24 22 24H2C0.89543 24 0 23.1046 0 22V2ZM11.6942 1.58536C11.754 1.4011 12.0147 1.40111 12.0746 1.58536L12.4898 2.86313C12.5166 2.94553 12.5934 3.00132 12.68 3.00132H14.0233C14.2171 3.00132 14.2976 3.24925 14.1409 3.36313L13.054 4.15276C12.9839 4.20369 12.9546 4.29397 12.9814 4.37637L13.3966 5.65405C13.4564 5.83831 13.2455 5.99154 13.0888 5.87766L12.0019 5.08798C11.9318 5.03705 11.8369 5.03705 11.7668 5.08798L10.6799 5.87768C10.5231 5.99156 10.3123 5.83833 10.3721 5.65407L10.7873 4.37637C10.8141 4.29397 10.7848 4.20369 10.7147 4.15276L9.6278 3.36313C9.47105 3.24925 9.55161 3.00132 9.74535 3.00132H11.0888C11.1754 3.00132 11.2522 2.94553 11.279 2.86313L11.6942 1.58536ZM4.704 4.43512C4.53138 4.34717 4.34706 4.5315 4.43502 4.70413L5.05696 5.92473C5.0963 6.00193 5.08145 6.09568 5.02018 6.15695L4.05175 7.12538C3.91475 7.26238 4.03311 7.49465 4.22447 7.46433L5.57715 7.25002C5.66273 7.23646 5.74731 7.27955 5.78664 7.35676L6.40849 8.57722C6.49645 8.74985 6.75392 8.70907 6.78423 8.51772L6.99851 7.16483C7.01207 7.07925 7.07919 7.01213 7.16476 6.99858L8.51758 6.7843C8.70894 6.75399 8.74972 6.49652 8.57709 6.40856L7.35662 5.78671C7.27941 5.74737 7.23632 5.66279 7.24988 5.57721L7.4642 4.22451C7.49452 4.03315 7.26225 3.91479 7.12524 4.05178L6.1568 5.02018C6.09553 5.08144 6.00179 5.09629 5.92459 5.05696L4.704 4.43512ZM1.58536 12.2163C1.40111 12.1564 1.40111 11.8957 1.58536 11.8358L2.9661 11.3872C3.0485 11.3604 3.10429 11.2836 3.10429 11.197V9.74534C3.10429 9.55159 3.35223 9.47104 3.4661 9.6278L4.31929 10.8023C4.37021 10.8724 4.46049 10.9017 4.5429 10.8749L5.9236 10.4263C6.10787 10.3664 6.26109 10.5773 6.1472 10.7341L5.29384 11.9085C5.24291 11.9786 5.24291 12.0735 5.29384 12.1436L6.14722 13.3181C6.26111 13.4748 6.10789 13.6857 5.92363 13.6258L4.5429 13.1772C4.46049 13.1505 4.37022 13.1798 4.31929 13.2499L3.4661 14.4243C3.35222 14.5811 3.10429 14.5005 3.10429 14.3068V12.8551C3.10429 12.7685 3.0485 12.6917 2.9661 12.6649L1.58536 12.2163ZM4.43501 19.1228C4.34705 19.2954 4.53138 19.4798 4.704 19.3918L5.92462 18.7699C6.00182 18.7306 6.09557 18.7454 6.15684 18.8067L7.12535 19.7752C7.26234 19.9122 7.49461 19.7938 7.46431 19.6025L7.25008 18.2497C7.23652 18.1641 7.27961 18.0796 7.35681 18.0402L8.57716 17.4184C8.74977 17.3304 8.70899 17.0729 8.51764 17.0426L7.1648 16.8283C7.07923 16.8148 7.01212 16.7477 6.99856 16.6621L6.78423 15.3093C6.75391 15.1179 6.49643 15.0771 6.40848 15.2498L5.78675 16.4702C5.74742 16.5474 5.66283 16.5905 5.57724 16.577L4.22447 16.3626C4.03311 16.3323 3.91475 16.5645 4.05174 16.7015L5.02013 17.67C5.0814 17.7312 5.09624 17.825 5.05691 17.9022L4.43501 19.1228ZM12.0746 22.1451C12.0147 22.3293 11.754 22.3293 11.6942 22.1451L11.2789 20.8673C11.2521 20.7849 11.1753 20.7291 11.0887 20.7291H9.74537C9.55163 20.7291 9.47107 20.4812 9.62782 20.3673L10.7147 19.5777C10.7848 19.5268 10.8142 19.4365 10.7874 19.3541L10.3722 18.0765C10.3123 17.8923 10.5232 17.739 10.6799 17.8529L11.7668 18.6425C11.8369 18.6934 11.9318 18.6934 12.0019 18.6425L13.0888 17.8529C13.2455 17.739 13.4564 17.8923 13.3965 18.0765L12.9814 19.3541C12.9546 19.4365 12.9839 19.5268 13.054 19.5777L14.1409 20.3673C14.2976 20.4812 14.2171 20.7291 14.0233 20.7291H12.6799C12.5933 20.7291 12.5165 20.7849 12.4897 20.8673L12.0746 22.1451ZM19.1228 19.3919C19.2954 19.4798 19.4798 19.2955 19.3918 19.1229L18.7699 17.9024C18.7305 17.8252 18.7454 17.7314 18.8066 17.6702L19.7752 16.7016C19.9121 16.5646 19.7938 16.3323 19.6024 16.3626L18.2497 16.577C18.1641 16.5905 18.0795 16.5475 18.0402 16.4702L17.4184 15.2498C17.3304 15.0771 17.0729 15.1179 17.0426 15.3093L16.8283 16.6621C16.8148 16.7477 16.7477 16.8148 16.6621 16.8284L15.3093 17.0426C15.1179 17.073 15.0772 17.3304 15.2498 17.4184L16.4702 18.0402C16.5474 18.0795 16.5905 18.1641 16.5769 18.2497L16.3626 19.6026C16.3322 19.794 16.5645 19.9123 16.7015 19.7753L17.6701 18.8068C17.7313 18.7456 17.8251 18.7307 17.9023 18.77L19.1228 19.3919ZM22.4146 11.8359C22.5988 11.8958 22.5988 12.1565 22.4146 12.2164L21.0338 12.665C20.9514 12.6918 20.8956 12.7686 20.8956 12.8552V14.3069C20.8956 14.5007 20.6477 14.5812 20.5338 14.4245L19.6805 13.25C19.6296 13.1798 19.5393 13.1505 19.4569 13.1773L18.0763 13.6259C17.8921 13.6858 17.7389 13.4749 17.8527 13.3182L18.706 12.1437C18.757 12.0736 18.757 11.9787 18.706 11.9086L17.8527 10.7341C17.7388 10.5773 17.8921 10.3664 18.0763 10.4263L19.457 10.875C19.5394 10.9017 19.6297 10.8724 19.6806 10.8023L20.5338 9.6278C20.6477 9.47104 20.8956 9.55159 20.8956 9.74534V11.1971C20.8956 11.2838 20.9514 11.3605 21.0338 11.3873L22.4146 11.8359ZM19.3918 4.70416C19.4797 4.53153 19.2954 4.34721 19.1228 4.43517L17.9023 5.05703C17.8251 5.09637 17.7314 5.08152 17.6701 5.02027L16.7015 4.05179C16.5645 3.9148 16.3322 4.03316 16.3625 4.22452L16.5769 5.57722C16.5904 5.6628 16.5473 5.74738 16.4701 5.78672L15.2497 6.40853C15.0771 6.49648 15.1179 6.75395 15.3092 6.78427L16.6621 6.9986C16.7476 7.01216Line truncated
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.3 KiB |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.4142 0H2V22H12V20H4V2H12V7H17V14H19V4.58579L14.4142 0ZM16.5858 5L14 2.41421V5H16.5858ZM18 17.5858L21.2929 14.2929L22.7071 15.7071L19.4142 19L22.7071 22.2929L21.2929 23.7071L18 20.4142L14.7071 23.7071L13.2929 22.2929L16.5858 19L13.2929 15.7071L14.7071 14.2929L18 17.5858Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 445 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2 0V22H11.5L14.5 19L11 15.5L14.5 12L18 15.5L19 14.5V4.5L14.5 0H2ZM13.5 5V2L16.5 5H13.5ZM13.2929 22.2929L16.5858 19L13.2929 15.7071L14.7071 14.2929L18 17.5858L21.2929 14.2929L22.7071 15.7071L19.4142 19L22.7071 22.2929L21.2929 23.7071L18 20.4142L14.7071 23.7071L13.2929 22.2929Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 448 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2 22V0H14.5L19 4.5V11H17.3135C11.6605 11 8.31543 17.3293 11.5 22H2ZM13.5 2V5H16.5L13.5 2ZM20.2122 20.7723C18.8453 22.1391 16.6293 22.1391 15.2624 20.7723C13.8956 19.4054 13.8956 17.1893 15.2624 15.8225C16.6293 14.4557 18.8453 14.4557 20.2122 15.8225L20.3897 16H19V18H24.0406V13L22.0406 13V14.8225L21.6264 14.4083C19.4785 12.2604 15.9961 12.2604 13.8482 14.4083C11.7003 16.5562 11.7003 20.0386 13.8482 22.1865C15.9961 24.3344 19.4785 24.3344 21.6264 22.1865L20.2122 20.7723Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 645 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13 1V6H18" stroke="#262626" stroke-width="2"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.4142 0H2V22H11V20H4V2H13.5858L17 5.41421V16H19V4.58579L14.4142 0ZM22.2689 14.3177L16.0317 21.0004L13.7593 18.3492L12.2407 19.6508L15.9683 23.9996L23.7311 15.6823L22.2689 14.3177Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 410 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2 0V22H12L10 19.5L14 16L16 18L19 15V4.5L14.5 0H2ZM13.5 5V2L16.5 5H13.5ZM22.2689 14.3177L16.0317 21.0004L13.7593 18.3492L12.2407 19.6508L15.9683 23.9996L23.7311 15.6823L22.2689 14.3177Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 356 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.4142 0H2V22H11V20H4V2H12V7H17V11H19V4.58579L14.4142 0ZM16.5858 5L14 2.41421V5H16.5858ZM20.2122 20.7723C18.8453 22.1391 16.6293 22.1391 15.2624 20.7723C13.8956 19.4054 13.8956 17.1893 15.2624 15.8225C16.6293 14.4557 18.8453 14.4557 20.2122 15.8225L20.3897 16H19V18H24.0406V13L22.0406 13V14.8225L21.6264 14.4083C19.4785 12.2604 15.9961 12.2604 13.8482 14.4083C11.7003 16.5562 11.7003 20.0386 13.8482 22.1865C15.9961 24.3344 19.4785 24.3344 21.6264 22.1865L20.2122 20.7723Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 645 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9.34783 12.9348V12.5015L9.03177 12.2052L1 4.67546L0.316059 5.405L1 4.67546V3.5H23V4.69448L15.4668 12.2277L15.1739 12.5206V12.9348L15.1739 21.5495L9.34783 23.0384V12.9348Z" stroke="#262626" stroke-width="2"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 321 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0 3V4.17546C0 4.45187 0.114409 4.71595 0.316059 4.905L8.34783 12.4348V22.5384C8.34783 23.1911 8.96302 23.6689 9.59542 23.5073L15.4215 22.0184C15.8642 21.9052 16.1739 21.5064 16.1739 21.0495V12.4348L23.7071 4.90159C23.8946 4.71405 24 4.4597 24 4.19448V3C24 2.44772 23.5523 2 23 2H1C0.447715 2 0 2.44772 0 3Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 438 B |
@@ -4,5 +4,5 @@
|
||||
"outDir": "./cjs",
|
||||
"module": "commonjs"
|
||||
},
|
||||
"exclude": ["./figma", "./scripts", "**/stories"]
|
||||
"exclude": ["./figma", "./scripts", "**/*.stories.*"]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-react",
|
||||
"version": "0.14.6",
|
||||
"version": "0.16.4",
|
||||
"private": false,
|
||||
"description": "NAV designsystem react components",
|
||||
"author": "NAV Designsystem team",
|
||||
@@ -35,7 +35,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@material-ui/core": "^4.12.3",
|
||||
"@navikt/ds-icons": "^0.7.2",
|
||||
"@navikt/ds-icons": "^0.8.3",
|
||||
"@popperjs/core": "^2.10.1",
|
||||
"classnames": "^2.2.6",
|
||||
"react-collapse": "^5.1.0",
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
import React, { forwardRef } from "react";
|
||||
import cl from "classnames";
|
||||
import MenuItems from "./MenuItems";
|
||||
import Collapsable, {
|
||||
AccordionMenuCollapsableType,
|
||||
} from "./AccordionMenuCollapsable";
|
||||
import Item, { AccordionMenuItemType } from "./AccordionMenuItem";
|
||||
|
||||
export interface AccordionMenuProps extends React.HTMLAttributes<HTMLElement> {
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
interface AccordionMenuComponent
|
||||
extends React.ForwardRefExoticComponent<
|
||||
AccordionMenuProps & React.RefAttributes<HTMLElement>
|
||||
> {
|
||||
Collapsable: AccordionMenuCollapsableType;
|
||||
Item: AccordionMenuItemType;
|
||||
}
|
||||
|
||||
const AccordionMenu = forwardRef<HTMLElement, AccordionMenuProps>(
|
||||
({ children, className, ...rest }, ref) => {
|
||||
return (
|
||||
<nav
|
||||
role="navigation"
|
||||
ref={ref}
|
||||
className={cl("navds-accordion-menu", className)}
|
||||
{...rest}
|
||||
>
|
||||
<MenuItems>{children}</MenuItems>
|
||||
</nav>
|
||||
);
|
||||
}
|
||||
) as AccordionMenuComponent;
|
||||
|
||||
AccordionMenu.Collapsable = Collapsable;
|
||||
AccordionMenu.Item = Item;
|
||||
|
||||
export default AccordionMenu;
|
||||
@@ -1,45 +0,0 @@
|
||||
import React, { forwardRef, HTMLAttributes, useState } from "react";
|
||||
import cl from "classnames";
|
||||
import { Expand } from "@navikt/ds-icons";
|
||||
import MenuItems from "./MenuItems";
|
||||
|
||||
export interface AccordionMenuCollapsableProps
|
||||
extends HTMLAttributes<HTMLDivElement> {
|
||||
title: string;
|
||||
defaultOpen?: boolean;
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
export type AccordionMenuCollapsableType = React.ForwardRefExoticComponent<
|
||||
AccordionMenuCollapsableProps & React.RefAttributes<HTMLDivElement>
|
||||
>;
|
||||
|
||||
const Collapsable: AccordionMenuCollapsableType = forwardRef(
|
||||
({ children, defaultOpen = false, title, className, ...rest }, ref) => {
|
||||
const [isOpen, setIsOpen] = useState(defaultOpen);
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={ref}
|
||||
className={cl("navds-accordion-menu-collapsable", className, {
|
||||
"navds-accordion-menu-collapsable--open": isOpen,
|
||||
})}
|
||||
{...rest}
|
||||
>
|
||||
<button
|
||||
onClick={() => setIsOpen(!isOpen)}
|
||||
className="navds-accordion-menu-collapsable__button"
|
||||
>
|
||||
{title}
|
||||
<Expand
|
||||
title={isOpen ? "Pil peker opp" : "Pil peker ned"}
|
||||
className="navds-accordion-menu-collapsable__expand-icon"
|
||||
/>
|
||||
</button>
|
||||
{isOpen && <MenuItems>{children}</MenuItems>}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
export default Collapsable;
|
||||
@@ -1,13 +0,0 @@
|
||||
import React from "react";
|
||||
|
||||
const MenuItems = ({ children }: { children: React.ReactNode }) => (
|
||||
<ul className="navds-accordion-menu__list">
|
||||
{React.Children.toArray(children).map((child, i) => (
|
||||
<li key={i} className="navds-accordion-menu__list-item">
|
||||
{child}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
);
|
||||
|
||||
export default MenuItems;
|
||||
@@ -1,3 +0,0 @@
|
||||
export { default as AccordionMenu, AccordionMenuProps } from "./AccordionMenu";
|
||||
export { AccordionMenuCollapsableProps } from "./AccordionMenuCollapsable";
|
||||
export { AccordionMenuItemProps } from "./AccordionMenuItem";
|
||||
@@ -1,66 +0,0 @@
|
||||
import { Meta, Canvas } from "@storybook/addon-docs";
|
||||
import { AccordionMenu } from "../../index";
|
||||
|
||||
<Meta title="ds-react/accordion-menu/intro" />
|
||||
|
||||
# Hvordan ta i bruk Accordion-menu
|
||||
|
||||
```jsx
|
||||
<AccordionMenu>
|
||||
<AccordionMenu.item href="#leo">Leo</AccordionMenu.item>
|
||||
<AccordionMenu.Collapsable title="Proin">
|
||||
<AccordionMenu.item href="#nulla" active>
|
||||
Nulla
|
||||
</AccordionMenu.item>
|
||||
<AccordionMenu.item href="#luctus">Luctus</AccordionMenu.item>
|
||||
</AccordionMenu.Collapsable>
|
||||
<AccordionMenu.Collapsable title="Accumsan">
|
||||
<AccordionMenu.item href="#justo" aria-current="page">
|
||||
Justo
|
||||
</AccordionMenu.item>
|
||||
<AccordionMenu.Collapsable title="Proin">
|
||||
<AccordionMenu.item href="#nulla">Nulla</AccordionMenu.item>
|
||||
<AccordionMenu.item href="#luctus">Luctus</AccordionMenu.item>
|
||||
</AccordionMenu.Collapsable>
|
||||
</AccordionMenu.Collapsable>
|
||||
</AccordionMenu>
|
||||
```
|
||||
|
||||
<Canvas>
|
||||
<AccordionMenu>
|
||||
<AccordionMenu.Item href="#leo">Leo</AccordionMenu.Item>
|
||||
<AccordionMenu.Collapsable title="Proin">
|
||||
<AccordionMenu.Item href="#nulla" active>
|
||||
Nulla
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Item href="#luctus">Luctus</AccordionMenu.Item>
|
||||
</AccordionMenu.Collapsable>
|
||||
<AccordionMenu.Collapsable title="Accumsan">
|
||||
<AccordionMenu.Item href="#justo" aria-current="page">
|
||||
Justo
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Collapsable title="Proin">
|
||||
<AccordionMenu.Item href="#nulla">Nulla</AccordionMenu.Item>
|
||||
<AccordionMenu.Item href="#luctus">Luctus</AccordionMenu.Item>
|
||||
</AccordionMenu.Collapsable>
|
||||
</AccordionMenu.Collapsable>
|
||||
</AccordionMenu>
|
||||
</Canvas>
|
||||
|
||||
Accordion-menu støtter opp til maks to-nivårer av `AccordionMenu.Collapsable` akkurat nå.
|
||||
|
||||
`AccordionMenu.Item` er implementert med `OverridableComponent`, noe som
|
||||
gjør at man kan ta i bruk eks react-router slik:
|
||||
|
||||
```jsx
|
||||
<AccordionMenu.item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/1"
|
||||
>
|
||||
Lenketekst
|
||||
</AccordionMenu.item>
|
||||
```
|
||||
|
||||
Her er `NavLink` fra `react-router-dom` brukt, og man får da
|
||||
samtidig bruke alle propsene til denne komponenten som da er `activeClassName` her.
|
||||
@@ -1,141 +0,0 @@
|
||||
import * as React from "react";
|
||||
import { AccordionMenu } from "../index";
|
||||
import { NavLink, HashRouter as Router } from "react-router-dom";
|
||||
|
||||
export default {
|
||||
title: "ds-react/accordion-menu",
|
||||
component: { AccordionMenu },
|
||||
};
|
||||
|
||||
export const All = () => (
|
||||
<div
|
||||
style={{
|
||||
background: "white",
|
||||
maxWidth: 288,
|
||||
}}
|
||||
>
|
||||
<AccordionMenu>
|
||||
<AccordionMenu.Item href="#leo">Leo</AccordionMenu.Item>
|
||||
<AccordionMenu.Collapsable title="Proin">
|
||||
<AccordionMenu.Item href="#nulla" active>
|
||||
Nulla
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Item href="#luctus">Luctus</AccordionMenu.Item>
|
||||
</AccordionMenu.Collapsable>
|
||||
<AccordionMenu.Collapsable title="Accumsan">
|
||||
<AccordionMenu.Item href="#justo" aria-current="page">
|
||||
Justo
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Item href="#pariatur" active aria-current="page">
|
||||
Pariatur
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Collapsable title="Proin">
|
||||
<AccordionMenu.Item href="#nulla" active>
|
||||
Nulla
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Item href="#luctus">Luctus</AccordionMenu.Item>
|
||||
</AccordionMenu.Collapsable>
|
||||
</AccordionMenu.Collapsable>
|
||||
<AccordionMenu.Item href="#justo" active>
|
||||
Justo
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Item href="#pariatur">Pariatur</AccordionMenu.Item>
|
||||
</AccordionMenu>
|
||||
</div>
|
||||
);
|
||||
|
||||
export const ReactRouter = () => (
|
||||
<AccordionMenu>
|
||||
<AccordionMenu.Collapsable title="Nivå 1 – 3 rems høy">
|
||||
<AccordionMenu.Item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/1"
|
||||
>
|
||||
Nivå 2 innrykk 2 rems
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/2"
|
||||
>
|
||||
Subtitle 3
|
||||
</AccordionMenu.Item>
|
||||
</AccordionMenu.Collapsable>
|
||||
<AccordionMenu.Collapsable title="Skjema og søknad">
|
||||
<AccordionMenu.Collapsable title="Satser">
|
||||
<AccordionMenu.Item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/3"
|
||||
>
|
||||
Nivå 3 – 3 rems innrykk Har du rett til dagpenger når du mottar annen
|
||||
økonomisk støtte fra NAV?
|
||||
</AccordionMenu.Item>
|
||||
</AccordionMenu.Collapsable>
|
||||
<AccordionMenu.Item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/4"
|
||||
>
|
||||
Subtitle 2
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/5"
|
||||
>
|
||||
Subtitle 3
|
||||
</AccordionMenu.Item>
|
||||
</AccordionMenu.Collapsable>
|
||||
<AccordionMenu.Collapsable title="Sakbehandlingstider">
|
||||
<AccordionMenu.Collapsable title="Subtitle 4 Lang tittel på andre nivå lorem ipsum">
|
||||
<AccordionMenu.Item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/6"
|
||||
>
|
||||
Subtitle 5
|
||||
</AccordionMenu.Item>
|
||||
</AccordionMenu.Collapsable>
|
||||
</AccordionMenu.Collapsable>
|
||||
<AccordionMenu.Item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/7"
|
||||
>
|
||||
Internasjonalt
|
||||
</AccordionMenu.Item>
|
||||
<AccordionMenu.Collapsable title="Meld fra om endringer lang tittel på første nivå">
|
||||
<AccordionMenu.Item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/8"
|
||||
>
|
||||
Subtitle 6
|
||||
</AccordionMenu.Item>
|
||||
</AccordionMenu.Collapsable>
|
||||
<AccordionMenu.Item
|
||||
as={NavLink}
|
||||
activeClassName="navds-accordion-menu-item--active"
|
||||
to="/9"
|
||||
>
|
||||
Nivå 1
|
||||
</AccordionMenu.Item>
|
||||
</AccordionMenu>
|
||||
);
|
||||
|
||||
ReactRouter.decorators = [
|
||||
(Story) => (
|
||||
<Router>
|
||||
<div
|
||||
style={{
|
||||
background: "white",
|
||||
maxWidth: 288,
|
||||
}}
|
||||
>
|
||||
<Story />
|
||||
</div>
|
||||
</Router>
|
||||
),
|
||||
];
|
||||
@@ -43,6 +43,7 @@ const AccordionHeader: AccordionHeaderType = forwardRef(
|
||||
|
||||
return (
|
||||
<button
|
||||
{...rest}
|
||||
ref={ref}
|
||||
id={context.buttonId}
|
||||
className={cl(
|
||||
@@ -52,17 +53,17 @@ const AccordionHeader: AccordionHeaderType = forwardRef(
|
||||
"navds-heading--small"
|
||||
)}
|
||||
onClick={handleClick}
|
||||
{...rest}
|
||||
aria-expanded={context.open}
|
||||
>
|
||||
{children}
|
||||
<Expand
|
||||
title={context.open ? "Lukk panel ikon" : "Åpne panel ikon"}
|
||||
aria-hidden
|
||||
className={cl("navds-accordion__expand-icon", {
|
||||
"navds-accordion__expand-icon--flip": context.open,
|
||||
})}
|
||||
/>
|
||||
<ExpandFilled
|
||||
title={context.open ? "Lukk panel ikon" : "Åpne panel ikon"}
|
||||
aria-hidden
|
||||
className={cl(
|
||||
"navds-accordion__expand-icon",
|
||||
"navds-accordion__expand-icon--filled",
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
import React, { useState } from "react";
|
||||
import AccordionContent from "./AccordionContent";
|
||||
import AccordionHeader from "./AccordionHeader";
|
||||
import AccordionItem from "./AccordionItem";
|
||||
import { Accordion } from ".";
|
||||
|
||||
export default {
|
||||
title: "ds-react/accordion",
|
||||
component: Accordion,
|
||||
subcomponents: {
|
||||
AccordionItem,
|
||||
AccordionContent,
|
||||
AccordionHeader,
|
||||
},
|
||||
};
|
||||
|
||||
export const All = () => {
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
<h1>Accordion</h1>
|
||||
<h2>Controlled</h2>
|
||||
<Accordion>
|
||||
<Accordion.Item open={open}>
|
||||
<Accordion.Header onClick={() => setOpen(!open)}>
|
||||
Accordion header text
|
||||
</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Magna aliquip aliquip fugiat nostrud nostrud velit pariatur veniam
|
||||
officia laboris voluptate officia pariatur.Lorem est ex anim velit
|
||||
occaecat nisi qui nostrud sit consectetur consectetur officia
|
||||
nostrud ullamco. Est ex duis proident nostrud elit qui laborum anim
|
||||
minim eu eiusmod. Veniam in nostrud sunt tempor velit incididunt
|
||||
sint ex dolor qui velit id eu. Deserunt magna sunt velit in. Est
|
||||
exercitation id cillum qui do. Minim adipisicing nostrud commodo
|
||||
proident occaecat aliquip nulla anim proident reprehenderit. Magna
|
||||
ipsum officia veniam cupidatat duis veniam dolore reprehenderit
|
||||
mollit velit.Ut consequat commodo minim occaecat id pariatur. Nisi
|
||||
enim tempor laborum commodo. Tempor sit quis nostrud eu cupidatat
|
||||
sunt commodo reprehenderit irure deserunt eiusmod ipsum.
|
||||
Exercitation quis commodo cillum eiusmod eiusmod. Do laborum qui
|
||||
proident commodo adipisicing eiusmod id.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
</Accordion>
|
||||
<h2>Un-controlled</h2>
|
||||
<Accordion>
|
||||
<Accordion.Item>
|
||||
<Accordion.Header>Accordion header text</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Magna aliquip aliquip fugiat nostrud nostrud velit pariatur veniam
|
||||
officia laboris voluptate officia pariatur.Lorem est ex anim velit
|
||||
occaecat nisi qui nostrud sit consectetur consectetur officia
|
||||
nostrud ullamco. Est ex duis proident nostrud elit qui laborum anim
|
||||
minim eu eiusmod. Veniam in nostrud sunt tempor velit incididunt
|
||||
sint ex dolor qui velit id eu. Deserunt magna sunt velit in. Est
|
||||
exercitation id cillum qui do. Minim adipisicing nostrud commodo
|
||||
proident occaecat aliquip nulla anim proident reprehenderit. Magna
|
||||
ipsum officia veniam cupidatat duis veniam dolore reprehenderit
|
||||
mollit velit.Ut consequat commodo minim occaecat id pariatur. Nisi
|
||||
enim tempor laborum commodo. Tempor sit quis nostrud eu cupidatat
|
||||
sunt commodo reprehenderit irure deserunt eiusmod ipsum.
|
||||
Exercitation quis commodo cillum eiusmod eiusmod. Do laborum qui
|
||||
proident commodo adipisicing eiusmod id.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
<Accordion.Item>
|
||||
<Accordion.Header>Accordion header text</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Magna aliquip aliquip fugiat nostrud nostrud velit pariatur veniam
|
||||
officia laboris voluptate officia pariatur.Lorem est ex anim velit
|
||||
occaecat nisi qui nostrud sit consectetur consectetur officia
|
||||
nostrud ullamco. Est ex duis proident nostrud elit qui laborum anim
|
||||
minim eu eiusmod. Veniam in nostrud sunt tempor velit incididunt
|
||||
sint ex dolor qui velit id eu. Deserunt magna sunt velit in. Est
|
||||
exercitation id cillum qui do. Minim adipisicing nostrud commodo
|
||||
proident occaecat aliquip nulla anim proident reprehenderit. Magna
|
||||
ipsum officia veniam cupidatat duis veniam dolore reprehenderit
|
||||
mollit velit.Ut consequat commodo minim occaecat id pariatur. Nisi
|
||||
enim tempor laborum commodo. Tempor sit quis nostrud eu cupidatat
|
||||
sunt commodo reprehenderit irure deserunt eiusmod ipsum.
|
||||
Exercitation quis commodo cillum eiusmod eiusmod. Do laborum qui
|
||||
proident commodo adipisicing eiusmod id.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
</Accordion>
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -1,72 +0,0 @@
|
||||
import { Meta, Canvas, Props } from "@storybook/addon-docs";
|
||||
import { Accordion } from "../../index";
|
||||
|
||||
<Meta title="ds-react/accordion/intro" />
|
||||
|
||||
# Hvordan ta i bruk Accordion
|
||||
|
||||
```jsx
|
||||
<Accordion>
|
||||
<Accordion.Item>
|
||||
<Accordion.Header>Accordion header text</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Magna aliquip aliquip fugiat nostrud nostrud velit pariatur veniam officia
|
||||
laboris voluptate officia pariatur.Lorem est ex anim velit occaecat nisi
|
||||
qui nostrud sit.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
<Accordion.Item>
|
||||
<Accordion.Header>Aliquip amet irure consectetur occaecat</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Cupidatat aliqua eu ea et anim excepteur. Labore aliquip dolore laborum
|
||||
consequat. Reprehenderit ad velit quis eiusmod ex sint aliquip do deserunt
|
||||
amet exercitation velit Lorem.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
</Accordion>
|
||||
```
|
||||
|
||||
<Canvas>
|
||||
<Accordion>
|
||||
<Accordion.Item>
|
||||
<Accordion.Header>Accordion header text</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Magna aliquip aliquip fugiat nostrud nostrud velit pariatur veniam
|
||||
officia laboris voluptate officia pariatur.Lorem est ex anim velit
|
||||
occaecat nisi qui nostrud sit.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
<Accordion.Item>
|
||||
<Accordion.Header>
|
||||
Aliquip amet irure consectetur occaecat
|
||||
</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Cupidatat aliqua eu ea et anim excepteur. Labore aliquip dolore laborum
|
||||
consequat. Reprehenderit ad velit quis eiusmod ex sint aliquip do
|
||||
deserunt amet exercitation velit Lorem.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
</Accordion>
|
||||
</Canvas>
|
||||
|
||||
## Controlled state
|
||||
|
||||
Accordion-komponeten styrer selv open-state, men om man ønsker kan man selv overskrive denne med
|
||||
`open`-prop + `onClick`-prop slik det er gjort på eksemplet.
|
||||
|
||||
```jsx
|
||||
<Accordion>
|
||||
<Accordion.Item open={open}>
|
||||
<Accordion.Header onClick={(open) => setOpen(!open)}>
|
||||
Accordion header text
|
||||
</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Magna aliquip aliquip fugiat nostrud nostrud velit pariatur veniam officia
|
||||
laboris voluptate officia pariatur.Lorem est ex anim velit
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
</Accordion>
|
||||
```
|
||||
|
||||
`renderContentWhenClosed`-prop på `Accordion.Item` bestemmer om innholdet (children) skal beholdes i dom-strukturen mens
|
||||
Accordion er lukket. Defaulter til `false`.
|
||||
@@ -1,92 +0,0 @@
|
||||
import React, { useState } from "react";
|
||||
import AccordionContent from "../AccordionContent";
|
||||
import AccordionHeader from "../AccordionHeader";
|
||||
import AccordionItem from "../AccordionItem";
|
||||
import { Accordion } from "../index";
|
||||
|
||||
export default {
|
||||
title: "ds-react/accordion",
|
||||
component: Accordion,
|
||||
subcomponents: {
|
||||
AccordionItem,
|
||||
AccordionContent,
|
||||
AccordionHeader,
|
||||
},
|
||||
};
|
||||
|
||||
export const All = () => {
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div>
|
||||
<h1>Accordion</h1>
|
||||
<h2>Controlled</h2>
|
||||
<Accordion>
|
||||
<Accordion.Item open={open}>
|
||||
<Accordion.Header onClick={() => setOpen(!open)}>
|
||||
Accordion header text
|
||||
</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Magna aliquip aliquip fugiat nostrud nostrud velit pariatur veniam
|
||||
officia laboris voluptate officia pariatur.Lorem est ex anim velit
|
||||
occaecat nisi qui nostrud sit consectetur consectetur officia
|
||||
nostrud ullamco. Est ex duis proident nostrud elit qui laborum
|
||||
anim minim eu eiusmod. Veniam in nostrud sunt tempor velit
|
||||
incididunt sint ex dolor qui velit id eu. Deserunt magna sunt
|
||||
velit in. Est exercitation id cillum qui do. Minim adipisicing
|
||||
nostrud commodo proident occaecat aliquip nulla anim proident
|
||||
reprehenderit. Magna ipsum officia veniam cupidatat duis veniam
|
||||
dolore reprehenderit mollit velit.Ut consequat commodo minim
|
||||
occaecat id pariatur. Nisi enim tempor laborum commodo. Tempor sit
|
||||
quis nostrud eu cupidatat sunt commodo reprehenderit irure
|
||||
deserunt eiusmod ipsum. Exercitation quis commodo cillum eiusmod
|
||||
eiusmod. Do laborum qui proident commodo adipisicing eiusmod id.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
</Accordion>
|
||||
<h2>Un-controlled</h2>
|
||||
<Accordion>
|
||||
<Accordion.Item>
|
||||
<Accordion.Header>Accordion header text</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Magna aliquip aliquip fugiat nostrud nostrud velit pariatur veniam
|
||||
officia laboris voluptate officia pariatur.Lorem est ex anim velit
|
||||
occaecat nisi qui nostrud sit consectetur consectetur officia
|
||||
nostrud ullamco. Est ex duis proident nostrud elit qui laborum
|
||||
anim minim eu eiusmod. Veniam in nostrud sunt tempor velit
|
||||
incididunt sint ex dolor qui velit id eu. Deserunt magna sunt
|
||||
velit in. Est exercitation id cillum qui do. Minim adipisicing
|
||||
nostrud commodo proident occaecat aliquip nulla anim proident
|
||||
reprehenderit. Magna ipsum officia veniam cupidatat duis veniam
|
||||
dolore reprehenderit mollit velit.Ut consequat commodo minim
|
||||
occaecat id pariatur. Nisi enim tempor laborum commodo. Tempor sit
|
||||
quis nostrud eu cupidatat sunt commodo reprehenderit irure
|
||||
deserunt eiusmod ipsum. Exercitation quis commodo cillum eiusmod
|
||||
eiusmod. Do laborum qui proident commodo adipisicing eiusmod id.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
<Accordion.Item>
|
||||
<Accordion.Header>Accordion header text</Accordion.Header>
|
||||
<Accordion.Content>
|
||||
Magna aliquip aliquip fugiat nostrud nostrud velit pariatur veniam
|
||||
officia laboris voluptate officia pariatur.Lorem est ex anim velit
|
||||
occaecat nisi qui nostrud sit consectetur consectetur officia
|
||||
nostrud ullamco. Est ex duis proident nostrud elit qui laborum
|
||||
anim minim eu eiusmod. Veniam in nostrud sunt tempor velit
|
||||
incididunt sint ex dolor qui velit id eu. Deserunt magna sunt
|
||||
velit in. Est exercitation id cillum qui do. Minim adipisicing
|
||||
nostrud commodo proident occaecat aliquip nulla anim proident
|
||||
reprehenderit. Magna ipsum officia veniam cupidatat duis veniam
|
||||
dolore reprehenderit mollit velit.Ut consequat commodo minim
|
||||
occaecat id pariatur. Nisi enim tempor laborum commodo. Tempor sit
|
||||
quis nostrud eu cupidatat sunt commodo reprehenderit irure
|
||||
deserunt eiusmod ipsum. Exercitation quis commodo cillum eiusmod
|
||||
eiusmod. Do laborum qui proident commodo adipisicing eiusmod id.
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
</Accordion>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
import React from "react";
|
||||
import { Alert } from "..";
|
||||
import { BodyLong, Heading } from "../..";
|
||||
import { Alert } from ".";
|
||||
import { BodyLong, Heading } from "..";
|
||||
|
||||
export default {
|
||||
title: "ds-react/alert",
|
||||
@@ -1,96 +0,0 @@
|
||||
import { Meta, Canvas } from "@storybook/addon-docs";
|
||||
import { Alert, Heading, BodyLong } from "../../index";
|
||||
|
||||
<Meta title="ds-react/alert/intro" />
|
||||
|
||||
# Hvordan ta i bruk Alert
|
||||
|
||||
```jsx
|
||||
<Alert variant="info">
|
||||
Id elit esse enim reprehenderit.Tempor tempor ex exercitation id aute
|
||||
eu.Laborum nulla nisi irure voluptate mollit fugiat.Est quis culpa nostrud et
|
||||
reprehenderit ea sint.Eu veniam labore enim labore qui eiusmod Lorem amet ad
|
||||
esse.
|
||||
</Alert>
|
||||
```
|
||||
|
||||
<Canvas>
|
||||
<Alert variant="info">
|
||||
Id elit esse enim reprehenderit.Tempor tempor ex exercitation id aute
|
||||
eu.Laborum nulla nisi irure voluptate mollit fugiat.Est quis culpa nostrud
|
||||
et reprehenderit ea sint.Eu veniam labore enim labore qui eiusmod Lorem amet
|
||||
ad esse.
|
||||
</Alert>
|
||||
</Canvas>
|
||||
|
||||
## Varianter
|
||||
|
||||
`variants`-prop kan brukes for å endre utseende mellom
|
||||
`info`, `success`, `warning` og `error`.
|
||||
|
||||
<Canvas>
|
||||
<Alert variant="info">Id elit esse enim reprehenderit.</Alert>
|
||||
<Alert variant="success">Id elit esse enim reprehenderit.</Alert>
|
||||
<Alert variant="warning">Id elit esse enim reprehenderit.</Alert>
|
||||
<Alert variant="error">Id elit esse enim reprehenderit.</Alert>
|
||||
</Canvas>
|
||||
|
||||
## Sizing
|
||||
|
||||
Alert har to størrelser: Default 64px height og small 32px height default.
|
||||
|
||||
<Canvas>
|
||||
<Alert size="small" variant="info">
|
||||
Id elit esse enim reprehenderit.
|
||||
</Alert>
|
||||
<Alert size="small" variant="success">
|
||||
Id elit esse enim reprehenderit.
|
||||
</Alert>
|
||||
<Alert size="small" variant="warning">
|
||||
Id elit esse enim reprehenderit.
|
||||
</Alert>
|
||||
<Alert size="small" variant="error">
|
||||
Id elit esse enim reprehenderit.
|
||||
</Alert>
|
||||
</Canvas>
|
||||
|
||||
## fullWidth
|
||||
|
||||
<Canvas>
|
||||
<div style={{ margin: 32, display: "grid", gap: 16 }}>
|
||||
<Alert fullWidth variant="info">
|
||||
Id elit esse enim reprehenderit.
|
||||
</Alert>
|
||||
<Alert fullWidth size="small" variant="info">
|
||||
Id elit esse enim reprehenderit.
|
||||
</Alert>
|
||||
</div>
|
||||
</Canvas>
|
||||
|
||||
## Med heading
|
||||
|
||||
```jsx
|
||||
<Alert variant="info">
|
||||
<Heading spacing size="small" level="2">
|
||||
Aliquip duis est in commodo pariatur
|
||||
</Heading>
|
||||
<BodyLong>
|
||||
Ullamco ullamco laborum et commodo sint culpa cupidatat culpa qui laboris
|
||||
ex. Labore ex occaecat proident qui qui fugiat magna. Fugiat sint commodo
|
||||
consequat eu aute.
|
||||
</BodyLong>
|
||||
</Alert>
|
||||
```
|
||||
|
||||
<Canvas>
|
||||
<Alert variant="info">
|
||||
<Heading spacing size="small" level="3">
|
||||
Aliquip duis est in commodo pariatur
|
||||
</Heading>
|
||||
<BodyLong>
|
||||
Ullamco ullamco laborum et commodo sint culpa cupidatat culpa qui laboris
|
||||
ex. Labore ex occaecat proident qui qui fugiat magna. Fugiat sint commodo
|
||||
consequat eu aute.
|
||||
</BodyLong>
|
||||
</Alert>
|
||||
</Canvas>
|
||||
@@ -1,6 +1,8 @@
|
||||
import React, { forwardRef } from "react";
|
||||
import React, { useRef, useState, forwardRef } from "react";
|
||||
import mergeRefs from "react-merge-refs";
|
||||
import cl from "classnames";
|
||||
import { BodyShort, OverridableComponent } from "../";
|
||||
import { BodyShort, OverridableComponent, Loader } from "../";
|
||||
import { useClientLayoutEffect } from "../util";
|
||||
|
||||
export interface ButtonProps
|
||||
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
@@ -24,6 +26,11 @@ export interface ButtonProps
|
||||
* @default false
|
||||
*/
|
||||
disabled?: boolean;
|
||||
/**
|
||||
* Replaces button content with a Loader component, keeps width
|
||||
* @default false
|
||||
*/
|
||||
loading?: boolean;
|
||||
}
|
||||
|
||||
const Button: OverridableComponent<ButtonProps, HTMLButtonElement> = forwardRef(
|
||||
@@ -34,25 +41,55 @@ const Button: OverridableComponent<ButtonProps, HTMLButtonElement> = forwardRef(
|
||||
className,
|
||||
children,
|
||||
size = "medium",
|
||||
loading = false,
|
||||
disabled,
|
||||
...rest
|
||||
},
|
||||
ref
|
||||
) => (
|
||||
<Component
|
||||
{...rest}
|
||||
ref={ref}
|
||||
className={cl(
|
||||
className,
|
||||
"navds-button",
|
||||
`navds-button--${variant}`,
|
||||
`navds-button--${size}`
|
||||
)}
|
||||
>
|
||||
<BodyShort as="span" className="navds-button__inner" size={size}>
|
||||
{children}
|
||||
</BodyShort>
|
||||
</Component>
|
||||
)
|
||||
) => {
|
||||
const buttonRef = useRef<HTMLButtonElement | null>(null);
|
||||
const mergedRef = mergeRefs([buttonRef, ref]);
|
||||
const [widthOverride, setWidthOverride] = useState<number>();
|
||||
|
||||
useClientLayoutEffect(() => {
|
||||
if (loading) {
|
||||
const requestID = window.requestAnimationFrame(() => {
|
||||
setWidthOverride(buttonRef?.current?.getBoundingClientRect()?.width);
|
||||
});
|
||||
return () => {
|
||||
setWidthOverride(undefined);
|
||||
cancelAnimationFrame(requestID);
|
||||
};
|
||||
}
|
||||
}, [loading, children]);
|
||||
|
||||
return (
|
||||
<Component
|
||||
{...rest}
|
||||
ref={mergedRef}
|
||||
className={cl(
|
||||
className,
|
||||
"navds-button",
|
||||
`navds-button--${variant}`,
|
||||
`navds-button--${size}`,
|
||||
{
|
||||
"navds-button--loading": widthOverride,
|
||||
}
|
||||
)}
|
||||
style={{ width: widthOverride }}
|
||||
disabled={disabled ?? widthOverride ? true : undefined}
|
||||
>
|
||||
<BodyShort
|
||||
as="span"
|
||||
className="navds-button__inner"
|
||||
size={size}
|
||||
aria-live="polite"
|
||||
>
|
||||
{widthOverride ? <Loader size={size} /> : children}
|
||||
</BodyShort>
|
||||
</Component>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
export default Button;
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import { Button } from "../index";
|
||||
import React, { useState } from "react";
|
||||
import { Button } from "./index";
|
||||
import { Success } from "@navikt/ds-icons";
|
||||
|
||||
export default {
|
||||
@@ -37,6 +37,13 @@ const varSwitch = {
|
||||
};
|
||||
|
||||
export const All = () => {
|
||||
const [loadingState, setLoadingState] = useState(true);
|
||||
const [content, setContent] = useState<string>("");
|
||||
|
||||
const toggleLoading = () => {
|
||||
setLoadingState(!loadingState);
|
||||
};
|
||||
|
||||
return (
|
||||
<div style={{ paddingLeft: "1rem" }}>
|
||||
<h1>Button</h1>
|
||||
@@ -82,7 +89,7 @@ export const All = () => {
|
||||
<Section>
|
||||
{variants.map((variant) => (
|
||||
<Button key={variant} variant={variant}>
|
||||
<span className="sr-only">Success ikon</span>
|
||||
<span className="navds-sr-only">Success ikon</span>
|
||||
<Success />
|
||||
</Button>
|
||||
))}
|
||||
@@ -98,11 +105,42 @@ export const All = () => {
|
||||
<Section>
|
||||
{variants.map((variant) => (
|
||||
<Button key={variant} variant={variant} size="small">
|
||||
<span className="sr-only">Success ikon</span>
|
||||
<span className="navds-sr-only">Success ikon</span>
|
||||
<Success />
|
||||
</Button>
|
||||
))}
|
||||
</Section>
|
||||
<h2>Button w/loader</h2>
|
||||
<Button onClick={toggleLoading}>Toggle loaders</Button>
|
||||
<Button onClick={() => setContent((content) => `${content} wat`)}>
|
||||
Change content
|
||||
</Button>
|
||||
<Section>
|
||||
{variants.map((variant) => (
|
||||
<Button
|
||||
key={variant}
|
||||
variant={variant}
|
||||
loading={loadingState}
|
||||
onClick={toggleLoading}
|
||||
>
|
||||
{content || varSwitch[variant]}
|
||||
</Button>
|
||||
))}
|
||||
</Section>
|
||||
<h2>Small w/loader</h2>
|
||||
<Section>
|
||||
{variants.map((variant) => (
|
||||
<Button
|
||||
key={variant}
|
||||
variant={variant}
|
||||
size="small"
|
||||
loading={loadingState}
|
||||
onClick={toggleLoading}
|
||||
>
|
||||
{varSwitch[variant]}
|
||||
</Button>
|
||||
))}
|
||||
</Section>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -1,70 +0,0 @@
|
||||
import { Meta, Canvas } from "@storybook/addon-docs";
|
||||
import { Button, Loader } from "../../index";
|
||||
import { Success } from "@navikt/ds-icons";
|
||||
|
||||
<Meta title="ds-react/button/intro" />
|
||||
|
||||
# Hvordan ta i bruk Button
|
||||
|
||||
```jsx
|
||||
<Button>Button</Button>
|
||||
```
|
||||
|
||||
<Canvas>
|
||||
<Button>Button</Button>
|
||||
</Canvas>
|
||||
|
||||
## Varianter
|
||||
|
||||
`variants`-prop kan brukes for å endre utseende mellom
|
||||
`primary`, `secondary`, `tertiary` og `danger`
|
||||
|
||||
<Canvas>
|
||||
<Button variant="primary">Primary</Button>
|
||||
<Button variant="secondary">Secondary</Button>
|
||||
<Button variant="tertiary">Tertiary</Button>
|
||||
<Button variant="danger">Danger</Button>
|
||||
</Canvas>
|
||||
|
||||
## Sizing
|
||||
|
||||
Button har to størrelser: Default 48px min-height og small 32px min-height
|
||||
|
||||
<Canvas>
|
||||
<Button size="small" variant="primary">
|
||||
Primary
|
||||
</Button>
|
||||
<Button size="small" variant="secondary">
|
||||
Secondary
|
||||
</Button>
|
||||
<Button size="small" variant="tertiary">
|
||||
Tertiary
|
||||
</Button>
|
||||
<Button size="small" variant="danger">
|
||||
Danger
|
||||
</Button>
|
||||
</Canvas>
|
||||
|
||||
## Med ikon eller `<Loader />`
|
||||
|
||||
Hvis man setter ikoner (svg) eller `<Loader />` rett på button vil størrelsen
|
||||
bli justert automatisk og sentrert.
|
||||
|
||||
<Canvas>
|
||||
<Button>
|
||||
<Loader /> Laster... <Loader />
|
||||
</Button>
|
||||
<Button size="small">
|
||||
<Loader />
|
||||
Laster...
|
||||
<Loader />
|
||||
</Button>
|
||||
<Button>
|
||||
<Success /> Laster... <Success />
|
||||
</Button>
|
||||
<Button size="small">
|
||||
<Success />
|
||||
Laster...
|
||||
<Success />
|
||||
</Button>
|
||||
</Canvas>
|
||||
@@ -96,7 +96,7 @@ const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(
|
||||
size={size}
|
||||
as="legend"
|
||||
className={cl("navds-fieldset__legend", {
|
||||
"sr-only": !!hideLegend,
|
||||
"navds-sr-only": !!hideLegend,
|
||||
})}
|
||||
>
|
||||
{legend}
|
||||
@@ -105,7 +105,7 @@ const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(
|
||||
(size === "medium" ? (
|
||||
<BodyShort
|
||||
className={cl("navds-fieldset__description", {
|
||||
"sr-only": !!hideLegend,
|
||||
"navds-sr-only": !!hideLegend,
|
||||
})}
|
||||
id={inputDescriptionId}
|
||||
size="small"
|
||||
@@ -116,7 +116,7 @@ const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(
|
||||
) : (
|
||||
<Detail
|
||||
className={cl("navds-fieldset__description", {
|
||||
"sr-only": !!hideLegend,
|
||||
"navds-sr-only": !!hideLegend,
|
||||
})}
|
||||
id={inputDescriptionId}
|
||||
size="small"
|
||||
|
||||
@@ -63,7 +63,7 @@ const Select = forwardRef<HTMLSelectElement, SelectProps>((props, ref) => {
|
||||
size={size}
|
||||
as="label"
|
||||
className={cl("navds-select__label", {
|
||||
"sr-only": hideLabel,
|
||||
"navds-sr-only": hideLabel,
|
||||
})}
|
||||
>
|
||||
{label}
|
||||
@@ -72,7 +72,7 @@ const Select = forwardRef<HTMLSelectElement, SelectProps>((props, ref) => {
|
||||
<BodyShort
|
||||
as="div"
|
||||
className={cl("navds-select__description", {
|
||||
"sr-only": hideLabel,
|
||||
"navds-sr-only": hideLabel,
|
||||
})}
|
||||
id={inputDescriptionId}
|
||||
size={size}
|
||||
|
||||
@@ -21,8 +21,8 @@ const SelectedIcon = () => (
|
||||
aria-label="Deaktiver valg"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M4.01386 8L10.25 2L11 2.75L4.01386 9.5L1 6.5L1.75 5.75L4.01386 8Z"
|
||||
fill="currentColor"
|
||||
stroke="currentColor"
|
||||
@@ -89,13 +89,15 @@ const Switch = forwardRef<HTMLInputElement, SwitchProps>((props, ref) => {
|
||||
`navds-switch--${size}`,
|
||||
`navds-switch--${position}`,
|
||||
{
|
||||
"navds-switch--disabled": inputProps.disabled,
|
||||
"navds-switch--loading": loading,
|
||||
"navds-switch--disabled": inputProps.disabled ?? loading,
|
||||
}
|
||||
)}
|
||||
>
|
||||
<input
|
||||
{...omit(rest, ["size"])}
|
||||
{...omit(inputProps, ["aria-invalid", "aria-describedby"])}
|
||||
disabled={inputProps.disabled ?? loading}
|
||||
checked={checkedProp}
|
||||
defaultChecked={defaultChecked}
|
||||
ref={ref}
|
||||
@@ -106,7 +108,7 @@ const Switch = forwardRef<HTMLInputElement, SwitchProps>((props, ref) => {
|
||||
<span className="navds-switch__track">
|
||||
<span className="navds-switch__thumb">
|
||||
{loading ? (
|
||||
<Loader size="xsmall" />
|
||||
<Loader size="xsmall" aria-live="polite" />
|
||||
) : checked ? (
|
||||
<SelectedIcon />
|
||||
) : null}
|
||||
@@ -115,7 +117,7 @@ const Switch = forwardRef<HTMLInputElement, SwitchProps>((props, ref) => {
|
||||
<label htmlFor={inputProps.id} className="navds-switch__label-wrapper">
|
||||
<div
|
||||
className={cl("navds-switch__content", {
|
||||
"sr-only": hideLabel,
|
||||
"navds-sr-only": hideLabel,
|
||||
"navds-switch--with-description": !!description && !hideLabel,
|
||||
})}
|
||||
>
|
||||
|
||||
@@ -62,7 +62,9 @@ const TextField = forwardRef<HTMLInputElement, TextFieldProps>((props, ref) => {
|
||||
htmlFor={inputProps.id}
|
||||
size={size}
|
||||
as="label"
|
||||
className={cl("navds-text-field__label", { "sr-only": hideLabel })}
|
||||
className={cl("navds-text-field__label", {
|
||||
"navds-sr-only": hideLabel,
|
||||
})}
|
||||
>
|
||||
{label}
|
||||
</Label>
|
||||
@@ -72,7 +74,7 @@ const TextField = forwardRef<HTMLInputElement, TextFieldProps>((props, ref) => {
|
||||
{size === "medium" ? (
|
||||
<BodyShort
|
||||
className={cl("navds-text-field__description", {
|
||||
"sr-only": hideLabel,
|
||||
"navds-sr-only": hideLabel,
|
||||
})}
|
||||
id={inputDescriptionId}
|
||||
size="small"
|
||||
@@ -83,7 +85,7 @@ const TextField = forwardRef<HTMLInputElement, TextFieldProps>((props, ref) => {
|
||||
) : (
|
||||
<Detail
|
||||
className={cl("navds-text-field__description", {
|
||||
"sr-only": hideLabel,
|
||||
"navds-sr-only": hideLabel,
|
||||
})}
|
||||
id={inputDescriptionId}
|
||||
size="small"
|
||||
|
||||
@@ -77,7 +77,7 @@ const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
|
||||
size={size}
|
||||
as="label"
|
||||
className={cl("navds-textarea__label", {
|
||||
"sr-only": hideLabel,
|
||||
"navds-sr-only": hideLabel,
|
||||
})}
|
||||
>
|
||||
{label}
|
||||
@@ -86,7 +86,7 @@ const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
|
||||
<BodyShort
|
||||
as="div"
|
||||
className={cl("navds-textarea__description", {
|
||||
"sr-only": hideLabel,
|
||||
"navds-sr-only": hideLabel,
|
||||
})}
|
||||
id={inputDescriptionId}
|
||||
size={size}
|
||||
@@ -113,7 +113,7 @@ const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
|
||||
/>
|
||||
{hasMaxLength && (
|
||||
<>
|
||||
<span id={maxLengthId} className="sr-only">
|
||||
<span id={maxLengthId} className="navds-sr-only">
|
||||
Tekstområde med plass til {maxLength} tegn., Textarea can have{" "}
|
||||
{maxLength} signs.
|
||||
</span>
|
||||
|
||||
@@ -24,6 +24,11 @@ export interface CheckboxProps
|
||||
* The value of the HTML element.
|
||||
*/
|
||||
value?: string;
|
||||
/**
|
||||
* Specify whether the Checkbox is in an indeterminate state
|
||||
* @default false
|
||||
*/
|
||||
indeterminate?: boolean;
|
||||
}
|
||||
|
||||
const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>((props, ref) => {
|
||||
@@ -52,13 +57,25 @@ const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>((props, ref) => {
|
||||
"hideLabel",
|
||||
])}
|
||||
{...inputProps}
|
||||
type="checkbox"
|
||||
className="navds-checkbox__input"
|
||||
ref={ref}
|
||||
aria-checked={props.indeterminate ? "mixed" : inputProps.checked}
|
||||
ref={(el) => {
|
||||
if (el) {
|
||||
el.indeterminate = props.indeterminate ?? false;
|
||||
}
|
||||
|
||||
if (typeof ref === "function") {
|
||||
ref(el);
|
||||
} else if (ref != null) {
|
||||
ref.current = el;
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<label htmlFor={inputProps.id} className="navds-checkbox__label">
|
||||
<div
|
||||
className={cl("navds-checkbox__content", {
|
||||
"sr-only": props.hideLabel,
|
||||
"navds-sr-only": props.hideLabel,
|
||||
})}
|
||||
>
|
||||
<BodyShort as="div" size={size}>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React from "react";
|
||||
import React, { useState } from "react";
|
||||
import { Checkbox, CheckboxGroup } from "../../index";
|
||||
import { Meta } from "@storybook/react/types-6-0";
|
||||
export default {
|
||||
@@ -6,6 +6,36 @@ export default {
|
||||
component: Checkbox,
|
||||
} as Meta;
|
||||
|
||||
export const Indeterminate = () => {
|
||||
const [checked, setChecked] = useState([true, false]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Checkbox
|
||||
checked={checked[0] && checked[1]}
|
||||
indeterminate={checked[0] !== checked[1]}
|
||||
onChange={(e) => setChecked([e.target.checked, e.target.checked])}
|
||||
>
|
||||
Parent
|
||||
</Checkbox>
|
||||
<div style={{ paddingLeft: "2rem" }}>
|
||||
<Checkbox
|
||||
checked={checked[0]}
|
||||
onChange={(e) => setChecked([e.target.checked, checked[1]])}
|
||||
>
|
||||
Child 1
|
||||
</Checkbox>
|
||||
<Checkbox
|
||||
checked={checked[1]}
|
||||
onChange={(e) => setChecked([checked[0], e.target.checked])}
|
||||
>
|
||||
Child 2
|
||||
</Checkbox>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export const All = () => {
|
||||
const Checkboxes = (props) => (
|
||||
<CheckboxGroup
|
||||
@@ -51,6 +81,13 @@ export const All = () => {
|
||||
<Checkbox value="Orange" description="Laborum ad" disabled defaultChecked>
|
||||
Orange
|
||||
</Checkbox>
|
||||
<h3>Indeterminate</h3>
|
||||
<Checkbox value="Apple" indeterminate>
|
||||
Apple
|
||||
</Checkbox>
|
||||
<Checkbox value="Orange" indeterminate size="small">
|
||||
Orange
|
||||
</Checkbox>
|
||||
|
||||
<h2>Checkbox group</h2>
|
||||
<Checkboxes />
|
||||
|
||||
@@ -32,7 +32,6 @@ const useCheckbox = ({ children, ...props }: CheckboxProps) => {
|
||||
...rest,
|
||||
inputProps: {
|
||||
...inputProps,
|
||||
type: "checkbox",
|
||||
checked: checkboxGroup?.value
|
||||
? checkboxGroup.value.includes(props.value as string)
|
||||
: props.checked,
|
||||
|
||||
@@ -90,7 +90,7 @@ const SearchField = forwardRef<HTMLDivElement, SearchFieldProps>(
|
||||
size={size}
|
||||
as="label"
|
||||
className={cl("navds-text-field__label", {
|
||||
"sr-only": hideLabel,
|
||||
"navds-sr-only": hideLabel,
|
||||
})}
|
||||
>
|
||||
{label}
|
||||
@@ -99,7 +99,7 @@ const SearchField = forwardRef<HTMLDivElement, SearchFieldProps>(
|
||||
<BodyShort
|
||||
as="div"
|
||||
className={cl("navds-text-field__description", {
|
||||
"sr-only": hideLabel,
|
||||
"navds-sr-only": hideLabel,
|
||||
})}
|
||||
id={inputDescriptionId}
|
||||
size={size}
|
||||
|
||||
@@ -78,7 +78,7 @@ export const All = () => {
|
||||
>
|
||||
<SearchField.Button>
|
||||
<Search />
|
||||
<span className="sr-only">Søk</span>
|
||||
<span className="navds-sr-only">Søk</span>
|
||||
</SearchField.Button>
|
||||
<SearchField.Input />
|
||||
</SearchField>
|
||||
@@ -91,7 +91,7 @@ export const All = () => {
|
||||
<SearchField.Input />
|
||||
<SearchField.Button>
|
||||
<Search />
|
||||
<span className="sr-only">Søk</span>
|
||||
<span className="navds-sr-only">Søk</span>
|
||||
</SearchField.Button>
|
||||
</SearchField>
|
||||
<SearchField
|
||||
@@ -101,7 +101,7 @@ export const All = () => {
|
||||
>
|
||||
<SearchField.Button>
|
||||
<Search />
|
||||
<span className="sr-only">Søk</span>
|
||||
<span className="navds-sr-only">Søk</span>
|
||||
</SearchField.Button>
|
||||
<SearchField.Clear>
|
||||
<Close /> Tøm
|
||||
@@ -120,7 +120,7 @@ export const All = () => {
|
||||
</SearchField.Clear>
|
||||
<SearchField.Button>
|
||||
<Search />
|
||||
<span className="sr-only">Søk</span>
|
||||
<span className="navds-sr-only">Søk</span>
|
||||
</SearchField.Button>
|
||||
</SearchField>
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ export default {
|
||||
|
||||
export const All = () => {
|
||||
const [checked, setChecked] = useState(false);
|
||||
const [loadingState, setLoadingState] = useState(false);
|
||||
return (
|
||||
<div style={{ width: "fit-content" }}>
|
||||
<h1>Switch</h1>
|
||||
@@ -91,6 +92,13 @@ export const All = () => {
|
||||
<Switch disabled loading>
|
||||
Label text
|
||||
</Switch>
|
||||
<Switch checked loading>
|
||||
Label text
|
||||
</Switch>
|
||||
<button onClick={() => setLoadingState(!loadingState)}>
|
||||
Toggle loading
|
||||
</button>
|
||||
<Switch loading={loadingState}>Label text</Switch>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -1,38 +1,40 @@
|
||||
import { Helptext as HelpTextIcon } from "@navikt/ds-icons";
|
||||
import { Placement } from "@popperjs/core";
|
||||
import cl from "classnames";
|
||||
import React, { forwardRef, useEffect, useRef, useState } from "react";
|
||||
import mergeRefs from "react-merge-refs";
|
||||
import { Popover } from "..";
|
||||
import { Popover, PopoverProps } from "..";
|
||||
|
||||
export interface HelpTextProps
|
||||
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
||||
Pick<PopoverProps, "strategy" | "placement"> {
|
||||
/**
|
||||
* Component content
|
||||
*/
|
||||
children: React.ReactNode;
|
||||
/**
|
||||
* Placement of popover
|
||||
* @default "top"
|
||||
*/
|
||||
placement?: Placement;
|
||||
}
|
||||
|
||||
const HelpText = forwardRef<HTMLButtonElement, HelpTextProps>(
|
||||
(
|
||||
{ className, children, placement = "top", title = "hjelp", ...rest },
|
||||
{
|
||||
className,
|
||||
children,
|
||||
placement = "top",
|
||||
strategy = "absolute",
|
||||
title = "hjelp",
|
||||
...rest
|
||||
},
|
||||
ref
|
||||
) => {
|
||||
const buttonRef = useRef<HTMLButtonElement | null>(null);
|
||||
const mergedRef = mergeRefs([buttonRef, ref]);
|
||||
const popoverRef = useRef<HTMLDivElement | null>(null);
|
||||
const [popoverRef, setPopoverRef] = useState<HTMLDivElement | null>(null);
|
||||
const wrapperRef = useRef<HTMLDivElement | null>(null);
|
||||
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
open && popoverRef.current?.focus();
|
||||
}, [open]);
|
||||
open && popoverRef?.focus?.();
|
||||
}, [open, popoverRef]);
|
||||
|
||||
const handleClick = (
|
||||
e: React.MouseEvent<HTMLButtonElement, MouseEvent>
|
||||
@@ -40,7 +42,6 @@ const HelpText = forwardRef<HTMLButtonElement, HelpTextProps>(
|
||||
setOpen((x) => !x);
|
||||
rest.onClick && rest.onClick(e);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="navds-help-text" ref={wrapperRef}>
|
||||
<button
|
||||
@@ -57,13 +58,14 @@ const HelpText = forwardRef<HTMLButtonElement, HelpTextProps>(
|
||||
<span className="navds-sr-only">{title}</span>
|
||||
</button>
|
||||
<Popover
|
||||
ref={popoverRef}
|
||||
ref={setPopoverRef}
|
||||
onClose={() => setOpen(false)}
|
||||
className="navds-help-text__popover"
|
||||
open={open}
|
||||
role="tooltip"
|
||||
anchorEl={buttonRef.current}
|
||||
placement={placement}
|
||||
strategy={strategy}
|
||||
>
|
||||
<Popover.Content>{children}</Popover.Content>
|
||||
</Popover>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
export * from "./accordion";
|
||||
export * from "./accordion-menu";
|
||||
export * from "./alert";
|
||||
export * from "./button";
|
||||
export * from "./form";
|
||||
@@ -9,6 +8,7 @@ export * from "./guide-panel";
|
||||
export * from "./link";
|
||||
export * from "./link-panel";
|
||||
export * from "./loader";
|
||||
export * from "./menu";
|
||||
export * from "./modal";
|
||||
export * from "./panel";
|
||||
export * from "./popover";
|
||||
|
||||
@@ -40,10 +40,7 @@ const LinkPanelComponent: OverridableComponent<
|
||||
className={cl("navds-link-panel", className)}
|
||||
>
|
||||
<div className="navds-link-panel__content">{children}</div>
|
||||
<Next
|
||||
className="navds-link-panel__chevron"
|
||||
aria-label="arrow-icon pointing right"
|
||||
/>
|
||||
<Next className="navds-link-panel__chevron" aria-hidden />
|
||||
</Panel>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -63,25 +63,3 @@ Bakgrunnen kan settes til transparent med `transparent={true}`
|
||||
<Canvas>
|
||||
<Loader size="2xlarge" transparent />
|
||||
</Canvas>
|
||||
|
||||
## Bruk av loader i knapper
|
||||
|
||||
Husk her å gi brukeren nok informasjon om hvorfor knappen har en Loader. Dette kan gjøres ved å ha god tekst på siden,
|
||||
i knappen og i `title`-proppen for `Loader`. Unngå også bruk av `Loader` uten noen tekst som hinter til hva som foregår.
|
||||
|
||||
Stylingen er overstyrt for knapper, slik at `transparent` ikke fungerer by-default ved bruk i knapper.
|
||||
Størrelsen justeres også automatisk, slik at alt man trenger er å sette Loaderen rett inn i knappen.
|
||||
|
||||
```jsx
|
||||
<Button>
|
||||
Laster inn nytt innhold...
|
||||
<Loader />
|
||||
</Button>
|
||||
```
|
||||
|
||||
<Canvas>
|
||||
<Button>
|
||||
Laster inn nytt innhold...
|
||||
<Loader />
|
||||
</Button>
|
||||
</Canvas>
|
||||
@@ -0,0 +1,36 @@
|
||||
import React, { forwardRef } from "react";
|
||||
import cl from "classnames";
|
||||
import MenuItems from "./MenuItems";
|
||||
|
||||
import Item, { MenuItemType } from "./MenuItem";
|
||||
import Collapse, { MenuCollapseType } from "./MenuCollapse";
|
||||
|
||||
export interface MenuProps extends React.HTMLAttributes<HTMLElement> {
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
interface MenuComponent
|
||||
extends React.ForwardRefExoticComponent<
|
||||
MenuProps & React.RefAttributes<HTMLElement>
|
||||
> {
|
||||
Collapse: MenuCollapseType;
|
||||
Item: MenuItemType;
|
||||
}
|
||||
|
||||
const Menu = forwardRef<HTMLElement, MenuProps>(
|
||||
({ children, className, ...rest }, ref) => (
|
||||
<nav
|
||||
{...rest}
|
||||
role="navigation"
|
||||
ref={ref}
|
||||
className={cl("navds-menu", className)}
|
||||
>
|
||||
<MenuItems>{children}</MenuItems>
|
||||
</nav>
|
||||
)
|
||||
) as MenuComponent;
|
||||
|
||||
Menu.Collapse = Collapse;
|
||||
Menu.Item = Item;
|
||||
|
||||
export default Menu;
|
||||
@@ -0,0 +1,80 @@
|
||||
import React, {
|
||||
createContext,
|
||||
forwardRef,
|
||||
HTMLAttributes,
|
||||
useContext,
|
||||
useState,
|
||||
} from "react";
|
||||
import cl from "classnames";
|
||||
import { Expand, ExpandFilled } from "@navikt/ds-icons";
|
||||
import MenuItems from "./MenuItems";
|
||||
|
||||
export const NestingContext = createContext<{ depth: number }>({ depth: 1 });
|
||||
|
||||
const NestingProvider = ({ children }) => {
|
||||
const context = useContext(NestingContext);
|
||||
|
||||
return (
|
||||
<NestingContext.Provider
|
||||
value={{
|
||||
depth: context.depth + 1,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</NestingContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
export interface MenuCollapseProps extends HTMLAttributes<HTMLDivElement> {
|
||||
title: string;
|
||||
defaultOpen?: boolean;
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
export type MenuCollapseType = React.ForwardRefExoticComponent<
|
||||
MenuCollapseProps & React.RefAttributes<HTMLDivElement>
|
||||
>;
|
||||
|
||||
const Collapse: MenuCollapseType = forwardRef(
|
||||
({ children, defaultOpen = false, title, className, ...rest }, ref) => {
|
||||
const [isOpen, setIsOpen] = useState(defaultOpen);
|
||||
const context = useContext(NestingContext);
|
||||
|
||||
return (
|
||||
<div
|
||||
{...rest}
|
||||
ref={ref}
|
||||
className={cl("navds-menu-collapse", className, {
|
||||
"navds-menu-collapse--open": isOpen,
|
||||
})}
|
||||
>
|
||||
<button
|
||||
onClick={() => setIsOpen(!isOpen)}
|
||||
className="navds-menu-collapse__button"
|
||||
>
|
||||
{title}
|
||||
<Expand
|
||||
title={isOpen ? "lukk navigasjons-skuff" : "åpne navigason-skuff"}
|
||||
className="navds-menu-collapse__expand-icon"
|
||||
/>
|
||||
<ExpandFilled
|
||||
title={isOpen ? "lukk navigasjons-skuff" : "åpne navigason-skuff"}
|
||||
className="navds-menu-collapse__expand-icon navds-menu-collapse__expand-icon--filled"
|
||||
/>
|
||||
</button>
|
||||
<NestingProvider>
|
||||
{isOpen && (
|
||||
<MenuItems
|
||||
data-depth={context.depth}
|
||||
className="navds-menu__list--inner"
|
||||
>
|
||||
{children}
|
||||
</MenuItems>
|
||||
)}
|
||||
</NestingProvider>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
export default Collapse;
|
||||
@@ -2,7 +2,7 @@ import React, { forwardRef } from "react";
|
||||
import { OverridableComponent } from "..";
|
||||
import cl from "classnames";
|
||||
|
||||
export interface AccordionMenuItemProps
|
||||
export interface MenuItemProps
|
||||
extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
|
||||
children: React.ReactNode;
|
||||
/**
|
||||
@@ -12,12 +12,12 @@ export interface AccordionMenuItemProps
|
||||
active?: boolean;
|
||||
}
|
||||
|
||||
export type AccordionMenuItemType = OverridableComponent<
|
||||
AccordionMenuItemProps,
|
||||
export type MenuItemType = OverridableComponent<
|
||||
MenuItemProps,
|
||||
HTMLAnchorElement
|
||||
>;
|
||||
|
||||
const Item: AccordionMenuItemType = forwardRef(
|
||||
const Item: MenuItemType = forwardRef(
|
||||
(
|
||||
{ children, as: Component = "a", active = false, className, ...rest },
|
||||
ref
|
||||
@@ -25,8 +25,8 @@ const Item: AccordionMenuItemType = forwardRef(
|
||||
return (
|
||||
<Component
|
||||
ref={ref}
|
||||
className={cl("navds-accordion-menu-item", className, {
|
||||
"navds-accordion-menu-item--active": active,
|
||||
className={cl("navds-menu-item", className, {
|
||||
"navds-menu-item--active": active,
|
||||
})}
|
||||
{...rest}
|
||||
>
|
||||
@@ -0,0 +1,21 @@
|
||||
import cl from "classnames";
|
||||
import React from "react";
|
||||
|
||||
const MenuItems = ({
|
||||
children,
|
||||
className,
|
||||
...rest
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
className?: string;
|
||||
}) => (
|
||||
<ul {...rest} className={cl("navds-menu__list", className)}>
|
||||
{React.Children.toArray(children).map((child, i) => (
|
||||
<li key={i} className="navds-menu__list-item">
|
||||
{child}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
);
|
||||
|
||||
export default MenuItems;
|
||||
@@ -0,0 +1,3 @@
|
||||
export { default as Menu, MenuProps } from "./Menu";
|
||||
export { MenuCollapseProps } from "./MenuCollapse";
|
||||
export { MenuItemProps } from "./MenuItem";
|
||||
@@ -0,0 +1,93 @@
|
||||
import { Meta, Canvas } from "@storybook/addon-docs";
|
||||
import { Menu } from "../../index";
|
||||
|
||||
<Meta title="ds-react/menu/intro" />
|
||||
|
||||
# Hvordan ta i bruk Menu
|
||||
|
||||
```jsx
|
||||
<Menu>
|
||||
<Menu.Item href="#leo">Leo</Menu.Item>
|
||||
<Menu.Collapse title="Proin">
|
||||
<Menu.Item href="#nulla" active>
|
||||
Nulla
|
||||
</Menu.Item>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
</Menu.Collapse>
|
||||
<Menu.Collapse title="Accumsan">
|
||||
<Menu.Item href="#justo" aria-current="page">
|
||||
Justo
|
||||
</Menu.Item>
|
||||
<Menu.Collapse title="Proin">
|
||||
<Menu.Item href="#nulla">Nulla</Menu.Item>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
</Menu.Collapse>
|
||||
</Menu.Collapse>
|
||||
</Menu>
|
||||
```
|
||||
|
||||
<Canvas>
|
||||
<Menu>
|
||||
<Menu.Item href="#leo">Leo</Menu.Item>
|
||||
<Menu.Collapse title="Proin">
|
||||
<Menu.Item href="#nulla" active>
|
||||
Nulla
|
||||
</Menu.Item>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
</Menu.Collapse>
|
||||
<Menu.Collapse title="Accumsan">
|
||||
<Menu.Item href="#justo">Justo</Menu.Item>
|
||||
<Menu.Collapse title="Proin">
|
||||
<Menu.Item href="#nulla">Nulla</Menu.Item>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
</Menu.Collapse>
|
||||
</Menu.Collapse>
|
||||
</Menu>
|
||||
</Canvas>
|
||||
|
||||
## Elementer i menyen
|
||||
|
||||
Menyen har to typer elementer man kan bruke: `Collapse` for nesting og `Item` for navigasjonslenker på siden.
|
||||
|
||||
<Canvas>
|
||||
<div>
|
||||
<h2>Item</h2>
|
||||
<Menu>
|
||||
<Menu.Item href="#leo">Lenke</Menu.Item>
|
||||
<Menu.Item href="#leo">Lenke</Menu.Item>
|
||||
<Menu.Item href="#leo">Lenke</Menu.Item>
|
||||
<Menu.Item href="#leo">Lenke</Menu.Item>
|
||||
<Menu.Item href="#leo">Lenke</Menu.Item>
|
||||
</Menu>
|
||||
<h2>Collapses + Item</h2>
|
||||
<Menu>
|
||||
<Menu.Collapse title="Proin">
|
||||
<Menu.Item href="#nulla" active>
|
||||
Nulla
|
||||
</Menu.Item>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
</Menu.Collapse>
|
||||
<Menu.Collapse title="Accumsan">
|
||||
<Menu.Item href="#justo">Justo</Menu.Item>
|
||||
<Menu.Collapse title="Proin">
|
||||
<Menu.Item href="#nulla">Nulla</Menu.Item>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
</Menu.Collapse>
|
||||
</Menu.Collapse>
|
||||
<Menu.Item href="#leo">Lenke</Menu.Item>
|
||||
<Menu.Item href="#leo">Lenke</Menu.Item>
|
||||
</Menu>
|
||||
</div>
|
||||
</Canvas>
|
||||
|
||||
`Menu.Item` er implementert med `OverridableComponent`, noe som
|
||||
gjør at man kan ta i bruk eks react-router slik:
|
||||
|
||||
```jsx
|
||||
<Menu.Item as={NavLink} activeClassName="navds-menu-item--active" to="/1">
|
||||
Lenketekst
|
||||
</Menu.Item>
|
||||
```
|
||||
|
||||
Her er `NavLink` fra `react-router-dom` brukt, og man får da
|
||||
samtidig bruke alle propsene til denne komponenten som da er `activeClassName` her.
|
||||
@@ -0,0 +1,139 @@
|
||||
import * as React from "react";
|
||||
import cl from "classnames";
|
||||
import { Menu } from "../index";
|
||||
import { NavLink, HashRouter as Router } from "react-router-dom";
|
||||
import { MenuItemProps } from "../MenuItem";
|
||||
|
||||
export default {
|
||||
title: "ds-react/menu",
|
||||
component: { Menu },
|
||||
};
|
||||
|
||||
export const All = () => (
|
||||
<div
|
||||
style={{
|
||||
background: "white",
|
||||
maxWidth: 288,
|
||||
}}
|
||||
>
|
||||
<h2>Only Menu.Items</h2>
|
||||
<Menu>
|
||||
<Menu.Item href="#leo">Leo</Menu.Item>
|
||||
|
||||
<Menu.Item href="#justo">Justo</Menu.Item>
|
||||
<Menu.Item href="#pariatur" active aria-current="page">
|
||||
Pariatur
|
||||
</Menu.Item>
|
||||
<Menu.Item href="#nulla">Nulla</Menu.Item>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
<Menu.Item href="#justo">Justo</Menu.Item>
|
||||
<Menu.Item href="#pariatur">Pariatur</Menu.Item>
|
||||
</Menu>
|
||||
|
||||
<h2>With Collapse</h2>
|
||||
<Menu>
|
||||
<Menu.Item href="#leo">Leo</Menu.Item>
|
||||
<Menu.Collapse title="Proin">
|
||||
<Menu.Item href="#nulla" active>
|
||||
Nulla
|
||||
</Menu.Item>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
</Menu.Collapse>
|
||||
<Menu.Collapse title="Accumsan">
|
||||
<Menu.Item href="#justo" aria-current="page">
|
||||
Justo
|
||||
</Menu.Item>
|
||||
<Menu.Item href="#pariatur" active aria-current="page">
|
||||
Pariatur
|
||||
</Menu.Item>
|
||||
<Menu.Collapse title="Proin">
|
||||
<Menu.Item href="#nulla" active>
|
||||
Nulla
|
||||
</Menu.Item>
|
||||
<Menu.Collapse title="Proin">
|
||||
<Menu.Item href="#nulla" active>
|
||||
Nulla
|
||||
</Menu.Item>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
</Menu.Collapse>
|
||||
<Menu.Item href="#luctus">Luctus</Menu.Item>
|
||||
</Menu.Collapse>
|
||||
</Menu.Collapse>
|
||||
<Menu.Item href="#justo" active>
|
||||
Justo
|
||||
</Menu.Item>
|
||||
<Menu.Item href="#pariatur">Pariatur</Menu.Item>
|
||||
</Menu>
|
||||
</div>
|
||||
);
|
||||
|
||||
export const ReactRouter = () => {
|
||||
const MenuItemLink = (props: MenuItemProps & { to: string }) => {
|
||||
const { to } = props;
|
||||
|
||||
const CustomLink = React.useMemo(
|
||||
() => (props: MenuItemProps) => (
|
||||
<NavLink
|
||||
{...props}
|
||||
to={to}
|
||||
className={({ isActive }) =>
|
||||
cl(props.className, {
|
||||
"navds-menu-item--active": isActive,
|
||||
})
|
||||
}
|
||||
/>
|
||||
),
|
||||
[to]
|
||||
);
|
||||
|
||||
return (
|
||||
<Menu.Item {...props} as={CustomLink}>
|
||||
Nivå 2 innrykk 2 rems
|
||||
</Menu.Item>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<Menu>
|
||||
<Menu.Collapse title="Nivå 1 - 3 rems høy">
|
||||
<MenuItemLink to="/1">Nivå 2 innrykk 2 rems</MenuItemLink>
|
||||
<MenuItemLink to="/2">Subtitle 3</MenuItemLink>
|
||||
</Menu.Collapse>
|
||||
<Menu.Collapse title="Skjema og søknad">
|
||||
<Menu.Collapse title="Satser">
|
||||
<MenuItemLink to="/3">
|
||||
Nivå 3 - 3 rems innrykk Har du rett til dagpenger når du mottar
|
||||
annen økonomisk støtte fra NAV?
|
||||
</MenuItemLink>
|
||||
</Menu.Collapse>
|
||||
<MenuItemLink to="/4">Subtitle 2</MenuItemLink>
|
||||
<MenuItemLink to="/5">Subtitle 3</MenuItemLink>
|
||||
</Menu.Collapse>
|
||||
<Menu.Collapse title="Sakbehandlingstider">
|
||||
<Menu.Collapse title="Subtitle 4 Lang tittel på andre nivå lorem ipsum">
|
||||
<MenuItemLink to="/6">Subtitle 5</MenuItemLink>
|
||||
</Menu.Collapse>
|
||||
</Menu.Collapse>
|
||||
<MenuItemLink to="/7">Internasjonalt</MenuItemLink>
|
||||
<Menu.Collapse title="Meld fra om endringer lang tittel på første nivå">
|
||||
<MenuItemLink to="/8">Subtitle 6</MenuItemLink>
|
||||
</Menu.Collapse>
|
||||
<MenuItemLink to="/9">Nivå 1</MenuItemLink>
|
||||
</Menu>
|
||||
);
|
||||
};
|
||||
|
||||
ReactRouter.decorators = [
|
||||
(Story) => (
|
||||
<Router>
|
||||
<div
|
||||
style={{
|
||||
background: "white",
|
||||
maxWidth: 288,
|
||||
}}
|
||||
>
|
||||
<Story />
|
||||
</div>
|
||||
</Router>
|
||||
),
|
||||
];
|
||||
@@ -28,6 +28,14 @@ export interface ModalProps {
|
||||
* User defined classname for modal
|
||||
*/
|
||||
className?: string;
|
||||
/**
|
||||
* Toggles addition of a X-button on modal
|
||||
* @default true
|
||||
*/
|
||||
closeButton?: boolean;
|
||||
"aria-labelledby"?: string;
|
||||
"aria-describedby"?: string;
|
||||
"aria-modal"?: boolean;
|
||||
}
|
||||
|
||||
interface ModalComponent
|
||||
@@ -50,6 +58,10 @@ const Modal = forwardRef<ReactModal, ModalProps>(
|
||||
onClose,
|
||||
className,
|
||||
shouldCloseOnOverlayClick = true,
|
||||
closeButton = true,
|
||||
"aria-describedby": ariaDescribedBy,
|
||||
"aria-labelledby": ariaLabelledBy,
|
||||
"aria-modal": ariaModal,
|
||||
...rest
|
||||
},
|
||||
ref
|
||||
@@ -75,20 +87,26 @@ const Modal = forwardRef<ReactModal, ModalProps>(
|
||||
overlayClassName="navds-modal__overlay"
|
||||
shouldCloseOnOverlayClick={shouldCloseOnOverlayClick}
|
||||
onRequestClose={(e) => onModalCloseRequest(e)}
|
||||
aria={{
|
||||
describedby: ariaDescribedBy,
|
||||
labelledby: ariaLabelledBy,
|
||||
modal: ariaModal,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
<Button
|
||||
className={cl("navds-modal__button", {
|
||||
"navds-modal__button--shake": shouldCloseOnOverlayClick,
|
||||
})}
|
||||
size="small"
|
||||
variant="secondary"
|
||||
ref={buttonRef}
|
||||
aria-label="lukk modalvindu"
|
||||
onClick={onClose}
|
||||
>
|
||||
<Close title="X-ikon for å lukke modal" />
|
||||
</Button>
|
||||
{closeButton && (
|
||||
<Button
|
||||
className={cl("navds-modal__button", {
|
||||
"navds-modal__button--shake": shouldCloseOnOverlayClick,
|
||||
})}
|
||||
size="small"
|
||||
variant="tertiary"
|
||||
ref={buttonRef}
|
||||
onClick={onClose}
|
||||
>
|
||||
<Close title="Lukk modalvindu" />
|
||||
</Button>
|
||||
)}
|
||||
</ReactModal>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ Modal.setAppElement("#root");
|
||||
export const All = () => {
|
||||
const [open, setOpen] = useState(true);
|
||||
const [openTwo, setOpenTwo] = useState(false);
|
||||
const [openThree, setOpenThree] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -46,6 +47,21 @@ export const All = () => {
|
||||
</p>
|
||||
</Modal.Content>
|
||||
</Modal>
|
||||
<button onClick={() => setOpenThree(true)}>
|
||||
Open modal without x-button
|
||||
</button>
|
||||
<Modal
|
||||
open={openThree}
|
||||
closeButton={false}
|
||||
onClose={() => setOpenThree(false)}
|
||||
>
|
||||
<Modal.Content>
|
||||
<h1>Header</h1>
|
||||
<h2>subheader</h2>
|
||||
<p>Cupidatat irure ipsum veniam ad in esse.</p>
|
||||
<p>Cillum tempor pariatur amet ut laborum Lorem enim enim.</p>
|
||||
</Modal.Content>
|
||||
</Modal>
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -55,11 +55,7 @@ const PageHeader = forwardRef<HTMLDivElement, PageHeaderProps>(
|
||||
<div className="navds-page-header__illustration">{illustration}</div>
|
||||
)}
|
||||
<div className="navds-page-header__wrapper">
|
||||
<Heading
|
||||
className="navds-page-header__title"
|
||||
size="2xlarge"
|
||||
level="1"
|
||||
>
|
||||
<Heading className="navds-page-header__title" size="xlarge" level="1">
|
||||
{children}
|
||||
</Heading>
|
||||
{description && (
|
||||
|
||||
@@ -44,6 +44,12 @@ export interface PopoverProps extends HTMLAttributes<HTMLDivElement> {
|
||||
* @default 16 w/arrow, 4 w/no-arrow
|
||||
*/
|
||||
offset?: number;
|
||||
/**
|
||||
* Changes what CSS position property to use
|
||||
* You want to use "fixed" if reference element is inside a fixed container, but popover is not
|
||||
* @default "absolute"
|
||||
*/
|
||||
strategy?: "absolute" | "fixed";
|
||||
}
|
||||
|
||||
const useEventLister = (event: string, callback) =>
|
||||
@@ -72,6 +78,7 @@ const Popover = forwardRef<HTMLDivElement, PopoverProps>(
|
||||
onClose,
|
||||
placement = "right",
|
||||
offset,
|
||||
strategy = "absolute",
|
||||
...rest
|
||||
},
|
||||
ref
|
||||
@@ -137,6 +144,7 @@ const Popover = forwardRef<HTMLDivElement, PopoverProps>(
|
||||
},
|
||||
},
|
||||
],
|
||||
strategy,
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ export interface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {
|
||||
/**
|
||||
* Sizes from largest "2xl" to smallest "s"
|
||||
*/
|
||||
size: "2xlarge" | "xlarge" | "large" | "medium" | "small" | "xsmall";
|
||||
size: "xlarge" | "large" | "medium" | "small" | "xsmall";
|
||||
/**
|
||||
* Heading text
|
||||
*/
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
.typo-story > div:nth-child(even) {
|
||||
background: var(--navds-global-color-gray-200);
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
import { Meta } from "@storybook/addon-docs";
|
||||
import { Alert, Heading, BodyLong } from "@navikt/ds-react";
|
||||
|
||||
<Meta title="ds-react/Typography/intro" />
|
||||
|
||||
# Hvordan ta i bruk typografien
|
||||
|
||||
Typografien kan tas i bruk som React komponenter eller ved å ta i bruk css-stilene.
|
||||
Se eksemplene under ds-react tabben her i storybook for å se hvordan man tar i bruk både react og stilpakken for dette oppsettet.
|
||||
|
||||
Oppsettet er forbedret med blandt annet letter-spacing og line-height.
|
||||
I tillegg kan man nå sette `spacing` proppen og man får da automatisk margin-bottom på typo-elementet.
|
||||
Da kan man lett sikre riktig spacing mellom tekst i en artikkel.
|
||||
|
||||
Font-size er skrevet med REM, men basert på 16px root font size.
|
||||
Dette vil si at de som har forstørret font-size på root vil ende opp med større font enn forventet.
|
||||
For de som har satt root font size til 18px (1.125rem) kan da "fikse" dette ved å endre tilbake til 16px,
|
||||
da det nye typo-oppsettet fikser større font, eller man ta i bruk css-en under.
|
||||
|
||||
Denne stylingen vil overskrive default variablene og tilpasse font-size.
|
||||
|
||||
```css
|
||||
/* autogenerated fix for 18px root-font-size*/
|
||||
:root {
|
||||
--navds-font-size-heading-2xlarge: 2.2222222222222223rem;
|
||||
--navds-font-size-heading-xlarge: 1.7777777777777777rem;
|
||||
--navds-font-size-heading-large: 1.5555555555555556rem;
|
||||
--navds-font-size-heading-medium: 1.3333333333333333rem;
|
||||
--navds-font-size-heading-small: 1.1111111111111112rem;
|
||||
--navds-font-size-xlarge: 1.1111111111111112rem;
|
||||
--navds-font-size-large: 1rem;
|
||||
--navds-font-size-medium: 0.8888888888888888rem;
|
||||
--navds-font-size-small: 0.7777777777777778rem;
|
||||
}
|
||||
```
|
||||
|
||||
Vi anbefaler å før eller siden endre tilbake til default root font size da designsystemet sine nye
|
||||
komponenter og design-tokens er basert på dette. Endringen til 18px root font size var i grunn for å teste en løsning for å
|
||||
forstørre font, noe som er fikset ved nye typo-løsningen. Vi vil derfor unngå å måtte ha midlertidge patcher/fikser
|
||||
for å tilpasse systemet for alle de forskjellige variantene av font size på root.
|
||||
|
||||
## Migrasjonsguide fra `nav-frontend-typografi` til `@navikt/ds-react`
|
||||
|
||||
De nye typografi-komponentene er ikke helt en-til-en med de gamle, så det kan hende du må trekke på en designer om du er usikker på hvilken komponent du skal velge. Eller du kan spørre en av oss i designsystemet.
|
||||
|
||||
### Overskrifter
|
||||
|
||||
Overskrifters tekststørrelse er nå uavhengig heading-nivå. Det betyr at du står fritt til å sørge for at overskrift-hierarkiet stemmer for din side, uavhengig av visuelt hierarki. Før kunne det være trøblete om men f.eks. ønsket seg en h1, men `<Sidetittel>` opplevdes som for stor.
|
||||
|
||||
En direkte en-til-en oversettelse av gamle komponenter til nye, hvor man bevarer størrelsene, ser sånn ut:
|
||||
|
||||
`<Sidetittel> -> <Heading size="2xlarge">`
|
||||
|
||||
`<Innholdstittel> -> <Heading size="xlarge">`
|
||||
|
||||
`<Systemtittel> -> <Heading size="medium">`
|
||||
|
||||
`<Undertittel> -> <Heading size="small">`
|
||||
|
||||
<Alert variant="warning">
|
||||
Pass på å sette riktig `level` i hver Heading-komponent for å ivareta
|
||||
hierarkiet (h1-h6).
|
||||
</Alert>
|
||||
|
||||
### Brødtekst
|
||||
|
||||
De nye komponentene for brødtekst heter `<BodyLong>` og `<BodyShort>`. `<BodyLong>` er ment å brukes der det er snakk om løpende tekst, f.eks. i en artikkel. I komponent-tekst som med fordel kan være mer kompakt skal `<BodyShort>` brukes, for den har en lavere linjehøyde.
|
||||
|
||||
Ny brødtekst-størrelse er 18px. Om du bygger grensesnitt med kompakt design (les; interne flater) der du ønsker å fortsette å bruke 16px brødtekst så finnes det en `<BodyLong size="small">` og `<BodyShort size="small">` som er til for deg.
|
||||
|
||||
`<Normaltekst> ->` `<BodyLong>`/`<BodyShort>` (muligens med `size=small`)
|
||||
|
||||
### Andre komponenter
|
||||
|
||||
`<Ingress> -> <Ingress>`
|
||||
|
||||
`<Element> -> <Label>`
|
||||
|
||||
`<UndertekstBold> -> <Detail>`
|
||||
|
||||
`<Undertekst> -> <Detail size="small">`
|
||||
|
||||
`<Feilmelding>` Denne har vi valgt å ikke videreføre, for vi er usikre på om det er behov for en egen komponent. Skriv gjerne en melding på #designsystem eller send en PM til @andreas.nordahl eller @ken.aleksander.johansen om du savner den.
|
||||
@@ -1,6 +1,5 @@
|
||||
import React from "react";
|
||||
import { Heading, BodyShort, BodyLong, Detail, Ingress, Label } from "../index";
|
||||
import "./index.css";
|
||||
|
||||
export default {
|
||||
title: "ds-react/typography",
|
||||
@@ -16,7 +15,7 @@ const TitleTemplate = ({ level, size, spacing }) => (
|
||||
);
|
||||
|
||||
export const HeadingStory = TitleTemplate.bind({});
|
||||
HeadingStory.args = { level: 1, size: "2xlarge", spacing: false };
|
||||
HeadingStory.args = { level: 1, size: "xlarge", spacing: false };
|
||||
|
||||
const IngressTemplate = ({ spacing }) => (
|
||||
<Ingress spacing={spacing}>{lorem()}</Ingress>
|
||||
@@ -64,8 +63,8 @@ DetailStory.args = { spacing: false, size: "medium" };
|
||||
export const SideInnholdEksempel = () => {
|
||||
return (
|
||||
<div style={{ maxWidth: 600 }}>
|
||||
<Heading level={"1"} size="2xlarge" spacing>
|
||||
Title lvl 1 2xlarge
|
||||
<Heading level={"1"} size="xlarge" spacing>
|
||||
Title lvl 1 xlarge
|
||||
</Heading>
|
||||
<BodyLong spacing>
|
||||
BodyLong: Aliqua ad et nisi commodo sit excepteur in commodo proident
|
||||
@@ -87,7 +86,7 @@ export const SideInnholdEksempel = () => {
|
||||
sunt proident irure consectetur excepteur.
|
||||
</BodyLong>
|
||||
<Heading level={"2"} size="xlarge" spacing>
|
||||
Title lvl 2 xlarge
|
||||
Title lvl 2 large
|
||||
</Heading>
|
||||
<Ingress spacing>
|
||||
Ingress: Mollit incididunt incididunt officia amet est et non aliqua
|
||||
@@ -0,0 +1,2 @@
|
||||
src/tokens.ts
|
||||
tailwind.config.js
|
||||
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
transform: {
|
||||
"^.+\\.ts?$": "ts-jest",
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "@navikt/ds-tailwind",
|
||||
"version": "0.1.2",
|
||||
"private": false,
|
||||
"description": "Auto-generated tailwind config based on @navikt/ds-tokens",
|
||||
"author": "NAV Designsystem team",
|
||||
"keywords": [
|
||||
"tailwind",
|
||||
"design-tokens"
|
||||
],
|
||||
"main": "tailwind.config.js",
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"tailwind.config.js"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "ts-node ./src",
|
||||
"test": "jest"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/navikt/nav-frontend-moduler.git",
|
||||
"directory": "@navikt/core/tailwind"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@navikt/ds-tokens": "^0.8.1",
|
||||
"@types/jest": "^27.0.1",
|
||||
"jest": "^27.2.0",
|
||||
"lodash": "^4.17.21",
|
||||
"ts-jest": "^27.0.5",
|
||||
"ts-node": "^10.3.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
// @ts-ignore
|
||||
import * as TokensBuild from "@navikt/ds-tokens/dist/tokens";
|
||||
import { writeFileSync } from "fs";
|
||||
import { kebabCase } from "lodash";
|
||||
import Reducer from "./reducer";
|
||||
|
||||
const tokens = Object.entries(TokensBuild).reduce(
|
||||
(old, [key, val]) => ({
|
||||
...old,
|
||||
[kebabCase(key).replace("navds-", "")]: val,
|
||||
}),
|
||||
{}
|
||||
);
|
||||
|
||||
const config = {
|
||||
theme: {
|
||||
colors: Reducer(tokens, ["semantic-color", "global-color"]),
|
||||
extend: {
|
||||
spacing: Reducer(tokens, ["spacing"]),
|
||||
zIndex: Reducer(tokens, ["z-index"]),
|
||||
boxShadow: Reducer(tokens, ["shadow"]),
|
||||
fontWeight: Reducer(tokens, ["font-weight"]),
|
||||
fontSize: Reducer(tokens, ["font-size"]),
|
||||
lineHeight: Reducer(tokens, ["font-line-height"]),
|
||||
fontFamily: Reducer(tokens, ["font-family"]),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const outputString = `module.exports = ${JSON.stringify(config, null, 2)};`;
|
||||
|
||||
writeFileSync("tailwind.config.js", outputString);
|
||||
|
||||
console.log("Success: Tailwind config ");
|
||||
@@ -0,0 +1,20 @@
|
||||
const replaceKey = (s: string, keys: string[]) => {
|
||||
let key = s;
|
||||
keys.forEach((k) => {
|
||||
key = key.replace(`${k}-`, "");
|
||||
});
|
||||
return key;
|
||||
};
|
||||
|
||||
/* Cherry-picks object keys we want */
|
||||
const Reducer = (
|
||||
tokens: { [key: string]: string | number },
|
||||
replace: string[]
|
||||
) =>
|
||||
Object.entries(tokens).reduce((old, [key, value]) => {
|
||||
return replace.find((v) => key.startsWith(v))
|
||||
? { ...old, [replaceKey(key, replace)]: value }
|
||||
: { ...old };
|
||||
}, {});
|
||||
|
||||
export default Reducer;
|
||||
@@ -0,0 +1,42 @@
|
||||
import Reducer from "../reducer";
|
||||
|
||||
describe("Check correct parsing of tailind tokens", () => {
|
||||
test("Check reducer function", () => {
|
||||
expect(
|
||||
Reducer(
|
||||
{
|
||||
"shadow-focus-inverted":
|
||||
"0 0 0 3px var(navds-semantic-color-focus-inverted)",
|
||||
"z-index-focus": 10,
|
||||
"global-color-blue-300": "rgba(102, 165, 244, 1)",
|
||||
"semantic-color-interaction-primary":
|
||||
"var(--navds-gloab-color-blue-300)",
|
||||
},
|
||||
["shadow"]
|
||||
)
|
||||
).toEqual({
|
||||
"focus-inverted": "0 0 0 3px var(navds-semantic-color-focus-inverted)",
|
||||
});
|
||||
});
|
||||
test("Check reducer function with multiple keys", () => {
|
||||
expect(
|
||||
Reducer(
|
||||
{
|
||||
"shadow-focus-inverted":
|
||||
"0 0 0 3px var(navds-semantic-color-focus-inverted)",
|
||||
"z-index-focus": 10,
|
||||
"global-color-transparent": "rgba(255, 255, 255, 0)",
|
||||
"global-color-white": "rgba(255, 255, 255, 1)",
|
||||
"semantic-color-border-inverted": "var(navds-global-color-gray-200)",
|
||||
"semantic-color-border-muted": "var(navds-global-color-gray-400)",
|
||||
},
|
||||
["global-color", "semantic-color"]
|
||||
)
|
||||
).toEqual({
|
||||
transparent: "rgba(255, 255, 255, 0)",
|
||||
white: "rgba(255, 255, 255, 1)",
|
||||
"border-inverted": "var(navds-global-color-gray-200)",
|
||||
"border-muted": "var(navds-global-color-gray-400)",
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"esModuleInterop": true,
|
||||
"allowJs": true
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
@@ -9,6 +9,7 @@ StyleDictionary.registerTransform({
|
||||
});
|
||||
|
||||
const StyleDictionaryExtended = StyleDictionary.extend(
|
||||
__dirname + "/config.json"
|
||||
__dirname + "/config.js"
|
||||
);
|
||||
|
||||
StyleDictionaryExtended.buildAllPlatforms();
|
||||
@@ -0,0 +1,52 @@
|
||||
module.exports = {
|
||||
source: ["src/index.js", "src/**/*.json"],
|
||||
platforms: {
|
||||
scss: {
|
||||
transformGroup: "scss",
|
||||
buildPath: "dist/",
|
||||
files: [
|
||||
{
|
||||
destination: "tokens.scss",
|
||||
format: "scss/variables",
|
||||
},
|
||||
],
|
||||
},
|
||||
less: {
|
||||
transformGroup: "less",
|
||||
buildPath: "dist/",
|
||||
files: [
|
||||
{
|
||||
destination: "tokens.less",
|
||||
format: "less/variables",
|
||||
},
|
||||
],
|
||||
},
|
||||
css: {
|
||||
transformGroup: "css",
|
||||
buildPath: "dist/",
|
||||
files: [
|
||||
{
|
||||
destination: "tokens.css",
|
||||
format: "css/variables",
|
||||
options: {
|
||||
outputReferences: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
js: {
|
||||
transformGroup: "js",
|
||||
buildPath: "dist/",
|
||||
files: [
|
||||
{
|
||||
destination: "tokens.js",
|
||||
format: "javascript/es6",
|
||||
},
|
||||
{
|
||||
destination: "tokens-cjs.js",
|
||||
format: "javascript/module-flat",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -1,52 +0,0 @@
|
||||
{
|
||||
"source": ["src/index.js", "src/**/*.json"],
|
||||
"platforms": {
|
||||
"scss": {
|
||||
"transformGroup": "scss",
|
||||
"buildPath": "dist/",
|
||||
"files": [
|
||||
{
|
||||
"destination": "tokens.scss",
|
||||
"format": "scss/variables"
|
||||
}
|
||||
]
|
||||
},
|
||||
"less": {
|
||||
"transformGroup": "less",
|
||||
"buildPath": "dist/",
|
||||
"files": [
|
||||
{
|
||||
"destination": "tokens.less",
|
||||
"format": "less/variables"
|
||||
}
|
||||
]
|
||||
},
|
||||
"css": {
|
||||
"transformGroup": "css",
|
||||
"buildPath": "dist/",
|
||||
"files": [
|
||||
{
|
||||
"destination": "tokens.css",
|
||||
"format": "css/variables",
|
||||
"options": {
|
||||
"outputReferences": true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"js": {
|
||||
"transformGroup": "js",
|
||||
"buildPath": "dist/",
|
||||
"files": [
|
||||
{
|
||||
"destination": "tokens.js",
|
||||
"format": "javascript/es6"
|
||||
},
|
||||
{
|
||||
"destination": "tokens-cjs.js",
|
||||
"format": "javascript/module-flat"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-tokens",
|
||||
"version": "0.7.1",
|
||||
"version": "0.8.1",
|
||||
"private": false,
|
||||
"description": "Auto-generated design-tokens for NAV design-systems framework",
|
||||
"author": "NAV Designsystem team",
|
||||
@@ -14,7 +14,8 @@
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"/dist",
|
||||
"/src"
|
||||
"/src",
|
||||
"/tailwind"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "node ./build.js",
|
||||
|
||||
@@ -74,16 +74,25 @@
|
||||
"value": "rgba(241, 241, 241, 1)"
|
||||
},
|
||||
"200": {
|
||||
"value": "rgba(201, 201, 201, 1)"
|
||||
"value": "rgba(229, 229, 229, 1)"
|
||||
},
|
||||
"300": {
|
||||
"value": "rgba(207, 207, 207, 1)"
|
||||
},
|
||||
"400": {
|
||||
"value": "rgba(160, 160, 160, 1)"
|
||||
"value": "rgba(176, 176, 176, 1)"
|
||||
},
|
||||
"500": {
|
||||
"value": "rgba(143, 143, 143, 1)"
|
||||
},
|
||||
"600": {
|
||||
"value": "rgba(106, 106, 106, 1)"
|
||||
"value": "rgba(112, 112, 112, 1)"
|
||||
},
|
||||
"700": {
|
||||
"value": "rgba(89, 89, 89, 1)"
|
||||
},
|
||||
"800": {
|
||||
"value": "rgba(79, 79, 79, 1)"
|
||||
"value": "rgba(64, 64, 64, 1)"
|
||||
},
|
||||
"900": {
|
||||
"value": "rgba(38, 38, 38, 1)"
|
||||
|
||||
@@ -66,3 +66,9 @@
|
||||
outline: none;
|
||||
box-shadow: inset 0 0 0 2px var(--navds-dropdown-item-color-focus);
|
||||
}
|
||||
|
||||
.navdsi-dropdown__item:disabled {
|
||||
opacity: 0.3;
|
||||
background: transparent;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-css-internal",
|
||||
"version": "0.7.0",
|
||||
"version": "0.7.1",
|
||||
"private": false,
|
||||
"description": "Css for NAV internal Designsystem components",
|
||||
"author": "NAV Designsystem team",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-react-internal",
|
||||
"version": "0.9.6",
|
||||
"version": "0.11.4",
|
||||
"private": false,
|
||||
"description": "NAV internal designsystem react components",
|
||||
"author": "NAV Designsystem team",
|
||||
@@ -33,8 +33,8 @@
|
||||
"watch": "tsc --watch -p tsconfig.esm.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@navikt/ds-icons": "^0.7.2",
|
||||
"@navikt/ds-react": "^0.14.6",
|
||||
"@navikt/ds-icons": "^0.8.3",
|
||||
"@navikt/ds-react": "^0.16.4",
|
||||
"@popperjs/core": "^2.10.1",
|
||||
"classnames": "^2.3.1",
|
||||
"copy-to-clipboard": "^3.3.1",
|
||||
|
||||
@@ -7,7 +7,7 @@ import { Success } from "@navikt/ds-react";
|
||||
# Hvordan ta i bruk CopyToClipboard
|
||||
|
||||
Innholdet i `copyText` vil bli kopiert til clipboard, mens innholdet i `popoverText`
|
||||
brukes i popover. Hvis komponenten ikke har noen children (tekst i button) vil da en "sr-only" tekst blie
|
||||
brukes i popover. Hvis komponenten ikke har noen children (tekst i button) vil da en "navds-sr-only" tekst bli
|
||||
lagt på knappen med tekst "Kopier copyText"
|
||||
|
||||
```jsx
|
||||
|
||||
@@ -27,6 +27,7 @@ export const All = () => (
|
||||
<Dropdown.Menu.List>
|
||||
<Dropdown.Menu.List.Item>Gosys</Dropdown.Menu.List.Item>
|
||||
<Dropdown.Menu.List.Item>Psys</Dropdown.Menu.List.Item>
|
||||
<Dropdown.Menu.List.Item disabled>Infotrygd</Dropdown.Menu.List.Item>
|
||||
</Dropdown.Menu.List>
|
||||
</Dropdown.Menu>
|
||||
</Dropdown>
|
||||
|
||||
@@ -1,516 +0,0 @@
|
||||
# Endringslogg
|
||||
|
||||
## September 2021
|
||||
|
||||
### Større oppdaterting for ds-react og ds-css
|
||||
|
||||
- Følg migreringsguiden: https://navikt.github.io/Designsystemet/?path=/story/ds-react-migration--page
|
||||
|
||||
## August 2021
|
||||
|
||||
### Skjema-elementer i `ds-react`-pakken
|
||||
|
||||
- Pakken ds-react og ds-css har nå implementert skjemakomponenter
|
||||
- Kan sees her: https://navikt.github.io/Designsystemet/?path=/story/ds-react-form-checkbox--all
|
||||
|
||||
### Ikoner
|
||||
|
||||
- `Addpeople` renamet til `Addperson` i ds-icons
|
||||
- `Desicion`-ikon lagt til.
|
||||
|
||||
## Juli 2021
|
||||
|
||||
### SpeechBubble komponent lagt til i ds-react
|
||||
|
||||
- Oppdatert SpeechBubble kode og design lagt til i ds-react pakken
|
||||
|
||||
### Loader komponent i ds-react (spinner)
|
||||
|
||||
- Loader er nå oppdatert og lagt til i ds-react
|
||||
|
||||
### Oppdatert AccordionMenu
|
||||
|
||||
- AccordionMenu har fått oppdatert design for å synce med figma
|
||||
|
||||
### MicroCard komponent
|
||||
|
||||
- Liten tag brukt for lenger i produktsider er lagt tilk i ds-react
|
||||
|
||||
### Oppdatert styling for ds-react komponenter + button
|
||||
|
||||
- Action/Hoved knapp og Danger/Fare knapp har fått oppdatert styling i ds-react og nav-frontend-knapper
|
||||
- I tillegg har noen komponenter ds-css fått justert styling for å matche Figma bedre.
|
||||
|
||||
### Ny Header komponent for produktsider i ds-react
|
||||
|
||||
[#1128](https://github.com/navikt/nav-frontend-moduler/pull/1128)
|
||||
|
||||
### Fikset RefAttributes for Accordion
|
||||
|
||||
[#1122](https://github.com/navikt/nav-frontend-moduler/pull/1122)
|
||||
|
||||
- Ref er satt til type HTMLButtonElement nå istedenfor HTMLDivElement.
|
||||
- Fikser SSR/CSR problem med forskjellige id-er som ble laget på server vs client.
|
||||
|
||||
## Juni 2021
|
||||
|
||||
### Verktøykasse MVP
|
||||
|
||||
- MVP for verktøykassen ble publisert til design.nav.no
|
||||
|
||||
### Fjernet smoothscroll fra ds-css
|
||||
|
||||
[#1123](https://github.com/navikt/nav-frontend-moduler/pull/1123)
|
||||
|
||||
- ds-css pakken defaulter ikke til at smoothscroll er satt. Dette er gjort av UU årsaker.
|
||||
|
||||
### Linkpanel lagt til i `ds-react`-pakken
|
||||
|
||||
### Nytt typo-oppsett for ds-react, ds-css og ds-tokens
|
||||
|
||||
[#1079](https://github.com/navikt/nav-frontend-moduler/pull/1079)
|
||||
|
||||
### Nytt typo-oppsett for ds-react, ds-css og ds-tokens
|
||||
|
||||
[#1079](https://github.com/navikt/nav-frontend-moduler/pull/1079)
|
||||
|
||||
[Typo med spacing](https://navikt.github.io/Designsystemet/?path=/story/ds-react-typography--typo-med-spacing)
|
||||
[Typo uten spacing](https://navikt.github.io/Designsystemet/?path=/story/ds-react-typography--typo-uten-spacing)
|
||||
[Bruks eksempel](https://navikt.github.io/Designsystemet/?path=/story/ds-react-typography--side-innhold-eksempel)
|
||||
|
||||
Ds-react, ds-css og ds-tokens er alle minor-bumpet
|
||||
|
||||
Nye komponenter for typografi:
|
||||
|
||||
- Title: Heading
|
||||
- Ingress
|
||||
- BodyLong: Lengre tekster, tenk en vanlig paragraf
|
||||
- BodyShort: Mindre tekster, tenk teksten på en knapp eller label
|
||||
- Label
|
||||
- Detail: Detaljetekst på 14px
|
||||
|
||||
Ds-css og ds-tokens er endret for å tilrettelegge for disse. Diverse komponenter i ds-react bruker nå også typo-stilene for å sikre riktig typo.
|
||||
|
||||
## 21. Mai 2021
|
||||
|
||||
### Popover-position oppdateres nå onMount
|
||||
|
||||
[#1104](https://github.com/navikt/nav-frontend-moduler/pull/1104)
|
||||
|
||||
- Hvis popover mountes med `ankerEl` så vil posisjon oppdateres riktig nå.
|
||||
- OPS! Tilfeller ved bruk av useRef som `ankerEl` kan føre til feil i posisjonering da Popover mountes med `ankerEl == null`, og da oppdatering av ref ikke fører til props oppdatering siden det er en ref. Anbefales å ta i bruk state for `ankerEl`
|
||||
|
||||
## 19. Mai 2021
|
||||
|
||||
### Oppdatert fargepalett
|
||||
|
||||
[#1092](https://github.com/navikt/nav-frontend-moduler/pull/1092)
|
||||
|
||||
- Alle nav-frontend pakker som `nav-frontend-core` berører vil major bumpes, inkludert `na v-frontend-core`.
|
||||
- `@navikt/ds-tokens`, `@navikt/ds-css` og `@navikt/ds-react` vil minor bumpes
|
||||
|
||||
- `orangeFocus` og alle variantene av denne fargen er fjernet fra `nav-frontend-core`
|
||||
- `navRod`sine lighten/darken varianter er fjernet fra `nav-frontend-core`. Bruk `redError` som erstattning.
|
||||
- `@navikt/ds-tokens` har nå `purple` og `limegreen` farger tilgjengelige
|
||||
|
||||
### Prop for hvit bakgrunn på veileder sin snakkeboble
|
||||
|
||||
[#1099](https://github.com/navikt/nav-frontend-moduler/pull/1099)
|
||||
|
||||
- Kan nå bruke prop `hvitSnakkeboble` for å setteakgrunnen på snakkeboble til hvit.
|
||||
|
||||
## 18. Mai 2021
|
||||
|
||||
### Oppdatert bakgrunnsfarge på Tag/Etikett for å synke med figma
|
||||
|
||||
[#1097](https://github.com/navikt/nav-frontend-moduler/pull/1097)
|
||||
[#1094](https://github.com/navikt/nav-frontend-moduler/pull/1094)
|
||||
|
||||
- Bakgrunnene til de fire komponent-variasjonenen er nå endret til `Lighten80` istedenfor `Lighten60`
|
||||
|
||||
### Oppdatert textareaRef prop for textarea-controlled
|
||||
|
||||
[#1098](https://github.com/navikt/nav-frontend-moduler/pull/1098)
|
||||
|
||||
- Legger på optional argument i textareaRef-propen på samme måte som i Textarea-componenten.
|
||||
|
||||
### BekreftCheckboksPanel label har nå underline onHover
|
||||
|
||||
[#1095](https://github.com/navikt/nav-frontend-moduler/pull/1095)
|
||||
|
||||
- Fikser en uu-feil hvor forskjellen på default og hover stil ikke var stor nok.
|
||||
|
||||
## 14. Mai 2021
|
||||
|
||||
### @navikt/ds-tokens eksporteres nå også i CommonJs format
|
||||
|
||||
## 13. Mai 2021
|
||||
|
||||
### Typeguard for children i Tekstomrade-komponenten
|
||||
|
||||
[#1089](https://github.com/navikt/nav-frontend-moduler/pull/1089)
|
||||
|
||||
- Sjekker at children == string, hvis ikke return null
|
||||
|
||||
## 04. Mai 2021
|
||||
|
||||
### Forbedret scroll-behavior for sticky-panel
|
||||
|
||||
[#1084](https://github.com/navikt/nav-frontend-moduler/pull/1084)
|
||||
|
||||
- Oppførselen til menyen scrollet separat på mobil-skjermer (< 648px), noe som førte til en litt rar interaksjon. Menyen og innholdet under flyter nå naturlig uten noen overflow og max-height.
|
||||
|
||||
## 30. April 2021
|
||||
|
||||
### xxxl -> 3xl etc
|
||||
|
||||
[#1086](https://github.com/navikt/nav-frontend-moduler/pull/1086)
|
||||
|
||||
### AnchorMenu history-state fiks
|
||||
|
||||
[#1085](https://github.com/navikt/nav-frontend-moduler/pull/1085)
|
||||
|
||||
- Beholder state-objektet når history oppdateres ved scrolling med anchor-menu. Dette benyttes ved async navigering mellom sider i bl.a. next.js, og denne vil brekke dersom state'en overskrives.
|
||||
|
||||
- Bruker replaceState istedenfor pushState slik at frem/tilbake-knapper i browser oppfører seg mer som forventet
|
||||
|
||||
## 27. April 2021
|
||||
|
||||
### Kan nå bruke className på `Popover`-komponent
|
||||
|
||||
[#1082](https://github.com/navikt/nav-frontend-moduler/pull/1082)
|
||||
|
||||
- Bruker kan nå bruke className som en prop på `<Popover />` uten at den overskriver komponentens styling
|
||||
|
||||
### Fikser Checkbokspanel focus+feil markering
|
||||
|
||||
[#1081](https://github.com/navikt/nav-frontend-moduler/pull/1081)
|
||||
|
||||
- Fokusmarkering vises nå når man har focus + feil
|
||||
|
||||
## 21. April 2021
|
||||
|
||||
## Active stil for secondary/normal-knapp er endret for å skille seg fra hover
|
||||
|
||||
[#1062](https://github.com/navikt/nav-frontend-moduler/pull/1062)
|
||||
|
||||
## 19. April 2021
|
||||
|
||||
### Modal-overlay klasse for @navikt/ds-css er nå `fixed
|
||||
|
||||
[#1074](https://github.com/navikt/nav-frontend-moduler/pull/1074)
|
||||
|
||||
- `absolute -> fixed`
|
||||
|
||||
## 16. April 2021
|
||||
|
||||
### Fokusmarkering forsvinner ikke nå onHover
|
||||
|
||||
[#1072](https://github.com/navikt/nav-frontend-moduler/pull/1072)
|
||||
|
||||
### Scroll er nå bare "smooth" onFocus
|
||||
|
||||
[#1071](https://github.com/navikt/nav-frontend-moduler/pull/1071)
|
||||
|
||||
Smooth-scroll bare satt i html:focus-within
|
||||
Slipper da at det er smooth-scroll når man gjør eks ctrl + f søk på siden.
|
||||
|
||||
Takk for tips @winsvold !
|
||||
|
||||
## 08. April 2021
|
||||
|
||||
### Gråskala er endret i `nav-frontend-core`
|
||||
|
||||
[#1068](https://github.com/navikt/nav-frontend-moduler/pull/1068)
|
||||
|
||||
- Gråfargene er endret til en mer nøytral og leselig farge enn tidligere.
|
||||
- Alle pakker som bruker `nav-frontend-core` eller har tilknytning til den (inkludert selve pakken) er minor bumpet fra x.0.x -> x.1.0.
|
||||
- Letteste måten å oppdatere pakkene på er å kjøre `npm update`
|
||||
- Hvis man ønsker å bumpe pakkene manuelt så kan alle `nav-frontend-*` pakker minor bumpes til x.1.x utenom disse:
|
||||
- - nav-frontend-chevron-style
|
||||
- - nav-frontend-chevron
|
||||
- - nav-frontend-fullbreddeknapp-style
|
||||
- - nav-frontend-grid-style
|
||||
- - nav-frontend-ikoner-assets
|
||||
- - nav-frontend-js-utils
|
||||
- - nav-frontend-spinner-style
|
||||
- - nav-frontend-spinner
|
||||
|
||||
## 07. April 2021
|
||||
|
||||
### Sourcemapping ds-icons og ds-react
|
||||
|
||||
[#1064](https://github.com/navikt/nav-frontend-moduler/pull/1064)
|
||||
[#1065](https://github.com/navikt/nav-frontend-moduler/pull/1065)
|
||||
|
||||
## 24. Mars 2021
|
||||
|
||||
### Smoothscroll og reduced animations
|
||||
|
||||
[#1055](https://github.com/navikt/nav-frontend-moduler/pull/1055)
|
||||
|
||||
- `@navikt/ds-css` sin baseline setter nå `scroll-behavior: smooth;` på html by default
|
||||
- Ved `(prefers-reduced-motion: reduce)` vil baseline redusere animasjoner.
|
||||
|
||||
## 10. Mars 2021
|
||||
|
||||
### @navikt/ds-react importerer nå ikke styling i selve komponenten
|
||||
|
||||
[#1030](https://github.com/navikt/nav-frontend-moduler/pull/1030)
|
||||
|
||||
- Dette betyr at pakken `@navikt/ds-css` må importeres separat ved å endten linke til pakken i `<head>` eller importere den høyt i dom-strukturen.
|
||||
|
||||
### @navikt/ds-react og @navikt/ds-icons er nå treeshakable
|
||||
|
||||
[#1033](https://github.com/navikt/nav-frontend-moduler/pull/1033)
|
||||
|
||||
- Begge pakkene defaulter nå til esm versjonen av pakken. De vanligste bundlerne hånterer da treeshaking selv når pakken blir brukt. Hvis man man ønsker å ta i bruk Commonjs versjonen kan man importere direkte fra `cjs` dir i pakken
|
||||
|
||||
```bash
|
||||
Esm -> import { Button } from "@navikt/ds-react";
|
||||
Cjs -> import { Button } from "@navikt/ds-react/cjs";
|
||||
```
|
||||
|
||||
Siden eks noen test-libraries ikke støtter ESM enda kan man legge denne til i jest config for å bruke pakkene:
|
||||
|
||||
```
|
||||
"moduleNameMapper": {
|
||||
"@navikt/ds-react(.*)": "@navikt/ds-react/cjs$1",
|
||||
"@navikt/ds-icons(.*)": "@navikt/ds-icons/cjs$1"
|
||||
}
|
||||
```
|
||||
|
||||
### Oppdatert feil-styling og state-handling for skjemakomponenter
|
||||
|
||||
[#1018](https://github.com/navikt/nav-frontend-moduler/pull/1018)
|
||||
|
||||
- Feil på Skjemagruppe vil føre til feil-styling på checkbox/radio og checkboxpanel/radiopanel
|
||||
- Checkboxpanel, Radiopanel og Radio har nå feil-prop
|
||||
- Feil + disabled styling er satt til bare disabled nå.
|
||||
- checkbox/radio og checkboxpanel/radiopanel kan nå alle ta i bruk utenFeilPropagerings-prop
|
||||
|
||||
## 01. Mars 2021
|
||||
|
||||
### Nav-frontend-typografi-style støtter nå Less v4
|
||||
|
||||
[#1014](https://github.com/navikt/nav-frontend-moduler/pull/1014)
|
||||
|
||||
- Alle divisjoner i Less-filer er nå wrappet i parentes
|
||||
|
||||
## 22. Februar 2021
|
||||
|
||||
### Kan nå vise label på checkbox i første column i tabell
|
||||
|
||||
[#1000](https://github.com/navikt/nav-frontend-moduler/pull/1000)
|
||||
|
||||
- Ved å sette `data-label="true"` på <Checkbox/> som blir brukt i tabell, kan man nå vise label om ønsket
|
||||
|
||||
### Oppdatert Bekreftcheckboxpanel for bedre UU
|
||||
|
||||
[#1002](https://github.com/navikt/nav-frontend-moduler/pull/1002)
|
||||
|
||||
- Styling for Lenke blir nå endret ved bruk på Bekreftcheckboxpanel for å sikre god kontrast
|
||||
|
||||
## 19. Februar 2021
|
||||
|
||||
### Oppdatert animasjon Ekspanderbartpanel
|
||||
|
||||
[#993](https://github.com/navikt/nav-frontend-moduler/pull/993)
|
||||
|
||||
- Animasjonen er nå på 250ms, erstatter 400ms
|
||||
|
||||
## 15. Februar 2021
|
||||
|
||||
### Oppdatert dokumentasjon om obligatoriske felt i skjema
|
||||
|
||||
[#996](https://github.com/navikt/nav-frontend-moduler/pull/996)
|
||||
|
||||
- https://design.nav.no/patterns/form-validation
|
||||
|
||||
## 12. Februar 2021
|
||||
|
||||
### Proptable viser nå riktige default-values for props
|
||||
|
||||
[#988](https://github.com/navikt/nav-frontend-moduler/pull/988)
|
||||
|
||||
- Man kan nå se hva default-value er for props under teknisk side for komponenter
|
||||
- Eks: https://design.nav.no/components/alertstripe/technical
|
||||
|
||||
## 05. Februar 2021
|
||||
|
||||
### Komponenter støtter nå React v17
|
||||
|
||||
[#979](https://github.com/navikt/nav-frontend-moduler/pull/979)
|
||||
|
||||
- Alle react komponenter har nå devDep og peerDep `^16.8.0 || ^17.0.0`
|
||||
- React er fjernet som devDep for stilpakker
|
||||
|
||||
## 05. Februar 2021
|
||||
|
||||
### Ikon-nedlastning i PNG format
|
||||
|
||||
[#973](https://github.com/navikt/nav-frontend-moduler/pull/973)
|
||||
|
||||
- Ikonsiden tilbyr nå både nedlastning av ikoner i SVG og PNG format
|
||||
- Fargevelger for ikon er laget for å kunne laste ned ikonene med forskjellige farger.
|
||||
|
||||
## 29. Januar 2021
|
||||
|
||||
### Publisering av ikonpakke og ikonsøk
|
||||
|
||||
[#945](https://github.com/navikt/nav-frontend-moduler/pull/945)
|
||||
|
||||
- `@navikt/ds-icons` er publisert som version 0.1.0
|
||||
- Ikonsøket på design.nav.no er nå i bruk
|
||||
|
||||
## 25. Januar 2021
|
||||
|
||||
### Fjernet komponenten EtikettLiten
|
||||
|
||||
[#956](https://github.com/navikt/nav-frontend-moduler/pull/956)
|
||||
|
||||
- `Undertekst` kan brukes som erstatning da begge har samme styling.
|
||||
- Dette fører til en major bump fra v2 -> v3 for `nav-frontend-typografi`
|
||||
|
||||
### Element for sortering av tabell endres
|
||||
|
||||
[#893](https://github.com/navikt/nav-frontend-moduler/pull/893)
|
||||
|
||||
- ✅ `<button aria-label="Sorter column synkende">`
|
||||
- ❌ `<Lenke href="#">`
|
||||
|
||||
- Hover og fokusmarkering for element er endret, samt plassering av chevron [Eksempel](https://design.nav.no/components/tabell#sorterbar-tabell)
|
||||
|
||||
Hvordan ta i bruk oppdateringen:
|
||||
|
||||
- Oppdater `nav-frontend-tabell-styles` til v1.0.0
|
||||
- Legge til pakken `nav-frontend-knapper-style` som nå er en dependency.
|
||||
- Endre all bruk av `<Lenke>` i sortert tabell til `<button>`. Kan være lurt å lese de nye punktene her [tabell-UU](https://design.nav.no/components/tabell/accessibility) også da.
|
||||
- Sikre at prosjektet ditt kan håndtere SVG, da chevrons nå er svg og ikke css. Create-react-app gjør dette selv. Om du bruker webpack er dette den mest vanlige løsningen: [npmjs @svgr/webpack](https://www.npmjs.com/package/@svgr/webpack). Om du bruker VUE er dette en potensiell løsning [npmjs vue-svg-loader](https://www.npmjs.com/package/vue-svg-loader)
|
||||
|
||||
## 08. Januar 2021
|
||||
|
||||
### Oppdatert RadioPanel med prop radioRef
|
||||
|
||||
[Pull-request](https://github.com/navikt/nav-frontend-moduler/pull/943)
|
||||
|
||||
Kan nå sette ref på RadioPanel
|
||||
[Dokumentasjon](http://localhost:8000/components/radiopanelgruppe/#bruk-av-radioref)
|
||||
|
||||
## 04. Januar 2021
|
||||
|
||||
### Oppdaterte Alertstripe komponent for bedre UU
|
||||
|
||||
[Pull-request](https://github.com/navikt/nav-frontend-moduler/pull/940)
|
||||
|
||||
SVG-ikonene Alertstripe brukte har nå `role="img"` og `aria-label` for å fikse
|
||||
[WCAG 2.1 SC 1.1.1](https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html)
|
||||
|
||||
### Fikset Math kalkulering for LESS v4
|
||||
|
||||
[Pull-request](https://github.com/navikt/nav-frontend-moduler/pull/937)
|
||||
|
||||
- Chevron mixin kalkulerte `Floor` uten parentes rundt intern kalkulering, noe LESS v4 ikke taklet.
|
||||
|
||||
### Oppdatert eksempel-prosjekt for CRA og Webpack
|
||||
|
||||
[Pull-request](https://github.com/navikt/nav-frontend-moduler/pull/931)
|
||||
|
||||
- Oppdatert til nyeste CRA
|
||||
- Oppdatert til enklere eslint config
|
||||
- Satt opp prettier, pretty-quick og stylelint
|
||||
- Satt opp husky for commit og push (v4)
|
||||
- Begge bruker nå nav-frontend-core for scaffolding by default
|
||||
|
||||
## 21. Desember 2020
|
||||
|
||||
### Fikset mixins for LESS v4
|
||||
|
||||
[Pull-request](https://github.com/navikt/nav-frontend-moduler/pull/930)
|
||||
|
||||
- LESS v4 krever at alle mixins må bli brukt med parentes.
|
||||
|
||||
`.skjemaelement__input;` ❌
|
||||
|
||||
`.skjemaelement__input();` ✅
|
||||
|
||||
## 14. Desember 2020
|
||||
|
||||
### Endringer Chevron
|
||||
|
||||
[Pull-request](https://github.com/navikt/nav-frontend-moduler/pull/916)
|
||||
|
||||
- Endret implementasjon til å bruke `<span>` over `<i>` da dette var sett på som dårlig praksis.
|
||||
- Bumpet Chevron stilpakke til v1 da ingen større endringer vil treffe denne fremmover.
|
||||
|
||||
## 18. januar 2020
|
||||
|
||||
### [Den Store Skjema-oppdateringen™](https://gist.github.com/Lillebo/7394a6e491d479795a6418d93bff638c)
|
||||
|
||||
:point_up: den, pluss:
|
||||
|
||||
### Nye komponenter
|
||||
|
||||
- Popover: https://design.nav.no/components/popover
|
||||
|
||||
### Endringer
|
||||
|
||||
- Fikset slik at `Etikett` utvider `HTMLDivElement`: [#575](https://github.com/navikt/nav-frontend-moduler/pull/575) Takk til [@hakonph](https://github.com/hakonph) :tada:
|
||||
- Fikset støtte for ikoner i Lenke: [#579](https://github.com/navikt/nav-frontend-moduler/pull/579) Takk til [@unorsk](https://github.com/unorsk) :tada:
|
||||
- Endret farge på valgt rad i Tabell: [#580](https://github.com/navikt/nav-frontend-moduler/pull/580)
|
||||
- Fikset støtte for å fortsatt rendre skjult innhold i EkspanderbartPanel: [#585](https://github.com/navikt/nav-frontend-moduler/pull/585) Takk til [@frodehansen2](https://github.com/frodehansen2) :tada:
|
||||
- Fikset støtte for `className` i Tekstomrade: [#590](https://github.com/navikt/nav-frontend-moduler/pull/590) Takk til [@alexander-svendsen](https://github.com/alexander-svendsen) :tada:
|
||||
- Fikset støtte for `className` i EkspanderbartPanel: [#594](https://github.com/navikt/nav-frontend-moduler/pull/594) Takk til [@kjesvale](https://github.com/kjesvale) :tada:
|
||||
- Forenklet skjermleser-tekst på lukknapp i Modal: [#612](https://github.com/navikt/nav-frontend-moduler/pull/612) Takk til [@frederikgdl](https://github.com/frederikgdl) :tada:
|
||||
- Fikset bortskriving fra `componentWillReceiveProps` i Popover: [#617](https://github.com/navikt/nav-frontend-moduler/pull/617) Takk til [@havstein](https://github.com/havstein) :tada:
|
||||
- Oppdatert LICENSE: [#619](https://github.com/navikt/nav-frontend-moduler/pull/619) Takk til [@erlendev](https://github.com/erlendev) :tada:
|
||||
- Lagt til blå "info"-variant av Veilederpanel: [#620](https://github.com/navikt/nav-frontend-moduler/pull/620) Takk til [@jhnav](https://github.com/jhnav) :tada:
|
||||
- Lagt til kontaktinformasjon for forslag til endringer i språk-retningslinjer: [#623](https://github.com/navikt/nav-frontend-moduler/pull/623) Takk til [@mariannefriess](https://github.com/mariannefriess) :tada:
|
||||
- Publisert ny versjon av Sketch-bibliotek med en rekke bugfikser og oppdatering til Sketch Smart Layout: [#624](https://github.com/navikt/nav-frontend-moduler/pull/624) Takk til [@vikingwind](https://github.com/vikingwind) :tada:
|
||||
- Publisert ny versjon av Ikon-bibliotek som inneholder hele ikon-pakken fremfor bare et utvalg: [#631](https://github.com/navikt/nav-frontend-moduler/pull/631) Takk til [@vikingwind](https://github.com/vikingwind) :tada:
|
||||
|
||||
### Bugfikser
|
||||
|
||||
- Fikset type for `onChange` prop på Textarea: [#578](https://github.com/navikt/nav-frontend-moduler/pull/578) Takk til [@hakonph](https://github.com/hakonph) :tada:
|
||||
- Fikset type for `inputRef` prop på Input: [#593](https://github.com/navikt/nav-frontend-moduler/pull/593) Takk til [@mijohansen](https://github.com/mijohansen) :tada:
|
||||
- Fikset avhengighet til React-versjon i Popover, Hjelpetekst
|
||||
- Fikset feil på posisjonering av Popover i IE11: [#611](https://github.com/navikt/nav-frontend-moduler/pull/611) Takk til [@frederikgdl](https://github.com/frederikgdl) :tada:
|
||||
- Fikset type for `checkboxRef` prop på Checkbox: [#615](https://github.com/navikt/nav-frontend-moduler/pull/615) Takk til [@nutgaard](https://github.com/nutgaard) :tada:
|
||||
- Fikset en bug der skjult tekst som kun er ment for skjermlesere likevel ble synlig i Hjelpetekst og Knapp: [#624](https://github.com/navikt/nav-frontend-moduler/pull/624)
|
||||
- Fikset slik at `className` ikke er påkrevd i Grid Row: [#630](https://github.com/navikt/nav-frontend-moduler/pull/630) Takk til [@AndreasDybdahl](https://github.com/AndreasDybdahl) :tada:
|
||||
- Fikset støtte for `className` prop i Snakkeboble: [#638](https://github.com/navikt/nav-frontend-moduler/pull/638) Takk til [@andersnav](https://github.com/andersnav) :tada:
|
||||
|
||||
## 15. oktober 2019
|
||||
|
||||
### Nye komponenter
|
||||
|
||||
- Tabell: https://design.nav.no/components/tabell
|
||||
- Ikonknapper: https://design.nav.no/components/ikonknapper
|
||||
|
||||
### Endringer
|
||||
|
||||
- Fikset støtte for publisering og markering av "beta"-pakker på design.nav.no
|
||||
- Fikset støtte for å liste opp og vise frem rene "style"-pakker i komponentoversikten på design.nav.no
|
||||
- Muligheten for å bare innstallere "style"-pakkene har blitt litt tydeligere under "Teknisk" på komponent-sidene
|
||||
- Fikset støtte for ikoner i knapper: https://design.nav.no/components/knapp#med-ikon
|
||||
- Fikset aria-varsling og rød markering på tekst-teller når Textarea får for mange tegn: [#548](https://github.com/navikt/nav-frontend-moduler/pull/548)
|
||||
- Fikset støtte for React 17.0+ i Ekspanderbartpanel: [#541](https://github.com/navikt/nav-frontend-moduler/pull/541) Takk til [@erlend-axelsson](https://github.com/@erlendaxelsson) :tada:
|
||||
- Fikset støtte for å bruke knappe-stiler på lenker: [#532](https://github.com/navikt/nav-frontend-moduler/pull/532)
|
||||
- Tegnbegrensning på Textarea er nå valgfri: [#490](https://github.com/navikt/nav-frontend-moduler/pull/490) Takk til [@hakonph](https://github.com/hakonph) :tada:
|
||||
|
||||
### Sider publisert på design.nav.no
|
||||
|
||||
- Oppdaterte språk-sider: https://design.nav.no/resources/language Takk til [@mariannefriess](https://github.com/mariannefriess) :tada:
|
||||
- Tilgjengelighet: https://design.nav.no/accessibility
|
||||
- Prinsipper for brukeropplevelse på interne flater: https://design.nav.no/resources/internal-ux-principles Takk til Hanna Sofia Hogberg og @ElinNav og alle andre som bidro :tada:
|
||||
- Subdomener: https://design.nav.no/resources/subdomains Takk til Tov Are Jacobsen og Petter Hafskjold :tada:
|
||||
- Grid: https://design.nav.no/resources/grid
|
||||
- Typografi: https://design.nav.no/resources/typography
|
||||
|
||||
### Bugfikser
|
||||
|
||||
- Fikset en gammel og plagsom bug med dårlig font-rendering i Chrome på Windows: [#557](https://github.com/navikt/nav-frontend-moduler/pull/557) Takk til @unorsk :tada:
|
||||
- Fikset en bug hvor knapper med 100% bredde fikk venstrejustert innhold: [#532](https://github.com/navikt/nav-frontend-moduler/pull/532) Takk til @winsvold :tada:
|
||||
- Fikset en bug hvor Textarea av og til kunne oppta dobbelt så mye plass som det trengte: [#530](https://github.com/navikt/nav-frontend-moduler/pull/530)
|
||||
- Fikset syntax-feil i scaffolding-script: [#523](https://github.com/navikt/nav-frontend-moduler/pull/523)
|
||||
- Fikset visuell bug hvor spinner forsvant på knapper med fokus: [#498](https://github.com/navikt/nav-frontend-moduler/pull/498)
|
||||
@@ -1,9 +1,6 @@
|
||||
# Bidra med utvikling av nye og eksisterende komponenter
|
||||
|
||||
#
|
||||
|
||||
Det oppfordres til at alle blir med og bidrar med nye moduler, og holder eksisterende moduler vedlike,
|
||||
slik at mest mulig av fremtidige moduler er å finne her og fungerer etter de behov som man har i det enkelte prosjekt.
|
||||
Lyst på en ny kul feature på en komponent? Prøv deg på en løsning selv eller start en dialog så kan vi hjelpe deg.
|
||||
|
||||
## TL;DR
|
||||
|
||||
@@ -31,21 +28,25 @@ brew reinstall vips
|
||||
|
||||
## Utviklingsmiljø
|
||||
|
||||
Vi tar nå i bruk storybook [https://storybook.js.org/](https://storybook.js.org/) som utviklermiljø.
|
||||
Vi bruker storybook [https://storybook.js.org/](https://storybook.js.org/) som utviklermiljø.
|
||||
`yarn storybook` vil starte opp dette miljøet og kan da skrive `stories` for komponentene man vil teste [hvordan skrive storybook stories](https://storybook.js.org/docs/react/writing-stories/introduction)
|
||||
|
||||
## Utvikling av nye komponenter
|
||||
|
||||
**NB!!** Det er aldri behov for å kjøre `npm install` i noen annen mappe enn rot-mappen.
|
||||
Om en modul du lager har behov for en npm-pakke så kan du legge den til i devDep/dep i pakken for så å kjøre `yarn install` i root. Yarn workspaces fikser da dependency treet selv.
|
||||
Om en modul du lager har behov for en npm-pakke så kan du legge den til i devDep/dep i pakken for så å kjøre `yarn install` i root. Yarn workspaces fikser da dependency treet selv. Hvis du lurer på hvordan strukturen er satt opp, så hjelper vi deg gjerne!
|
||||
|
||||
## Dokumentasjon
|
||||
|
||||
Dokumentasjon kan skrives ved å legge til mdx filer under `website/src/pages`. Nye komponenter under `@navikt/` dokumenteres ved å skrive mdx filer under `website/src/pages/beta/components`. Eldre komponenter dokumenteres ved å endre mdx filer under `md`-mappen lokalt i pakken under `packages`.
|
||||
Dokumentasjon ang komponentter finner man på nettsiden vår [design.nav.no](https://design.nav.no/). Hvis man ønsker å skrive noe dokumentasjon selv gjør vi det via CMS et Sanity. Spør gjerne om tilgang så kan du være med å utfylle dokumentasjonen vår [her](https://verktoykasse.sanity.studio/).
|
||||
|
||||
## Kodekvalitet
|
||||
## Kodekvalitet og testing
|
||||
|
||||
For å sikre kodekvalitet er det satt opp både `prettier` som kjører for hver commit, samt linter som kjører hvert push
|
||||
Kode: Noen komponenter og løsninger blir testet med jest + react-testing-library hvert build.
|
||||
|
||||
Design: Ved bruk av [Chromatic](https://www.chromatic.com/) + storybook har vi visuell regresjons-testing på alle komponentene våre.
|
||||
|
||||
For å sikre kodekvalitet er det satt opp både `prettier` som kjører for hver commit, samt linter som kjører hvert push. All kode blir da auto-"prettified"
|
||||
|
||||
## Kommandoer
|
||||
|
||||
@@ -57,15 +58,9 @@ For å sikre kodekvalitet er det satt opp både `prettier` som kjører for hver
|
||||
- `yarn lint` - Kjører diverse lintere på kode og styling
|
||||
- `yarn storybook` - starter opp utviklingsmiljø for storybook
|
||||
|
||||
### Nettside
|
||||
|
||||
- `yarn start` - starter opp gatsby nettsiden lokalt
|
||||
- `yarn build:gatsby` - bygger gatsby nettsiden lokalt
|
||||
- `yarn serve` - server bygd gatsby nettside på localhost:9000
|
||||
|
||||
## Ikoner
|
||||
|
||||
> Krever at man har lagt til en .env fil under `@navikt/core/icons/figma-api` med en Figma auth-token i format FIGMA_TOKEN="[TOKEN]"
|
||||
> Krever at man har lagt til en .env fil under `@navikt/core/icons` med en Figma auth-token i format FIGMA_TOKEN="[TOKEN]"
|
||||
|
||||
- `yarn lerna:icons` - Oppdaterer ikonpakken med de nyeste ikonene fra Figma-biblioteket
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<h1 align="center">
|
||||
<img src="https://www.nav.no/_/asset/no.nav.navno:1575554845/img/navno/logo.svg" />
|
||||
<img src="https://avatars.githubusercontent.com/u/11848947?s=200&v=4" />
|
||||
<br/>Designsystemet
|
||||
</h1>
|
||||
|
||||
@@ -11,8 +11,10 @@
|
||||
<a href="https://github.com/navikt/nav-frontend-moduler/pulls">
|
||||
<img src="https://img.shields.io/badge/PRs-welcome-green.svg" />
|
||||
</a>
|
||||
<img src="https://github.com/navikt/nav-frontend-moduler/workflows/Build,%20test%20and%20maybe%20publish/badge.svg" />
|
||||
<img src="https://github.com/navikt/nav-frontend-moduler/actions/workflows/build-publish.yml/badge.svg" />
|
||||
<img src="https://github.com/navikt/nav-frontend-moduler/actions/workflows/chromatic.yml/badge.svg" />
|
||||
</p>
|
||||
<img src="https://img.shields.io/endpoint?style=for-the-badge&url=https://runkit.io/fezvrasta/combined-npm-downloads/1.0.0?packages=@navikt/ds-react,@navikt/ds-css,@navikt/ds-icons,@navikt/ds-tokens,@navikt/ds-react-internal,@navikt/ds-css-internal,nav-frontend-alertstriper-style,nav-frontend-alertstriper,nav-frontend-chevron-style,nav-frontend-chevron,nav-frontend-core,nav-frontend-ekspanderbartpanel-style,nav-frontend-ekspanderbartpanel,nav-frontend-etiketter-style,nav-frontend-etiketter,nav-frontend-fullbreddeknapp-style,nav-frontend-grid-style,nav-frontend-grid,nav-frontend-hjelpetekst-style,nav-frontend-hjelpetekst,nav-frontend-ikoner-assets,nav-frontend-ikonknapper,nav-frontend-js-utils,nav-frontend-knapper-style,nav-frontend-knapper,nav-frontend-lenkepanel-style,nav-frontend-lenkepanel,nav-frontend-lenker-style,nav-frontend-lenker,nav-frontend-lesmerpanel-style,nav-frontend-lesmerpanel,nav-frontend-lukknapp-style,nav-frontend-lukknapp,nav-frontend-modal-style,nav-frontend-modal,nav-frontend-paneler-style,nav-frontend-paneler,nav-frontend-popover-style,nav-frontend-popover,nav-frontend-skjema-style,nav-frontend-skjema,nav-frontend-snakkeboble-style,nav-frontend-snakkeboble,nav-frontend-spinner-style,nav-frontend-spinner,nav-frontend-stegindikator-style,nav-frontend-stegindikator,nav-frontend-tabell-style,nav-frontend-tabs-style,nav-frontend-tabs,nav-frontend-tekstomrade,nav-frontend-toggle-style,nav-frontend-toggle,nav-frontend-typografi-style,nav-frontend-typografi,nav-frontend-veileder-style,nav-frontend-veileder,nav-frontend-veilederpanel-style,nav-frontend-veilederpanel" />
|
||||
<h4><a href="https://design.nav.no">Nettside</a> | <a href="https://github.com/navikt/nav-frontend-moduler/blob/master/CONTRIBUTING.md">Bidra</a> | <a href="https://github.com/navikt/nav-frontend-moduler/issues">Bug-rapport</a>
|
||||
</div>
|
||||
|
||||
@@ -21,8 +23,16 @@
|
||||
Repoet inneholder følgende:
|
||||
|
||||
- [Felleskomponenter](https://github.com/navikt/nav-frontend-moduler/tree/master/@navikt/)
|
||||
- [Storybook](https://navikt.github.io/Designsystemet) for komponenter.
|
||||
- [Gammel dokumentasjon](https://old-design-nav.vercel.app/designsystem) for komponenter.
|
||||
- [Storybook](https://5f801fb2aea7820022de2936-rognyzqcpw.chromatic.com/) for komponenter.
|
||||
- [Gammel dokumentasjon](https://old-design-nav.vercel.app) for komponenter.
|
||||
|
||||
## Dokumentasjon
|
||||
|
||||
[Dokumentasjon side forvaltes i dette repoet](https://github.com/navikt/verktoykassen)
|
||||
|
||||
## Endringslogg
|
||||
|
||||
[Alle relevante kode-endringer blir dokumentert her](https://design.nav.no/designsystem/side/endringslogg)
|
||||
|
||||
## Bidra
|
||||
|
||||
@@ -30,4 +40,10 @@ Gå til [CONTRIBUTING.md](https://github.com/navikt/nav-frontend-moduler/blob/ma
|
||||
|
||||
## Lisenser
|
||||
|
||||
Gå til [LICENSE](https://github.com/navikt/nav-frontend-moduler/blob/master/LICENSE)
|
||||
Gå til [LICENSE](https://github.com/navikt/nav-frontend-moduler/blob/master/LICENCE)
|
||||
|
||||
## Contributors
|
||||
|
||||
<a href="https://github.com/navikt/nav-frontend-moduler/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=navikt/nav-frontend-moduler" />
|
||||
</a>
|
||||
@@ -17,6 +17,7 @@
|
||||
"@navikt/core/react",
|
||||
"@navikt/core/icons",
|
||||
"@navikt/core/tokens",
|
||||
"@navikt/core/tailwind",
|
||||
"@navikt/internal/css",
|
||||
"@navikt/internal/react"
|
||||
]
|
||||
|
||||
@@ -8,8 +8,9 @@
|
||||
"postinstall": "husky install",
|
||||
"boot": "yarn clean:lib && yarn build:packages --stream",
|
||||
"storybook": "start-storybook -p 6006",
|
||||
"build:packages": "yarn run --silent lerna run build",
|
||||
"build:packages": "yarn build:tokens && yarn run --silent lerna run build",
|
||||
"build:storybook": "build-storybook",
|
||||
"build:tokens": "yarn workspace @navikt/ds-tokens build",
|
||||
"chromatic": "npx chromatic --project-token x3xqdfgkujg",
|
||||
"lerna:watch": "yarn run lerna run watch --stream",
|
||||
"update:icons": "yarn workspace @navikt/ds-icons update",
|
||||
@@ -56,10 +57,6 @@
|
||||
"url": "https://github.com/navikt/nav-frontend-moduler.git"
|
||||
},
|
||||
"dependencies": {
|
||||
"@storybook/addon-storysource": "^6.3.4",
|
||||
"@storybook/addons": "^6.3.4",
|
||||
"@storybook/theming": "^6.3.4",
|
||||
"@storybook/addon-a11y": "^6.3.12",
|
||||
"extend": "^3.0.2",
|
||||
"gh-pages": "^3.1.0",
|
||||
"glob": "^7.1.6",
|
||||
@@ -72,11 +69,17 @@
|
||||
"yarn": "^1.22.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@storybook/addon-storysource": "^6.4",
|
||||
"@storybook/addons": "^6.4",
|
||||
"@storybook/theming": "^6.4",
|
||||
"@storybook/addon-a11y": "^6.4",
|
||||
"@storybook/builder-webpack5": "^6.4",
|
||||
"@storybook/manager-webpack5": "^6.4",
|
||||
"@storybook/addon-actions": "^6.4",
|
||||
"@storybook/addon-docs": "^6.4",
|
||||
"@storybook/addon-essentials": "^6.4",
|
||||
"@storybook/react": "^6.4",
|
||||
"@babel/core": "^7.11.6",
|
||||
"@storybook/addon-actions": "^6.3.4",
|
||||
"@storybook/addon-docs": "^6.3.4",
|
||||
"@storybook/addon-essentials": "^6.3.4",
|
||||
"@storybook/react": "^6.3.4",
|
||||
"@typescript-eslint/eslint-plugin": "^4.3.0",
|
||||
"@typescript-eslint/parser": "^4.3.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
|
||||