Compare commits

...
Author SHA1 Message Date
github-actions[bot]andgithub-actions[bot] 3c544d2771 Version Packages (#1837)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-03-02 13:41:34 +01:00
Ken b575816e73 🎨 Dropdown kan nå styre open/defaultOpen manuelt (#1835) 2023-03-02 13:38:29 +01:00
Ken 71d30afab1 🎨 La til hex-verdier i design-tokens visning 2023-03-02 13:26:32 +01:00
Ken d488b83738 🐛 Fikset skeleton-lasting i kodeeksempler 2023-03-02 13:05:12 +01:00
Ken c6952576ff 🎨 Skeleton loading av komponent-eksempler 2023-03-02 11:54:32 +01:00
github-actions[bot]andgithub-actions[bot] 1c5db8dacf Version Packages (#1834)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-03-02 11:21:46 +01:00
Ken ac1e69b342 ♻️ Nested-list logic 2023-03-02 10:49:27 +01:00
Ken a10285a50d 🔥 Fjernet gammel css-klasser for algolia 2023-03-02 10:38:11 +01:00
Ken 2843a6cc56 🔥 Fjernet algolia fra CSP 2023-03-02 10:31:26 +01:00
Ken ac3187de75 ⬆️ Sanity 3.5.1 2023-03-02 10:30:00 +01:00
Ken 647b749535 🎨 Oppdatert token-ikon 2023-03-02 10:26:03 +01:00
github-actions[bot]andgithub-actions[bot] 2c7e86503f Version Packages (#1833)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-03-01 18:07:06 +01:00
Ken 4abe46455a 🎨 Breakpoints dokumentasjon og token-visning 2023-03-01 17:38:09 +01:00
Ken 8893b5c82d [Tokens] Breakpoint-tokens (#1832) 2023-03-01 17:10:01 +01:00
Ken 19b16fff75 🐛 Fjernet flaky button-story fra chromatic 2023-03-01 14:13:34 +01:00
Ken 2f1974d7bf 📝 Oppdatert egnet-til/uegnet-til tekster i komponent-intro 2023-03-01 14:06:43 +01:00
github-actions[bot]andgithub-actions[bot] b07972d7dd Version Packages (#1830)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-03-01 13:37:07 +01:00
Ken f962bc7816 🎨 Fikset chrome-bug for disabled select i chrome 2023-03-01 13:34:51 +01:00
github-actions[bot]andgithub-actions[bot] 0cba7a93b8 Version Packages (#1829)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-02-28 15:47:06 +01:00
a7ce61f840 New/list (#1823)
* 🎉 setup

* 💄 add stylesheet

* 🎨 conditional type

* 🎨 add listitem

* 🎨 add title + desc + refactor

* 🎨 added title and description

* ♿ add aria labels

* 🎨 add headingTag prop

* 🎨 add stories

* 🎨 update ListItem API

* 💄 ul markers

* 🎨 update markers

* 🎨 add icons story

* 🎨 ordered markers

* 🎨 update stories

* 🎨 tweak list props

* 💄 update classes

* 💄 update classes again

* 🎨 remove icon if ol

* 🎨 update stories

* 🎨 use default counter for ol

* 🎨 h4 > span

* 🎨 use bodyshort default

* 🎨 update stories

* 🎨 tweaks

* 🎨 Css-tokens

* 🎨 update aria

Co-authored-by: Ken <KenAJoh@users.noreply.github.com>

* 🎨 refactor css and remove test story

co authored by OleJørgen and Ken

* 🎨 add examples

* 🎨 update examples

* Update @navikt/core/css/list.css

Co-authored-by: Ken <26967723+KenAJoh@users.noreply.github.com>

* Update @navikt/core/css/list.css

Co-authored-by: Ken <26967723+KenAJoh@users.noreply.github.com>

* 🎨 La til tokens-doc

* 🔖 changeset

* 🎨 add console warn

* 💄 tweak margin to support nested list

* 🎨 nested story

* 🎨 add nested example

* 🚧 detect nested lists

* 💄 change margins for nested lists

* 💄 tweak margins

* Update @navikt/core/react/src/list/List.tsx

* ⬆️ Storybook beta 45 -> 54

* ✨ add fixedWeeks option to standalone (#1827)

* ✨ add fixedWeeks option to standalone

* 🔖 changeset

* ♿ Fikset siteimprove feilmeldinger for kode-eksempler

* Version Packages (#1828)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* 🔥 Fjernet redundant console.log

* [Snyk] Security upgrade node from 16.13.1-alpine3.14 to 18.1-alpine3.14 (#1826)

* 🔖 changeset

---------

Co-authored-by: Ken <ken.aleksander@gmail.com>
Co-authored-by: Ken <KenAJoh@users.noreply.github.com>
Co-authored-by: Ken <26967723+KenAJoh@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Snyk bot <snyk-bot@snyk.io>
2023-02-28 15:44:13 +01:00
Snyk bot 35e8da7811 [Snyk] Security upgrade node from 16.13.1-alpine3.14 to 18.1-alpine3.14 (#1826) 2023-02-28 14:59:28 +01:00
Ken 8953185f80 🔥 Fjernet redundant console.log 2023-02-28 14:23:44 +01:00
github-actions[bot]andgithub-actions[bot] 43b0301d7c Version Packages (#1828)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-02-28 14:03:10 +01:00
Ken d77b766a56 ♿ Fikset siteimprove feilmeldinger for kode-eksempler 2023-02-28 13:36:40 +01:00
Kai Erik Schieren 98c06b0be2 ✨ add fixedWeeks option to standalone (#1827)
* ✨ add fixedWeeks option to standalone

* 🔖 changeset
2023-02-28 13:30:28 +01:00
Ken 61b84e14fb ⬆️ Storybook beta 45 -> 54 2023-02-28 12:24:30 +01:00
KenandKai Erik Schieren edbbc53cdb [Website] Oppdatert next 12 -> 13.2, sanity 3.2 -> 3.5 (#1822)
Co-authored-by: Kai Erik Schieren <kai.schieren@soprasteria.com>
2023-02-24 11:30:56 +01:00
102 changed files with 2283 additions and 1247 deletions

No files matched your search

+16
View File
@@ -1,5 +1,21 @@
# @navikt/ds-codemod
## 2.6.0
## 2.5.1
## 2.5.0
## 2.4.3
## 2.4.2
### Patch Changes
- [#1823](https://github.com/navikt/aksel/pull/1823) [`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8) Thanks [@kschieren](https://github.com/kschieren)! - added support for nested lists
## 2.4.1
## 2.4.0
## 2.3.1
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-codemod",
"version": "2.4.0",
"version": "2.6.0",
"description": "Aksel codemods for NAVs designsystem",
"author": "Aksel | NAV designsystem team",
"license": "MIT",
+2 -2
View File
@@ -39,8 +39,8 @@
"build-pict": "svgr --silent --index-template index-template.js --out-dir src/pictograms pictograms"
},
"dependencies": {
"@navikt/ds-icons": "^2.4.0",
"@navikt/ds-react": "^2.4.0",
"@navikt/ds-icons": "^2.6.0",
"@navikt/ds-react": "^2.6.0",
"clsx": "^1.1.1"
},
"devDependencies": {
+20
View File
@@ -1,5 +1,25 @@
# @navikt/ds-css
## 2.6.0
## 2.5.1
## 2.5.0
## 2.4.3
### Patch Changes
- [`f962bc781`](https://github.com/navikt/aksel/commit/f962bc7816027c24e334d9754c3e07cda951cf56) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Fikset disabled-opacity bug i select for Chrome
## 2.4.2
### Patch Changes
- [#1823](https://github.com/navikt/aksel/pull/1823) [`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8) Thanks [@kschieren](https://github.com/kschieren)! - added support for nested lists
## 2.4.1
## 2.4.0
### Minor Changes
+12
View File
@@ -49,9 +49,21 @@
border-color: var(--ac-select-error-border, var(--a-surface-danger));
}
/**
Disabled
*/
.navds-select__input:disabled {
background-color: var(--ac-select-bg, var(--a-surface-default));
border: 1px solid var(--ac-select-border, var(--a-border-default));
box-shadow: none;
cursor: not-allowed;
/* Chrome-fix */
opacity: 1;
color: var(--a-text-default);
}
/* Chrome-fix */
.navds-select__input:disabled > option {
color: var(--a-text-default);
}
+11 -2
View File
@@ -3,8 +3,17 @@
padding: 0;
}
.navds-list li:not(:first-child) {
margin-top: var(--a-spacing-5);
.navds-list--nested {
margin: var(--a-spacing-4) 0 var(--a-spacing-8) 0;
}
.navds-list li:not(.navds-list__item--noMargin) {
margin-bottom: var(--a-spacing-5);
}
.navds-list:last-child > ul > li:last-child,
.navds-list:last-child > ol > li:last-child {
margin-bottom: 0;
}
.navds-list ul .navds-list__item {
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-css",
"version": "2.4.0",
"version": "2.6.0",
"description": "CSS for NAV Designsystem",
"author": "Aksel | NAV designsystem team",
"keywords": [
@@ -20,7 +20,7 @@
"watch": "postcss --watch --use postcss-import -o dist/index.css index.css"
},
"devDependencies": {
"@navikt/ds-tokens": "^2.4.0",
"@navikt/ds-tokens": "^2.6.0",
"normalize.css": "^8.0.1",
"postcss": "^8.4.0",
"postcss-cli": "^9.0.0",
+48
View File
@@ -1,5 +1,53 @@
# @navikt/ds-react
## 2.6.0
### Patch Changes
- Updated dependencies []:
- @navikt/ds-icons@2.6.0
## 2.5.1
### Patch Changes
- [`ac1e69b34`](https://github.com/navikt/aksel/commit/ac1e69b342ae207db2e80e3058555c56902e5832) Thanks [@KenAJoh](https://github.com/KenAJoh)! - :recycle: Refaktorert nested-list logikk
- Updated dependencies []:
- @navikt/ds-icons@2.5.1
## 2.5.0
### Patch Changes
- Updated dependencies []:
- @navikt/ds-icons@2.5.0
## 2.4.3
### Patch Changes
- Updated dependencies []:
- @navikt/ds-icons@2.4.3
## 2.4.2
### Patch Changes
- [#1823](https://github.com/navikt/aksel/pull/1823) [`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8) Thanks [@kschieren](https://github.com/kschieren)! - added support for nested lists
- Updated dependencies [[`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8)]:
- @navikt/ds-icons@2.4.2
## 2.4.1
### Patch Changes
- [#1827](https://github.com/navikt/aksel/pull/1827) [`98c06b0be`](https://github.com/navikt/aksel/commit/98c06b0be20debff9969af874d5239ec920fa401) Thanks [@kschieren](https://github.com/kschieren)! - Added fixedWeeks prop to standalone datepicker
- Updated dependencies []:
- @navikt/ds-icons@2.4.1
## 2.4.0
### Minor Changes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-react",
"version": "2.4.0",
"version": "2.6.0",
"description": "Aksel react-components for NAV designsystem",
"author": "Aksel | NAV designsystem team",
"license": "MIT",
@@ -37,7 +37,7 @@
},
"dependencies": {
"@floating-ui/react": "0.17.0",
"@navikt/ds-icons": "^2.4.0",
"@navikt/ds-icons": "^2.6.0",
"@radix-ui/react-tabs": "1.0.0",
"@radix-ui/react-toggle-group": "1.0.0",
"clsx": "^1.2.1",
@@ -148,7 +148,8 @@ export const Loading = {
</div>
),
args: { chromatic: { delay: 300 } },
args: { chromatic: { disableSnapshot: true } },
chromatic: { disableSnapshot: true },
};
export const Icon = () => (
@@ -274,5 +275,6 @@ export const LoadingWithAs = {
</div>
),
args: { chromatic: { delay: 300 } },
args: { chromatic: { disableSnapshot: true } },
chromatic: { disableSnapshot: true },
};
@@ -24,6 +24,11 @@ interface DatePickerStandaloneDefaultProps
* Datepicker classname
*/
className?: string;
/**
* If datepicker should be fixed to 6 weeks, regardless of actual weeks in month
* @default true
*/
fixedWeeks?: boolean;
}
export type DatePickerStandaloneProps = DatePickerStandaloneDefaultProps &
@@ -50,6 +55,7 @@ export const DatePickerStandalone: DatePickerStandaloneType = forwardRef<
id,
defaultSelected,
onSelect,
fixedWeeks = true,
...rest
},
ref
@@ -113,7 +119,7 @@ export const DatePickerStandalone: DatePickerStandaloneType = forwardRef<
weekend: "rdp-day__weekend",
}}
showWeekNumber={showWeekNumber}
fixedWeeks
fixedWeeks={fixedWeeks}
showOutsideDays
{...omit(rest, ["onSelect"])}
/>
+15 -3
View File
@@ -1,5 +1,5 @@
import cl from "clsx";
import React, { createContext, forwardRef } from "react";
import React, { createContext, forwardRef, useContext } from "react";
import { BodyShort, Heading } from "../typography";
import { useId } from "../util/useId";
import { ListItem, ListItemType } from "./ListItem";
@@ -26,16 +26,19 @@ export interface ListProps extends React.HTMLAttributes<HTMLDivElement> {
headingTag?: React.ElementType<any>;
}
interface ListComponent extends React.ForwardRefExoticComponent<ListProps> {
export interface ListComponent
extends React.ForwardRefExoticComponent<ListProps> {
Item: ListItemType;
}
interface ListContextProps {
listType: "ul" | "ol";
isNested: boolean | null;
}
export const ListContext = createContext<ListContextProps>({
listType: "ul",
isNested: null,
});
export const List = forwardRef<HTMLDivElement, ListProps>(
@@ -53,13 +56,22 @@ export const List = forwardRef<HTMLDivElement, ListProps>(
) => {
const ariaId = useId();
const { isNested } = useContext(ListContext);
return (
<ListContext.Provider
value={{
listType: ListTag,
isNested: isNested === null ? false : true,
}}
>
<div {...rest} ref={ref} className={cl("navds-list", className)}>
<div
{...rest}
ref={ref}
className={cl("navds-list", className, {
"navds-list--nested": isNested === null ? false : true,
})}
>
{title && (
<Heading id={`tittel-${ariaId}`} size="small" as={headingTag}>
{title}
+15 -3
View File
@@ -13,7 +13,7 @@ export interface ListItemProps extends React.HTMLAttributes<HTMLLIElement> {
*/
title?: string;
/*
* Icon to be used as list marker
* Icon to be used as list marker for unordered lists.
*/
icon?: React.ReactNode;
}
@@ -25,10 +25,22 @@ export interface ListItemType
export const ListItem: ListItemType = forwardRef(
({ className, children, title, icon, ...rest }, ref) => {
const { listType } = useContext(ListContext);
const { listType, isNested } = useContext(ListContext);
if (listType === "ol" && icon) {
console.warn(
"<List />: Icon prop is not supported for ordered lists. Please remove the icon prop."
);
}
return (
<li {...rest} ref={ref} className={cl("navds-list__item", className)}>
<li
{...rest}
ref={ref}
className={cl("navds-list__item", className, {
"navds-list__item--noMargin": isNested,
})}
>
{listType === "ul" && (
<div
className={cl({
@@ -117,3 +117,32 @@ export const Icons = {
);
},
};
export const Nested = {
render: () => {
return (
<List>
<List.Item title="Sed Do Eiusmod Tempor Incididunt">
Beskrivelsen på punkter er nærmere forklart <a href="/">her</a>
<List>
<List.Item title="Lorem Ipsum Dolor Sit Amet">
Beskrivelsen på punkter er nærmere forklart <a href="/">her</a>
</List.Item>
<List.Item title="Consectetur Adipiscing Elit">
Beskrivelsen på punkter er nærmere forklart <a href="/">her</a>
</List.Item>
<List.Item>
Beskrivelsen på punkter er nærmere forklart <a href="/">her</a>
</List.Item>
<List.Item>
Beskrivelsen på punkter er nærmere forklart <a href="/">her</a>
</List.Item>
</List>
</List.Item>
<List.Item>
Beskrivelsen på punkter er nærmere forklart <a href="/">her</a>
</List.Item>
</List>
);
},
};
@@ -42,7 +42,13 @@ function showContent(element: HTMLDivElement | null, height: Height) {
// ------------------ Component
interface AnimateHeightProps extends React.HTMLAttributes<HTMLDivElement> {
/**
* @default 250ms
*/
duration?: number;
/**
* @default ease
*/
easing?: string;
height: Height;
innerClassName?: string;
+20
View File
@@ -1,5 +1,25 @@
# @navikt/ds-tailwind
## 2.6.0
## 2.5.1
## 2.5.0
### Minor Changes
- [#1832](https://github.com/navikt/aksel/pull/1832) [`8893b5c82`](https://github.com/navikt/aksel/commit/8893b5c82daf7c23897019fda912e702a1f05eaa) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Breakpoint-tokens for ds-tokens og ds-tailwind
## 2.4.3
## 2.4.2
### Patch Changes
- [#1823](https://github.com/navikt/aksel/pull/1823) [`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8) Thanks [@kschieren](https://github.com/kschieren)! - added support for nested lists
## 2.4.1
## 2.4.0
## 2.3.1
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-tailwind",
"version": "2.4.0",
"version": "2.6.0",
"description": "Tailwind config based on @navikt/ds-tokens",
"author": "Aksel | NAV designsystem team",
"keywords": [
@@ -22,7 +22,7 @@
"directory": "@navikt/core/tailwind"
},
"devDependencies": {
"@navikt/ds-tokens": "^2.4.0",
"@navikt/ds-tokens": "^2.6.0",
"@types/jest": "^29.0.0",
"color": "4.2.3",
"jest": "^29.0.0",
@@ -0,0 +1,11 @@
import Reducer from "./reducer";
export const getBreakpoints = (tokens: { [key: string]: string | number }) => {
const breakpoints = Reducer(tokens, ["breakpoint"]);
return Object.keys(breakpoints)
.filter((key) => !key.includes("xs") && !key.includes("-down"))
.reduce((cur, key) => {
return Object.assign(cur, { [key]: breakpoints[key] });
}, {});
};
+2
View File
@@ -2,6 +2,7 @@
import * as TokensBuild from "@navikt/ds-tokens/dist/tokens";
import { writeFileSync } from "fs";
import { getColors } from "./colors";
import { getBreakpoints } from "./getBreakpoints";
import kebabCase from "./kebabCase";
import Reducer from "./reducer";
@@ -16,6 +17,7 @@ const tokens = Object.entries(TokensBuild).reduce(
const config = {
theme: {
colors: getColors(tokens),
screen: getBreakpoints(tokens),
extend: {
spacing: Reducer(tokens, ["spacing"]),
zIndex: Reducer(tokens, ["z-index"]),
+20
View File
@@ -1,5 +1,25 @@
# @navikt/ds-tokens
## 2.6.0
## 2.5.1
## 2.5.0
### Minor Changes
- [#1832](https://github.com/navikt/aksel/pull/1832) [`8893b5c82`](https://github.com/navikt/aksel/commit/8893b5c82daf7c23897019fda912e702a1f05eaa) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Breakpoint-tokens for ds-tokens og ds-tailwind
## 2.4.3
## 2.4.2
### Patch Changes
- [#1823](https://github.com/navikt/aksel/pull/1823) [`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8) Thanks [@kschieren](https://github.com/kschieren)! - added support for nested lists
## 2.4.1
## 2.4.0
## 2.3.1
+43
View File
@@ -1,4 +1,47 @@
{
"breakpoints": [
{ "name": "--a-breakpoint-xs", "value": "0" },
{
"name": "--a-breakpoint-sm",
"value": "480px",
"description": "@media (min-width: 480px)"
},
{
"name": "--a-breakpoint-sm-down",
"value": "479px",
"description": "@media (max-width: 479px)"
},
{
"name": "--a-breakpoint-md",
"value": "768px",
"description": "@media (min-width: 768px)"
},
{
"name": "--a-breakpoint-md-down",
"value": "767px",
"description": "@media (max-width: 767px)"
},
{
"name": "--a-breakpoint-lg",
"value": "1024px",
"description": "@media (min-width: 1024px)"
},
{
"name": "--a-breakpoint-lg-down",
"value": "1023px",
"description": "@media (max-width: 1023px)"
},
{
"name": "--a-breakpoint-xl",
"value": "1280px",
"description": "@media (min-width: 1280px)"
},
{
"name": "--a-breakpoint-xl-down",
"value": "1279px",
"description": "@media (max-width: 1279px)"
}
],
"font": [
{
"name": "--a-font-family",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-tokens",
"version": "2.4.0",
"version": "2.6.0",
"description": "Design-tokens for NAV designsystem",
"author": "Aksel | NAV designsystem team",
"keywords": [
+11
View File
@@ -3,6 +3,17 @@ const getFontSize = (size) => `${size / baseFontSize}rem`;
module.exports = {
a: {
breakpoint: {
xs: { value: "0" },
sm: { value: "480px" },
"sm-down": { value: "479px" },
md: { value: "768px" },
"md-down": { value: "767px" },
lg: { value: "1024px" },
"lg-down": { value: "1023px" },
xl: { value: "1280px" },
"xl-down": { value: "1279px" },
},
font: {
family: { value: '"Source Sans Pro", Arial, sans-serif' },
line: {
+16
View File
@@ -1,5 +1,21 @@
# @navikt/ds-icons
## 2.6.0
## 2.5.1
## 2.5.0
## 2.4.3
## 2.4.2
### Patch Changes
- [#1823](https://github.com/navikt/aksel/pull/1823) [`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8) Thanks [@kschieren](https://github.com/kschieren)! - added support for nested lists
## 2.4.1
## 2.4.0
## 2.3.1
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-icons",
"version": "2.4.0",
"version": "2.6.0",
"description": "Aksel icons for NAV",
"author": "Aksel | NAV designsystem team",
"repository": {
+16
View File
@@ -1,5 +1,21 @@
# @navikt/ds-css-internal
## 2.6.0
## 2.5.1
## 2.5.0
## 2.4.3
## 2.4.2
### Patch Changes
- [#1823](https://github.com/navikt/aksel/pull/1823) [`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8) Thanks [@kschieren](https://github.com/kschieren)! - added support for nested lists
## 2.4.1
## 2.4.0
## 2.3.1
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-css-internal",
"version": "2.4.0",
"version": "2.6.0",
"description": "CSS for NAV internal Designsystem-components",
"author": "Aksel | NAV designsystem team",
"keywords": [
+54
View File
@@ -1,5 +1,59 @@
# @navikt/ds-react-internal
## 2.6.0
### Minor Changes
- [#1835](https://github.com/navikt/aksel/pull/1835) [`b575816e7`](https://github.com/navikt/aksel/commit/b575816e736d440f224e1e70abf851262a976981) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Controlled og defaultOpen-states for Dropdown
### Patch Changes
- Updated dependencies []:
- @navikt/ds-react@2.6.0
- @navikt/ds-icons@2.6.0
## 2.5.1
### Patch Changes
- Updated dependencies [[`ac1e69b34`](https://github.com/navikt/aksel/commit/ac1e69b342ae207db2e80e3058555c56902e5832)]:
- @navikt/ds-react@2.5.1
- @navikt/ds-icons@2.5.1
## 2.5.0
### Patch Changes
- Updated dependencies []:
- @navikt/ds-react@2.5.0
- @navikt/ds-icons@2.5.0
## 2.4.3
### Patch Changes
- Updated dependencies []:
- @navikt/ds-react@2.4.3
- @navikt/ds-icons@2.4.3
## 2.4.2
### Patch Changes
- [#1823](https://github.com/navikt/aksel/pull/1823) [`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8) Thanks [@kschieren](https://github.com/kschieren)! - added support for nested lists
- Updated dependencies [[`a7ce61f84`](https://github.com/navikt/aksel/commit/a7ce61f840e5bfaafc4f70e550167fe0095555b8)]:
- @navikt/ds-react@2.4.2
- @navikt/ds-icons@2.4.2
## 2.4.1
### Patch Changes
- Updated dependencies [[`98c06b0be`](https://github.com/navikt/aksel/commit/98c06b0be20debff9969af874d5239ec920fa401)]:
- @navikt/ds-react@2.4.1
- @navikt/ds-icons@2.4.1
## 2.4.0
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-react-internal",
"version": "2.4.0",
"version": "2.6.0",
"description": "Aksel react components for internal UIs in NAV",
"author": "Aksel | NAV designsystem team",
"license": "MIT",
@@ -35,8 +35,8 @@
"watch": "tsc --watch -p tsconfig.esm.json"
},
"dependencies": {
"@navikt/ds-icons": "^2.4.0",
"@navikt/ds-react": "^2.4.0",
"@navikt/ds-icons": "^2.6.0",
"@navikt/ds-react": "^2.6.0",
"clsx": "^1.1.1",
"copy-to-clipboard": "^3.3.1"
},
@@ -5,7 +5,7 @@ import Menu, { MenuType } from "./Menu";
export interface DropdownProps {
children: React.ReactNode;
/**
* Handler that is called when an item is selected.
* Handler called when an item is selected.
*/
onSelect?: (element: React.MouseEvent) => void;
/**
@@ -13,6 +13,14 @@ export interface DropdownProps {
* @default true
*/
closeOnSelect?: boolean;
/**
* @default false
*/
defaultOpen?: boolean;
/**
* Controlled state of the dropdown. When set, you will need to handle onClose and onSelect manually.
*/
open?: boolean;
}
export interface DropdownType extends React.FC<DropdownProps> {
@@ -22,7 +30,7 @@ export interface DropdownType extends React.FC<DropdownProps> {
export interface DropdownContextType {
readonly isOpen: boolean;
setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
handleToggle: (v: boolean) => void;
readonly anchorEl: Element | null;
setAnchorEl: React.Dispatch<React.SetStateAction<Element | null>>;
onSelect: (element: React.MouseEvent) => void;
@@ -30,20 +38,34 @@ export interface DropdownContextType {
export const DropdownContext = createContext<DropdownContextType | null>(null);
export const Dropdown = (({ children, onSelect, closeOnSelect = true }) => {
const [isOpen, setIsOpen] = useState<boolean>(false);
export const Dropdown = (({
children,
onSelect,
closeOnSelect = true,
defaultOpen = false,
open,
}) => {
const [isOpen, setIsOpen] = useState<boolean>(defaultOpen);
const [anchorEl, setAnchorEl] = useState<Element | null>(null);
const handleToggle = (v: boolean) => {
if (open === undefined) {
setIsOpen(v);
}
};
return (
<DropdownContext.Provider
value={{
isOpen,
setIsOpen,
isOpen: open ?? isOpen,
handleToggle,
anchorEl,
setAnchorEl,
onSelect: (event) => {
onSelect?.(event);
closeOnSelect && setIsOpen(false);
if (closeOnSelect) {
open === undefined && setIsOpen(false);
}
},
}}
>
@@ -1,6 +1,6 @@
import React, { forwardRef, useContext } from "react";
import cl from "clsx";
import { OverridableComponent } from "@navikt/ds-react";
import cl from "clsx";
import React, { forwardRef, useContext } from "react";
import { DropdownContext } from "../../Dropdown";
export interface GroupedItemProps
@@ -19,6 +19,7 @@ export type GroupedItemType = OverridableComponent<
export const GroupedItem: GroupedItemType = forwardRef(
({ as: Component = "button", className, ...rest }, ref) => {
const context = useContext(DropdownContext);
return (
<dd className="navdsi-dropdown__list-item">
<Component
@@ -18,6 +18,7 @@ export type ListItemType = OverridableComponent<
export const ListItem: ListItemType = forwardRef(
({ as: Component = "button", className, ...rest }, ref) => {
const context = useContext(DropdownContext);
return (
<li className="navdsi-dropdown__list-item">
<Component
@@ -1,10 +1,10 @@
import React, { forwardRef, useContext } from "react";
import cl from "clsx";
import { Popover } from "@navikt/ds-react";
import List, { ListType } from "./List";
import GroupedList, { GroupedListType } from "./GroupedList";
import Divider, { DividerType } from "./Divider";
import cl from "clsx";
import React, { forwardRef, useContext } from "react";
import { DropdownContext } from "../Dropdown";
import Divider, { DividerType } from "./Divider";
import GroupedList, { GroupedListType } from "./GroupedList";
import List, { ListType } from "./List";
interface MenuProps extends React.HTMLAttributes<HTMLDivElement> {
/**
@@ -57,7 +57,7 @@ export const Menu = forwardRef<HTMLDivElement, MenuProps>(
return null;
}
const { isOpen, anchorEl, setIsOpen } = context;
const { isOpen, anchorEl, handleToggle } = context;
return (
<Popover
@@ -70,7 +70,7 @@ export const Menu = forwardRef<HTMLDivElement, MenuProps>(
anchorEl={anchorEl}
open={isOpen}
onClose={() => {
setIsOpen(false);
handleToggle(false);
onClose && onClose();
}}
/>
+11 -3
View File
@@ -23,15 +23,23 @@ export const Toggle: ToggleType = forwardRef(
return null;
}
const { setAnchorEl, setIsOpen, isOpen } = context;
const { setAnchorEl, handleToggle, isOpen } = context;
return (
<button
{...rest}
ref={ref}
ref={(el) => {
setAnchorEl(el);
if (typeof ref === "function") {
ref(el);
} else if (ref != null) {
ref.current = el;
}
}}
onClick={(e) => {
setAnchorEl(e.currentTarget);
setIsOpen((isOpen) => !isOpen);
handleToggle(!isOpen);
onClick && onClick(e);
}}
aria-expanded={isOpen}
@@ -1,6 +1,7 @@
import React from "react";
import React, { useState } from "react";
import { Dropdown } from "..";
import { Meta } from "@storybook/react";
import { Button } from "@navikt/ds-react";
export default {
title: "ds-react-internal/Dropdown",
@@ -34,3 +35,57 @@ export const Default = () => {
</Dropdown>
);
};
export const DefaultOpen = {
render: () => (
<Dropdown onSelect={(event) => console.log(event)} defaultOpen>
<Button as={Dropdown.Toggle}>Toggle</Button>
<Dropdown.Menu
strategy="fixed"
onClose={() => console.log("ONCLOSE default")}
>
<Dropdown.Menu.GroupedList>
<Dropdown.Menu.GroupedList.Heading>
Systemer og oppslagsverk
</Dropdown.Menu.GroupedList.Heading>
<Dropdown.Menu.GroupedList.Item
onClick={() => console.log("GroupedList.Item-click")}
>
Gosys
</Dropdown.Menu.GroupedList.Item>
</Dropdown.Menu.GroupedList>
</Dropdown.Menu>
</Dropdown>
),
args: { chromatic: { delay: 300 } },
};
export const ControlledOpen = {
render: () => {
// eslint-disable-next-line react-hooks/rules-of-hooks
const [openState, setOpenState] = useState(true);
return (
<Dropdown onSelect={(event) => console.log(event)} open={openState}>
<Button as={Dropdown.Toggle} onClick={() => setOpenState(!openState)}>
Toggle
</Button>
<Dropdown.Menu
strategy="fixed"
onClose={() => console.log("ONCLOSE CONTROLLED")}
>
<Dropdown.Menu.GroupedList>
<Dropdown.Menu.GroupedList.Heading>
Systemer og oppslagsverk
</Dropdown.Menu.GroupedList.Heading>
<Dropdown.Menu.GroupedList.Item
onClick={() => console.log("GroupedList.Item-click")}
>
Gosys
</Dropdown.Menu.GroupedList.Item>
</Dropdown.Menu.GroupedList>
</Dropdown.Menu>
</Dropdown>
);
},
args: { chromatic: { delay: 300 } },
};
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:16.15.0-alpine3.14
FROM node:18.1-alpine3.14
RUN apk add --no-cache libc6-compat
ENV NODE_ENV production
+9 -9
View File
@@ -15,16 +15,16 @@
"website"
],
"dependencies": {
"@navikt/ds-codemod": "^2.4.0",
"@navikt/ds-css": "^2.4.0",
"@navikt/ds-css-internal": "^2.4.0",
"@navikt/ds-icons": "^2.4.0",
"@navikt/ds-react": "^2.4.0",
"@navikt/ds-react-internal": "^2.4.0",
"@navikt/ds-tailwind": "^2.4.0",
"@navikt/ds-tokens": "^2.4.0"
"@navikt/ds-codemod": "^2.6.0",
"@navikt/ds-css": "^2.6.0",
"@navikt/ds-css-internal": "^2.6.0",
"@navikt/ds-icons": "^2.6.0",
"@navikt/ds-react": "^2.6.0",
"@navikt/ds-react-internal": "^2.6.0",
"@navikt/ds-tailwind": "^2.6.0",
"@navikt/ds-tokens": "^2.6.0"
},
"devDependencies": {
"prettier-plugin-tailwindcss": "^0.1.13"
"prettier-plugin-tailwindcss": "^0.2.3"
}
}
@@ -67,7 +67,7 @@ const serializers = {
<Ingress
spacing
{...textProps}
className={cl("algolia-index-body", {
className={cl({
"last:mb-0": context.noLastMargin,
})}
/>
@@ -76,27 +76,20 @@ const serializers = {
size={context.size}
spacing
{...textProps}
className={cl("algolia-index-body", {
className={cl({
"last:mb-0": context.noLastMargin,
})}
/>
);
case "detail":
return (
<Detail
spacing
size="small"
{...textProps}
className="algolia-index-detail"
/>
);
return <Detail spacing {...textProps} />;
case "h2":
return <LevelTwoHeading {...textProps} id={`h${node._key}`} />;
case "h3":
return (
<Heading
className="algolia-index-lvl3 max-w-text text-deepblue-800 mt-8 scroll-mt-20 focus:outline-none"
className="max-w-text text-deepblue-800 mt-8 scroll-mt-20 focus:outline-none"
spacing
level="3"
size="medium"
@@ -108,7 +101,7 @@ const serializers = {
case "h4":
return (
<Heading
className="algolia-index-lvl4 max-w-text text-deepblue-800 mt-6"
className="max-w-text text-deepblue-800 mt-6"
spacing
level="4"
size="small"
@@ -117,7 +110,7 @@ const serializers = {
);
case "ingress":
return (
<Ingress spacing className="algolia-index-ingress max-w-text">
<Ingress spacing className="max-w-text">
{children}
</Ingress>
);
@@ -127,7 +120,7 @@ const serializers = {
size={context.size}
spacing
{...textProps}
className="algolia-index-body max-w-text"
className="max-w-text"
/>
);
}
@@ -190,7 +183,7 @@ const serializers = {
}
if (href && href.startsWith("mailto:")) {
return (
<NextLink href={href} passHref>
<NextLink href={href} passHref legacyBehavior>
<Link
onClick={(e) =>
logNav(
@@ -222,7 +215,7 @@ const serializers = {
{children} <ExternalLink title="åpner lenken i ny fane" />
</Link>
) : (
<NextLink href={href} passHref>
<NextLink href={href} passHref legacyBehavior>
<Link
onClick={(e) =>
logNav(
@@ -244,7 +237,7 @@ const serializers = {
const href = `/${slug?.current}`;
return (
<NextLink href={href} passHref>
<NextLink href={href} passHref legacyBehavior>
<Link
onClick={(e) =>
logNav(
@@ -10,7 +10,7 @@ const Footer = () => {
id="aksel-footer"
data-hj-suppress
data-theme="dark"
className="algolia-ignore-index text-text-on-inverted bg-deepblue-800 relative flex w-full justify-center"
className="toc-ignore text-text-on-inverted bg-deepblue-800 relative flex w-full justify-center"
>
<div className="relative z-10 mx-auto grid w-full max-w-screen-2xl gap-16 px-4 pt-12 pb-16 md:px-6">
<div className="grid gap-12 xl:grid-cols-3 xl:gap-6">
@@ -21,14 +21,22 @@ const Footer = () => {
</Heading>
<BodyShort as="ul" className="mt-5 grid gap-2">
<li>
<NextLink href="/god-praksis/artikler/om-aksel" passHref>
<NextLink
href="/god-praksis/artikler/om-aksel"
passHref
legacyBehavior
>
<Link className="text-text-on-inverted focus:shadow-focus focus:text-text-default focus:bg-blue-200 focus:shadow-blue-200">
Om Aksel
</Link>
</NextLink>
</li>
<li>
<NextLink href="/god-praksis/artikler/skriv-for-aksel" passHref>
<NextLink
href="/god-praksis/artikler/skriv-for-aksel"
passHref
legacyBehavior
>
<Link className="text-text-on-inverted focus:shadow-focus focus:text-text-default focus:bg-blue-200 focus:shadow-blue-200">
Skriv for Aksel
</Link>
@@ -98,23 +106,22 @@ const Footer = () => {
Arbeids- og velferdsetaten
</div>
<span className="mb-1 self-end xl:mb-0" />
{/* <BodyShort className="mb-1 self-end xl:mb-0">
Redaktør: Eidar Grande Vollan
</BodyShort> */}
<div className="hidden self-end xl:block">
<p>&copy; {new Date().getFullYear()} NAV</p>
<NextLink href="/side/personvernerklaering" passHref>
<a className="focus:bg-border-focus-on-inverted focus:text-text-default focus:ring-border-focus-on-inverted outline-none hover:underline focus:no-underline focus:ring">
Personvernerklæring og informasjonskapsler
</a>
<NextLink
href="/side/personvernerklaering"
className="focus:bg-border-focus-on-inverted focus:text-text-default focus:ring-border-focus-on-inverted outline-none hover:underline focus:no-underline focus:ring"
>
Personvernerklæring og informasjonskapsler
</NextLink>
</div>
<div className="block self-end xl:hidden">
&copy; {new Date().getFullYear()} NAV |{" "}
<NextLink href="/side/personvernerklaering" passHref>
<a className="focus:bg-border-focus-on-inverted focus:ring-border-focus-on-inverted outline-none hover:underline focus:no-underline focus:ring">
Personvernerklæring og informasjonskapsler
</a>
<NextLink
href="/side/personvernerklaering"
className="focus:bg-border-focus-on-inverted focus:ring-border-focus-on-inverted outline-none hover:underline focus:no-underline focus:ring"
>
Personvernerklæring og informasjonskapsler
</NextLink>
</div>
</div>
@@ -11,27 +11,27 @@ const LinkElement = ({ name, href, onClick }) => {
const { asPath } = useRouter();
return (
<li className="flex h-11 items-center">
<Link href={href} passHref>
<a
className={cl(
"hover:bg-surface-action-subtle-hover focus-visible:shadow-focus-inset relative flex h-full w-full items-center rounded px-2 focus:outline-none",
{
"before:bg-surface-action-selected pl-4 font-semibold before:absolute before:left-0 before:h-6 before:w-1 before:rounded-full":
asPath.startsWith(href),
"": !asPath.startsWith(href),
}
)}
onClick={(e) => {
logNav(
"header",
window.location.pathname,
e.currentTarget.getAttribute("href")
);
onClick();
}}
>
{name}
</a>
<Link
href={href}
passHref
className={cl(
"hover:bg-surface-action-subtle-hover focus-visible:shadow-focus-inset relative flex h-full w-full items-center rounded px-2 focus:outline-none",
{
"before:bg-surface-action-selected pl-4 font-semibold before:absolute before:left-0 before:h-6 before:w-1 before:rounded-full":
asPath.startsWith(href),
"": !asPath.startsWith(href),
}
)}
onClick={(e) => {
logNav(
"header",
window.location.pathname,
e.currentTarget.getAttribute("href")
);
onClick();
}}
>
{name}
</Link>
</li>
);
@@ -63,7 +63,7 @@ export const Hamburger = () => {
aria={{ modal: true }}
overlayClassName="header-modal__overlay"
contentLabel="Meny"
className="bg-surface-default xs:max-w-[90%] xs:right-6 xs:left-auto xs:w-96 absolute left-4 top-0 right-4 block rounded py-14 px-11 md:hidden"
className="bg-surface-default absolute left-4 top-0 right-4 block rounded py-14 px-11 sm:right-6 sm:left-auto sm:w-96 sm:max-w-[90%] md:hidden"
>
<nav aria-label="hovedmeny">
<ul>
@@ -10,27 +10,27 @@ const LinkElement = ({ name, href }) => {
const { asPath } = useRouter();
return (
<li>
<Link href={href} passHref>
<a
className={cl(
"text-deepblue-800 focus-visible:shadow-focus relative grid h-full place-items-center rounded px-2 focus:outline-none",
{
"before:bg-border-action-selected font-semibold before:absolute before:bottom-[1px] before:z-10 before:h-1 before:w-[calc(100%_-_16px)] before:rounded-full":
asPath.startsWith(href),
"hover:before:bg-border-subtle-hover before:absolute before:bottom-[1px] before:z-10 before:h-1 before:w-[calc(100%_-_16px)] before:rounded-full":
!asPath.startsWith(href),
}
)}
onClick={(e) =>
logNav(
"header",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
<Link
href={href}
passHref
className={cl(
"text-deepblue-800 focus-visible:shadow-focus relative grid h-full place-items-center rounded px-2 focus:outline-none",
{
"before:bg-border-action-selected font-semibold before:absolute before:bottom-[1px] before:z-10 before:h-1 before:w-[calc(100%_-_16px)] before:rounded-full":
asPath.startsWith(href),
"hover:before:bg-border-subtle-hover before:absolute before:bottom-[1px] before:z-10 before:h-1 before:w-[calc(100%_-_16px)] before:rounded-full":
!asPath.startsWith(href),
}
>
{name}
</a>
)}
onClick={(e) =>
logNav(
"header",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
>
{name}
</Link>
</li>
);
@@ -55,21 +55,21 @@ export const Header = ({
})}
>
<div className="mx-auto flex h-full max-w-screen-2xl items-center pr-4 pt-3 lg:pr-6">
<div className="xs:pr-6 xs:pl-4 flex h-11 items-center pr-4 pl-4">
<Link href="/" passHref>
<a
onClick={(e) =>
logNav(
"header",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
className="focus-visible:shadow-focus grid h-full place-items-center rounded px-2 focus:outline-none"
>
<Logo />
<span className="sr-only">Aksel</span>
</a>
<div className="flex h-11 items-center pr-4 pl-4 sm:pr-6 sm:pl-4">
<Link
href="/"
passHref
onClick={(e) =>
logNav(
"header",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
className="focus-visible:shadow-focus grid h-full place-items-center rounded px-2 focus:outline-none"
>
<Logo />
<span className="sr-only">Aksel</span>
</Link>
</div>
<nav
@@ -2,9 +2,9 @@ import { urlFor } from "@/lib";
import { isNew } from "@/utils";
import { Tag } from "@navikt/ds-react";
import cl from "classnames";
import Image from "next/legacy/image";
import { StatusTag } from "components/website-modules/StatusTag";
import { SearchHit } from "lib/types/search";
import Image from "next/image";
import NextLink from "next/link";
export function Hit({
@@ -29,16 +29,16 @@ export function Hit({
)}
>
<div className="px-2 py-6">
<NextLink href={`/${hit.item.slug}`} passHref>
<a
onClick={() => logSuccess(index, `/${(hit.item as any).slug}`)}
className="flex items-center gap-2 text-xl font-semibold after:absolute after:inset-0 focus:outline-none"
>
<span className="group-hover:underline">
{highlightStr(hit.item.heading, query)}
</span>
<StatusTag status={hit?.item?.status?.tag} aria-hidden />
</a>
<NextLink
href={`/${hit.item.slug}`}
passHref
onClick={() => logSuccess(index, `/${(hit.item as any).slug}`)}
className="flex items-center gap-2 text-xl font-semibold after:absolute after:inset-0 focus:outline-none"
>
<span className="group-hover:underline">
{highlightStr(hit.item.heading, query)}
</span>
<StatusTag status={hit?.item?.status?.tag} aria-hidden />
</NextLink>
<span className="font-regular text-text-subtle text-lg" aria-hidden>
{hit.highlight.shouldHightlight ? (
@@ -62,8 +62,8 @@ export function Hit({
<Image
src={urlFor(hit.item.status.bilde).auto("format").url()}
decoding="sync"
width="96px"
height="96px"
width="96"
height="96"
layout="fixed"
objectFit="contain"
alt={hit.item?.heading + " thumbnail"}
@@ -100,20 +100,17 @@ export function IconHit({
<NextLink
href={`/grunnleggende/staesj/ikoner?icon=${hit.item.name}`}
passHref
onClick={() => logSuccess(index, `/${(hit.item as any).name}`)}
className="flex items-center gap-2 text-xl font-semibold after:absolute after:inset-0 focus:outline-none"
>
<a
onClick={() => logSuccess(index, `/${(hit.item as any).name}`)}
className="flex items-center gap-2 text-xl font-semibold after:absolute after:inset-0 focus:outline-none"
>
<span className="group-hover:underline">
{highlightStr(hit.item.name, query)}
</span>
{isNew(hit.item?.created_at ?? "") && (
<Tag variant="info" size="small" aria-hidden>
Ny
</Tag>
)}
</a>
<span className="group-hover:underline">
{highlightStr(hit.item.name, query)}
</span>
{isNew(hit.item?.created_at ?? "") && (
<Tag variant="info" size="small" aria-hidden>
Ny
</Tag>
)}
</NextLink>
</div>
@@ -121,8 +118,8 @@ export function IconHit({
<Image
src={`https://raw.githubusercontent.com/navikt/aksel/main/%40navikt/icons/svg/${hit.item.name}.svg`}
decoding="sync"
width="24px"
height="24px"
width="24"
height="24"
layout="fixed"
objectFit="contain"
alt={hit.item.name + " thumbnail"}
@@ -119,7 +119,7 @@ const AkselArtikkelTemplate = ({
<Heading
level="1"
size="large"
className="algolia-index-lvl1 text-deepblue-800 mt-4 md:text-5xl"
className="text-deepblue-800 mt-4 md:text-5xl"
>
{data.heading}
</Heading>
@@ -154,11 +154,12 @@ const AkselArtikkelTemplate = ({
key={title}
href={`/god-praksis/${slug.current}`}
passHref
legacyBehavior
>
<BodyShort
size="small"
as="a"
className="algolia-index-lvl5 min-h-8 text-deepblue-800 focus-visible:shadow-focus flex items-center justify-center gap-[2px] rounded-full bg-gray-200 pl-4 pr-1 capitalize no-underline hover:underline focus:outline-none"
className="min-h-8 text-deepblue-800 focus-visible:shadow-focus flex items-center justify-center gap-[2px] rounded-full bg-gray-200 pl-4 pr-1 capitalize no-underline hover:underline focus:outline-none"
>
{title}
<Next aria-hidden />
@@ -73,7 +73,7 @@ const AkselPrinsippTemplate = ({
>
<article className="overflow-x-clip">
<div
className={cl("max-w-aksel xs:w-[90%] mx-auto px-4", {
className={cl("max-w-aksel mx-auto px-4 sm:w-[90%]", {
"pb-32": mainPage,
})}
>
@@ -88,7 +88,7 @@ const AkselPrinsippTemplate = ({
<Heading
level="1"
size="large"
className="algolia-index-lvl1 text-deepblue-700 mt-4 md:text-5xl"
className="text-deepblue-700 mt-4 md:text-5xl"
>
{data.heading}
</Heading>
@@ -123,7 +123,7 @@ const AkselPrinsippTemplate = ({
"bg-gray-100": mainPage,
})}
>
<div className="max-w-aksel xs:w-[90%] mx-auto px-4">
<div className="max-w-aksel mx-auto px-4 sm:w-[90%]">
<div className="pb-16 md:pb-32">
<div className="relative mx-auto mt-4 max-w-prose lg:ml-0 lg:grid lg:max-w-none lg:grid-flow-row-dense lg:grid-cols-3 lg:items-start lg:gap-x-12">
<TableOfContents
@@ -135,7 +135,7 @@ const AkselPrinsippTemplate = ({
{data?.hero_bilde && (
<Bilde
node={data.hero_bilde as any}
className="xs:-mt-72 -mt-36 mb-10"
className="-mt-36 mb-10 sm:-mt-72"
/>
)}
<SanityBlockContent
@@ -62,7 +62,7 @@ const KomponentArtikkelTemplate = ({
size="xlarge"
level="1"
spacing
className="algolia-index-lvl1 text-deepblue-800 flex flex-wrap items-center gap-4"
className="text-deepblue-800 flex flex-wrap items-center gap-4"
>
{data.heading}
</Heading>
@@ -8,7 +8,7 @@ import { ReactNode } from "react";
import cl from "clsx";
import NextLink from "next/link";
import { capitalize } from "@/utils";
import Image from "next/image";
import Image from "next/legacy/image";
import { TableOfContentsv2 } from "components/website-modules/TOCv2";
const HeaderCube = ({ ...props }) => (
@@ -77,7 +77,7 @@ export const WithSidebar = ({
<main
tabIndex={-1}
id="hovedinnhold"
className="min-h-screen-header md:max-w-screen-sidebar xs:pl-6 xs:pr-6 relative w-full px-4 focus:outline-none md:pl-0"
className="min-h-screen-header md:max-w-screen-sidebar relative w-full px-4 focus:outline-none sm:pl-6 sm:pr-6 md:pl-0"
>
<div
className={cl(
@@ -96,6 +96,7 @@ export const WithSidebar = ({
<NextLink
href={`/${pageType.type.toLowerCase()}`}
passHref
legacyBehavior
>
<Link className="text-text-default">
{capitalize(pageType.type)}
@@ -144,12 +145,12 @@ export const WithSidebar = ({
</div>
)}
{variant === "landingPage" && (
<div className="xs:block pointer-events-none absolute top-0 right-0 hidden">
<div className="pointer-events-none absolute top-0 right-0 hidden sm:block">
<HeaderCube className="text-deepblue-300 z-0 max-h-full" />
</div>
)}
</div>
<div className={cl("xs:px-6 md:px-10", { flex: withToc })}>
<div className={cl("sm:px-6 md:px-10", { flex: withToc })}>
{withToc && (
<TableOfContentsv2
changedState={pageProps["content"]}
@@ -19,7 +19,7 @@ export const NoSidebarLayout = ({
id="hovedinnhold"
className="aksel-artikkel bg-gray-50 pt-4 focus:outline-none"
>
<div className="max-w-aksel xs:w-[90%] mx-auto px-4">
<div className="max-w-aksel mx-auto px-4 sm:w-[90%]">
<article className="pt-12 pb-16 md:pb-32">{children}</article>
</div>
{aside}
@@ -31,7 +31,7 @@ const NavItem = ({
}
)}
>
<Link href={`/${link.slug}`} passHref>
<Link href={`/${link.slug}`} passHref legacyBehavior>
<BodyShort
as="a"
size="small"
@@ -156,7 +156,7 @@ export const Sidebar = ({
return (
<div
data-testid="ds-sidebar"
className="algolia-ignore-index w-sidebar bg-surface-default z-[1002] hidden shrink-0 self-start pb-4 md:block"
className="toc-ignore w-sidebar bg-surface-default z-[1002] hidden shrink-0 self-start pb-4 md:block"
>
<nav aria-label={kategori} className={cl("overflow-x-auto")}>
<ul className="pb-4 pl-6">
@@ -20,10 +20,7 @@ const Accordion = ({
<DsAccordion.Item key={el._key}>
<DsAccordion.Header>{el.title}</DsAccordion.Header>
<DsAccordion.Content>
<SanityBlockContent
blocks={el.content}
className="algolia-ignore-index"
/>
<SanityBlockContent blocks={el.content} className="toc-ignore" />
</DsAccordion.Content>
</DsAccordion.Item>
))}
@@ -43,7 +43,7 @@ const Element = ({
return (
<figure
className={cl(
"flex min-w-full flex-1 flex-col rounded-t sm:min-w-[440px]",
"flex min-w-full flex-1 flex-col rounded-t sm:min-w-[320px]",
{
"basis-full": block?.fullwidth,
"max-w-sm": !block?.fullwidth,
@@ -23,7 +23,7 @@ const Intro = ({
<div>
<>
<Label as="p" className="mb-3">
Egnet til å:
Egnet til:
</Label>
<ul className="mb-7 list-disc">
{node.brukes_til.map((x) => (
@@ -39,7 +39,7 @@ const Intro = ({
{node?.brukes_ikke_til && (
<>
<Label as="p" className="mb-3">
Vurder noe annet:
Uegnet til:
</Label>
<ul className="list-disc">
{node.brukes_ikke_til.map((x) => (
@@ -38,8 +38,7 @@ const TableComponent = ({
</Table.Body>
</Table>
<style global jsx>{`
.algolia-index-body.navds-body-long.navds-typo--spacing
+ .table-heading-margin {
.navds-body-long.navds-typo--spacing + .table-heading-margin {
margin-top: -1rem;
}
.table-heading-margin + .navds-heading {
@@ -102,6 +102,7 @@ const TokenTable = ({ node }: { node: SanityT.Schema.token_kategori }) => {
<NextLink
href="https://aksel.nav.no/grunnleggende/styling/design-tokens#hec62d38bc813"
passHref
legacyBehavior
>
<Link>guiden vår</Link>
</NextLink>{" "}
@@ -28,7 +28,7 @@ const Bilde = ({
<>
<figure
className={cl("m-0 mb-8 flex flex-col", style.figure, className, {
"sm:max-w-text": node?.small,
"md:max-w-text": node?.small,
})}
>
<div
@@ -58,7 +58,7 @@ const Bilde = ({
{node?.kilde?.link ? (
<>
{`${node?.kilde?.prefix}: `}
<NextLink href={node.kilde.link} passHref>
<NextLink href={node.kilde.link} passHref legacyBehavior>
<Link className="break-normal">{node?.kilde?.tekst}</Link>
</NextLink>
</>
@@ -42,25 +42,22 @@ const ArtikkelCard = ({
},
}}
passHref
className="after:absolute after:inset-0 after:z-10 after:rounded-lg focus:outline-none"
onClick={(e) =>
logNav(
"artikkel-kort",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
>
<a
className="after:absolute after:inset-0 after:z-10 after:rounded-lg focus:outline-none"
onClick={(e) =>
logNav(
"artikkel-kort",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
<Heading
level={level}
size="small"
className="text-deepblue-700 group-hover:underline"
>
<Heading
level={level}
size="small"
className="text-deepblue-700 group-hover:underline"
>
{heading}
</Heading>
</a>
{heading}
</Heading>
</NextLink>
{ingress && <BodyShort className="mt-2">{ingress}</BodyShort>}
{variant === "god-praksis" ? (
@@ -20,7 +20,7 @@ const BloggCard = ({
return (
<li key={blog._id} className="border-b-border-subtle h-fit border-b pb-8">
<Heading size="medium" as="div">
<NextLink href={`/${blog.slug}`} passHref>
<NextLink href={`/${blog.slug}`} passHref legacyBehavior>
<Link
className="text-deepblue-500 no-underline hover:underline"
onClick={(e) =>
@@ -2,7 +2,7 @@ import { withErrorBoundary } from "@/error-boundary";
import { BodyShort } from "@navikt/ds-react";
import cl from "clsx";
import NextLink from "next/link";
import Image from "next/image";
import Image from "next/legacy/image";
import { logNav } from "@/utils";
import { SanityT, urlFor } from "@/lib";
@@ -32,19 +32,19 @@ const GodPraksisCard = ({ node }: { node: AkselTemaT }) => {
priority
/>
</div>
<NextLink href={`/god-praksis/${node.slug.current}`} passHref>
<a
onClick={(e) =>
logNav(
"card",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
className="navds-heading--medium text-deepblue-700 navds-heading mb-4 no-underline after:absolute after:inset-0 after:rounded-lg focus:outline-none group-hover:underline"
>
{node.title}
</a>
<NextLink
href={`/god-praksis/${node.slug.current}`}
passHref
onClick={(e) =>
logNav(
"card",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
className="navds-heading--medium text-deepblue-700 navds-heading mb-4 no-underline after:absolute after:inset-0 after:rounded-lg focus:outline-none group-hover:underline"
>
{node.title}
</NextLink>
<BodyShort className={cl("mb-2 lg:mb-6")}>{node.oppsummering}</BodyShort>
<BodyShort size="small" className="text-text-subtle">
@@ -15,27 +15,27 @@ const InnholdsKort = ({
}
return (
<article className="shadow-small last-of-type:mb-18 focus-within:ring-border-focus hover:shadow-medium xs:p-8 group relative mb-7 rounded-lg bg-white p-4 ring-1 ring-gray-900/10 focus-within:ring">
<article className="shadow-small last-of-type:mb-18 focus-within:ring-border-focus hover:shadow-medium group relative mb-7 rounded-lg bg-white p-4 ring-1 ring-gray-900/10 focus-within:ring sm:p-8">
<Heading
spacing
size="small"
level="3"
id={node._key}
className="algolia-index-lvl3 text-deepblue-500 scroll-mt-28 focus:outline-none group-hover:underline"
className="text-deepblue-500 scroll-mt-28 focus:outline-none group-hover:underline"
>
<NextLink href={`/${node?.lenke}`} passHref>
<a
onClick={(e) =>
logNav(
"prinsipp-kort",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
className="z-10 before:absolute before:inset-0 focus:outline-none"
>
{node.title}
</a>
<NextLink
href={`/${node?.lenke}`}
passHref
onClick={(e) =>
logNav(
"prinsipp-kort",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
className="z-10 before:absolute before:inset-0 focus:outline-none"
>
{node.title}
</NextLink>
</Heading>
<SanityBlockContent blocks={node.body} noLastMargin />
@@ -27,36 +27,37 @@ const RelatertInnhold = ({
className={cl(
"relatedCard",
"mb-8 max-w-4xl gap-4",
"xs:grid-cols-2 grid w-full"
"grid w-full sm:grid-cols-2"
)}
>
{node.lenker.map((x) => (
<NextLink href={getHref(x)} passHref key={x._key}>
<a
onClick={(e) =>
logNav(
"relatert-innhold",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
className="algolia-ignore-index shadow-small focus-visible:shadow-focus bg-surface-default ring-border-subtle group grid rounded border-2 border-transparent px-4 py-3 ring-1 focus:outline-none"
<NextLink
href={getHref(x)}
passHref
key={x._key}
onClick={(e) =>
logNav(
"relatert-innhold",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
className="toc-ignore shadow-small focus-visible:shadow-focus bg-surface-default ring-border-subtle group grid rounded border-2 border-transparent px-4 py-3 ring-1 focus:outline-none"
>
<Heading
as="span"
size="xsmall"
className="underline group-hover:no-underline"
>
<Heading
as="span"
size="xsmall"
className="underline group-hover:no-underline"
>
{x.title}
</Heading>
<BodyShort
size="small"
className="text-text-subtle mt-1 self-end break-words"
as="span"
>
{x.ekstern_domene ? <>{getTag(x)}</> : `aksel.nav.no`}
</BodyShort>
</a>
{x.title}
</Heading>
<BodyShort
size="small"
className="text-text-subtle mt-1 self-end break-words"
as="span"
>
{x.ekstern_domene ? <>{getTag(x)}</> : `aksel.nav.no`}
</BodyShort>
</NextLink>
))}
</div>
@@ -19,6 +19,7 @@ const ComponentExamples = ({
}): JSX.Element => {
const [activeExample, setActiveExample] = useState(null);
const [frameState, setFrameState] = useState(300);
const [unloaded, setUnloaded] = useState(true);
const handleExampleLoad = () => {
let attempts = 0;
@@ -32,6 +33,7 @@ const ComponentExamples = ({
const newHeight = iframePadding + exampleWrapper.offsetHeight;
clearInterval(waitForExampleContentToRender);
setFrameState(newHeight < 300 ? 300 : newHeight);
setUnloaded(false);
}
attempts++;
@@ -77,7 +79,10 @@ const ComponentExamples = ({
key={fil._key}
value={fil.navn}
selected={active === fil.navn}
onClick={() => setActiveExample(fil.navn)}
onClick={() => {
setActiveExample(fil.navn);
setUnloaded(true);
}}
>
{fixName(fil.navn)}
</Chips.Toggle>
@@ -100,7 +105,15 @@ const ComponentExamples = ({
{active === fil.navn && (
<>
<div className="overflow-hidden rounded-t border border-b-0 border-gray-300 bg-gray-50">
<div
className={cl(
"overflow-hidden rounded-t border border-b-0 border-gray-300 ",
{
"relative animate-pulse": unloaded,
"bg-gray-50": !unloaded,
}
)}
>
<iframe
src={`/eksempler/${node.dir.title}/${fil.navn.replace(
".tsx",
@@ -109,21 +122,30 @@ const ComponentExamples = ({
height={frameState}
onLoad={() => handleExampleLoad()}
id={iframeId}
aria-label="Komponent eksempler"
aria-label={`${node?.dir?.title} ${fil.navn} eksempel`}
className={cl(
"min-w-80 block w-full max-w-full resize-x overflow-auto bg-white shadow-[20px_0_20px_-20px_rgba(0,0,0,0.22)]"
"min-w-80 block w-full max-w-full resize-x overflow-auto bg-white shadow-[20px_0_20px_-20px_rgba(0,0,0,0.22)]",
{ invisible: unloaded }
)}
title="Kode-eksempler"
/>
{unloaded && (
<div className="absolute inset-0 mx-auto flex flex-col items-center justify-center gap-2">
<div className="grid w-3/5 gap-2">
<div className="bg-surface-neutral-subtle h-6 w-2/3 rounded-xl" />
<div className="bg-surface-neutral-subtle h-16 w-full rounded-xl" />
</div>
</div>
)}
</div>
<div className="xs:justify-end mb-2 flex justify-center gap-2 rounded-b border border-gray-300 px-2 py-1 text-base ">
<div className="mb-2 flex justify-center gap-2 rounded-b border border-gray-300 px-2 py-1 text-base sm:justify-end ">
<CodeSandbox code={fil.innhold.trim()} />
<Link
href={`/eksempler/${node.dir.title}/${fil.navn.replace(
".tsx",
""
)}`}
className="text-gray-900"
className="si-ignore text-gray-900"
target="_blank"
>
Åpne i nytt vindu
@@ -3,7 +3,7 @@ import { SanityT, urlFor } from "@/lib";
import { Heading } from "@navikt/ds-react";
import Nextlink from "next/link";
import cl from "clsx";
import Image from "next/image";
import Image from "next/legacy/image";
import { StatusTag } from "components/website-modules/StatusTag";
const ComponentOverview = ({
@@ -58,8 +58,8 @@ const ComponentOverview = ({
<Image
src={urlFor(x.status?.bilde).auto("format").url()}
decoding="async"
width="200px"
height="200px"
width="200"
height="200"
layout="fixed"
objectFit="contain"
alt={x?.heading + " thumbnail"}
@@ -106,7 +106,11 @@ const ComponentOverview = ({
<div className="grid p-6 pt-0">
<span className="flex items-center justify-between">
<Nextlink href={`/${x?.slug.current}`} passHref>
<Nextlink
href={`/${x?.slug.current}`}
passHref
legacyBehavior
>
<Heading
as="a"
size="small"
@@ -62,6 +62,7 @@ const Filter = ({
}}
size="small"
defaultValue="outline"
variant="neutral"
>
<ToggleGroup.Item value="outline">Outline</ToggleGroup.Item>
<ToggleGroup.Item value="filled">Filled</ToggleGroup.Item>
@@ -1,7 +1,7 @@
import meta from "@navikt/ds-icons/meta.json";
import { BodyShort, Button, Detail, Heading } from "@navikt/ds-react";
import Image from "next/image";
import { useEffect, useState } from "react";
import Image from "next/legacy/image";
import {
AmplitudeEvents,
@@ -74,7 +74,7 @@ import ${icon} from "@navikt/ds-icons/svg/${icon}.svg";`,
return (
<div className="flex min-w-[300px] max-w-xl shrink flex-col">
<div className="xs:flex-row mr-16 inline-flex flex-col justify-between gap-4">
<div className="mr-16 inline-flex flex-col justify-between gap-4 sm:flex-row">
<div>
<Heading
spacing
@@ -136,8 +136,8 @@ import ${icon} from "@navikt/ds-icons/svg/${icon}.svg";`,
<Image
src={`https://raw.githubusercontent.com/navikt/aksel/main/%40navikt/icons/svg/${icon}.svg`}
decoding="sync"
width="96px"
height="96px"
width="96"
height="96"
layout="fixed"
objectFit="contain"
alt={icon + "eksempel lyst"}
@@ -149,8 +149,8 @@ import ${icon} from "@navikt/ds-icons/svg/${icon}.svg";`,
src={`https://raw.githubusercontent.com/navikt/aksel/main/%40navikt/icons/svg/${icon}.svg`}
decoding="sync"
className="invert"
width="96px"
height="96px"
width="96"
height="96"
layout="fixed"
objectFit="contain"
alt={icon + " eksempel mørk bakgrunn"}
@@ -63,7 +63,7 @@ const PropTable = ({ komponent }: { komponent: PropT }): JSX.Element => {
{komponent?.title ? komponent.title : "Props"}
</Heading>
<div className="algolia-ignore-index relative mb-8">
<div className="toc-ignore relative mb-8">
{komponent?.propref?.proplist?.length === 0 && (
<div className="mb-8 rounded-b border border-gray-300 p-2">
<BodyShort>Fant ingen props for denne komponenten.</BodyShort>
@@ -17,7 +17,7 @@ const Tips = ({ node }: { node: SanityT.Schema.tips }): JSX.Element => {
<div
className={cl(
style.tips,
"linear xs:px-8 my-8 max-w-2xl rounded-r border-l-[6px] border-l-green-200 bg-white px-4 py-4"
"linear my-8 max-w-2xl rounded-r border-l-[6px] border-l-green-200 bg-white px-4 py-4 sm:px-8"
)}
>
<Detail
@@ -71,7 +71,7 @@ const Tips = ({ node }: { node: SanityT.Schema.tips }): JSX.Element => {
<div
className={cl(
style.tips,
"xs:px-6 my-7 max-w-2xl px-4 py-3 shadow-[inset_5px_0_0_0_var(--a-gray-500),inset_0_0_0_1px_var(--a-gray-200)]"
"my-7 max-w-2xl px-4 py-3 shadow-[inset_5px_0_0_0_var(--a-gray-500),inset_0_0_0_1px_var(--a-gray-200)] sm:px-6"
)}
>
<Detail
@@ -5,10 +5,12 @@ export const Frame = ({
tokens,
styles,
element: Element,
showHex,
}: {
tokens: { name: string; value: string; description?: string }[];
styles: string;
styles?: string;
element?: ({ token, name }: { token: string; name?: string }) => JSX.Element;
showHex?: boolean;
}) => {
const hasDescription = !!tokens.find((x) => x?.description);
return (
@@ -45,7 +47,7 @@ export const Frame = ({
{c.value}
</td>
<Detail as="td" className="mt-1">
{c.description}
{showHex ? getHex(c.value) : c.description}
</Detail>
</tr>
))}
@@ -53,3 +55,23 @@ export const Frame = ({
</table>
);
};
function getHex(value: string) {
return RGBAToHexA(value.replace(", 1)", ""));
}
/* https://stackoverflow.com/a/73401564 */
function RGBAToHexA(rgba, forceRemoveAlpha = false) {
return (
"#" +
rgba
.replace(/^rgba?\(|\s+|\)$/g, "") // Get's rgba / rgb string values
.split(",") // splits them at ","
.filter((string, index) => !forceRemoveAlpha || index !== 3)
.map((string) => parseFloat(string)) // Converts them to numbers
.map((number, index) => (index === 3 ? Math.round(number * 255) : number)) // Converts alpha to 255 number
.map((number) => number.toString(16)) // Converts numbers to hex
.map((string) => (string.length === 1 ? "0" + string : string)) // Adds 0 when length of one number is 1
.join("")
); // Puts the array to togehter to a string
}
@@ -0,0 +1,128 @@
import docs from "@navikt/ds-tokens/docs.json";
import { Frame } from "../Frame";
export const BreakpointsView = ({ cat }: { cat: string }) => {
const breakpoints = docs[cat];
return (
<Frame
tokens={breakpoints}
element={({ name }: { token: string; name?: string }) => {
const Svg = getSvg(name);
return (
<div
className="min-h-16 bg-surface-default flex h-full w-full items-center justify-start rounded-md px-4 text-5xl font-semibold"
aria-hidden
>
{Svg}
</div>
);
}}
/>
);
};
function getSvg(token: string) {
switch (true) {
case token.includes("xs"):
return (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
focusable={false}
aria-hidden
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M7.75 5.77778C7.75 5.16382 8.20527 4.75 8.66667 4.75H15.3333C15.7947 4.75 16.25 5.16382 16.25 5.77778V18.2222C16.25 18.8362 15.7947 19.25 15.3333 19.25H8.66667C8.20527 19.25 7.75 18.8362 7.75 18.2222V5.77778ZM8.66667 3.25C7.28712 3.25 6.25 4.42806 6.25 5.77778V18.2222C6.25 19.5719 7.28712 20.75 8.66667 20.75H15.3333C16.7129 20.75 17.75 19.5719 17.75 18.2222V5.77778C17.75 4.42806 16.7129 3.25 15.3333 3.25H8.66667ZM12 16.75C11.5858 16.75 11.25 17.0858 11.25 17.5C11.25 17.9142 11.5858 18.25 12 18.25H12.01C12.4242 18.25 12.76 17.9142 12.76 17.5C12.76 17.0858 12.4242 16.75 12.01 16.75H12Z"
fill="#262626"
/>
</svg>
);
case token.includes("sm"):
return (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
focusable={false}
aria-hidden
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M6.75 5C6.75 4.30964 7.30964 3.75 8 3.75H16C16.6904 3.75 17.25 4.30964 17.25 5V19C17.25 19.6904 16.6904 20.25 16 20.25H8C7.30964 20.25 6.75 19.6904 6.75 19V5ZM8 2.25C6.48122 2.25 5.25 3.48122 5.25 5V19C5.25 20.5188 6.48122 21.75 8 21.75H16C17.5188 21.75 18.75 20.5188 18.75 19V5C18.75 3.48122 17.5188 2.25 16 2.25H8ZM11.5 4.75C11.0858 4.75 10.75 5.08579 10.75 5.5C10.75 5.91421 11.0858 6.25 11.5 6.25H12.5C12.9142 6.25 13.25 5.91421 13.25 5.5C13.25 5.08579 12.9142 4.75 12.5 4.75H11.5Z"
fill="#262626"
/>
</svg>
);
case token.includes("md"):
return (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
focusable={false}
aria-hidden
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M3.75 6C3.75 5.30964 4.30964 4.75 5 4.75H19C19.6904 4.75 20.25 5.30964 20.25 6V18C20.25 18.6904 19.6904 19.25 19 19.25H5C4.30964 19.25 3.75 18.6904 3.75 18V6ZM5 3.25C3.48122 3.25 2.25 4.48122 2.25 6V18C2.25 19.5188 3.48122 20.75 5 20.75H19C20.5188 20.75 21.75 19.5188 21.75 18V6C21.75 4.48122 20.5188 3.25 19 3.25H5ZM10.5 5.75C10.0858 5.75 9.75 6.08579 9.75 6.5C9.75 6.91421 10.0858 7.25 10.5 7.25H13.5C13.9142 7.25 14.25 6.91421 14.25 6.5C14.25 6.08579 13.9142 5.75 13.5 5.75H10.5Z"
fill="#262626"
/>
</svg>
);
case token.includes("lg"):
return (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
focusable={false}
aria-hidden
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M5.5 4.25C4.5335 4.25 3.75 5.0335 3.75 6V15C3.75 15.9665 4.5335 16.75 5.5 16.75H18.5C19.4665 16.75 20.25 15.9665 20.25 15V6C20.25 5.0335 19.4665 4.25 18.5 4.25H5.5ZM5.25 6C5.25 5.86193 5.36193 5.75 5.5 5.75H18.5C18.6381 5.75 18.75 5.86193 18.75 6V15C18.75 15.1381 18.6381 15.25 18.5 15.25H5.5C5.36193 15.25 5.25 15.1381 5.25 15V6ZM3 18.25C2.58579 18.25 2.25 18.5858 2.25 19C2.25 19.4142 2.58579 19.75 3 19.75H21C21.4142 19.75 21.75 19.4142 21.75 19C21.75 18.5858 21.4142 18.25 21 18.25H3Z"
fill="#262626"
/>
</svg>
);
case token.includes("xl"):
return (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
focusable={false}
aria-hidden
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M2.25 4.5C2.25 3.80964 2.80964 3.25 3.5 3.25H20.5C21.1904 3.25 21.75 3.80964 21.75 4.5V15.5C21.75 16.1904 21.1904 16.75 20.5 16.75H12.75V19.25H19C19.4142 19.25 19.75 19.5858 19.75 20C19.75 20.4142 19.4142 20.75 19 20.75H6C5.58579 20.75 5.25 20.4142 5.25 20C5.25 19.5858 5.58579 19.25 6 19.25H11.25V16.75H3.5C2.80964 16.75 2.25 16.1904 2.25 15.5V4.5ZM3.75 4.75V15.25H20.25V4.75H3.75Z"
fill="#262626"
/>
</svg>
);
default:
return null;
}
}
@@ -5,5 +5,5 @@ import { Frame } from "../Frame";
export const GlobalView = ({ cat }: { cat: string }) => {
const colors = docs[cat];
return <Frame tokens={colors} styles="background" />;
return <Frame tokens={colors} styles="background" showHex />;
};
@@ -11,6 +11,7 @@ export const SemanticView = ({ cat }: { cat: string }) => {
<Frame
tokens={colors}
styles="color"
showHex
element={({ token }: { token: string }) => {
const c = color(token);
const isLigth = c.luminosity() > 0.9;
@@ -38,6 +39,7 @@ export const SemanticView = ({ cat }: { cat: string }) => {
<Frame
tokens={colors}
styles="color"
showHex
element={({ token }: { token: string }) => {
const c = color(token);
const isLigth = c.luminosity() > 0.9;
@@ -66,6 +68,7 @@ export const SemanticView = ({ cat }: { cat: string }) => {
<Frame
tokens={colors}
styles="color"
showHex
element={({ token }: { token: string }) => {
const c = color(token);
const isLigth = c.luminosity() > 0.9;
@@ -92,5 +95,5 @@ export const SemanticView = ({ cat }: { cat: string }) => {
/>
);
}
return <Frame tokens={colors} styles="background" />;
return <Frame tokens={colors} styles="background" showHex />;
};
@@ -1,4 +1,5 @@
import { withErrorBoundary } from "@/error-boundary";
import { BreakpointsView } from "components/sanity-modules/token-view/categories/Breakpoints";
import { FontView } from "./categories/Font";
import { GlobalView } from "./categories/Global";
import { SemanticView } from "./categories/Semantic";
@@ -27,6 +28,8 @@ const TokenView = ({
return <SpacingView cat={token.title} />;
case token.title === "z-index":
return <ZindexView cat={token.title} />;
case token.title === "breakpoints":
return <BreakpointsView cat={token.title} />;
default:
return null;
}
@@ -16,49 +16,45 @@ const AkselLink = ({
className?: string;
}) => {
return (
<Link href={href} passHref>
<a
<Link
href={href}
passHref
className={cl("group relative w-fit pr-5 focus:outline-none", className, {
"white focus-visible:text-text-default focus-visible:bg-blue-200 focus-visible:shadow-[0_0_0_3px_var(--a-blue-200)]":
inverted,
"text-deepblue-500 focus-visible:text-text-on-action group-hover:text-deepblue-800 focus-visible:bg-blue-800 focus-visible:shadow-[0_0_0_3px_var(--a-blue-800)]":
!inverted,
})}
onClick={(e) =>
logNav(
"link",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
>
{children}
<svg
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={cl(
"group relative w-fit pr-5 focus:outline-none",
className,
{
"white focus-visible:text-text-default focus-visible:bg-blue-200 focus-visible:shadow-[0_0_0_3px_var(--a-blue-200)]":
inverted,
"text-deepblue-500 focus-visible:text-text-on-action group-hover:text-deepblue-800 focus-visible:bg-blue-800 focus-visible:shadow-[0_0_0_3px_var(--a-blue-800)]":
!inverted,
}
"ml-2 h-[20px] w-[10px] scale-[0.85] transition-[width,right] group-hover:w-[16px]",
"absolute right-[5px] top-1/2 -translate-y-1/2 rotate-180 group-hover:right-0"
)}
onClick={(e) =>
logNav(
"link",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
aria-hidden
>
{children}
<svg
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={cl(
"ml-2 h-[20px] w-[10px] scale-[0.85] transition-[width,right] group-hover:w-[16px]",
"absolute right-[5px] top-1/2 -translate-y-1/2 rotate-180 group-hover:right-0"
)}
aria-hidden
>
<path
d="M8 17.5L2.12132 11.6213C0.949744 10.4497 0.949746 8.55025 2.12132 7.37868L8 1.5"
stroke="currentColor"
strokeWidth="1.5"
/>
<path
d="M16 9.72266L8 9.72266"
strokeWidth="1.5"
stroke="currentColor"
className="hidden group-hover:block"
/>
</svg>
</a>
<path
d="M8 17.5L2.12132 11.6213C0.949744 10.4497 0.949746 8.55025 2.12132 7.37868L8 1.5"
stroke="currentColor"
strokeWidth="1.5"
/>
<path
d="M16 9.72266L8 9.72266"
strokeWidth="1.5"
stroke="currentColor"
className="hidden group-hover:block"
/>
</svg>
</Link>
);
};
@@ -69,7 +69,11 @@ export const BloggAd = () => {
</BodyLong>
<BodyLong>
Ta kontakt med{" "}
<NextLink href="https://nav-it.slack.com/archives/C7NE7A8UF" passHref>
<NextLink
href="https://nav-it.slack.com/archives/C7NE7A8UF"
passHref
legacyBehavior
>
<Link className="font-semibold text-[#831843]">
#Aksel-designsystemet
</Link>
@@ -18,34 +18,35 @@ export const BreadCrumbs = ({
}
return (
<NextLink href={href ?? `/god-praksis/${router.query.tema}`} passHref>
<a className="text-deepblue-500 hover:text-deepblue-800 group mb-1 flex w-fit items-center justify-start focus:underline focus:outline-none">
<svg
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={cl(
"transition-width text-deepblue-500 group-hover:text-deepblue-800 mr-2 h-[20px] w-[10px] group-hover:w-[16px]"
)}
aria-hidden
>
<path
d="M8 17.5L2.12132 11.6213C0.949744 10.4497 0.949746 8.55025 2.12132 7.37868L8 1.5"
stroke="currentColor"
strokeWidth="1.5"
/>
<path
d="M16 9.72266L8 9.72266"
strokeWidth="1.5"
stroke="currentColor"
className="hidden group-hover:block"
/>
</svg>
{text ??
(router.query.tema as string).replace(/(^\w|\s\w)/g, (m) =>
m.toUpperCase()
)}
</a>
<NextLink
href={href ?? `/god-praksis/${router.query.tema}`}
passHref
className="text-deepblue-500 hover:text-deepblue-800 group mb-1 flex w-fit items-center justify-start focus:underline focus:outline-none"
>
<svg
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={cl(
"transition-width text-deepblue-500 group-hover:text-deepblue-800 mr-2 h-[20px] w-[10px] group-hover:w-[16px]"
)}
aria-hidden
>
<path
d="M8 17.5L2.12132 11.6213C0.949744 10.4497 0.949746 8.55025 2.12132 7.37868L8 1.5"
stroke="currentColor"
strokeWidth="1.5"
/>
<path
d="M16 9.72266L8 9.72266"
strokeWidth="1.5"
stroke="currentColor"
className="hidden group-hover:block"
/>
</svg>
{text ??
(router.query.tema as string).replace(/(^\w|\s\w)/g, (m) =>
m.toUpperCase()
)}
</NextLink>
);
};
@@ -20,7 +20,7 @@ export const LevelTwoHeading = ({
level="2"
size="large"
className={cl(
"algolia-index-lvl2 max-w-text text-deepblue-800 group mb-4 mt-12 scroll-mt-20 first-of-type:mt-0 focus:outline-none",
"max-w-text text-deepblue-800 group mb-4 mt-12 scroll-mt-20 first-of-type:mt-0 focus:outline-none",
{
hidden: hidden,
block: !hidden,
@@ -1,4 +1,4 @@
import Image from "next/image";
import Image from "next/legacy/image";
import NextLink from "next/link";
import { dateStr } from "@/utils";
import { BodyLong, BodyShort, Heading, Link } from "@navikt/ds-react";
@@ -44,7 +44,7 @@ export const LatestBloggposts = ({
level={level}
size="xlarge"
className={cl(
"algolia-index-lvl1 text-deepblue-800 mx-auto w-full md:mx-0 md:max-w-none",
"text-deepblue-800 mx-auto w-full md:mx-0 md:max-w-none",
{ "text-5xl": variant === "blogg" }
)}
>
@@ -98,7 +98,7 @@ export const LatestBloggposts = ({
/>
)}
</div>
<NextLink href={`/${bloggs[0].slug}`} passHref>
<NextLink href={`/${bloggs[0].slug}`} passHref legacyBehavior>
<Link className="text-deepblue-500 no-underline hover:underline">
<Heading
size="large"
@@ -163,7 +163,7 @@ export const LatestBloggposts = ({
</div>
)}
<div>
<NextLink href={`/${blog.slug}`} passHref>
<NextLink href={`/${blog.slug}`} passHref legacyBehavior>
<Link className="text-deepblue-500 no-underline hover:underline">
<Heading
size="small"
@@ -236,7 +236,7 @@ export const LatestBloggposts = ({
/>
)}
</div>
<NextLink href={`/${bloggs[0].slug}`} passHref>
<NextLink href={`/${bloggs[0].slug}`} passHref legacyBehavior>
<Link className="text-deepblue-500 no-underline hover:underline">
<Heading
size="large"
@@ -295,7 +295,7 @@ export const LatestBloggposts = ({
</div>
)}
<div>
<NextLink href={`/${blog.slug}`} passHref>
<NextLink href={`/${blog.slug}`} passHref legacyBehavior>
<Link className="text-deepblue-500 no-underline hover:underline">
<Heading
size="small"
@@ -41,8 +41,9 @@ function PreviewBanner(): JSX.Element {
<Link
href="https://aksel.nav.no/god-praksis/artikler/ny-redaktor-i-aksel"
passHref
className="underline"
>
<a className="underline">Les mer om hvordan du får tilgang</a>
Les mer om hvordan du får tilgang
</Link>
</div>
</>
@@ -42,9 +42,9 @@ export function TableOfContents({
const filtered = Array.from(newTree)?.filter(
(x) =>
!Array.from(
main.getElementsByClassName("algolia-ignore-index")
)?.some((y) => y.contains(x))
!Array.from(main.getElementsByClassName("toc-ignore"))?.some((y) =>
y.contains(x)
)
);
const toc: {
heading: string;
@@ -132,7 +132,7 @@ export function TableOfContents({
<aside
aria-labelledby="toc-heading"
className={cl(
"algolia-ignore-index sticky top-20 z-[1] order-1 my-0 mb-16 hidden w-72 flex-col items-start pl-4",
"toc-ignore sticky top-20 z-[1] order-1 my-0 mb-16 hidden w-72 flex-col items-start pl-4",
{
hidden: !renderToc,
"col-start-3 max-w-prose md:sticky md:top-20 lg:flex":
@@ -42,9 +42,9 @@ export function TableOfContentsv2({
const filtered = Array.from(newTree)?.filter(
(x) =>
!Array.from(
main.getElementsByClassName("algolia-ignore-index")
)?.some((y) => y.contains(x))
!Array.from(main.getElementsByClassName("toc-ignore"))?.some((y) =>
y.contains(x)
)
);
const toc: {
heading: string;
@@ -131,7 +131,7 @@ export function TableOfContentsv2({
return (
<aside
className={cl(
"algolia-ignore-index xs:-mr-6 sticky top-20 z-[1] order-1 my-0 ml-6 mb-16 mr-auto h-full w-full max-w-[160px] flex-col items-start md:-mr-10",
"toc-ignore sticky top-20 z-[1] order-1 my-0 ml-6 mb-16 mr-auto h-full w-full max-w-[160px] flex-col items-start sm:-mr-6 md:-mr-10",
{
hidden: !renderToc,
"hidden xl:flex": renderToc,
@@ -77,7 +77,7 @@ export const ToolCard = () => {
<div className="-rotate-45">{t.icon}</div>
</div>
<div>
<NextLink href={t.href} passHref>
<NextLink href={t.href} passHref legacyBehavior>
<Link
className="text-text-default mb-1 font-semibold"
onClick={(e) =>
@@ -149,8 +149,8 @@ const Feedback = ({
if (!docId || !docType) return null;
const classes = akselFeedback
? "algolia-ignore-index scroll-my-[30vh]"
: cl("scroll-my-[30vh] algolia-ignore-index mt-44 mb-28", {
? "toc-ignore scroll-my-[30vh]"
: cl("scroll-my-[30vh] toc-ignore mt-44 mb-28", {
"mx-auto": center,
});
+6 -1
View File
@@ -196,7 +196,12 @@ const contributorsSingle = `contributors[0]->{
export const akselBloggPosts = `*[_type == "blogg_landingsside"][0]{
"page": {..., intro[]{...,${deRefs}}},
"bloggposts": *[_type == "aksel_blogg"] | order(_createdAt desc){
...,
seo,
heading,
ingress,
publishedAt,
_createdAt,
_id,
"slug": slug.current,
${contributorsAll}
}
+61 -71
View File
@@ -1,7 +1,6 @@
/* eslint-disable @typescript-eslint/no-var-requires */
/* eslint-disable no-undef */
const withTM = require("next-transpile-modules")(["@navikt/ds-tokens"]);
const withBundleAnalyzer = require("@next/bundle-analyzer")({
enabled: process.env.ANALYZE === "true",
});
@@ -13,7 +12,7 @@ const ContentSecurityPolicy = `
script-src 'self' https://in2.taskanalytics.com/tm.js 'nonce-4e1aa203a32e' 'unsafe-eval';
style-src 'self' 'unsafe-inline';
report-uri https://sentry.gc.nav.no/api/113/envelope/?sentry_key=d35bd60e413c489ca0f2fd389b4e6e5e&sentry_version=7;
connect-src 'self' https://raw.githubusercontent.com/navikt/ wss://hnbe3yhs.api.sanity.io cdn.sanity.io *.api.sanity.io https://amplitude.nav.no https://sentry.gc.nav.no https://*.algolia.net https://*.algolianet.com https://in2.taskanalytics.com/03346;
connect-src 'self' https://raw.githubusercontent.com/navikt/ wss://hnbe3yhs.api.sanity.io cdn.sanity.io *.api.sanity.io https://amplitude.nav.no https://sentry.gc.nav.no https://in2.taskanalytics.com/03346;
frame-ancestors localhost:3333 'self' localhost:3000 https://verktoykasse.sanity.studio/;
media-src 'self' cdn.sanity.io;
frame-src 'self' https://web.microsoftstream.com localhost:3000 https://aksel.dev.nav.no/;
@@ -51,81 +50,72 @@ const securityHeaders = [
];
const config = () =>
withBundleAnalyzer(
withTM({
serverRuntimeConfig: {
// Will only be available on the server side
azureAppClientId: process.env.AZURE_APP_CLIENT_ID,
azureJwksUri: process.env.AZURE_OPENID_CONFIG_JWKS_URI,
azureAppIssuer: process.env.AZURE_OPENID_CONFIG_ISSUER,
azureAppWellKnownUrl: process.env.AZURE_APP_WELL_KNOWN_URL,
azureAppJWK: process.env.AZURE_APP_JWK,
},
publicRuntimeConfig: {
NEXT_PUBLIC_TEST: process.env.NEXT_PUBLIC_TEST,
},
async headers() {
return [
{
source: "/:path*",
headers: securityHeaders,
},
];
},
rewrites: async () => [
withBundleAnalyzer({
transpilePackages: ["@navikt/ds-tokens"],
serverRuntimeConfig: {
// Will only be available on the server side
azureAppClientId: process.env.AZURE_APP_CLIENT_ID,
azureJwksUri: process.env.AZURE_OPENID_CONFIG_JWKS_URI,
azureAppIssuer: process.env.AZURE_OPENID_CONFIG_ISSUER,
azureAppWellKnownUrl: process.env.AZURE_APP_WELL_KNOWN_URL,
azureAppJWK: process.env.AZURE_APP_JWK,
},
publicRuntimeConfig: {
NEXT_PUBLIC_TEST: process.env.NEXT_PUBLIC_TEST,
},
async headers() {
return [
{
source: "/sitemap.xml",
destination: "/api/sitemap",
source: "/:path*",
headers: securityHeaders,
},
],
async redirects() {
return [
{
source: "/studio",
destination: "/admin",
permanent: true,
},
{
source: "/storybook",
destination:
"https://main--5f801fb2aea7820022de2936.chromatic.com/",
permanent: false,
},
{
source: "/prinsipper",
destination: "/",
permanent: false,
},
{
source: "/preview/:slug*",
destination: "/api/preview?slug=:slug*",
permanent: true,
},
];
];
},
rewrites: async () => [
{
source: "/sitemap.xml",
destination: "/api/sitemap",
},
],
async redirects() {
return [
{
source: "/studio",
destination: "/admin",
permanent: true,
},
{
source: "/storybook",
destination: "https://main--5f801fb2aea7820022de2936.chromatic.com/",
permanent: false,
},
{
source: "/prinsipper",
destination: "/",
permanent: false,
},
{
source: "/preview/:slug*",
destination: "/api/preview?slug=:slug*",
permanent: true,
},
];
},
webpack(config) {
config.module.rules.push({
test: /\.svg$/,
use: ["@svgr/webpack"],
});
webpack(config) {
config.module.rules.push({
test: /\.svg$/,
use: ["@svgr/webpack"],
});
return config;
},
images: {
domains: ["cdn.sanity.io", "raw.githubusercontent.com"],
dangerouslyAllowSVG: true,
},
/* swcMinify: true,
httpAgentOptions: {
keepAlive: false,
}, */
})
);
return config;
},
images: {
domains: ["cdn.sanity.io", "raw.githubusercontent.com"],
dangerouslyAllowSVG: true,
},
});
if (process.env.NODE_ENV === "production") {
/* console.log("sentry is enabled");
module.exports = withSentryConfig(config(), { silent: true }); */
module.exports = config();
} else {
module.exports = config();
+11 -12
View File
@@ -25,17 +25,17 @@
},
"dependencies": {
"@sanity/block-content-to-react": "^3.0.0",
"@sanity/client": "^4.0.1",
"@sanity/code-input": "4.0.0",
"@sanity/client": "^5.2.2",
"@sanity/code-input": "4.1.0",
"@sanity/color-input": "^3.0.2",
"@sanity/icons": "2.2.2",
"@sanity/image-url": "1.0.2",
"@sanity/preview-kit": "^1.3.2",
"@sanity/preview-kit": "^1.3.4",
"@sanity/table": "1.0.1",
"@sanity/ui": "^1.2.0",
"@sanity/vision": "3.2.6",
"@sanity/ui": "^1.3.0",
"@sanity/vision": "3.5.1",
"@svgr/webpack": "^5.5.0",
"amplitude-js": "^8.8.0",
"amplitude-js": "^8.21.5",
"boring-avatars": "1.7.0",
"clsx": "^1.2.1",
"codesandbox": "^2.2.3",
@@ -46,8 +46,8 @@
"jose": "4.10.0",
"jwt-decode": "3.1.2",
"lodash": "^4.17.21",
"next": "^12.2.0",
"next-sanity": "^4.1.2",
"next": "^13.2.1",
"next-sanity": "^4.1.5",
"prettier": "2.7.1",
"prism-react-renderer": "^1.3.0",
"prismjs": "^1.27.0",
@@ -55,10 +55,10 @@
"react-dom": "^18.0.0",
"react-modal": "3.15.1",
"recharts": "^2.2.0",
"sanity": "3.2.6",
"sanity": "3.5.1",
"sanity-plugin-asset-source-unsplash": "^1.0.6",
"sanity-plugin-iframe-pane": "^2.1.1",
"sanity-plugin-media": "^2.0.4",
"sanity-plugin-iframe-pane": "^2.2.0",
"sanity-plugin-media": "^2.0.5",
"sitemap": "^7.0.0",
"styled-components": "^5.2",
"swr": "^1.1.2",
@@ -83,7 +83,6 @@
"jest": "^29.0.0",
"jest-environment-jsdom": "^29.0.0",
"json5": "2.2.1",
"next-transpile-modules": "^9.0.0",
"postcss": "^8.4.0",
"postcss-import": "^14.1.0",
"postcss-loader": "7.0.0",
+1 -1
View File
@@ -24,7 +24,7 @@ function Page() {
<BodyLong className="mb-2">
Vi fant ikke siden du var ute etter{" "}
</BodyLong>
<NextLink href="/" passHref>
<NextLink href="/" passHref legacyBehavior>
<Link>Tilbake til forsiden</Link>
</NextLink>
</div>
@@ -85,7 +85,7 @@ export default async function logPageView(
// If last week is not same as current week, add new week
await client
.patch(metrics._id)
.prepend("weekObj.weeks", [
.prepend("weeksObj.weeks", [
{
week: format(new Date(), "yyyy-MM-dd"),
views: 1,
@@ -4,7 +4,7 @@ import Link from "next/link";
const Example = () => {
return (
<Link href="#" passHref>
<Link href="#" passHref legacyBehavior>
<Button as="a">Lenke</Button>
</Link>
);
@@ -0,0 +1,44 @@
import { List } from "@navikt/ds-react";
import { withDsExample } from "components/website-modules/examples/withDsExample";
const Example = () => {
return (
<List>
<List.Item title="Kritiske">
disse er problemer som må løses så fort som mulig—de hindrer folk i å
bruke siden i det hele tatt og kan være direkte farlig.
</List.Item>
<List.Item title="Høy">
brukere er forhindret i å forstå innholdet eller utføre kritiske
oppgaver, og det finnes ingen forsvarsstrategier eller alternative
løsninger.
<List>
<List.Item>
Rammeverket, inkludert navigasjon, påloggings- og søkefunksjoner
</List.Item>
<List.Item>Gjenbrukbare komponenter</List.Item>
<List.Item>Nøkkelstier gjennom nettstedet</List.Item>
</List>
</List.Item>
<List.Item title="Medium">
det er vanskelig, tidkrevende eller frustrerende for brukere å få
tilgang til innhold eller funksjonalitet.
</List.Item>
<List.Item title="Lav">
brukeren få tilgang til alt innhold og funksjonalitet, men
brukeropplevelsen er dårlig.
</List.Item>
</List>
);
};
export default withDsExample(Example);
/* Storybook story */
export const Demo = {
render: Example,
};
export const args = {
index: 4,
};
@@ -10,7 +10,7 @@ import ArtikkelCard from "components/sanity-modules/cards/ArtikkelCard";
import { AkselCubeStatic } from "components/website-modules/cube";
import { PreviewSuspense } from "next-sanity/preview";
import Head from "next/head";
import Image from "next/image";
import Image from "next/legacy/image";
import { lazy } from "react";
import NotFotfund from "../404";
@@ -84,8 +84,8 @@ const Page = ({ tema: page }: PageProps): JSX.Element => {
<Image
src={urlFor(page.pictogram.url).auto("format").url()}
decoding="sync"
width="72px"
height="72px"
width="72"
height="72"
layout="fixed"
priority
aria-hidden
@@ -94,15 +94,11 @@ const Page = ({ tema: page }: PageProps): JSX.Element => {
<Heading
level="1"
size="xlarge"
className="algolia-index-lvl1 mt-8 hidden md:block md:text-5xl"
className="mt-8 hidden md:block md:text-5xl"
>
{page.title}
</Heading>
<Heading
level="1"
size="large"
className="algolia-index-lvl1 mt-8 block md:hidden"
>
<Heading level="1" size="large" className="mt-8 block md:hidden">
{page.title}
</Heading>
@@ -115,7 +111,7 @@ const Page = ({ tema: page }: PageProps): JSX.Element => {
/>
<div
className={cl(
"max-w xs:w-96 relative z-10 mb-2 h-fit xl:mt-[10px]",
"max-w relative z-10 mb-2 h-fit sm:w-96 xl:mt-[10px]",
{ invisible: !hasAnsvarlig }
)}
aria-hidden={!hasAnsvarlig}
@@ -61,7 +61,7 @@ const Artikler = ({ articles }: ArtiklerProps) => {
<Heading
level="1"
size="xlarge"
className="algolia-index-lvl1 text-deepblue-800 my-20 md:text-[3rem]"
className="text-deepblue-800 my-20 md:text-[3rem]"
>
Artikler
</Heading>
@@ -66,7 +66,7 @@ const Page = ({ temaer, page, resent }: PageProps): JSX.Element => {
<Heading
level="1"
size="xlarge"
className="algolia-index-lvl1 text-deepblue-800 text-5xl"
className="text-deepblue-800 text-5xl"
>
God praksis
</Heading>
+31 -61
View File
@@ -37,48 +37,18 @@ const introcards = [
desc: "Farger, spacing, shadows, etc.",
icon: (props) => (
<svg
width="24"
height="24"
viewBox="0 0 24 24"
width="25"
height="25"
{...props}
viewBox="0 0 25 25"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
d="M12 3L19.7942 7.5V16.5L12 21L4.20576 16.5V7.5L12 3Z"
stroke="#262626"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M12 15L12 21"
stroke="#262626"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M19.7942 7.5L14.598 10.5"
stroke="#262626"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M9.40196 10.5L4.2058 7.50001"
stroke="#262626"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<circle
cx="12.0001"
cy="11.9999"
r="3"
stroke="#262626"
strokeWidth="1.5"
strokeLinecap="round"
fillRule="evenodd"
clipRule="evenodd"
d="M5.43701 12.5C5.43701 7.94365 9.13066 4.25 13.687 4.25C15.2739 4.25 16.4265 4.57516 17.3491 5.17306C18.2711 5.77061 19.0319 6.6847 19.7603 7.98893C20.2701 9.23986 20.4558 11.0729 19.1409 12.2863C18.6392 12.7493 18.012 12.982 17.3192 13.2391L17.3189 13.2393L17.3181 13.2396L17.3177 13.2397C17.2103 13.2796 17.1013 13.32 16.991 13.362C16.6196 13.5033 16.1837 13.6826 15.843 13.9598C15.4601 14.2712 15.187 14.7148 15.187 15.3125C15.187 15.7706 15.294 16.175 15.5132 16.5199C15.7288 16.859 16.02 17.089 16.3057 17.2548C16.5851 17.417 16.8886 17.5343 17.1497 17.6302C17.2102 17.6524 17.2682 17.6734 17.3244 17.6938L17.3247 17.6939C17.5288 17.7678 17.7074 17.8326 17.8824 17.9104C18.0341 17.9778 18.2347 18.2218 18.199 18.6447C18.1669 19.0253 17.9217 19.5564 17.1694 19.9814C16.1123 20.4743 14.9329 20.75 13.687 20.75C9.13066 20.75 5.43701 17.0563 5.43701 12.5ZM13.687 2.75C8.30224 2.75 3.93701 7.11522 3.93701 12.5C3.93701 17.8848 8.30224 22.25 13.687 22.25C15.1673 22.25 16.5725 21.9196 17.8311 21.3278C17.8463 21.3207 17.8613 21.313 17.876 21.3048C19.0194 20.6701 19.6136 19.7207 19.6937 18.7707C19.7706 17.8595 19.3524 16.9222 18.4916 16.5396C18.2631 16.4381 18.0201 16.3502 17.8105 16.2744L17.8102 16.2743L17.809 16.2738C17.7595 16.2559 17.712 16.2387 17.6669 16.2222C17.4112 16.1282 17.2155 16.0486 17.0589 15.9577C16.9087 15.8704 16.8273 15.791 16.7792 15.7153C16.7347 15.6454 16.687 15.5294 16.687 15.3125C16.687 15.2352 16.6995 15.1966 16.7895 15.1234C16.9218 15.0158 17.1463 14.9078 17.5245 14.7639C17.6117 14.7307 17.7061 14.6962 17.8063 14.6597C18.4827 14.4126 19.4192 14.0706 20.1581 13.3887C22.1944 11.5095 21.7328 8.82247 21.1293 7.37404C21.1186 7.34823 21.1064 7.32304 21.0928 7.2986C20.2923 5.85597 19.3781 4.70059 18.1649 3.9143C16.9434 3.12266 15.4886 2.75 13.687 2.75ZM17.6898 8.82978C16.8896 8.61536 16.0671 9.09024 15.8527 9.89044C15.6383 10.6906 16.1131 11.5131 16.9133 11.7276C17.7135 11.942 18.536 11.4671 18.7505 10.6669C18.9649 9.8667 18.49 9.04419 17.6898 8.82978ZM8.6083 7.94928C8.82271 7.14908 9.64522 6.6742 10.4454 6.88862C11.2456 7.10303 11.7205 7.92553 11.5061 8.72573C11.2917 9.52593 10.4692 10.0008 9.66896 9.78639C8.86876 9.57198 8.39388 8.74947 8.6083 7.94928ZM14.7147 5.44428C13.9145 5.22987 13.092 5.70474 12.8776 6.50494C12.6632 7.30514 13.138 8.12764 13.9382 8.34206C14.7384 8.55647 15.5609 8.0816 15.7754 7.2814C15.9898 6.4812 15.5149 5.65869 14.7147 5.44428Z"
fill="#262626"
/>
</svg>
),
@@ -111,28 +81,28 @@ const introcards = [
const IntroCards = () => {
return (
<ul className="centered-layout xs:mb-36 mb-40 grid w-full max-w-screen-md grid-cols-2 gap-4 md:gap-6">
<ul className="centered-layout mb-40 grid w-full max-w-screen-md grid-cols-2 gap-4 sm:mb-36 md:gap-6">
{introcards.map(({ icon: Icon, title, desc, href }) => (
<li key={title} className="grid">
<Link href={href} passHref>
<a
className="focus-visible:shadow-focus bg-surface-default hover:shadow-small hover:ring-border-subtle group z-10 rounded-lg p-4 hover:ring-1 focus:outline-none"
onClick={(e) =>
logNav(
"intro-kort",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
>
<span className="xs:flex items-center gap-2">
<Icon aria-hidden className="shrink-0 text-2xl" role="img" />
<span className="text-xl font-semibold group-hover:underline">
{title}
</span>
<Link
href={href}
passHref
className="focus-visible:shadow-focus bg-surface-default hover:shadow-small hover:ring-border-subtle group z-10 rounded-lg p-4 hover:ring-1 focus:outline-none"
onClick={(e) =>
logNav(
"intro-kort",
window.location.pathname,
e.currentTarget.getAttribute("href")
)
}
>
<span className="items-center gap-2 sm:flex">
<Icon aria-hidden className="shrink-0 text-2xl" role="img" />
<span className="text-xl font-semibold group-hover:underline">
{title}
</span>
<div className="text-text-subtle mt-2">{desc}</div>
</a>
</span>
<div className="text-text-subtle mt-2">{desc}</div>
</Link>
</li>
))}
@@ -175,7 +145,7 @@ const GetStarted = ({
style={{
gridTemplateColumns: `repeat(${links.length}, minmax(0, 1fr))`,
}}
className="xs:grid mx-auto mt-6 flex w-fit flex-col place-items-center justify-evenly gap-4 md:gap-8"
className="mx-auto mt-6 flex w-fit flex-col place-items-center justify-evenly gap-4 sm:grid md:gap-8"
>
{links.map((x) => (
<li key={x.title}>
@@ -270,11 +240,11 @@ const Forside = ({
<main tabIndex={-1} id="hovedinnhold" className="focus:outline-none">
<div className="z-20 pb-8">
<div className="centered-layout xs:mt-36 xs:mb-18 xs:max-w-screen-xs relative mb-16 mt-20 grid max-w-xs place-items-center text-center">
<div className="centered-layout sm:mb-18 sm:max-w-screen-xs relative mb-16 mt-20 grid max-w-xs place-items-center text-center sm:mt-36">
<Heading
level="1"
size="xlarge"
className="text-deepblue-800 xs:text-[3.5rem] leading-[1.2]"
className="text-deepblue-800 leading-[1.2] sm:text-[3.5rem]"
>
{page.title}
</Heading>
@@ -291,7 +261,7 @@ const Forside = ({
<Heading
level="2"
size="xlarge"
className="text-deepblue-800 xs:text-[3.25rem] mb-8 text-center"
className="text-deepblue-800 mb-8 text-center sm:text-[3.25rem]"
>
God praksis
</Heading>
@@ -13,7 +13,7 @@ import TableOfContents from "components/website-modules/TOC";
import { getImage } from "components/website-modules/utils/get-image";
import { PreviewSuspense } from "next-sanity/preview";
import Head from "next/head";
import Image from "next/image";
import Image from "next/legacy/image";
import { GetServerSideProps } from "next/types";
import { lazy } from "react";
import NotFotfund from "../404";
@@ -88,14 +88,14 @@ const Page = ({
<main
tabIndex={-1}
id="hovedinnhold"
className="aksel-artikkel xs:pb-32 #FEFCE9 overflow-hidden bg-[#FEFCE9] pt-[8vw] pb-16 focus:outline-none"
className="aksel-artikkel #FEFCE9 overflow-hidden bg-[#FEFCE9] pt-[8vw] pb-16 focus:outline-none sm:pb-32"
>
<div className="px-4">
<div className="dynamic-wrapper-prose text-center">
<Heading
level="1"
size="xlarge"
className="algolia-index-lvl1 hyphen text-deepblue-800 mt-1 break-words text-5xl leading-[1.2]"
className="hyphen text-deepblue-800 mt-1 break-words text-5xl leading-[1.2]"
>
{blogg.heading}
</Heading>
@@ -195,7 +195,7 @@ const Page = ({
<Heading level="2" size="large">
Flere blogginnlegg
</Heading>
<ul className="mt-12 grid gap-x-6 gap-y-6 sm:grid-cols-2 sm:gap-y-10 md:gap-x-6 lg:grid-cols-3">
<ul className="mt-12 grid gap-x-6 gap-y-6 md:grid-cols-2 md:gap-y-10 md:gap-x-6 lg:grid-cols-3">
{morePosts.map((post) => (
<BloggCard key={post._id} blog={post} />
))}
@@ -72,7 +72,7 @@ const Page = (props: PageProps): JSX.Element => {
<Heading level="2" size="xlarge" className="text-deepblue-800">
Flere blogginnlegg
</Heading>
<ul className="mt-12 grid gap-x-3 gap-y-6 sm:grid-cols-2 sm:gap-y-10 md:gap-x-6 lg:grid-cols-3">
<ul className="mt-12 grid gap-x-3 gap-y-6 md:grid-cols-2 md:gap-y-10 md:gap-x-6 lg:grid-cols-3">
{remainingPosts.map((blog) => (
<BloggCard key={blog._id} blog={blog} />
))}
+2 -7
View File
@@ -41,15 +41,11 @@ const Page = ({
<main
tabIndex={-1}
id="hovedinnhold"
className="aksel-artikkel xs:pb-32 bg-gray-50 pt-[8vw] pb-16 focus:outline-none"
className="aksel-artikkel bg-gray-50 pt-[8vw] pb-16 focus:outline-none sm:pb-32"
>
<div className="px-4">
<div className="dynamic-wrapper-prose">
<Heading
level="1"
size="xlarge"
className="algolia-index-lvl1 mt-1"
>
<Heading level="1" size="xlarge" className="mt-1">
{page.heading}
</Heading>
</div>
@@ -110,7 +106,6 @@ export const getServerSideProps: GetServerSideProps = async (
const { page } = await getClient().fetch(akselStandaloneBySlug, {
slug: `side/${context.params.slug}`,
});
console.log(page);
return {
props: {
@@ -17,14 +17,14 @@ export const KomponentIntro = defineType({
defineField({
type: "array",
name: "brukes_til",
title: "Egnet til å:",
title: "Egnet til:",
of: [{ type: "string" }],
validation: (Rule) => Rule.required().min(1),
}),
defineField({
type: "array",
name: "brukes_ikke_til",
title: "Vurder noe annet: (optional)",
title: "Uegnet til: (optional)",
of: [{ type: "string" }],
}),
],
+7 -7
View File
@@ -104,7 +104,7 @@ export const serializers = {
case "h2":
return (
<Heading
className="algolia-index-lvl3 max-w-text mt-8 scroll-mt-20 focus:outline-none"
className="max-w-text mt-8 scroll-mt-20 focus:outline-none"
spacing
level="2"
size="medium"
@@ -116,7 +116,7 @@ export const serializers = {
case "h3":
return (
<Heading
className="algolia-index-lvl3 max-w-text mt-8 scroll-mt-20 first:mt-0 focus:outline-none group-first:mt-0"
className="max-w-text mt-8 scroll-mt-20 first:mt-0 focus:outline-none group-first:mt-0"
spacing
level="3"
size="small"
@@ -128,7 +128,7 @@ export const serializers = {
case "h4":
return (
<Heading
className="algolia-index-lvl4 max-w-text mt-6"
className="max-w-text mt-6"
spacing
level="4"
size="xsmall"
@@ -141,7 +141,7 @@ export const serializers = {
size="medium"
spacing
{...textProps}
className="algolia-index-body max-w-text"
className="max-w-text"
/>
);
}
@@ -187,7 +187,7 @@ export const serializers = {
}) => {
if (href && href.startsWith("mailto:")) {
return (
<NextLink href={href} passHref>
<NextLink href={href} passHref legacyBehavior>
<Link className="inline">{children}</Link>
</NextLink>
);
@@ -197,7 +197,7 @@ export const serializers = {
{children} <ExternalLink title="åpner lenken i ny fane" />
</Link>
) : (
<NextLink href={href} passHref>
<NextLink href={href} passHref legacyBehavior>
<Link className="inline">{children}</Link>
</NextLink>
);
@@ -209,7 +209,7 @@ export const serializers = {
const href = `/${slug?.current}`;
return (
<NextLink href={href} passHref>
<NextLink href={href} passHref legacyBehavior>
<Link>{children}</Link>
</NextLink>
);
+3 -3
View File
@@ -7,13 +7,13 @@
}
.content-box {
@apply max-w-content-w-padding xs:mx-auto xs:px-6 w-full px-4 pb-4 md:mx-0 md:mr-auto md:px-12;
@apply max-w-content-w-padding w-full px-4 pb-4 sm:mx-auto sm:px-6 md:mx-0 md:mr-auto md:px-12;
}
.content-box--full {
@apply xs:mx-auto xs:px-6 w-full px-4 pb-4 md:mx-0 md:mr-auto md:px-12;
@apply w-full px-4 pb-4 sm:mx-auto sm:px-6 md:mx-0 md:mr-auto md:px-12;
}
.centered-layout {
@apply xs:px-6 mx-auto w-full px-4;
@apply mx-auto w-full px-4 sm:px-6;
}
+5 -5
View File
@@ -15,23 +15,23 @@ p.override-text-no-max {
}
.dynamic-wrapper {
@apply max-w-aksel xs:w-[90%] mx-auto;
@apply max-w-aksel mx-auto sm:w-[90%];
}
.dynamic-wrapper-prose {
@apply xs:w-[90%] mx-auto max-w-prose;
@apply mx-auto max-w-prose sm:w-[90%];
}
.dynamic-wrapper-left {
@apply xs:w-[90%] max-w-prose;
@apply max-w-prose sm:w-[90%];
}
.dynamic-wrapper-2xl {
@apply xs:w-[90%] mx-auto max-w-2xl;
@apply mx-auto max-w-2xl sm:w-[90%];
}
.card-grid-3-1 {
@apply grid gap-3 sm:grid-cols-2 md:gap-6 lg:grid-cols-3;
@apply grid gap-3 md:grid-cols-2 md:gap-6 lg:grid-cols-3;
}
.card-grid-2-1 {
-9
View File
@@ -8,15 +8,6 @@ module.exports = {
"./stories/**/*.{js,ts,jsx,tsx}",
],
theme: {
/* Flytt ut fra extend og refactor bruk av screen */
screens: {
xs: "480px",
sm: "648px",
md: "768px",
lg: "1024px",
xl: "1280px",
"2xl": "1440px",
},
extend: {
colors: {
pink: {
+2 -2
View File
@@ -10,8 +10,8 @@
"preview": "vite preview"
},
"dependencies": {
"@navikt/ds-css": "2.4.0",
"@navikt/ds-react": "2.4.0",
"@navikt/ds-css": "2.6.0",
"@navikt/ds-react": "2.6.0",
"react": "^18.0.0",
"react-dom": "^18.0.0"
},
Loaded 100 of 102 files, more files were not shown because too many files have changed in this diff. Show more