File size: 1,567 Bytes
e59d91d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { Popover } from '@headlessui/react'
import { InformationCircleIcon } from '@heroicons/react/24/outline'

const DEFAULT_BTN =
  'rounded p-0.5 text-slate-400 hover:bg-slate-100 hover:text-slate-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-400'

export type InfoHelpTriggerProps = {
  help: string
  /** Short topic for the control (used in ``aria-label`` only). */
  topic: string
  /** Panel alignment under the trigger. */
  align?: 'left' | 'right'
  buttonClassName?: string
}

/**
 * Census map / charts: replaces ``title=`` on info icons — native tooltips are hover-only
 * and unreliable on touch; this opens a readable panel on click (and supports keyboard).
 */
export function InfoHelpTrigger({
  help,
  topic,
  align = 'left',
  buttonClassName = DEFAULT_BTN,
}: InfoHelpTriggerProps) {
  const panelAlign = align === 'right' ? 'right-0' : 'left-0'
  return (
    <Popover className="relative inline-flex align-middle">
      <Popover.Button
        type="button"
        className={buttonClassName}
        aria-label={`${topic}: more information`}
      >
        <InformationCircleIcon className="h-3.5 w-3.5" aria-hidden />
      </Popover.Button>
      <Popover.Panel
        className={`absolute ${panelAlign} z-[300] mt-1 w-[min(calc(100vw-2rem),24rem)] max-h-72 overflow-y-auto rounded-lg border border-slate-200 bg-white p-3 text-left text-xs leading-relaxed text-slate-700 shadow-xl ring-1 ring-black/5`}
      >
        <p className="whitespace-pre-wrap">{help}</p>
      </Popover.Panel>
    </Popover>
  )
}