Compare commits

...
Author SHA1 Message Date
github-actions[bot]andgithub-actions[bot] b4f37e80d0 Version Packages (#3509)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-23 09:07:21 +01:00
Ken f70bebc03e Update swift-readers-check.md 2025-01-22 14:03:11 +01:00
Ken 7aa85beb01 [Darkside] Quality assurance P1 (#3510)
* 💄 Adjustments 1

* 💄 Bumped default strong scale

* 💄 Bumped secondary neutral border

* 💄 Reduced text-color change on hover

* 🐛 Resolved border and focus logic for combobox

* 🐛 Fix icon sizing for buttons

* 💄 Use tertiary-buttons for datepicker caption

* Update @navikt/core/react/src/chips/Toggle.tsx

* 💄 QA updates combobox darkside (#3511)
2025-01-22 13:58:27 +01:00
Ken d29509dc0a 🐛 Using 'loader' inside 'icon'-prop broke layout caused by position absolute (#3515) 2025-01-22 11:19:29 +01:00
Ken 90f6178c3a ♻️ Fix #3451 scaling for 400% zoom (#3514) 2025-01-22 11:19:21 +01:00
Ken 6678742543 💄 Error borders uses danger-strong consistently (#3512) 2025-01-22 11:19:13 +01:00
715a34ac7d always render the maxSelected message when isMultiSelect (#3506)
* always render the maxSelected message when isMultiSelect

* also check if maxSelected is set

* Changeset

* Update .changeset/swift-readers-check.md

---------

Co-authored-by: Lars Eirik Korsgaard Hansen <71271458+larseirikhansen@users.noreply.github.com>
Co-authored-by: Ken <26967723+KenAJoh@users.noreply.github.com>
2025-01-22 09:02:58 +01:00
Ken 85feb0ed8a 📝 Added new sidebar category for /komponenter 2025-01-22 08:53:44 +01:00
dependabot[bot]andKen d2a7c868d5 ⬆️ Bump vite from 5.4.8 to 5.4.12 in /examples/referansesider (#3516)
* ⬆️ Bump vite from 5.4.8 to 5.4.12 in /examples/referansesider

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.8 to 5.4.12.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.12/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

* Repo-bump vite

* 🔀 Yarn lock

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ken <ken.aleksander@gmail.com>
2025-01-22 08:48:18 +01:00
Ken edab37a5da 🐛 Third bloggpost was sliced from view on frontpage 2025-01-21 13:13:20 +01:00
KenandHalvor Haugan fad913ce6b [Table] ExpandableRow contentGutter-prop (#3507)
* ✨ New prop contentGutter for ExpandableRow component

* ✨ Added new prop-support in darkside CSS

* 📝 changeset

* Update @navikt/core/react/src/table/ExpandableRow.tsx

Co-authored-by: Halvor Haugan <83693529+HalvorHaugan@users.noreply.github.com>

---------

Co-authored-by: Halvor Haugan <83693529+HalvorHaugan@users.noreply.github.com>
2025-01-21 06:00:20 +01:00
Ken 54e03db491 🐛 Added missing 'li'-tag for list-item in blogglist 2025-01-20 10:00:48 +01:00
Ken b52806535d 💄 Incremental layout and list-view update on Produktbloggen 2025-01-20 08:26:19 +01:00
Ken bbca69af9c ♻️ Removed raised-tokens from darkside roles 2025-01-20 07:48:09 +01:00
64 changed files with 449 additions and 505 deletions

No files matched your search

+2
View File
@@ -1,5 +1,7 @@
# @navikt/aksel-icons
## 7.10.0
## 7.9.2
## 7.9.1
@@ -28,7 +28,7 @@
"postcss": "^8.4.31",
"postcss-url": "^10.1.3",
"typescript": "5.5.4",
"vite": "^5.4.6",
"vite": "^5.4.12",
"vite-plugin-singlefile": "^1.0.0",
"vite-plugin-svgr": "^4.2.0"
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/aksel-icons",
"version": "7.9.2",
"version": "7.10.0",
"author": "Aksel | Nav",
"homepage": "https://aksel.nav.no/ikoner",
"repository": {
+2
View File
@@ -1,5 +1,7 @@
# @navikt/aksel-stylelint
## 7.10.0
## 7.9.2
## 7.9.1
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/aksel-stylelint",
"version": "7.9.2",
"version": "7.10.0",
"author": "Aksel | Nav",
"homepage": "https://aksel.nav.no/grunnleggende/kode/stylelint",
"repository": {
@@ -35,8 +35,8 @@
"dev": "yarn watch:lint"
},
"devDependencies": {
"@navikt/ds-css": "^7.9.2",
"@navikt/ds-tokens": "^7.9.2",
"@navikt/ds-css": "^7.10.0",
"@navikt/ds-tokens": "^7.10.0",
"concurrently": "9.0.1",
"postcss-selector-parser": "^6.0.13",
"postcss-value-parser": "^4.2.0",
+7
View File
@@ -1,5 +1,12 @@
# @navikt/aksel
## 7.10.0
### Patch Changes
- Updated dependencies [[`d29509d`](https://github.com/navikt/aksel/commit/d29509dc0ad0ef6bff38ad9a2a820d3bd1770aaa), [`fad913c`](https://github.com/navikt/aksel/commit/fad913ce6b27580a2f7b54984955324d1af08196), [`715a34a`](https://github.com/navikt/aksel/commit/715a34ac7d4aa46b5b7b5990e5e1cd528cfd7f6b)]:
- @navikt/ds-css@7.10.0
## 7.9.2
### Patch Changes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/aksel",
"version": "7.9.2",
"version": "7.10.0",
"description": "Aksel command line interface. Handles css-imports, codemods and more",
"author": "Aksel | Nav designsystem team",
"license": "MIT",
@@ -29,7 +29,7 @@
},
"homepage": "https://aksel.nav.no/grunnleggende/kode/kommandolinje",
"dependencies": {
"@navikt/ds-css": "^7.9.2",
"@navikt/ds-css": "^7.10.0",
"axios": "1.7.4",
"chalk": "4.1.0",
"clipboardy": "^2.3.0",
+12
View File
@@ -1,5 +1,17 @@
# @navikt/ds-css
## 7.10.0
### Minor Changes
- Table: New prop `contentGutter` added to `ExpandableRow`-component. This allows user more control for content layout inside expandable element. ([#3507](https://github.com/navikt/aksel/pull/3507))
### Patch Changes
- Button: Using `<Loader />` within `icon`-prop now supported. ([#3515](https://github.com/navikt/aksel/pull/3515))
- Combobox: Always render `maxSelected` message when `isMultiSelect` is set. ([#3506](https://github.com/navikt/aksel/pull/3506))
## 7.9.2
### Patch Changes
+1 -1
View File
@@ -497,7 +497,7 @@
}
/* Loader overrides */
.navds-button .navds-loader {
.navds-button > .navds-loader {
position: absolute;
}
@@ -100,7 +100,7 @@
height: 22px;
align-self: center;
background-color: var(--ax-bg-accent-moderateA);
color: var(--ax-text-accent-strong);
color: var(--ax-text-accent);
}
.navds-accordion__header-chevron {
@@ -107,7 +107,7 @@
&:focus {
background-color: var(--ax-bg-danger-moderate-hoverA);
color: var(--ax-text-danger-strong);
color: var(--ax-text-danger);
}
}
@@ -17,26 +17,28 @@
box-shadow: inset 0 0 0 var(--__axc-button-border-width) var(--__axc-button-border-color);
&:focus-visible {
outline: 2px solid var(--ax-border-focus);
outline-offset: 2px;
outline: 3px solid var(--ax-border-focus);
outline-offset: 3px;
}
}
.navds-button--small,
.navds-button--xsmall {
--__axc-button-icon-margin: -2px;
--__axc-button-icon-size: 1.25rem;
}
.navds-button--small {
padding: var(--ax-space-4) var(--ax-space-12);
min-height: 2rem;
min-width: 2rem;
gap: var(--ax-space-6);
}
.navds-button--xsmall {
padding: var(--ax-space-2) var(--ax-space-8);
gap: var(--ax-space-4);
--__axc-button-icon-size: 1.25rem;
}
.navds-button--icon-only {
@@ -159,7 +161,7 @@
* .navds-button--secondary-neutral *
**************************/
.navds-button--secondary-neutral {
--__axc-button-border-color: var(--ax-border-default);
--__axc-button-border-color: var(--ax-border-strong);
background-color: transparent;
color: var(--ax-text-default);
@@ -178,7 +180,7 @@
}
&:is(:disabled, .navds-button--disabled) {
--__axc-button-border-color: var(--ax-border-default);
--__axc-button-border-color: var(--ax-border-strong);
color: var(--ax-text-default);
background-color: transparent;
@@ -262,7 +264,7 @@
}
/* Loader overrides */
.navds-button .navds-loader {
.navds-button > .navds-loader {
position: absolute;
}
+2 -2
View File
@@ -73,14 +73,14 @@
.navds-chat--info {
& .navds-chat__bubble,
& .navds-chat__avatar {
background-color: var(--ax-bg-info-raised);
background-color: var(--ax-bg-info-moderate);
}
}
.navds-chat--neutral {
& .navds-chat__bubble,
& .navds-chat__avatar {
background-color: var(--ax-bg-raised);
background-color: var(--ax-bg-moderateA);
}
}
+1 -1
View File
@@ -72,7 +72,7 @@
.navds-chips__toggle--action {
box-shadow: inset 0 0 0 1px var(--ax-border-accent-subtleA);
background-color: var(--ax-bg-accent-moderate);
color: var(--ax-text-default);
color: var(--ax-text-accent-strong);
&:hover {
background-color: var(--ax-bg-accent-moderate-hover);
@@ -67,12 +67,8 @@
--__axc-copybutton-padding: var(--ax-space-4);
}
& .navds-copybutton__icon {
font-size: 1.25rem;
}
& > .navds-copybutton__content {
gap: var(--ax-space-6);
gap: var(--ax-space-4);
}
}
@@ -96,7 +92,7 @@
}
& > .navds-copybutton__content {
gap: var(--ax-space-4);
gap: var(--ax-space-2);
}
}
@@ -104,18 +100,6 @@
.navds-copybutton__icon {
font-size: 1.5rem;
display: flex;
&:first-of-type {
margin-left: -0.25rem;
}
&:last-of-type {
margin-right: -0.25rem;
}
&:only-child {
margin: 0;
}
}
.navds-copybutton--active .navds-copybutton__icon {
@@ -146,14 +130,6 @@
&.navds-copybutton--active {
color: var(--ax-text-success);
&:hover {
color: var(--ax-text-success-strong);
}
}
&:hover {
color: var(--ax-text-accent-strong);
}
&:disabled {
@@ -165,11 +141,6 @@
.navds-copybutton--neutral {
color: var(--ax-text-subtle);
&:hover,
&.navds-copybutton--active {
color: var(--ax-text-default);
}
&:disabled {
color: var(--ax-text-subtle);
}
@@ -179,5 +150,5 @@
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--ax-space-8);
gap: var(--ax-space-6);
}
@@ -15,7 +15,7 @@
.navds-form-field:not(:is(.navds-combobox--disabled, .navds-combobox--readonly)) {
& .navds-combobox__wrapper:hover {
border-color: var(--ax-border-focus);
border-color: var(--ax-border-accent-strong);
}
}
@@ -31,6 +31,10 @@
opacity: var(--ax-opacity-disabled);
& .navds-combobox__wrapper {
&:hover {
border-color: var(--ax-border-default);
}
& *:hover {
cursor: not-allowed;
}
@@ -80,9 +84,9 @@
border-radius: var(--ax-border-radius-medium);
&:has(.navds-combobox__input:focus-visible) {
outline: 2px solid var(--ax-border-focus);
outline-offset: 2px;
border-color: var(--ax-border-focus);
outline: 3px solid var(--ax-border-focus);
outline-offset: 3px;
border-color: var(--ax-border-accent-strong);
}
&:has(.navds-combobox__input:focus-visible).navds-combobox__wrapper-inner--virtually-unfocused {
@@ -113,15 +117,19 @@
&:hover {
cursor: text;
}
.navds-combobox--disabled &:hover {
border-color: var(--ax-border-default);
}
}
.navds-combobox--error {
& .navds-combobox__wrapper-inner {
border-color: var(--ax-border-danger);
box-shadow: 0 0 0 1px var(--ax-border-danger);
border-color: var(--ax-border-danger-strong);
box-shadow: 0 0 0 1px var(--ax-border-danger-strong);
&:has(.navds-combobox__input:focus-visible) {
border-color: var(--ax-border-danger);
border-color: var(--ax-border-danger-strong);
}
}
}
@@ -230,7 +238,7 @@
/* dropdown & non selectable dropdown items */
.navds-combobox__list {
max-height: 290px;
max-height: 316px;
overflow: clip;
position: absolute;
left: 0;
@@ -268,7 +276,7 @@
border-radius: var(--ax-border-radius-medium);
border: 0;
margin-inline: var(--ax-space-8);
margin-block: var(--ax-space-4);
margin-block: var(--ax-space-2);
scroll-margin-block: 8px; /* outline + outline-offset + margin-block */
}
@@ -307,7 +315,6 @@
.navds-combobox__list-item--focus {
cursor: pointer;
outline: 2px solid var(--ax-border-focus);
outline-offset: 2px;
}
.navds-combobox__list-item {
@@ -321,10 +328,11 @@
& mark {
background-color: transparent;
font-weight: var(--ax-font-weight-bold);
color: var(--ax-text-default);
}
& svg {
color: var(--ax-text-accent);
color: var(--ax-text-default);
}
}
@@ -344,14 +352,14 @@
justify-content: flex-start;
gap: 0.25rem;
margin: 0;
margin-block: calc(var(--ax-space-4) * -1);
padding-block: var(--ax-space-16);
margin-block-start: calc(var(--ax-space-4) * -1);
& svg {
color: var(--ax-text-default);
}
&:only-child {
margin-block: calc(var(--ax-space-4) * -1);
border: none;
}
}
@@ -89,7 +89,7 @@
.navds-dropzone--error > .navds-dropzone__area {
border-color: transparent;
outline: 2px solid var(--ax-border-danger);
outline: 2px solid var(--ax-border-danger-strong);
outline-offset: -1px;
}
@@ -165,7 +165,7 @@ li.navds-file-item {
}
.navds-file-item--error > .navds-file-item__inner {
outline: 2px solid var(--ax-border-danger);
outline: 2px solid var(--ax-border-danger-strong);
}
.navds-file-item__icon {
@@ -141,7 +141,7 @@
.navds-checkbox__input:hover:not(:disabled) + .navds-checkbox__label,
.navds-radio__input:hover:not(:disabled) + .navds-radio__label {
color: var(--ax-text-accent-strong);
color: var(--ax-text-accent);
}
.navds-checkbox__input:hover:not(:disabled, :checked, :indeterminate) + .navds-checkbox__label::before,
@@ -152,13 +152,12 @@
.navds-checkbox--error > .navds-checkbox__input:not(:disabled, :checked, :indeterminate) + .navds-checkbox__label::before,
.navds-radio--error > .navds-radio__input:not(:disabled, :checked) + .navds-radio__label::before {
border-color: var(--ax-border-danger);
border-color: var(--ax-border-danger-strong);
}
.navds-checkbox--error > .navds-checkbox__input:not(:disabled, :checked, :indeterminate):hover + .navds-checkbox__label::before,
.navds-radio--error > .navds-radio__input:not(:disabled, :checked):hover + .navds-radio__label::before {
background-color: var(--ax-bg-danger-moderate-hoverA);
border-color: var(--ax-border-danger-strong);
}
.navds-checkbox--error > .navds-checkbox__input:is(:checked, :indeterminate):not(:disabled) + .navds-checkbox__label::before {
@@ -127,13 +127,13 @@
/* --------------------------- Search Error-state --------------------------- */
.navds-search--error .navds-search__input:not(:disabled) {
border-color: var(--ax-border-danger);
border-color: var(--ax-border-danger-strong);
box-shadow:
inset -2px 0 0 0 var(--ax-border-danger),
inset 0 0 0 1px var(--ax-border-danger);
inset -2px 0 0 0 var(--ax-border-danger-strong),
inset 0 0 0 1px var(--ax-border-danger-strong);
&.navds-search__input--simple {
box-shadow: inset 0 0 0 1px var(--ax-border-danger);
box-shadow: inset 0 0 0 1px var(--ax-border-danger-strong);
}
}
@@ -66,8 +66,8 @@
/* --------------------------- Select Error-state --------------------------- */
.navds-select--error {
> * select {
box-shadow: 0 0 0 1px var(--ax-border-danger);
border-color: var(--ax-border-danger);
box-shadow: 0 0 0 1px var(--ax-border-danger-strong);
border-color: var(--ax-border-danger-strong);
}
> * select:hover,
@@ -55,7 +55,7 @@
.navds-switch__input:hover ~ .navds-switch__label-wrapper,
.navds-switch__label-wrapper:hover {
color: var(--ax-text-accent-strong);
color: var(--ax-text-accent);
}
.navds-switch__input:disabled:hover ~ .navds-switch__label-wrapper {
@@ -124,7 +124,7 @@
.navds-switch__input:checked ~ .navds-switch__track > & {
background-color: var(--ax-bg-raised);
transform: translateX(1.25rem);
color: var(--ax-text-accent-strong);
color: var(--ax-text-accent);
width: 1.25rem;
height: 1.25rem;
left: 0;
@@ -39,8 +39,8 @@
}
.navds-text-field--error .navds-text-field__input:not(:disabled) {
border-color: var(--ax-border-danger);
box-shadow: 0 0 0 1px var(--ax-border-danger);
border-color: var(--ax-border-danger-strong);
box-shadow: 0 0 0 1px var(--ax-border-danger-strong);
}
.navds-text-field--readonly .navds-text-field__input {
@@ -90,8 +90,8 @@
}
.navds-textarea--error .navds-textarea__input:not(:disabled) {
box-shadow: 0 0 0 1px var(--ax-border-danger);
border-color: var(--ax-border-danger);
box-shadow: 0 0 0 1px var(--ax-border-danger-strong);
border-color: var(--ax-border-danger-strong);
}
@media (forced-colors: active) {
@@ -20,8 +20,8 @@
text-align: start;
&:focus-visible {
outline: 2px solid var(--ax-border-focus);
outline-offset: 2px;
outline: 3px solid var(--ax-border-focus);
outline-offset: 3px;
}
&[data-state="open"] .navds-read-more__expand-icon {
+20 -2
View File
@@ -229,9 +229,27 @@
}
.navds-table__expanded-row-content {
padding: var(--ax-space-16) calc(var(--ax-space-8) + 3rem);
--__ac-table-expanded-row-pi: calc(var(--ax-space-8) + 3rem);
padding-block: var(--ax-space-16);
}
.navds-table--small .navds-table__expanded-row-content {
padding: var(--ax-space-8) calc(var(--ax-space-8) + 3rem);
padding-block: var(--ax-space-8);
}
.navds-table__expanded-row-content--gutter-both {
padding-inline: var(--__ac-table-expanded-row-pi);
}
.navds-table__expanded-row-content--gutter-left {
padding-inline: var(--__ac-table-expanded-row-pi) var(--ax-space-8);
}
.navds-table__expanded-row-content--gutter-right {
padding-inline: var(--ax-space-8) var(--__ac-table-expanded-row-pi);
}
.navds-table__expanded-row-content--gutter-none {
padding-inline: var(--ax-space-8);
}
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-css",
"version": "7.9.2",
"version": "7.10.0",
"description": "CSS for Nav Designsystem",
"author": "Aksel | Nav designsystem team",
"keywords": [
@@ -28,7 +28,7 @@
"test": "yarn build && vitest run"
},
"devDependencies": {
"@navikt/ds-tokens": "^7.9.2",
"@navikt/ds-tokens": "^7.10.0",
"@types/clean-css": "4.2.11",
"autoprefixer": "^10.4.20",
"browserslist": "^4.24.2",
+20 -2
View File
@@ -249,11 +249,29 @@
}
.navds-table__expanded-row-content {
padding: var(--a-spacing-4) calc(var(--a-spacing-2) + 3rem);
--__ac-table-expanded-row-pi: calc(var(--a-spacing-2) + 3rem);
padding-block: var(--a-spacing-4);
}
.navds-table--small .navds-table__expanded-row-content {
padding: var(--a-spacing-2) calc(var(--a-spacing-2) + 3rem);
padding-block: var(--a-spacing-2);
}
.navds-table__expanded-row-content--gutter-both {
padding-inline: var(--__ac-table-expanded-row-pi);
}
.navds-table__expanded-row-content--gutter-left {
padding-inline: var(--__ac-table-expanded-row-pi) var(--a-spacing-2);
}
.navds-table__expanded-row-content--gutter-right {
padding-inline: var(--a-spacing-2) var(--__ac-table-expanded-row-pi);
}
.navds-table__expanded-row-content--gutter-none {
padding-inline: var(--a-spacing-2);
}
@media (forced-colors: active) {
+14
View File
@@ -1,5 +1,19 @@
# @navikt/ds-react
## 7.10.0
### Minor Changes
- Table: New prop `contentGutter` added to `ExpandableRow`-component. This allows user more control for content layout inside expandable element. ([#3507](https://github.com/navikt/aksel/pull/3507))
### Patch Changes
- Combobox: Always render `maxSelected` message when `isMultiSelect` is set. ([#3506](https://github.com/navikt/aksel/pull/3506))
- Updated dependencies []:
- @navikt/ds-tokens@7.10.0
- @navikt/aksel-icons@7.10.0
## 7.9.2
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-react",
"version": "7.9.2",
"version": "7.10.0",
"description": "React components from the Norwegian Labour and Welfare Administration.",
"author": "Aksel, a team part of the Norwegian Labour and Welfare Administration.",
"license": "MIT",
@@ -615,8 +615,8 @@
"dependencies": {
"@floating-ui/react": "0.25.4",
"@floating-ui/react-dom": "^2.0.9",
"@navikt/aksel-icons": "^7.9.2",
"@navikt/ds-tokens": "^7.9.2",
"@navikt/aksel-icons": "^7.10.0",
"@navikt/ds-tokens": "^7.10.0",
"clsx": "^2.1.0",
"date-fns": "^3.0.0",
"react-day-picker": "8.10.1"
+6 -1
View File
@@ -74,7 +74,12 @@ export const ToggleChips: OverridableComponent<
fillRule="evenodd"
clipRule="evenodd"
d="M10 3.125C6.20304 3.125 3.125 6.20304 3.125 10C3.125 13.797 6.20304 16.875 10 16.875C13.797 16.875 16.875 13.797 16.875 10C16.875 6.20304 13.797 3.125 10 3.125ZM1.875 10C1.875 5.51269 5.51269 1.875 10 1.875C14.4873 1.875 18.125 5.51269 18.125 10C18.125 14.4873 14.4873 18.125 10 18.125C5.51269 18.125 1.875 14.4873 1.875 10Z"
fill="var(--ax-text-neutral-icon, var(--ac-chip-toggle-circle-border, var(--a-border-default)))"
/* After removing old fallbacks, change to currentColor */
fill={`var(${
variant === "action"
? "--ax-text-accent-strong"
: "--ax-text-default"
}, var(--ac-chip-toggle-circle-border, var(--a-border-default)))`}
/>
)}
</svg>
@@ -21,7 +21,7 @@ export const DatePickerCaption = ({ displayMonth, id }: CaptionProps) => {
<>
<div className="navds-date__caption">
<Button
variant="tertiary"
variant="tertiary-neutral"
disabled={!previousMonth}
onClick={() => previousMonth && goToMonth(previousMonth)}
icon={<ArrowLeftIcon title={translate("goToPreviousMonth")} />}
@@ -41,7 +41,7 @@ export const DatePickerCaption = ({ displayMonth, id }: CaptionProps) => {
icon={<ArrowRightIcon title={translate("goToNextMonth")} />}
onClick={() => nextMonth && goToMonth(nextMonth)}
disabled={!nextMonth}
variant="tertiary"
variant="tertiary-neutral"
className="navds-date__caption-button"
type="button"
/>
@@ -56,7 +56,7 @@ export const DropdownCaption = ({ displayMonth, id }: CaptionProps) => {
{formatCaption(displayMonth, { locale })}
</span>
<Button
variant="tertiary"
variant="tertiary-neutral"
disabled={!previousMonth}
onClick={() => previousMonth && goToMonth(previousMonth)}
icon={<ArrowLeftIcon title={translate("goToPreviousMonth")} />}
@@ -94,10 +94,10 @@ export const DropdownCaption = ({ displayMonth, id }: CaptionProps) => {
</div>
<Button
variant="tertiary-neutral"
icon={<ArrowRightIcon title={translate("goToNextMonth")} />}
onClick={() => nextMonth && goToMonth(nextMonth)}
disabled={!nextMonth}
variant="tertiary"
className="navds-date__caption-button"
type="button"
/>
@@ -23,10 +23,10 @@ const FilteredOptions = () => {
isMouseLastUsedInputDevice,
isValueNew,
} = useFilteredOptionsContext();
const { maxSelected } = useSelectedOptionsContext();
const { maxSelected, isMultiSelect } = useSelectedOptionsContext();
const shouldRenderNonSelectables =
maxSelected.isLimitReached || // Render maxSelected message
(isMultiSelect && maxSelected.limit) || // Render maxSelected message
isLoading || // Render loading message
(!isLoading && filteredOptions.length === 0 && !allowNewValues); // Render no hits message
@@ -45,7 +45,7 @@ const FilteredOptions = () => {
>
{shouldRenderNonSelectables && (
<div className="navds-combobox__list_non-selectables" role="status">
{maxSelected.isLimitReached && <MaxSelectedMessage />}
{isMultiSelect && maxSelected.limit && <MaxSelectedMessage />}
{isLoading && <LoadingMessage />}
{!isLoading && filteredOptions.length === 0 && !allowNewValues && (
<NoSearchHitsMessage />
@@ -48,6 +48,11 @@ export interface ExpandableRowProps extends Omit<RowProps, "content"> {
* @default 999
*/
colSpan?: number;
/**
* Optional left, right-gutter for content
* @default Same as `togglePlacement`
*/
contentGutter?: "left" | "right" | "none";
}
export type ExpandableRowType = React.ForwardRefExoticComponent<
@@ -67,6 +72,7 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
expansionDisabled = false,
expandOnRowClick = false,
colSpan = 999,
contentGutter,
onClick,
...rest
},
@@ -139,7 +145,9 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
<td colSpan={colSpan} className="navds-table__expanded-row-cell">
<AnimateHeight
className="navds-table__expanded-row-collapse"
innerClassName="navds-table__expanded-row-content"
innerClassName={`navds-table__expanded-row-content navds-table__expanded-row-content--gutter-${
contentGutter ?? togglePlacement
}`}
height={_open ? "auto" : 0}
duration={150}
easing="cubic-bezier(0.39,0.57,0.56,1)"
@@ -120,6 +120,68 @@ export const ExpandableSmall = () => {
);
};
export const ExpandableContentGutter = () => {
return (
<Table zebraStripes>
<Table.Header>
<Table.Row>
<Table.HeaderCell></Table.HeaderCell>
<Table.HeaderCell>Cell</Table.HeaderCell>
<Table.HeaderCell>Cell</Table.HeaderCell>
<Table.HeaderCell></Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
<Table.ExpandableRow
defaultOpen
content="ContentContent ContentContent ContentContent"
togglePlacement="left"
>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
</Table.ExpandableRow>
<Table.ExpandableRow
content="ContentContent ContentContent ContentContent"
togglePlacement="right"
defaultOpen
>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
</Table.ExpandableRow>
<Table.ExpandableRow
content="ContentContent ContentContent ContentContent"
defaultOpen
contentGutter="left"
>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
</Table.ExpandableRow>
<Table.ExpandableRow
content="ContentContent ContentContent ContentContent"
defaultOpen
contentGutter="right"
>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
</Table.ExpandableRow>
<Table.ExpandableRow
content="ContentContent ContentContent ContentContent Con.."
defaultOpen
contentGutter="none"
>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
<Table.DataCell>Cell</Table.DataCell>
</Table.ExpandableRow>
</Table.Body>
</Table>
);
};
const columns = [
{
name: "Navn",
+2
View File
@@ -1,5 +1,7 @@
# @navikt/ds-tailwind
## 7.10.0
## 7.9.2
## 7.9.1
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-tailwind",
"version": "7.9.2",
"version": "7.10.0",
"description": "Tailwind config based on @navikt/ds-tokens",
"author": "Aksel | Nav designsystem team",
"keywords": [
@@ -24,7 +24,7 @@
"directory": "@navikt/core/tailwind"
},
"devDependencies": {
"@navikt/ds-tokens": "^7.9.2",
"@navikt/ds-tokens": "^7.10.0",
"color": "4.2.3",
"lodash": "^4.17.21",
"tailwindcss": "^3.3.3",
+2
View File
@@ -1,5 +1,7 @@
# @navikt/ds-tokens
## 7.10.0
## 7.9.2
## 7.9.1
@@ -27,19 +27,13 @@ describe("Validate token configurations", () => {
test(`Semantic tokens for all roles: Lightmode`, () => {
expect(
validateConfig(
semanticTokensForAllRolesConfig("light"),
configKeysWithGroup,
),
validateConfig(semanticTokensForAllRolesConfig(), configKeysWithGroup),
).toBeTruthy();
});
test(`Semantic tokens for all roles: Darkmode`, () => {
expect(
validateConfig(
semanticTokensForAllRolesConfig("dark"),
configKeysWithGroup,
),
validateConfig(semanticTokensForAllRolesConfig(), configKeysWithGroup),
).toBeTruthy();
});
@@ -35,7 +35,7 @@ export const lightModeTokens = () => {
mergeConfigs([
shadowTokenConfig("light"),
opacityTokenConfig("light"),
semanticTokensForAllRolesConfig("light"),
semanticTokensForAllRolesConfig(),
textContrastTokenConfig,
semanticTokenConfig("light"),
globalColorLightModeConfig,
@@ -52,7 +52,7 @@ export const darkModeTokens = () => {
mergeConfigs([
shadowTokenConfig("dark"),
opacityTokenConfig("dark"),
semanticTokensForAllRolesConfig("dark"),
semanticTokensForAllRolesConfig(),
textContrastTokenConfig,
semanticTokenConfig("dark"),
globalColorDarkModeConfig,
@@ -1,12 +1,8 @@
import _ from "lodash";
import {
ColorRolesList,
type ColorTheme,
type SemanticColorRoles,
} from "../../types";
import { ColorRolesList, type SemanticColorRoles } from "../../types";
import { type StyleDictionaryTokenConfig } from "../tokens.util";
const configForRole = (role: SemanticColorRoles, theme: ColorTheme) => {
const configForRole = (role: SemanticColorRoles) => {
return {
bg: {
[`${role}-soft`]: {
@@ -69,17 +65,6 @@ const configForRole = (role: SemanticColorRoles, theme: ColorTheme) => {
type: "color",
group: `background.${role}`,
},
[`${role}-raised`]: {
/* We bump raised for darkmode */
value: `{ax.${role}.${theme === "light" ? "100" : "200"}.value}`,
type: "color",
group: `background.${role}`,
},
[`${role}-raised-hover`]: {
value: `{ax.${role}.${theme === "light" ? "200" : "300"}.value}`,
type: "color",
group: `background.${role}`,
},
},
text: {
[role]: {
@@ -126,9 +111,9 @@ const configForRole = (role: SemanticColorRoles, theme: ColorTheme) => {
/**
* We need to deep merge the token config for each role to get the complete token config for all roles.
*/
export const semanticTokensForAllRolesConfig = (theme: ColorTheme) => {
export const semanticTokensForAllRolesConfig = () => {
return ColorRolesList.filter((name) => name !== "neutral").reduce(
(acc, role) => _.merge(acc, configForRole(role, theme)),
(acc, role) => _.merge(acc, configForRole(role)),
{} as ReturnType<typeof configForRole>,
);
};
@@ -119,20 +119,20 @@ export function semanticTokenConfig(theme: ColorTheme) {
group: `background`,
},
strong: {
value: `{ax.neutral.600.value}`,
type: "color",
group: `background`,
},
"strong-hover": {
value: `{ax.neutral.700.value}`,
type: "color",
group: `background`,
},
"strong-pressed": {
"strong-hover": {
value: `{ax.neutral.800.value}`,
type: "color",
group: `background`,
},
"strong-pressed": {
value: `{ax.neutral.900.value}`,
type: "color",
group: `background`,
},
},
border: {
default: {
@@ -160,7 +160,7 @@ export function semanticTokenConfig(theme: ColorTheme) {
* - Discuss with brand
*/
focus: {
value: "{ax.accent.700.value}",
value: "{ax.neutral.1000.value}",
type: "color",
group: "border",
/**
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@navikt/ds-tokens",
"version": "7.9.2",
"version": "7.10.0",
"description": "Design-tokens for Nav designsystem",
"author": "Aksel | Nav designsystem team",
"keywords": [
+2 -4
View File
@@ -68,8 +68,7 @@ export type StaticBgKeys =
| `${SemanticColorRoles}-soft`
| `${SemanticColorRoles}-moderate`
| `${SemanticColorRoles}-moderateA`
| `${SemanticColorRoles}-strong`
| `${SemanticColorRoles}-raised`;
| `${SemanticColorRoles}-strong`;
export type StatefulBgKeys =
| `${SemanticColorRoles}-hover`
@@ -79,8 +78,7 @@ export type StatefulBgKeys =
| `${SemanticColorRoles}-moderate-pressed`
| `${SemanticColorRoles}-moderate-pressedA`
| `${SemanticColorRoles}-strong-hover`
| `${SemanticColorRoles}-strong-pressed`
| `${SemanticColorRoles}-raised-hover`;
| `${SemanticColorRoles}-strong-pressed`;
export type DefaultTextColorKeys =
| "default"
+16
View File
@@ -1,5 +1,21 @@
# Changelog
## 7.10
### @navikt/ds-css
- Table: New prop `contentGutter` added to `ExpandableRow`-component. This allows user more control for content layout inside expandable element. ([#3507](https://github.com/navikt/aksel/pull/3507))
* Button: Using `<Loader />` within `icon`-prop now supported. ([#3515](https://github.com/navikt/aksel/pull/3515))
* Combobox: Always render `maxSelected` message when `isMultiSelect` is set. ([#3506](https://github.com/navikt/aksel/pull/3506))
### @navikt/ds-react
- Table: New prop `contentGutter` added to `ExpandableRow`-component. This allows user more control for content layout inside expandable element. ([#3507](https://github.com/navikt/aksel/pull/3507))
* Combobox: Always render `maxSelected` message when `isMultiSelect` is set. ([#3506](https://github.com/navikt/aksel/pull/3506))
## 7.9
### @navikt/ds-css
+5 -5
View File
@@ -15,10 +15,10 @@
"playroom"
],
"dependencies": {
"@navikt/aksel-icons": "^7.9.2",
"@navikt/ds-css": "^7.9.2",
"@navikt/ds-react": "^7.9.2",
"@navikt/ds-tailwind": "^7.9.2",
"@navikt/ds-tokens": "^7.9.2"
"@navikt/aksel-icons": "^7.10.0",
"@navikt/ds-css": "^7.10.0",
"@navikt/ds-react": "^7.10.0",
"@navikt/ds-tailwind": "^7.10.0",
"@navikt/ds-tokens": "^7.10.0"
}
}
@@ -1,55 +0,0 @@
import NextLink from "next/link";
import { BodyLong, BodyShort, Heading, Link } from "@navikt/ds-react";
import ErrorBoundary from "@/error-boundary";
import { useFormatedDate } from "@/hooks/useFormatedDate";
import { amplitudeLogNavigation } from "@/logging";
import { AkselBloggDocT, ResolveContributorsT, ResolveSlugT } from "@/types";
import { getAuthors } from "@/utils";
type BloggCardProps = {
blog: ResolveContributorsT<ResolveSlugT<AkselBloggDocT>>;
};
const BloggCard = ({ blog }: BloggCardProps) => {
const date = useFormatedDate(blog?.publishedAt ?? blog._createdAt);
return (
<li
key={blog._id}
className="flex h-full flex-col place-content-start border-b border-b-border-subtle pb-10"
>
<Heading size="medium" as="div">
<NextLink href={`/${blog.slug}`} passHref legacyBehavior>
<Link
className="text-deepblue-500 underline hover:no-underline"
onClick={(e) =>
amplitudeLogNavigation(
"blogg-card",
e.currentTarget.getAttribute("href"),
)
}
>
{blog.heading}
</Link>
</NextLink>
</Heading>
<BodyLong className="my-2 line-clamp-2">{blog?.ingress}</BodyLong>
{getAuthors(blog).length > 0 && (
<BodyShort
size="small"
className="mt-auto flex gap-2 justify-self-end text-text-subtle"
>
<span className="font-semibold">{getAuthors(blog)[0]}</span>
<span>{date}</span>
</BodyShort>
)}
</li>
);
};
export default function Component(props: BloggCardProps) {
return (
<ErrorBoundary boundaryName="ArtikkelCard">
<BloggCard {...props} />
</ErrorBoundary>
);
}
@@ -1,88 +0,0 @@
import NextLink from "next/link";
import { BodyLong, Heading, Link } from "@navikt/ds-react";
const CubeLarge = () => (
<svg
width="1016"
height="320"
viewBox="0 0 1016 320"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className="pointer-events-none absolute right-0 z-0 hidden lg:block"
aria-hidden
>
<path
d="M849.229 637.344L1096.48 390.09L849.228 142.836L601.975 390.09L849.229 637.344Z"
stroke="#F9A8D4"
strokeOpacity="0.4"
strokeWidth="3.54219"
strokeLinejoin="round"
/>
<path
d="M872.671 119.393L1119.93 -127.861H873.041L625.787 119.393H872.671Z"
stroke="#F9A8D4"
strokeOpacity="0.4"
strokeWidth="3.54219"
strokeLinejoin="round"
/>
</svg>
);
const CubeSmall = () => (
<svg
className="pointer-events-none absolute left-0 z-0 max-w-full overflow-hidden lg:hidden"
width="390"
height="290"
viewBox="0 0 390 290"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-hidden
>
<path
d="M-0.327544 508.393L246.927 261.139H0.0431418L-247.212 508.393H-0.327544Z"
stroke="#F9A8D4"
strokeOpacity="0.4"
strokeWidth="3.54219"
strokeLinejoin="round"
/>
<path
d="M517.621 -9.55799L764.876 237.697L517.992 237.697L270.737 -9.55799H517.621Z"
stroke="#F9A8D4"
strokeOpacity="0.4"
strokeWidth="3.54219"
strokeLinejoin="round"
/>
</svg>
);
export const BloggAd = () => {
return (
<div className="relative left-1/2 right-1/2 -mx-[50vw] my-20 flex h-72 w-screen items-center bg-[#FBCFE8] px-4 md:left-auto md:right-auto md:mx-auto md:w-full md:max-w-[85%] md:rounded-2xl md:px-6 lg:h-80 lg:pl-12">
<div className="z-10 max-w-sm text-[#831843]">
<Heading level="2" size="xlarge" spacing>
Skriv for bloggen
</Heading>
<BodyLong spacing>
Brenner du for digital produktutvikling, og har en #FFC0E6-blogger i
magen?
</BodyLong>
<BodyLong>
Ta kontakt med{" "}
<NextLink
href="https://nav-it.slack.com/archives/C7NE7A8UF"
passHref
legacyBehavior
>
<Link className="font-semibold text-[#831843]">
#Aksel-designsystemet
</Link>
</NextLink>{" "}
på Slack
</BodyLong>
</div>
<CubeLarge />
<CubeSmall />
</div>
);
};
@@ -1,7 +1,6 @@
import { Heading } from "@navikt/ds-react";
import { Heading, Show } from "@navikt/ds-react";
import { SanityBlockContent } from "@/sanity-block";
import { AkselBloggDocT, ResolveContributorsT, ResolveSlugT } from "@/types";
import { BloggList } from "./parts/BloggList";
import { HighlightedBlogg } from "./parts/HighlightedBlogg";
export const LatestBloggposts = ({
@@ -23,7 +22,7 @@ export const LatestBloggposts = ({
level="1"
size="xlarge"
spacing
className="mx-auto w-full text-5xl text-deepblue-700 md:mx-0 md:max-w-none"
className="mx-auto w-full text-5xl text-aksel-heading md:mx-0 md:max-w-none"
>
{title}
</Heading>
@@ -31,11 +30,9 @@ export const LatestBloggposts = ({
{/* Desktop-view */}
<div className="mx-auto my-10 grid gap-12 md:my-12 md:grid-cols-2">
<HighlightedBlogg blogg={bloggs[0]} />
<div className="col-span-1 grid place-content-start gap-12">
{bloggs.slice(1, 3).map((blogg) => (
<BloggList blogg={blogg} key={blogg._id} />
))}
</div>
<Show above="md">
<HighlightedBlogg blogg={bloggs[1]} />
</Show>
</div>
</div>
);
@@ -13,7 +13,7 @@ export const BloggList = ({
}) => {
const date = useFormatedDate(blogg?.publishedAt ?? blogg._createdAt);
return (
<div>
<li>
<div className="hidden gap-6 md:flex">
<div className="relative hidden aspect-square h-[11.75rem] rounded-lg ring-1 ring-border-subtle lg:block">
{blogg?.seo?.image ? (
@@ -37,15 +37,15 @@ export const BloggList = ({
)}
</div>
<div>
<div className="w-full">
<NextLink href={`/${blogg.slug}`} passHref legacyBehavior>
<Link className="text-deepblue-500 underline hover:no-underline">
<Heading size="small" level="2">
<Link className="text-aksel-heading underline hover:no-underline">
<Heading size="medium" level="2">
{blogg.heading}
</Heading>
</Link>
</NextLink>
<BodyLong className="mt-4" size="small">
<BodyLong className="mt-4" size="medium">
{blogg?.ingress}
</BodyLong>
{getAuthors(blogg).length > 0 ? (
@@ -63,54 +63,29 @@ export const BloggList = ({
)}
</div>
</div>
<div className="md:hidden">
<div className="relative mb-6 block aspect-video">
{blogg?.seo?.image ? (
<Image
src={urlFor(blogg.seo.image).auto("format").url()}
layout="fill"
objectFit="cover"
aria-hidden
priority
className="rounded-lg"
/>
) : (
<Image
src={getImage(blogg?.heading ?? "", "thumbnail")}
layout="fill"
objectFit="cover"
aria-hidden
priority
className="rounded-lg"
/>
)}
</div>
<div className="md:hidden">
<NextLink href={`/${blogg.slug}`} passHref legacyBehavior>
<Link className="text-deepblue-500 underline hover:no-underline">
<Heading size="small" level="2">
{blogg.heading}
</Heading>
</Link>
</NextLink>
<BodyLong className="mt-4" size="small">
{blogg?.ingress}
</BodyLong>
{getAuthors(blogg).length > 0 ? (
<BodyShort
size="small"
className="mt-4 flex gap-2 text-text-subtle"
>
<span className="font-semibold">{getAuthors(blogg)[0]}</span>
<span>{date}</span>
</BodyShort>
) : (
<BodyShort size="small" className="mt-4 text-text-subtle">
<span>{date}</span>
</BodyShort>
)}
</div>
<div className="w-full md:hidden">
<NextLink href={`/${blogg.slug}`} passHref legacyBehavior>
<Link className="text-aksel-heading underline hover:no-underline">
<Heading size="medium" level="2">
{blogg.heading}
</Heading>
</Link>
</NextLink>
<BodyLong className="mt-4" size="medium">
{blogg?.ingress}
</BodyLong>
{getAuthors(blogg).length > 0 ? (
<BodyShort size="small" className="mt-4 flex gap-2 text-text-subtle">
<span className="font-semibold">{getAuthors(blogg)[0]}</span>
<span>{date}</span>
</BodyShort>
) : (
<BodyShort size="small" className="mt-4 text-text-subtle">
<span>{date}</span>
</BodyShort>
)}
</div>
</div>
</li>
);
};
@@ -13,7 +13,7 @@ export const HighlightedBlogg = ({
}) => {
const date = useFormatedDate(blogg?.publishedAt ?? blogg._createdAt);
return (
<div>
<article>
<div className="col-span-1 hidden md:block">
<div className="relative mb-10 block aspect-video rounded-lg ring-1 ring-border-subtle">
{blogg?.seo?.image ? (
@@ -46,7 +46,7 @@ export const HighlightedBlogg = ({
)}
</div>
<NextLink href={`/${blogg.slug}`} passHref legacyBehavior>
<Link className="text-deepblue-500 underline hover:no-underline">
<Link className="text-aksel-heading underline hover:no-underline">
<Heading size="large" level="2">
{blogg.heading}
</Heading>
@@ -93,7 +93,7 @@ export const HighlightedBlogg = ({
)}
</div>
<NextLink href={`/${blogg.slug}`} passHref legacyBehavior>
<Link className="text-deepblue-500 underline hover:no-underline">
<Link className="text-aksel-heading underline hover:no-underline">
<Heading size="large" level="2">
{blogg.heading}
</Heading>
@@ -109,6 +109,6 @@ export const HighlightedBlogg = ({
</BodyShort>
)}
</div>
</div>
</article>
);
};
@@ -25,11 +25,7 @@ export const SearchForm = () => {
}
return (
<form
role="search"
onSubmit={(e) => e.preventDefault()}
className="px-6 pb-4"
>
<form role="search" onSubmit={(e) => e.preventDefault()} className="w-full">
<Search
label={
<span className="flex items-center gap-2">
@@ -2,12 +2,13 @@ import cl from "clsx";
import Image from "next/legacy/image";
import NextLink from "next/link";
import { forwardRef, useContext } from "react";
import { Show } from "@navikt/ds-react";
import { Tag } from "@/cms/frontpage-blocks/latest-articles/Tag";
import { urlFor } from "@/sanity/interface";
import { SearchHitT, searchOptions } from "@/types";
import { StatusTag } from "@/web/StatusTag";
import { SearchContext, SearchLoggingContext } from "../providers";
import { highlightMatches, highlightStr } from "../utils";
import { highlightStr } from "../utils";
export const Hit = forwardRef<
HTMLLIElement,
@@ -33,10 +34,11 @@ export const Hit = forwardRef<
"relative flex scroll-my-10 items-center justify-between gap-3 border-b border-border-subtle px-2 last-of-type:border-b-0 has-[+_*_:focus-visible]:border-b-transparent has-[:focus-visible]:border-b-transparent",
)}
>
<div className="w-full truncate px-2 py-3">
<div className="w-full px-2 py-3">
<span
className={cl({
"flex flex-col": simple,
"flex flex-col gap-1 md:flex-row md:justify-between md:gap-4":
simple,
"flex items-center gap-2": !simple,
})}
>
@@ -44,12 +46,13 @@ export const Hit = forwardRef<
href={href}
onClick={() => logSuccess(index, `/${hit.item.slug}`)}
className={cl(
"group scroll-my-32 truncate text-xl font-semibold underline hover:decoration-[3px] focus:outline-none",
"group scroll-my-32 break-words text-xl font-semibold underline hover:decoration-[3px] focus:outline-none",
"after:absolute after:inset-0 after:rounded-lg after:ring-inset focus-visible:after:ring-[3px] focus-visible:after:ring-border-focus",
)}
>
{highlightStr(hit.item.heading, query, tag)}
</NextLink>
{simple ? (
<Tag
type={hit.item._type}
@@ -65,7 +68,9 @@ export const Hit = forwardRef<
)}
</span>
{!simple && <HeadingLinks hit={hit} />}
<Show above="md" asChild>
<p className="line-clamp-2">{hit.description}</p>
</Show>
</div>
{!simple && (
@@ -87,19 +92,3 @@ export const Hit = forwardRef<
</li>
);
});
function HeadingLinks({
hit,
}: {
hit: SearchHitT | Omit<SearchHitT, "score" | "anchor">;
}) {
if (hit.matches && hit.matches?.[0].key !== "heading") {
return highlightMatches(hit.matches[0]);
}
return (
<span className="max-w-full text-lg font-regular text-text-subtle">
{hit.description}
</span>
);
}
@@ -75,7 +75,7 @@ export function Collection({
<div>
{heading && tag && (
<h2
className={cl("sticky top-0 z-10 p-2 px-6 md:px-10", {
className={cl("top-0 z-10 p-2 px-6 md:sticky md:px-10", {
"bg-deepblue-50": ["komponent_artikkel", "ds_artikkel"].includes(
tag,
),
@@ -91,7 +91,7 @@ export function Collection({
)}
{heading && !tag && (
<Heading
className="sticky top-0 z-10 bg-surface-subtle p-2 px-6 md:px-10"
className="top-0 z-10 bg-surface-subtle p-2 px-6 md:sticky md:px-10"
size="small"
level="2"
>
@@ -1,5 +1,6 @@
import { useContext } from "react";
import { Modal } from "@navikt/ds-react";
import { XMarkIcon } from "@navikt/aksel-icons";
import { Button, Heading, Modal } from "@navikt/ds-react";
import { AkselSearchButton } from "@/web/search/parts/SearchButton";
import { SearchContext, SearchNavigationContext } from "../providers";
import { SearchForm } from "./Form";
@@ -22,16 +23,28 @@ export const Search = () => {
e.stopPropagation();
}
}}
className="h-[90%] max-h-[52rem]"
className="md:h-[90%] md:max-h-[52rem]"
width="medium"
aria-labelledby="aksel-search-heading"
closeOnBackdropClick
header={{
heading: "Søk",
closeButton: true,
}}
>
<Heading
level="1"
size="medium"
id="aksel-search-heading"
visuallyHidden
>
Søk
</Heading>
<Skeleton />
<SearchForm />
<div className="flex items-center gap-2 px-2 py-1 md:px-4 md:py-4">
<SearchForm />
<Button
variant="tertiary-neutral"
onClick={close}
icon={<XMarkIcon title="Lukk" />}
/>
</div>
<Results />
</Modal>
</>
@@ -1,6 +1,4 @@
import cl from "clsx";
import type { FuseResultMatch } from "fuse.js";
import React from "react";
import { searchOptions } from "@/types";
function splitStr(str: string, query: string) {
@@ -48,50 +46,3 @@ export function highlightStr(
</>
);
}
export function highlightMatches(hitMatch: FuseResultMatch) {
const text = hitMatch.value;
if (!text) {
return null;
}
const result: { text: string; highlight: boolean }[] = [];
const matches = [...hitMatch.indices];
let index = 0;
matches.forEach((match, i) => {
const str = text.substring(match[0], match[1] - 1);
let preText = text.substring(index, match[0]);
if (i === 0) {
const preLength = preText.length;
preText = preText.substring(preText.length - 23);
if (preText.length < preLength) {
preText = `...${preText}`;
}
}
result.push({ text: preText, highlight: false });
result.push({ text: str, highlight: true });
index = match[1] - 1;
if (i === matches.length - 1) {
result.push({ text: text.substring(index), highlight: false });
}
});
return (
<span>
{result.map((part, i) => (
<span
key={i}
className={cl({
"font-semibold text-text-default": part.highlight,
})}
>
{part.text}
</span>
))}
</span>
);
}
@@ -1,7 +1,6 @@
import Image from "next/legacy/image";
import { GetServerSideProps } from "next/types";
import { BodyLong, BodyShort, Detail, Heading } from "@navikt/ds-react";
import BloggCard from "@/cms/cards/BloggCard";
import Footer from "@/layout/footer/Footer";
import Header from "@/layout/header/Header";
import { SanityBlockContent } from "@/sanity-block";
@@ -15,7 +14,7 @@ import {
ResolveSlugT,
} from "@/types";
import { abbrName, dateStr, getImage } from "@/utils";
import { BloggAd } from "@/web/BloggAd";
import { BloggList } from "@/web/blogg-page/parts/BloggList";
import { PagePreview } from "@/web/preview/PagePreview";
import { SEO } from "@/web/seo/SEO";
import NotFotfund from "../404";
@@ -43,6 +42,7 @@ export const query = `{
_createdAt,
_id,
ingress,
seo,
${contributorsAll},
}
}`;
@@ -207,17 +207,13 @@ const Page = ({ blogg, morePosts, publishDate }: PageProps["props"]) => {
<Heading level="2" size="large">
Flere blogginnlegg
</Heading>
<ul className="mt-12 grid gap-x-6 gap-y-6 md:grid-cols-2 md:gap-x-6 md:gap-y-10 lg:grid-cols-3">
<ul className="mt-12 grid gap-12">
{morePosts.map((post) => (
<BloggCard key={post._id} blog={post} />
<BloggList key={post._id} blogg={post} />
))}
</ul>
</div>
)}
<div className="mx-auto grid w-full max-w-4xl">
<BloggAd />
</div>
</div>
</main>
<Footer />
@@ -1,6 +1,4 @@
import { GetStaticProps } from "next/types";
import { Heading } from "@navikt/ds-react";
import BloggCard from "@/cms/cards/BloggCard";
import Footer from "@/layout/footer/Footer";
import Header from "@/layout/header/Header";
import { getClient } from "@/sanity/client.server";
@@ -12,8 +10,8 @@ import {
ResolveContributorsT,
ResolveSlugT,
} from "@/types";
import { BloggAd } from "@/web/BloggAd";
import { LatestBloggposts } from "@/web/blogg-page/BloggPage";
import { BloggList } from "@/web/blogg-page/parts/BloggList";
import { PagePreview } from "@/web/preview/PagePreview";
import { SEO } from "@/web/seo/SEO";
import NotFotfund from "../404";
@@ -62,7 +60,7 @@ const Page = (props: PageProps["props"]) => {
return <NotFotfund />;
}
const remainingPosts = props?.bloggposts?.slice(3, props?.bloggposts.length);
const remainingPosts = props?.bloggposts?.slice(2, props?.bloggposts.length);
return (
<>
@@ -82,24 +80,17 @@ const Page = (props: PageProps["props"]) => {
<div className="mx-auto mb-40 grid w-full max-w-screen-2xl px-4 sm:px-6">
<LatestBloggposts
bloggs={props?.bloggposts}
title="Blogg"
title="Produktbloggen"
intro={props?.page?.intro}
/>
{/* Skriv for bloggen */}
<BloggAd />
{/* Flere blogger */}
{remainingPosts && (
<div>
<Heading level="2" size="xlarge" className="text-deepblue-800">
Flere blogginnlegg
</Heading>
<ul className="mt-12 grid gap-x-3 gap-y-6 md:grid-cols-2 md:gap-x-6 md:gap-y-10 lg:grid-cols-3">
{remainingPosts.map((blog) => (
<BloggCard key={blog._id} blog={blog} />
))}
</ul>
</div>
<ul className="mt-8 grid gap-12 md:grid-cols-2">
{remainingPosts.map((blogg) => (
<BloggList blogg={blogg} key={blogg._id} />
))}
</ul>
)}
</div>
</main>
+1
View File
@@ -46,6 +46,7 @@ export const komponentKategorier = [
{ title: "Primitives", value: "primitives" },
{ title: "Core", value: "core" },
{ title: "Alpha", value: "alpha" },
{ title: "Legacy", value: "legacy" },
];
export const grunnleggendeKategorier = [
+1 -1
View File
@@ -37,6 +37,6 @@
"tailwindcss": "^3.4.11",
"typescript": "5.5.4",
"typescript-eslint": "^8.0.1",
"vite": "^5.4.8"
"vite": "^5.4.12"
}
}
+26 -16
View File
@@ -733,23 +733,23 @@ __metadata:
linkType: hard
"@navikt/aksel-icons@file:../../@navikt/aksel-icons::locator=referansesider%40workspace%3A.":
version: 7.8.0
resolution: "@navikt/aksel-icons@file:../../@navikt/aksel-icons#../../@navikt/aksel-icons::hash=bac186&locator=referansesider%40workspace%3A."
checksum: 10/e31e6a82d5945df984a8139615867428a0aee90f22091501c51f31c2b6a157aeec4cd3c3427f520d2139eb73bfce57c41cdb4543718d58441c2635a7c7f2cdc5
version: 7.9.2
resolution: "@navikt/aksel-icons@file:../../@navikt/aksel-icons#../../@navikt/aksel-icons::hash=aff5eb&locator=referansesider%40workspace%3A."
checksum: 10/99c2ca45b4ef0debbf78b183733ef1f9bb35246efaf19e914c4f269124b4fd90699b7e5e12a231618e796365c9b22d764b3525689367b184ad907dc45afdfc6f
languageName: node
linkType: hard
"@navikt/ds-css@file:../../@navikt/core/css::locator=referansesider%40workspace%3A.":
version: 7.8.0
resolution: "@navikt/ds-css@file:../../@navikt/core/css#../../@navikt/core/css::hash=7413d6&locator=referansesider%40workspace%3A."
checksum: 10/7079efa87adac336780587e201d3591268e69b47f4dd0fdcccd44c5d4ad28766abfff04845643e2439880eb5a2fe22b2f55fa07fe76a9daa98b6f8ed0e883d99
version: 7.9.2
resolution: "@navikt/ds-css@file:../../@navikt/core/css#../../@navikt/core/css::hash=d4b3e1&locator=referansesider%40workspace%3A."
checksum: 10/2faff79f5081fd4dcbe512478e8aa17dd6df32c2f2db874e24469bb24d4a6b7de09ffb242683eb3512481fc95fad4266c6ab1747bbfc2a86f9781e46b9282af5
languageName: node
linkType: hard
"@navikt/ds-tokens@file:../../@navikt/core/tokens::locator=referansesider%40workspace%3A.":
version: 7.8.0
resolution: "@navikt/ds-tokens@file:../../@navikt/core/tokens#../../@navikt/core/tokens::hash=2b97bf&locator=referansesider%40workspace%3A."
checksum: 10/015b8b0a4908c58ee294a11cf679dfd78072c43dc0eccfa4c75c5bd7edbf77c34e99f035efbe271d30dd24fd87ea65a205c755c7705412f4d6740c6a42e34cd2
version: 7.9.2
resolution: "@navikt/ds-tokens@file:../../@navikt/core/tokens#../../@navikt/core/tokens::hash=9c3497&locator=referansesider%40workspace%3A."
checksum: 10/99c62f4207165fa675989c0f0ba1e65497dad8f1233583f506f5631d5dbaca3c0ac8d0b683f8a3f03ace0c2296bc49f8f12a439d73e41be4a0a47fb957fd9869
languageName: node
linkType: hard
@@ -1233,7 +1233,7 @@ __metadata:
languageName: node
linkType: hard
"@types/react@npm:*, @types/react@npm:^18.3.3":
"@types/react@npm:*":
version: 18.3.6
resolution: "@types/react@npm:18.3.6"
dependencies:
@@ -1243,6 +1243,16 @@ __metadata:
languageName: node
linkType: hard
"@types/react@npm:^18.3.11":
version: 18.3.18
resolution: "@types/react@npm:18.3.18"
dependencies:
"@types/prop-types": "npm:*"
csstype: "npm:^3.0.2"
checksum: 10/7fdd8b853e0d291d4138133f93f8d5c333da918e5804afcea61a923aab4bdfc9bb15eb21a5640959b452972b8715ddf10ffb12b3bd071898b9e37738636463f2
languageName: node
linkType: hard
"@types/stylis@npm:4.2.5":
version: 4.2.5
resolution: "@types/stylis@npm:4.2.5"
@@ -3372,7 +3382,7 @@ __metadata:
"@tanstack/react-router": "npm:^1.57.17"
"@tanstack/router-devtools": "npm:^1.57.17"
"@tanstack/router-plugin": "npm:^1.57.15"
"@types/react": "npm:^18.3.3"
"@types/react": "npm:^18.3.11"
"@types/react-dom": "npm:^18.3.0"
"@vitejs/plugin-react-swc": "npm:^3.5.0"
"@vitest/eslint-plugin": "npm:^1.1.4"
@@ -3390,7 +3400,7 @@ __metadata:
tailwindcss: "npm:^3.4.11"
typescript: "npm:5.5.4"
typescript-eslint: "npm:^8.0.1"
vite: "npm:^5.4.8"
vite: "npm:^5.4.12"
languageName: unknown
linkType: soft
@@ -4015,9 +4025,9 @@ __metadata:
languageName: node
linkType: hard
"vite@npm:^5.4.8":
version: 5.4.8
resolution: "vite@npm:5.4.8"
"vite@npm:^5.4.12":
version: 5.4.14
resolution: "vite@npm:5.4.14"
dependencies:
esbuild: "npm:^0.21.3"
fsevents: "npm:~2.3.3"
@@ -4054,7 +4064,7 @@ __metadata:
optional: true
bin:
vite: bin/vite.js
checksum: 10/17fdffa558abaf854f04ead7d3ddd76e4556a59871f9ac63cca3fc20a79979984837d8dddaae4b171e3d73061f781e4eec0f6d3babdbce2b4d111d29cf474c1c
checksum: 10/ce382f4059eb6c939823b8f62163794752243755d84c71a4b73ad0f7d4d9f4c7a557a6ef4c78e0640f4bcf5ae5ec6b20c7ee4816419af3c81ba275f478b73468
languageName: node
linkType: hard
+1 -1
View File
@@ -20,6 +20,6 @@
"@types/react-dom": "^18.2.18",
"@vitejs/plugin-react": "^4.2.1",
"typescript": "5.5.4",
"vite": "^5.4.6"
"vite": "^5.4.12"
}
}
+1 -1
View File
@@ -193,7 +193,7 @@
"stylelint-value-no-unknown-custom-properties": "^6.0.0",
"tsx": "^4.19.1",
"typescript": "5.5.4",
"vite": "^5.4.6",
"vite": "^5.4.12",
"vite-plugin-turbosnap": "^1.0.3",
"vite-tsconfig-paths": "^4.3.2"
},
+63 -20
View File
@@ -3668,7 +3668,7 @@ __metadata:
languageName: node
linkType: hard
"@navikt/aksel-icons@npm:^7.9.2, @navikt/aksel-icons@workspace:@navikt/aksel-icons":
"@navikt/aksel-icons@npm:^7.10.0, @navikt/aksel-icons@workspace:@navikt/aksel-icons":
version: 0.0.0-use.local
resolution: "@navikt/aksel-icons@workspace:@navikt/aksel-icons"
dependencies:
@@ -3699,8 +3699,8 @@ __metadata:
version: 0.0.0-use.local
resolution: "@navikt/aksel-stylelint@workspace:@navikt/aksel-stylelint"
dependencies:
"@navikt/ds-css": "npm:^7.9.2"
"@navikt/ds-tokens": "npm:^7.9.2"
"@navikt/ds-css": "npm:^7.10.0"
"@navikt/ds-tokens": "npm:^7.10.0"
concurrently: "npm:9.0.1"
postcss-selector-parser: "npm:^6.0.13"
postcss-value-parser: "npm:^4.2.0"
@@ -3715,7 +3715,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@navikt/aksel@workspace:@navikt/aksel"
dependencies:
"@navikt/ds-css": "npm:^7.9.2"
"@navikt/ds-css": "npm:^7.10.0"
axios: "npm:1.7.4"
chalk: "npm:4.1.0"
clipboardy: "npm:^2.3.0"
@@ -3736,11 +3736,11 @@ __metadata:
languageName: unknown
linkType: soft
"@navikt/ds-css@npm:*, @navikt/ds-css@npm:^7.9.2, @navikt/ds-css@workspace:@navikt/core/css":
"@navikt/ds-css@npm:*, @navikt/ds-css@npm:^7.10.0, @navikt/ds-css@workspace:@navikt/core/css":
version: 0.0.0-use.local
resolution: "@navikt/ds-css@workspace:@navikt/core/css"
dependencies:
"@navikt/ds-tokens": "npm:^7.9.2"
"@navikt/ds-tokens": "npm:^7.10.0"
"@types/clean-css": "npm:4.2.11"
autoprefixer: "npm:^10.4.20"
browserslist: "npm:^4.24.2"
@@ -3760,14 +3760,14 @@ __metadata:
languageName: unknown
linkType: soft
"@navikt/ds-react@npm:*, @navikt/ds-react@npm:^7.9.2, @navikt/ds-react@workspace:@navikt/core/react":
"@navikt/ds-react@npm:*, @navikt/ds-react@npm:^7.10.0, @navikt/ds-react@workspace:@navikt/core/react":
version: 0.0.0-use.local
resolution: "@navikt/ds-react@workspace:@navikt/core/react"
dependencies:
"@floating-ui/react": "npm:0.25.4"
"@floating-ui/react-dom": "npm:^2.0.9"
"@navikt/aksel-icons": "npm:^7.9.2"
"@navikt/ds-tokens": "npm:^7.9.2"
"@navikt/aksel-icons": "npm:^7.10.0"
"@navikt/ds-tokens": "npm:^7.10.0"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:^6.6.3"
"@testing-library/react": "npm:^16.1.0"
@@ -3798,11 +3798,11 @@ __metadata:
languageName: unknown
linkType: soft
"@navikt/ds-tailwind@npm:^7.9.2, @navikt/ds-tailwind@workspace:@navikt/core/tailwind":
"@navikt/ds-tailwind@npm:^7.10.0, @navikt/ds-tailwind@workspace:@navikt/core/tailwind":
version: 0.0.0-use.local
resolution: "@navikt/ds-tailwind@workspace:@navikt/core/tailwind"
dependencies:
"@navikt/ds-tokens": "npm:^7.9.2"
"@navikt/ds-tokens": "npm:^7.10.0"
color: "npm:4.2.3"
lodash: "npm:^4.17.21"
tailwindcss: "npm:^3.3.3"
@@ -3812,7 +3812,7 @@ __metadata:
languageName: unknown
linkType: soft
"@navikt/ds-tokens@npm:^7.9.2, @navikt/ds-tokens@workspace:@navikt/core/tokens":
"@navikt/ds-tokens@npm:^7.10.0, @navikt/ds-tokens@workspace:@navikt/core/tokens":
version: 0.0.0-use.local
resolution: "@navikt/ds-tokens@workspace:@navikt/core/tokens"
dependencies:
@@ -7597,7 +7597,7 @@ __metadata:
react: "npm:^18.0.0"
react-dom: "npm:^18.0.0"
typescript: "npm:5.5.4"
vite: "npm:^5.4.6"
vite: "npm:^5.4.12"
vite-plugin-singlefile: "npm:^1.0.0"
vite-plugin-svgr: "npm:^4.2.0"
languageName: unknown
@@ -7607,11 +7607,11 @@ __metadata:
version: 0.0.0-use.local
resolution: "aksel.nav.no@workspace:aksel.nav.no"
dependencies:
"@navikt/aksel-icons": "npm:^7.9.2"
"@navikt/ds-css": "npm:^7.9.2"
"@navikt/ds-react": "npm:^7.9.2"
"@navikt/ds-tailwind": "npm:^7.9.2"
"@navikt/ds-tokens": "npm:^7.9.2"
"@navikt/aksel-icons": "npm:^7.10.0"
"@navikt/ds-css": "npm:^7.10.0"
"@navikt/ds-react": "npm:^7.10.0"
"@navikt/ds-tailwind": "npm:^7.10.0"
"@navikt/ds-tokens": "npm:^7.10.0"
languageName: unknown
linkType: soft
@@ -7666,7 +7666,7 @@ __metadata:
stylelint-value-no-unknown-custom-properties: "npm:^6.0.0"
tsx: "npm:^4.19.1"
typescript: "npm:5.5.4"
vite: "npm:^5.4.6"
vite: "npm:^5.4.12"
vite-plugin-turbosnap: "npm:^1.0.3"
vite-tsconfig-paths: "npm:^4.3.2"
languageName: unknown
@@ -24356,7 +24356,7 @@ __metadata:
languageName: node
linkType: hard
"vite@npm:^5.0.0, vite@npm:^5.0.11, vite@npm:^5.4.6":
"vite@npm:^5.0.0, vite@npm:^5.0.11":
version: 5.4.9
resolution: "vite@npm:5.4.9"
dependencies:
@@ -24399,6 +24399,49 @@ __metadata:
languageName: node
linkType: hard
"vite@npm:^5.4.12":
version: 5.4.14
resolution: "vite@npm:5.4.14"
dependencies:
esbuild: "npm:^0.21.3"
fsevents: "npm:~2.3.3"
postcss: "npm:^8.4.43"
rollup: "npm:^4.20.0"
peerDependencies:
"@types/node": ^18.0.0 || >=20.0.0
less: "*"
lightningcss: ^1.21.0
sass: "*"
sass-embedded: "*"
stylus: "*"
sugarss: "*"
terser: ^5.4.0
dependenciesMeta:
fsevents:
optional: true
peerDependenciesMeta:
"@types/node":
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
sass-embedded:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
bin:
vite: bin/vite.js
checksum: 10/ce382f4059eb6c939823b8f62163794752243755d84c71a4b73ad0f7d4d9f4c7a557a6ef4c78e0640f4bcf5ae5ec6b20c7ee4816419af3c81ba275f478b73468
languageName: node
linkType: hard
"vitest@npm:^2.1.8":
version: 2.1.8
resolution: "vitest@npm:2.1.8"