import { signal } from "@angular/core"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { getByRole, userEvent } from "@storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ButtonComponent } from "../button"; import { BitIconButtonComponent } from "../icon-button"; import { I18nMockService } from "../utils"; import { TooltipPosition, TooltipPositionIdentifier, tooltipPositions } from "./tooltip-positions"; import { TOOLTIP_DATA, TooltipComponent } from "./tooltip.component"; import { TooltipDirective } from "./tooltip.directive"; import { formatArgsForCodeSnippet } from ".storybook/format-args-for-code-snippet"; export default { title: "Component Library/Tooltip", component: TooltipDirective, decorators: [ moduleMetadata({ imports: [TooltipDirective, TooltipComponent, BitIconButtonComponent, ButtonComponent], providers: [ { provide: I18nService, useFactory: () => { return new I18nMockService({ loading: "Loading", }); }, }, { provide: TOOLTIP_DATA, useFactory: () => { // simple fixed demo values for the Default story return { content: signal("This is a tooltip"), isVisible: signal(true), tooltipPosition: signal("above-center"), }; }, }, ], }), ], parameters: { design: { type: "figma", url: "https://www.figma.com/design/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library?m=auto&node-id=30558-13730&t=4k23PtzCwqDekAZW-1", }, chromatic: { // Allows 30% difference for the tooltip stories since they are rendered in a portal and may be affected by the environment. diffThreshold: 0.3, }, }, argTypes: { bitTooltip: { control: "text", description: "Text content of the tooltip", }, tooltipPosition: { control: "select", options: tooltipPositions.map((position: TooltipPosition) => position.id), description: "Position of the tooltip relative to the element", table: { type: { summary: tooltipPositions.map((position: TooltipPosition) => position.id).join(" | "), }, defaultValue: { summary: "above-center" }, }, }, }, } as Meta; type Story = StoryObj; export const Default: Story = { args: { tooltipPosition: "above-center", }, parameters: { chromatic: { disableSnapshot: true }, }, render: (args) => ({ props: args, template: `
`, }), play: async (context) => { const canvasEl = context.canvasElement; const button = getByRole(canvasEl, "button"); await userEvent.hover(button); }, }; export const AllPositions: Story = { parameters: { chromatic: { disableSnapshot: true }, }, render: () => ({ template: `
`, }), }; export const LongContent: Story = { parameters: { chromatic: { disableSnapshot: true }, }, render: () => ({ template: `
`, }), }; export const OnDisabledButton: Story = { parameters: { chromatic: { disableSnapshot: true }, }, render: () => ({ template: `
`, }), }; export const OnNonIconButton: Story = { parameters: { chromatic: { disableSnapshot: true }, }, render: () => ({ template: `
`, }), };