diff --git a/packages/components-css/index.scss b/packages/components-css/index.scss index ab552efa..699557a9 100644 --- a/packages/components-css/index.scss +++ b/packages/components-css/index.scss @@ -35,4 +35,5 @@ @import "table/index"; @import "textarea/index"; @import "textbox/index"; +@import "toggletip/index"; @import "unordered-list/index"; diff --git a/packages/components-css/toggletip/_mixin.scss b/packages/components-css/toggletip/_mixin.scss new file mode 100644 index 00000000..2aa1cf15 --- /dev/null +++ b/packages/components-css/toggletip/_mixin.scss @@ -0,0 +1,59 @@ +/** + * @license EUPL-1.2 + * Copyright (c) 2021 Community for NL Design System + */ + +@mixin rhc-toggletip { + background-color: transparent; + border-radius: var(--rhc-toggletip-border-radius); + display: inline-flex; + flex-direction: column; + size: var(--rhc-toggletip-size); +} + +@mixin rhc-toggletip__summary { + cursor: pointer; + display: inline-flex; + margin-block-end: var(--rhc-toggletip-gap, 16px); + max-inline-size: var(--rhc-toggletip-size); + size: var(--rhc-toggletip-size); +} + +@mixin rhc-toggletip__button { + background-color: var(--rhc-toggletip-background-color); + border-color: var(--rhc-toggletip-border-color); + border-radius: var(--rhc-toggletip-border-radius); + border-width: var(--rhc-toggletip-border-width); + color: var(--rhc-toggletip-color); + cursor: pointer; + display: inline-flex; + max-inline-size: var(--rhc-toggletip-size); + padding-block: 0; + padding-inline: 0; + size: var(--rhc-toggletip-size); +} + +@mixin rhc-toggletip__button--no-pointer-events { + pointer-events: none; +} + +@mixin rhc-toggletip__icon { + size: var(--rhc-toggletip-icon-size); +} + +@mixin rhc-toggletip--active { + background-color: var(--rhc-toggletip-active-background-color); + border-color: var(--rhc-toggletip-active-border-color); + border-style: solid; + color: var(--rhc-toggletip-active-color); +} + +@mixin rhc-toggletip--hover { + background-color: var(--rhc-toggletip-hover-background-color); + color: var(--rhc-toggletip-hover-color); +} + +@mixin rhc-toggletip--focus { + background-color: var(--rhc-toggletip-focus-background-color); + color: var(--rhc-toggletip-focus-color); +} diff --git a/packages/components-css/toggletip/index.scss b/packages/components-css/toggletip/index.scss new file mode 100644 index 00000000..5e991c94 --- /dev/null +++ b/packages/components-css/toggletip/index.scss @@ -0,0 +1,48 @@ +/** + * @license EUPL-1.2 + * Copyright (c) 2021 Community for NL Design System + */ + +@import "./mixin"; + +.rhc-toggletip { + @include rhc-toggletip; +} + +.rhc-toggletip__summary { + @include rhc-toggletip__summary; +} + +.rhc-toggletip__button { + @include rhc-toggletip__button; +} + +.rhc-toggletip__summary .rhc-toggletip__button { + // If button is not used standalone the summary should take precedence + @include rhc-toggletip__button--no-pointer-events; +} + +.rhc-toggletip__button:focus { + @include rhc-toggletip--focus; +} + +.rhc-toggletip__button:hover { + @include rhc-toggletip--hover; +} + +.rhc-toggletip__summary:focus .rhc-toggletip__button { + @include rhc-toggletip--focus; +} + +.rhc-toggletip__summary:hover .rhc-toggletip__button { + @include rhc-toggletip--hover; +} + +.rhc-toggletip:active .rhc-toggletip__button, +.rhc-toggletip[open] .rhc-toggletip__button { + @include rhc-toggletip--active; +} + +.rhc-toggletip__icon { + @include rhc-toggletip__icon; +} diff --git a/packages/components-react/src/Toggletip.tsx b/packages/components-react/src/Toggletip.tsx new file mode 100644 index 00000000..584c6c48 --- /dev/null +++ b/packages/components-react/src/Toggletip.tsx @@ -0,0 +1,46 @@ +import clsx from 'clsx'; +import { DetailsHTMLAttributes, ForwardedRef, forwardRef, PropsWithChildren, ReactNode } from 'react'; +import { Alert } from './Alert'; +import { Icon } from './icon/Icon'; + +export interface ToggletipProps extends DetailsHTMLAttributes { + className?: string; +} + +export const ToggletipButton = forwardRef( + ({ children }: { children?: ReactNode }, ref: ForwardedRef) => { + return ( + + ); + }, +); +ToggletipButton.displayName = 'ToggletipButton'; + +export const ToggletipContent = forwardRef( + ({ children }: { children: ReactNode }, ref: ForwardedRef) => { + return ( +
+ {children} +
+ ); + }, +); +ToggletipContent.displayName = 'ToggletipContent'; + +export const Toggletip = forwardRef( + ({ children, className, ...restProps }: PropsWithChildren, ref: ForwardedRef) => { + return ( +
+ + + + {children} +
+ ); + }, +); + +Toggletip.displayName = 'Toggletip'; diff --git a/packages/components-react/src/icon/Icon.tsx b/packages/components-react/src/icon/Icon.tsx index b8843f96..a3330bcd 100644 --- a/packages/components-react/src/icon/Icon.tsx +++ b/packages/components-react/src/icon/Icon.tsx @@ -38,6 +38,7 @@ import { IconHeart, IconHome, IconInfoCircle, + IconInfoSmall, IconInfoSquare, IconLink, IconLock, @@ -80,7 +81,6 @@ export const IconenSet: Partial> = { activiteit: , 'agile-werken': , 'alert-circle': , - 'api-inrichting': , 'arrows-sort': , audio: , @@ -107,8 +107,9 @@ export const IconenSet: Partial> = { 'haakse-pijl': , hashtag: , home: , - info: , + info: , 'info-circle': , + 'info-square': , inloggen: , instellingen: , 'interne-link': , diff --git a/packages/components-react/src/icon/IconTypes.ts b/packages/components-react/src/icon/IconTypes.ts index 3faef3d8..52108021 100644 --- a/packages/components-react/src/icon/IconTypes.ts +++ b/packages/components-react/src/icon/IconTypes.ts @@ -230,6 +230,7 @@ export type RijkshuisstijlIconID = | 'home' | 'info' | 'info-circle' + | 'info-square' | 'inloggen' | 'instellingen' | 'interne-link' diff --git a/packages/components-react/src/index.ts b/packages/components-react/src/index.ts index 10896665..c0789254 100644 --- a/packages/components-react/src/index.ts +++ b/packages/components-react/src/index.ts @@ -95,6 +95,7 @@ export { TableCaption } from './TableCaption'; export { TableCell, type TableCellProps } from './TableCell'; export { TableHeaderCell, type TableHeaderCellProps } from './TableHeaderCell'; export { Textbox, type TextboxProps } from './Textbox'; +export { Toggletip, ToggletipButton, ToggletipContent, type ToggletipProps } from './Toggletip'; export { UnorderedList, UnorderedListItem, diff --git a/packages/storybook/src/community/alert.md b/packages/storybook/src/community/alert.md index eb788e86..9053e2fc 100644 --- a/packages/storybook/src/community/alert.md +++ b/packages/storybook/src/community/alert.md @@ -18,7 +18,7 @@ import { Alert } from '@rijkshuisstijl-community/components-react'; ; diff --git a/packages/storybook/src/community/toggletip.stories.tsx b/packages/storybook/src/community/toggletip.stories.tsx new file mode 100644 index 00000000..1a449d9d --- /dev/null +++ b/packages/storybook/src/community/toggletip.stories.tsx @@ -0,0 +1,17 @@ +import { Toggletip } from '@rijkshuisstijl-community/components-react'; +import { Meta, StoryObj } from '@storybook/react'; + +const meta = { + title: 'Rijkshuisstijl/Toggletip', + id: 'rhc-toggletip', + component: Toggletip, + args: { + children: 'Lorem ipsum dolor sit amet, consecteur ad * isicing elit, sed do eiusmod *', + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/proprietary/design-tokens/figma/figma.tokens.json b/proprietary/design-tokens/figma/figma.tokens.json index 0abdd3d9..4d718c4e 100644 --- a/proprietary/design-tokens/figma/figma.tokens.json +++ b/proprietary/design-tokens/figma/figma.tokens.json @@ -5977,7 +5977,7 @@ } }, "components/toggletip": { - "todo": { + "rhc": { "toggletip": { "color": { "value": "{rhc.color.wit}", @@ -5995,6 +5995,10 @@ "value": "{rhc.border-radius.md}", "type": "borderRadius" }, + "border-width": { + "value": "{rhc.border-width.default}", + "type": "borderWidth" + }, "icon": { "size": { "value": "{rhc.size.icon.functional}", @@ -6038,10 +6042,6 @@ "value": "{rhc.color.feedback.info.default}", "type": "color" } - }, - "border-width": { - "value": "{rhc.border-width.default}", - "type": "borderWidth" } } }