Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Erstattet Radix togglegroup med intern implementasjon #2620

Merged
merged 67 commits into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
46df36a
:tada: Ny hook og API 'descendants'
KenAJoh Dec 28, 2023
9e93ef0
Merge branch 'main' into use-descendants
KenAJoh Jan 10, 2024
807c347
Merge branch 'main' into use-descendants
KenAJoh Jan 13, 2024
88da011
:memo: Bedre storiers
KenAJoh Jan 13, 2024
d90756d
:art: implementert togglegroup med descendants
KenAJoh Jan 13, 2024
786c4a4
:art: Implemented togglegroup.item
KenAJoh Jan 13, 2024
3122e88
:art: Fjernet gammel togglegroup
KenAJoh Jan 13, 2024
db76e31
:bug: Fikset keydown
KenAJoh Jan 13, 2024
95ce83d
:fire: Fjernet comment
KenAJoh Jan 13, 2024
5d035f4
:tada: RowingFocus resetter nå ved focus-exit
KenAJoh Jan 14, 2024
c5d94a9
:fire: Fjernet radix toggleroup fra dependencies
KenAJoh Jan 14, 2024
7d67e27
:memo: Changeset
KenAJoh Jan 15, 2024
6f62cb5
[V6] Deprecated Grid og ContentContainer (#2622)
KenAJoh Jan 15, 2024
d179824
Merge branch 'main' into aksel-v6
KenAJoh Jan 15, 2024
c0419ad
Merge branch 'main' into aksel-v6
KenAJoh Jan 16, 2024
444fe5d
Textarea: Fjern wrapper (#2635)
HalvorHaugan Jan 16, 2024
5706b06
Merge branch 'main' into aksel-v6
KenAJoh Jan 16, 2024
af14279
[V6] Chat-props deprecation (#2631)
KenAJoh Jan 18, 2024
c59a808
[V6] 1440px breakpoint (#2632)
KenAJoh Jan 18, 2024
9512fc6
[V6] Fjernet z-index-modal token (#2637)
KenAJoh Jan 18, 2024
40f688f
Merge branch 'main' into aksel-v6
KenAJoh Jan 18, 2024
aa8cc46
[V6] ErrorSummary magic (#2642)
KenAJoh Jan 18, 2024
fc3d520
:memo: Oppdatert migreringsguide for z-index + tailwind
KenAJoh Jan 18, 2024
32523e4
:bug: Fikset bruk av z-modal i tailwind
KenAJoh Jan 18, 2024
c2e1e94
Merge branch 'main' into aksel-v6
KenAJoh Jan 29, 2024
5891e69
Merge branch 'main' into aksel-v6
KenAJoh Jan 31, 2024
44e4ce1
Merge branch 'main' into aksel-v6
KenAJoh Jan 31, 2024
77b4610
:fire: Fjernet descendants-filer
KenAJoh Jan 31, 2024
c421d1f
Merge branch 'aksel-v6' into new-internal-togglegroup
KenAJoh Jan 31, 2024
de6e10d
:memo: Rename context og types til namespace
KenAJoh Jan 31, 2024
d4ae3ea
Merge branch 'main' into aksel-v6
KenAJoh Feb 6, 2024
857b14e
Merge branch 'main' into aksel-v6
KenAJoh Feb 6, 2024
caa34f1
Merge branch 'main' into aksel-v6
KenAJoh Feb 7, 2024
832c406
:fire: Fjernet openOnFocus-prop fra date
KenAJoh Feb 7, 2024
83df87a
[V6] Modal: strengere prop-typer (#2718)
HalvorHaugan Feb 8, 2024
a6bd0f8
Merge branch 'main' into aksel-v6
KenAJoh Feb 13, 2024
4999e28
:art: SortState i Table har nå none tilgjengelig (#2726)
KenAJoh Feb 14, 2024
939e6ad
[V6] Oppdatert bruk av action-farger (#2717)
KenAJoh Feb 14, 2024
3f6b930
[V6] Native ESM-støtte 🎉 (#2677)
KenAJoh Feb 14, 2024
f0a3598
Merge branch 'main' into aksel-v6
KenAJoh Feb 14, 2024
01811de
Merge branch 'aksel-v6' into new-internal-togglegroup
KenAJoh Feb 14, 2024
734e33f
:tada: ToggleGroup-prop fill
KenAJoh Feb 14, 2024
63e4467
:bug: Async-lasting av date-fns er nå v3 esm compliant
KenAJoh Feb 14, 2024
143c2fd
Merge branch 'main' into aksel-v6
KenAJoh Feb 14, 2024
465cad7
Merge branch 'aksel-v6' into new-internal-togglegroup
KenAJoh Feb 14, 2024
f4ee28c
:test_tube: Forbedret ToggleGroup-tester
KenAJoh Feb 14, 2024
d1fb7c6
Merge branch 'main' into new-internal-togglegroup
KenAJoh Feb 19, 2024
0adfdbb
:arrow_up: yarn sync
KenAJoh Feb 19, 2024
ef27d8e
Merge branch 'main' into new-internal-togglegroup
KenAJoh Mar 4, 2024
97dedfd
:bug: Fikset import av parts
KenAJoh Mar 4, 2024
be1f203
:fire: Fjernet duplikate changesets
KenAJoh Mar 5, 2024
28fa42f
:arrow_down: Reversert duplikate endringer som kom fra v6
KenAJoh Mar 5, 2024
4055633
Merge branch 'main' into new-internal-togglegroup
KenAJoh Mar 18, 2024
7b7ed56
:memo: rowing -> roving
KenAJoh Apr 9, 2024
1e31b69
:memo: Bedre test-navn
KenAJoh Apr 9, 2024
964b471
:memo: Bedre navngivning for tester
KenAJoh Apr 10, 2024
877e0cd
:zap: Fjernet useEffect for state update
KenAJoh Apr 10, 2024
6155349
:memo: Oppdatert changeset og jsdoc
KenAJoh Apr 10, 2024
4043a0e
:recycle: Inlinet aria-desribedby
KenAJoh Apr 10, 2024
b6e4ac5
Merge branch 'main' into new-internal-togglegroup
KenAJoh Apr 10, 2024
c4eea53
:memo: Demo for fill-prop på aksel.nav.no
KenAJoh Apr 10, 2024
cffdc88
:bug: Togglegroup krever onChange-prop
KenAJoh Apr 10, 2024
2e7e2fd
:memo: ToggleGroup story for chromatic
KenAJoh Apr 10, 2024
1268dea
Merge branch 'main' into new-internal-togglegroup
KenAJoh Apr 10, 2024
7a05007
:arrow_up: yarn lock
KenAJoh Apr 10, 2024
bf7a263
Merge branch 'main' into new-internal-togglegroup
KenAJoh Apr 11, 2024
af0940c
:tada: Bedre visning av eksempel på aksel.nav.no
KenAJoh Apr 11, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/grumpy-pugs-buy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@navikt/ds-react": patch
---

ToggleGroup: La til ny prop `fill` som strekker ToggleGroup til å ta opp all tilgjengelig bredde.
5 changes: 5 additions & 0 deletions .changeset/polite-rockets-raise.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@navikt/ds-react": minor
---

ToggleGroup: Erstattet bruk av dependency `@radix-ui/react-toggle-group` med egen implementasjon.
4 changes: 4 additions & 0 deletions @navikt/core/css/toggle-group.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
gap: var(--a-spacing-2);
}

.navds-toggle-group__wrapper--fill {
justify-items: initial;
}

.navds-toggle-group {
border-radius: var(--a-border-radius-medium);
background-color: var(--ac-toggle-group-bg, var(--a-surface-transparent));
Expand Down
1 change: 0 additions & 1 deletion @navikt/core/react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -564,7 +564,6 @@
"@floating-ui/react": "0.25.4",
"@navikt/aksel-icons": "^6.4.1",
"@navikt/ds-tokens": "^6.4.1",
"@radix-ui/react-toggle-group": "1.0.0",
"clsx": "^2.1.0",
"date-fns": "^3.0.0",
"react-day-picker": "8.10.0"
Expand Down
31 changes: 31 additions & 0 deletions @navikt/core/react/src/toggle-group/ToggleGroup.context.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { createContext as ReactCreateContext } from "react";
import { createContext } from "../util/create-context";
import { createDescendantContext } from "../util/hooks/descendants/useDescendant";
import { ToggleGroupProps } from "./ToggleGroup.types";
import { useToggleGroup } from "./useToggleGroup";

interface ToggleContextProps {
size: "medium" | "small";
}

export const ToggleGroupContext = ReactCreateContext<ToggleContextProps | null>(
null,
);

export const [
ToggleGroupDescendantsProvider,
useToggleGroupDescendantsContext,
useToggleGroupDescendants,
useToggleGroupDescendant,
] = createDescendantContext<HTMLButtonElement, { value: string }>();

type ToggleGroupProviderProps = ReturnType<typeof useToggleGroup> &
Pick<ToggleGroupProps, "size">;

/* State context */
export const [ToggleGroupProvider, useToggleGroupContext] =
createContext<ToggleGroupProviderProps>({
name: "ToggleGroupContext",
hookName: "useToggleGroupContext",
providerName: "ToggleGroupProvider",
});
73 changes: 67 additions & 6 deletions @navikt/core/react/src/toggle-group/ToggleGroup.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
EnvelopeOpenIcon,
InboxUpIcon,
} from "@navikt/aksel-icons";
import { VStack } from "../layout/stack";
import ToggleGroup from "./ToggleGroup";

const meta: Meta<typeof ToggleGroup> = {
Expand All @@ -22,7 +23,11 @@ const meta: Meta<typeof ToggleGroup> = {
control: { type: "radio" },
},
},
parameters: {
chromatic: { disable: true },
},
};

export default meta;

const Items = (icon?: boolean, both?: boolean) => (
Expand Down Expand Up @@ -71,6 +76,7 @@ export const Default = (props) => {
</ToggleGroup>
);
};

Default.args = {
icon: true,
text: true,
Expand All @@ -81,7 +87,7 @@ export const Compositions = () => {
const [activeValue, setActiveValue] = useState("ulest");

return (
<div className="colgap">
<VStack gap="6">
<ToggleGroup value={activeValue} onChange={setActiveValue}>
{Items()}
</ToggleGroup>
Expand All @@ -91,15 +97,18 @@ export const Compositions = () => {
<ToggleGroup value={activeValue} onChange={setActiveValue}>
{Items(true)}
</ToggleGroup>
</div>
<ToggleGroup fill value={activeValue} onChange={setActiveValue}>
{Items(true)}
</ToggleGroup>
</VStack>
);
};

export const Variants = () => {
const [activeValue, setActiveValue] = useState("ulest");

return (
<div className="colgap">
<VStack gap="6">
<ToggleGroup
variant="action"
value={activeValue}
Expand All @@ -114,15 +123,15 @@ export const Variants = () => {
>
{Items(true, true)}
</ToggleGroup>
</div>
</VStack>
);
};

export const Small = () => {
const [activeValue, setActiveValue] = useState("ulest");

return (
<div className="colgap">
<VStack gap="6">
<ToggleGroup size="small" value={activeValue} onChange={setActiveValue}>
{Items()}
</ToggleGroup>
Expand All @@ -132,6 +141,58 @@ export const Small = () => {
<ToggleGroup size="small" value={activeValue} onChange={setActiveValue}>
{Items(true)}
</ToggleGroup>
</div>
</VStack>
);
};

export const Chromatic = {
render: () => (
<VStack gap="6">
<div>
<h2>Text</h2>
<ToggleGroup value="ulest" onChange={console.log}>
{Items()}
</ToggleGroup>
</div>
<div>
<h2>Icon</h2>
<ToggleGroup value="ulest" onChange={console.log}>
{Items(true)}
</ToggleGroup>
</div>
<div>
<h2>Text + icon</h2>
<ToggleGroup value="ulest" onChange={console.log}>
{Items(true, true)}
</ToggleGroup>
</div>
<div style={{ minWidth: 600 }}>
<h2>Fill</h2>
<ToggleGroup value="ulest" onChange={console.log} fill>
{Items(true, true)}
</ToggleGroup>
</div>
<div>
<h2>Small</h2>
<ToggleGroup value="ulest" onChange={console.log} size="small">
{Items(true, true)}
</ToggleGroup>
</div>
<div>
<h2>Small + fill</h2>
<ToggleGroup value="ulest" onChange={console.log} size="small" fill>
{Items(true, true)}
</ToggleGroup>
</div>
<div>
<h2>Neutral</h2>
<ToggleGroup value="ulest" onChange={console.log} variant="neutral">
{Items(true, true)}
</ToggleGroup>
</div>
</VStack>
),
parameters: {
chromatic: { disable: false },
},
};
73 changes: 57 additions & 16 deletions @navikt/core/react/src/toggle-group/ToggleGroup.test.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { fireEvent, render, screen } from "@testing-library/react";
import { act, fireEvent, render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import React from "react";
import { describe, expect, test } from "vitest";
import { ToggleGroup } from "./ToggleGroup";
Expand All @@ -20,36 +21,76 @@ const TestToggleGroup = ({ value, onChange, defaultValue }: any) => (
describe("ToggleGroup", () => {
test("sets default value correctly", () => {
render(<TestToggleGroup defaultValue="toggle2" />);
const toggle = screen.getByTestId("toggle2");
const toggle2 = screen.getByTestId("toggle2");

expect(toggle).toHaveAttribute("aria-checked", "true");
expect(toggle2).toHaveAttribute("aria-checked", "true");
});

test("sets correct attributes on active toggle", () => {
render(<TestToggleGroup defaultValue="toggle2" />);
const toggle = screen.getByTestId("toggle2");
const toggle2 = screen.getByTestId("toggle2");

expect(toggle).toHaveAttribute("aria-checked", "true");
expect(toggle).toHaveAttribute("role", "radio");
expect(toggle).toHaveAttribute("type", "button");
expect(toggle).toHaveAttribute("tabindex", "-1");
expect(toggle2).toHaveAttribute("aria-checked", "true");
expect(toggle2).toHaveAttribute("role", "radio");
expect(toggle2).toHaveAttribute("type", "button");
expect(toggle2).toHaveAttribute("tabindex", "0");
});

test("sets correct attributes on idle toggle", () => {
render(<TestToggleGroup defaultValue="toggle1" />);
const toggle = screen.getByTestId("toggle2");
const toggle2 = screen.getByTestId("toggle2");

expect(toggle).toHaveAttribute("aria-checked", "false");
expect(toggle).toHaveAttribute("role", "radio");
expect(toggle).toHaveAttribute("type", "button");
expect(toggle).toHaveAttribute("tabindex", "-1");
expect(toggle2).toHaveAttribute("aria-checked", "false");
expect(toggle2).toHaveAttribute("role", "radio");
expect(toggle2).toHaveAttribute("type", "button");
expect(toggle2).toHaveAttribute("tabindex", "-1");
});

test("sets tabindex to 0 when focused", () => {
render(<TestToggleGroup defaultValue="toggle2" />);
const toggle = screen.getByTestId("toggle2");
const toggle2 = screen.getByTestId("toggle2");

fireEvent.focus(toggle);
expect(toggle).toHaveAttribute("tabindex", "0");
fireEvent.focus(toggle2);
expect(toggle2).toHaveAttribute("tabindex", "0");
});

test("roving tabindex keydown moves focus", () => {
render(<TestToggleGroup defaultValue="toggle1" />);
const toggle1 = screen.getByTestId("toggle1");

expect(toggle1).toHaveAttribute("tabindex", "0");
fireEvent.keyDown(toggle1, { key: "ArrowRight" });

expect(toggle1).toHaveAttribute("tabindex", "-1");
expect(screen.getByTestId("toggle2")).toHaveAttribute("tabindex", "0");
expect(screen.getByTestId("toggle2")).toHaveAttribute(
"aria-checked",
"false",
);
});

test("Space selects focused toggle-item", async () => {
render(<TestToggleGroup defaultValue="toggle1" />);
const toggle1 = screen.getByTestId("toggle1");

expect(toggle1).toHaveAttribute("tabindex", "0");
fireEvent.keyDown(toggle1, { key: "ArrowRight" });

expect(toggle1).toHaveAttribute("tabindex", "-1");
expect(screen.getByTestId("toggle2")).toHaveAttribute("tabindex", "0");
expect(screen.getByTestId("toggle2")).toHaveAttribute(
"aria-checked",
"false",
);

// eslint-disable-next-line testing-library/no-unnecessary-act
await act(async () => {
await userEvent.keyboard(" ");
});

expect(screen.getByTestId("toggle2")).toHaveAttribute(
"aria-checked",
"true",
);
});
});
Loading
Loading