import type { Meta, StoryObj } from "@storybook/react-vite"; import React from "react"; /** * Display & Visibility Utilities * * CSS utility classes for showing/hiding elements at different breakpoints. * All classes use `!important` to override component specificity. * * Use the viewport toolbar to verify responsive variants. */ const meta: Meta = { title: "FP.React Components/Utilities/Display", tags: ["stable"], parameters: { docs: { description: { component: "Responsive display and visibility utilities. Switch viewports in the toolbar to verify breakpoint behavior.", }, }, }, }; export default meta; type Story = StoryObj; const boxStyle: React.CSSProperties = { padding: "0.75rem 1rem", background: "#e0f2fe", border: "1px solid #0ea5e9", borderRadius: "0.25rem", fontFamily: "monospace", fontSize: "0.875rem", }; const hiddenBoxStyle: React.CSSProperties = { ...boxStyle, background: "#fef9c3", border: "1px solid #ca8a04", }; /** `.hide` removes from layout + accessibility tree. `.show` restores it. */ export const HideShow: Story = { render: () => (
Visible (no class)
Hidden — .hide (display: none)
Always shown — .show (display: revert)
), }; /** `.invisible` hides visually but preserves layout space (ghost element). */ export const Invisible: Story = { render: () => (
Before
.invisible — layout preserved, visually hidden
After (notice the gap)
), }; /** * `.sr-only` — visually hidden but present in the accessibility tree. * `.sr-only-focusable` — sr-only that becomes visible on focus (skip links). */ export const ScreenReaderOnly: Story = { render: () => (

The text below is visually hidden but read by screen readers:

This text is only announced by screen readers Tab to focus me — .sr-only-focusable (skip link pattern)
), }; /** `.print:hide` — hidden when printing. Open print preview to verify. */ export const PrintHide: Story = { render: () => (
Always visible (printed)
), }; /** * Responsive hide/show. * Switch the viewport toolbar to verify each breakpoint: * - sm (480px): `.sm:hide` disappears * - md (768px): `.md:show` appears * - lg (992px): `.lg:hide` disappears */ export const ResponsiveVariants: Story = { render: () => (
Always visible
.sm:hide — hidden at 480px+
.hide .md:show — hidden by default, shown at 768px+
.lg:hide — hidden at 992px+
.hide .xl:show — hidden by default, shown at 1280px+
), }; /** `.md:invisible` at md+ — layout space preserved, element invisible. */ export const ResponsiveInvisible: Story = { render: () => (
Before
.md:invisible — invisible at 768px+ (layout preserved)
After
), };