diff --git a/@navikt/core/css/darkside/stepper.darkside.css b/@navikt/core/css/darkside/stepper.darkside.css index a7f3907965..b82584b28d 100644 --- a/@navikt/core/css/darkside/stepper.darkside.css +++ b/@navikt/core/css/darkside/stepper.darkside.css @@ -1,47 +1,44 @@ .navds-stepper { - --navds-stepper-circle-size: 1.75rem; - --navds-stepper-border-width: 2px; - --navds-stepper-line-length: 1rem; + --__axc-stepper-circle-size: 1.75rem; + --__axc-stepper-border-width: 2px; + --__axc-stepper-line-length: 1rem; - color: var(--ac-stepper-text, var(--a-surface-action)); - font-weight: 600; + color: var(--ax-text-accent); + font-weight: var(--ax-font-weight-bold); line-height: 1; list-style: none; padding-left: 0; margin: 0; } -.navds-stepper--horizontal { - display: flex; - align-items: flex-start; - text-align: center; -} - .navds-stepper__item { display: grid; grid-template-rows: - [line-1] auto [step-start] var(--navds-stepper-circle-size) + [line-1] auto [step-start] var(--__axc-stepper-circle-size) [line-2 step-end] auto; - grid-template-columns: var(--navds-stepper-circle-size) auto; + grid-template-columns: var(--__axc-stepper-circle-size) auto; justify-items: flex-start; - gap: 0.5rem; + gap: var(--ax-spacing-2); } .navds-stepper__line { - background-color: var(--ac-stepper-line, var(--a-border-default)); - width: var(--navds-stepper-border-width); + background-color: var(--ax-border-accent); + width: var(--__axc-stepper-border-width); height: 100%; - min-height: var(--navds-stepper-line-length); + min-height: var(--__axc-stepper-line-length); justify-self: center; grid-column: 1; -} -.navds-stepper__step--behind.navds-stepper__step--completed + .navds-stepper__line { - background-color: var(--ac-stepper-line-completed, var(--a-border-selected)); + .navds-stepper__item--non-interactive & { + background-color: var(--ax-border-neutral); + } } -.navds-stepper__item--behind.navds-stepper__item--completed + .navds-stepper__item > .navds-stepper__line--1 { - background-color: var(--ac-stepper-line-completed, var(--a-border-selected)); +/* Line before non-interactive step */ +.navds-stepper__item:has(+ .navds-stepper__item > .navds-stepper__step[data-interactive="false"]) { + .navds-stepper__line--2 { + background-color: var(--ax-border-neutral); + } } .navds-stepper__line--1 { @@ -51,89 +48,45 @@ .navds-stepper__line--2 { grid-row: line-2; -} -:where(.navds-stepper__item:last-of-type) .navds-stepper__line--2 { - display: none; + /* Hide last line under item */ + .navds-stepper__item:last-of-type & { + display: none; + } } .navds-stepper__step { grid-row: 2 / -1; grid-column: 1 / -1; display: grid; - grid-template-columns: [circle] var(--navds-stepper-circle-size) [content] auto; - gap: var(--a-spacing-2); + grid-template-columns: [circle] var(--__axc-stepper-circle-size) [content] auto; + gap: var(--ax-spacing-2); justify-content: flex-start; - text-decoration: none; cursor: pointer; - padding: var(--navds-stepper-border-width); - margin: calc(var(--navds-stepper-border-width) * -1) calc(var(--navds-stepper-border-width) * -1) 1.75rem; -} + padding: var(--__axc-stepper-border-width); + margin: calc(var(--__axc-stepper-border-width) * -1) calc(var(--__axc-stepper-border-width) * -1) + var(--__axc-stepper-circle-size); -.navds-stepper__item:last-child .navds-stepper__step { - margin-bottom: 0; -} - -@media (forced-colors: active) { - .navds-stepper__step { - background-color: ButtonFace; - color: ButtonText; - } - - .navds-stepper__circle.navds-stepper__circle { - border: 0; - } - - .navds-stepper__step .navds-stepper__circle { - forced-color-adjust: none; - background-color: ButtonText; - border-color: ButtonText; - color: ButtonFace; - } - - .navds-stepper__step.navds-stepper__step:focus-visible { - box-shadow: none; - outline: 2px solid highlight; - outline-offset: 2px; - } + &:focus-visible { + outline: 2px solid var(--ax-border-focus); + outline-offset: 4px; - .navds-stepper__step.navds-stepper__step--active .navds-stepper__circle { - forced-color-adjust: none; - background-color: highlight; - border-color: highlighttext; - color: highlighttext; + /* Isolate item to make outline show above line--2 */ + isolation: isolate; } - .navds-stepper__line { - background-color: ButtonText; + /* Remove last item bottom margin */ + .navds-stepper__item:last-child & { + margin-bottom: 0; } -} - -button.navds-stepper__step { - appearance: none; - border: none; - background-color: transparent; - font: inherit; - color: inherit; - text-align: inherit; -} - -.navds-stepper__step--non-interactive { - color: var(--ac-stepper-non-interactive, var(--a-text-subtle)); - cursor: default; -} - -:where(.navds-stepper__step):focus-visible { - outline: none; - box-shadow: var(--a-shadow-focus); - isolation: isolate; -} -@supports not selector(:focus-visible) { - .navds-stepper__step:focus { - outline: none; - box-shadow: var(--a-shadow-focus); - isolation: isolate; + &:is(button) { + appearance: none; + border: none; + background-color: transparent; + font: inherit; + color: inherit; + text-align: inherit; } } @@ -141,168 +94,177 @@ button.navds-stepper__step { grid-column: circle; display: inline-grid; place-items: center; - flex-shrink: 0; - width: var(--navds-stepper-circle-size); - height: var(--navds-stepper-circle-size); - border: var(--navds-stepper-border-width) solid currentColor; - border-radius: var(--a-border-radius-full); + width: var(--__axc-stepper-circle-size); + height: var(--__axc-stepper-circle-size); + border: var(--__axc-stepper-border-width) solid currentColor; + border-radius: var(--ax-border-radius-full); line-height: 1; } .navds-stepper__circle--success { - border: none; background: none; - font-size: 1.75rem; - color: var(--a-text-on-action); - background-color: var(--ac-stepper-text, var(--a-surface-action)); + font-size: var(--__axc-stepper-circle-size); } -.navds-stepper__content { - min-width: fit-content; - line-height: 1.5; - grid-column: content; - padding-top: 0.035rem; -} - -/* Horizontal */ -:where(.navds-stepper--horizontal) .navds-stepper__item { - flex: 1 1 100%; - grid-template-columns: - [line-1-start] 1fr [step-start] auto [line-1-end] var(--navds-stepper-circle-size) - [line-2-start] auto [step-end] 1fr [line-2-end]; - grid-template-rows: var(--navds-stepper-circle-size) auto; -} - -:where(.navds-stepper--horizontal) .navds-stepper__line { - height: var(--navds-stepper-border-width); - width: 100%; - min-height: auto; - grid-row: 1; - display: block; - align-self: center; -} - -:where(.navds-stepper--horizontal) .navds-stepper__line--1 { - grid-column: line-1; -} - -:where(.navds-stepper--horizontal) .navds-stepper__line--2 { - grid-column: line-2; -} +.navds-stepper__step[data-interactive="true"] { + color: var(--ax-text-accent); + border-radius: var(--ax-border-radius-medium); + text-decoration: none; -:where(.navds-stepper--horizontal .navds-stepper__item:first-of-type) .navds-stepper__line--1, -:where(.navds-stepper--horizontal .navds-stepper__item:last-of-type) .navds-stepper__line--2 { - visibility: hidden; -} + & .navds-stepper__content { + text-decoration: underline; + text-underline-offset: 0.1em; + text-decoration-thickness: 0.05em; + } -:where(.navds-stepper--horizontal) .navds-stepper__step { - grid-row: 1 / -1; - grid-column: step; - display: grid; - grid-template-rows: [circle] var(--navds-stepper-circle-size) [content] auto; - grid-template-columns: - [content-start] auto [circle] var(--navds-stepper-circle-size) - [content-end] auto; - place-items: center center; - margin-bottom: 0; -} + &:hover, + &:active { + & .navds-stepper__content { + text-decoration-thickness: 0.111em; + } + } -:where(.navds-stepper--horizontal) .navds-stepper__circle { - grid-row: circle; - grid-column: 2; -} + &:hover { + color: var(--ax-text-accent-strong); -:where(.navds-stepper--horizontal) .navds-stepper__content { - grid-row: content; - grid-column: 1 / -1; - max-width: 24ch; -} + & .navds-stepper__circle { + color: var(--ax-text-accent-strong); + } + } -/* Active step */ -:where(.navds-stepper__step--active) .navds-stepper__content { - color: var(--ac-stepper-active, var(--a-text-action-selected)); -} + & .navds-stepper__circle { + color: var(--ax-text-accent); + border-color: var(--ax-border-accent); + } -.navds-stepper__step:hover:where(:not(.navds-stepper__step--non-interactive)) { - color: var(--ac-stepper-hover-active, var(--a-text-action-hover)); -} + &[data-active="true"] { + & .navds-stepper__content { + color: var(--ax-text-accent-strong); + text-decoration: none; + } + + & .navds-stepper__circle { + color: var(--ax-text-accent-contrast); + background-color: var(--ax-bg-accent-strong-pressed); + border-color: var(--ax-bg-accent-strong-pressed); + } + } -:where(.navds-stepper__step:hover) .navds-stepper__content { - text-decoration: underline; + &[data-active="false"] { + &:hover { + & .navds-stepper__circle { + background-color: var(--ax-bg-accent-moderate-hover); + border-color: var(--ax-border-accent-strong); + } + } + } } -:where(.navds-stepper__step--non-interactive:hover, .navds-stepper__step--active:hover) .navds-stepper__content { - text-decoration: none; -} +.navds-stepper__step[data-interactive="false"] { + color: var(--ax-text-neutral); + cursor: default; -:where(.navds-stepper__step--active) .navds-stepper__circle { - background-color: var(--ac-stepper-active-bg, var(--a-surface-action-selected)); - border-color: var(--ac-stepper-active-border, var(--a-border-action-selected)); - color: var(--ac-stepper-active-text, var(--a-text-on-action)); -} + & .navds-stepper__circle { + color: var(--ax-text-neutral); + border-color: var(--ax-border-default); + } -:where(.navds-stepper__step:not(.navds-stepper__step--active):hover) .navds-stepper__circle { - background-color: var(--ac-stepper-hover-bg, var(--a-surface-action-subtle-hover)); -} + &[data-active="true"] { + & .navds-stepper__content { + color: var(--ax-text-neutral-strong); + } -:where(.navds-stepper__step:not(.navds-stepper__step--active):hover) .navds-stepper__circle--success { - background-color: var(--ac-stepper-text, var(--a-surface-action-hover)); + & .navds-stepper__circle { + color: var(--ax-text-neutral-contrast); + background-color: var(--ax-bg-neutral-strong-pressed); + border-color: var(--ax-bg-neutral-strong-pressed); + } + } } -/* Non-interactive */ -:where(.navds-stepper__step--non-interactive.navds-stepper__step--active) .navds-stepper__content { - color: var(--ac-stepper-non-interactive-active, var(--a-text-default)); +.navds-stepper__content { + min-width: fit-content; + line-height: 1.5; + grid-column: content; + padding-top: 0.035rem; } -.navds-stepper__step--non-interactive.navds-stepper__step--behind.navds-stepper__step--completed + .navds-stepper__line { - background-color: var(--ac-stepper-non-interactive-line-completed, var(--a-border-strong)); -} +/* Horizontal */ +.navds-stepper[data-orientation="horizontal"] { + display: flex; + align-items: flex-start; + text-align: center; -.navds-stepper__item--non-interactive.navds-stepper__item--behind.navds-stepper__item--completed - + .navds-stepper__item - > .navds-stepper__line--1 { - background-color: var(--ac-stepper-non-interactive-line-completed, var(--a-border-strong)); -} + & .navds-stepper__line { + height: var(--__axc-stepper-border-width); + width: 100%; + min-height: auto; + grid-row: 1; + display: block; + align-self: center; + } -:where(.navds-stepper__step--non-interactive.navds-stepper__step--active) .navds-stepper__circle { - background-color: var(--ac-stepper-non-interactive-active-bg, var(--a-surface-inverted)); - border-color: var(--ac-stepper-non-interactive-active-border, var(--a-surface-inverted)); - color: var(--ac-stepper-non-interactive-active-text, var(--a-text-on-inverted)); -} + & .navds-stepper__line--1 { + grid-column: line-1; + } -:where(.navds-stepper__step--non-interactive:hover) .navds-stepper__circle { - background-color: transparent; -} + & .navds-stepper__line--2 { + grid-column: line-2; + } -:where(.navds-stepper__step--non-interactive.navds-stepper__step--active:hover) .navds-stepper__circle { - background-color: var(--ac-stepper-non-interactive-active-bg, var(--a-surface-inverted)); -} + & .navds-stepper__item { + flex: 1 1 100%; + grid-template-columns: + [line-1-start] 1fr [step-start] auto [line-1-end] var(--__axc-stepper-circle-size) + [line-2-start] auto [step-end] 1fr [line-2-end]; + grid-template-rows: var(--__axc-stepper-circle-size) auto; + + &:first-of-type .navds-stepper__line--1, + &:last-of-type .navds-stepper__line--2 { + visibility: hidden; + } + } -:where(.navds-stepper__step--completed.navds-stepper__step--active) .navds-stepper__circle { - background-color: inherit; - color: var(--ac-stepper-active-completed, var(--a-text-action-selected)); -} + & .navds-stepper__step { + grid-row: 1 / -1; + grid-column: step; + display: grid; + grid-template-rows: [circle] var(--__axc-stepper-circle-size) [content] auto; + grid-template-columns: + [content-start] auto [circle] var(--__axc-stepper-circle-size) + [content-end] auto; + place-items: center center; + margin-bottom: 0; + } -:where(.navds-stepper__step--completed.navds-stepper__step--active) .navds-stepper__circle--success { - color: var(--a-text-on-action); - background-color: var(--ac-stepper-active-completed, var(--a-surface-action-selected)); -} + & .navds-stepper__circle { + grid-row: circle; + grid-column: 2; + } -:where(.navds-stepper__step--non-interactive, .navds-stepper__step--non-interactive:hover) .navds-stepper__circle--success { - color: var(--a-text-on-inverted); - background-color: var(--ac-stepper-non-interactive-completed-bg, var(--a-surface-neutral)); + & .navds-stepper__content { + grid-row: content; + grid-column: 1 / -1; + max-width: 24ch; + } } -:where(.navds-stepper__step--non-interactive.navds-stepper__step--active) .navds-stepper__circle--success { - color: var(--a-text-on-inverted); - background-color: var(--ac-stepper-non-interactive-active-completed, var(--a-surface-inverted)); -} +@media (forced-colors: active) { + .navds-stepper__circle.navds-stepper__circle { + border: 0; + outline: 2px solid ButtonText; + outline-offset: 2px; + } -:where(.navds-stepper__step--completed.navds-stepper__step--active.navds-stepper__step--non-interactive) .navds-stepper__circle { - color: var(--ac-stepper-non-interactive-active-completed, var(--a-text-default)); -} + .navds-stepper__line.navds-stepper__line { + background-color: ButtonText; + } -:where(.navds-stepper__step--completed.navds-stepper__step--active.navds-stepper__step--non-interactive) - .navds-stepper__circle--success { - color: var(--ac-stepper-non-interactive-active-completed, var(--a-text-on-inverted)); + .navds-stepper__step[data-active="true"][data-interactive] { + .navds-stepper__circle { + forced-color-adjust: none; + background-color: highlight; + color: highlighttext; + } + } } diff --git a/@navikt/core/react/src/stepper/Step.tsx b/@navikt/core/react/src/stepper/Step.tsx index d32539ac1a..86f5079c34 100644 --- a/@navikt/core/react/src/stepper/Step.tsx +++ b/@navikt/core/react/src/stepper/Step.tsx @@ -60,6 +60,9 @@ export const Step: OverridableComponent = "navds-stepper__step--non-interactive": !isInteractive, "navds-stepper__step--completed": completed, })} + data-active={activeStep === context.index} + data-completed={completed} + data-interactive={isInteractive} onClick={composeEventHandlers(onClick, handleStepClick)} > {completed ? ( diff --git a/@navikt/core/react/src/stepper/Stepper.tsx b/@navikt/core/react/src/stepper/Stepper.tsx index 33f473b12a..29046118d3 100644 --- a/@navikt/core/react/src/stepper/Stepper.tsx +++ b/@navikt/core/react/src/stepper/Stepper.tsx @@ -93,6 +93,7 @@ export const Stepper: StepperComponent = forwardRef< orientation === "horizontal" ? "navds-stepper--horizontal" : "", className, )} + data-orientation={orientation} > {React.Children.map(children, (step, index) => { const stepProps: Partial = @@ -101,10 +102,12 @@ export const Stepper: StepperComponent = forwardRef< return (
  • index, "navds-stepper__item--completed": stepProps.completed, - "navds-stepper__item--non-interactive": - stepProps.interactive ?? interactive, + "navds-stepper__item--non-interactive": !( + stepProps.interactive ?? interactive + ), })} key={index + (children?.toString?.() ?? "")} > diff --git a/@navikt/core/react/src/stepper/stepper.stories.tsx b/@navikt/core/react/src/stepper/stepper.stories.tsx index 3f1a27ec42..180fe7361d 100644 --- a/@navikt/core/react/src/stepper/stepper.stories.tsx +++ b/@navikt/core/react/src/stepper/stepper.stories.tsx @@ -180,7 +180,9 @@ export const CompletedSteps: StoryFn = () => { = 4}> Søknadstekst for en veldig spesifikk prosess i NAV som har lang tekst - 5}>Vedlegg + 5} interactive={false}> + Vedlegg + 6}>Oppsummering 7}>Innsending