eidos-ui 3.8.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/alert/index.cjs +5 -5
- package/dist/alert/index.js +4 -4
- package/dist/button/index.cjs +4 -4
- package/dist/button/index.js +3 -3
- package/dist/chip/index.cjs +4 -4
- package/dist/chip/index.js +3 -3
- package/dist/{chunk-V5CM5TH3.js → chunk-2OBOD3GO.js} +3 -3
- package/dist/{chunk-CFVUUMQA.cjs → chunk-2URFSWJT.cjs} +6 -8
- package/dist/chunk-2URFSWJT.cjs.map +1 -0
- package/dist/{chunk-4S57PE43.js → chunk-2WDL2ZVP.js} +6 -7
- package/dist/chunk-2WDL2ZVP.js.map +1 -0
- package/dist/{chunk-V64DICJK.js → chunk-363IKX3C.js} +3 -3
- package/dist/{chunk-LWCFT5SP.cjs → chunk-3QBMSZSE.cjs} +3 -3
- package/dist/{chunk-LWCFT5SP.cjs.map → chunk-3QBMSZSE.cjs.map} +1 -1
- package/dist/{chunk-6LTZV6HN.js → chunk-43DJ3GGR.js} +19 -19
- package/dist/chunk-43DJ3GGR.js.map +1 -0
- package/dist/{chunk-L6ERHCQ2.js → chunk-57BVERWD.js} +3 -3
- package/dist/{chunk-AUNDBUHM.cjs → chunk-5HRVHEHE.cjs} +3 -3
- package/dist/{chunk-AUNDBUHM.cjs.map → chunk-5HRVHEHE.cjs.map} +1 -1
- package/dist/{chunk-6IB27I5K.cjs → chunk-6JYXGRJ3.cjs} +8 -8
- package/dist/{chunk-6IB27I5K.cjs.map → chunk-6JYXGRJ3.cjs.map} +1 -1
- package/dist/{chunk-NERASTO2.cjs → chunk-6ZFXIYH7.cjs} +3 -3
- package/dist/{chunk-NERASTO2.cjs.map → chunk-6ZFXIYH7.cjs.map} +1 -1
- package/dist/{chunk-IKXXXVUO.js → chunk-7TQUJ6BJ.js} +3 -3
- package/dist/{chunk-544RAXWO.cjs → chunk-7VMF6LIC.cjs} +19 -19
- package/dist/{chunk-544RAXWO.cjs.map → chunk-7VMF6LIC.cjs.map} +1 -1
- package/dist/{chunk-WTFEMOV5.cjs → chunk-ADB7QRX5.cjs} +16 -16
- package/dist/{chunk-WTFEMOV5.cjs.map → chunk-ADB7QRX5.cjs.map} +1 -1
- package/dist/{chunk-6CW5QSYV.cjs → chunk-AFGC62AL.cjs} +7 -7
- package/dist/{chunk-6CW5QSYV.cjs.map → chunk-AFGC62AL.cjs.map} +1 -1
- package/dist/{chunk-U4SVBE2M.js → chunk-AWPJH3UB.js} +4 -4
- package/dist/{chunk-B2OHBIAL.cjs → chunk-BKUZF7CW.cjs} +10 -11
- package/dist/chunk-BKUZF7CW.cjs.map +1 -0
- package/dist/{chunk-WR77IZUU.cjs → chunk-BPVOQLCA.cjs} +7 -7
- package/dist/{chunk-WR77IZUU.cjs.map → chunk-BPVOQLCA.cjs.map} +1 -1
- package/dist/{chunk-MCPGI6EI.js → chunk-BUSMGQJ4.js} +2 -2
- package/dist/{chunk-H3C6YECZ.js → chunk-D2PXPX56.js} +6 -6
- package/dist/{chunk-L6YJ6QTZ.js → chunk-DCUIT7SI.js} +2 -2
- package/dist/{chunk-HYRLK462.js → chunk-EDPCI2JC.js} +2 -2
- package/dist/{chunk-DPTTDHZ5.js → chunk-FAGQGGT3.js} +3 -3
- package/dist/{chunk-CNTG7OOO.js → chunk-FAXDWZQH.js} +12 -12
- package/dist/{chunk-7NUVLVSL.cjs → chunk-FJSK2RT7.cjs} +5 -5
- package/dist/{chunk-7NUVLVSL.cjs.map → chunk-FJSK2RT7.cjs.map} +1 -1
- package/dist/{chunk-P6OJQ2RN.js → chunk-FSX7DDLO.js} +8 -9
- package/dist/chunk-FSX7DDLO.js.map +1 -0
- package/dist/{chunk-XIUZT4TO.js → chunk-GE3QCXT7.js} +6 -7
- package/dist/chunk-GE3QCXT7.js.map +1 -0
- package/dist/{chunk-JY77VJAZ.js → chunk-GHUEVNNU.js} +3 -3
- package/dist/{chunk-4V2XYUQL.js → chunk-GLEPKX2R.js} +2 -2
- package/dist/{chunk-QUSO4GFA.cjs → chunk-GRKC4PIX.cjs} +24 -24
- package/dist/chunk-GRKC4PIX.cjs.map +1 -0
- package/dist/{chunk-SLHIVEFW.cjs → chunk-HKLLKNRQ.cjs} +6 -9
- package/dist/chunk-HKLLKNRQ.cjs.map +1 -0
- package/dist/{chunk-2TIMJD4K.js → chunk-IBT535UH.js} +3 -3
- package/dist/{chunk-HR5MWA3B.cjs → chunk-IJW6YCJB.cjs} +5 -5
- package/dist/{chunk-HR5MWA3B.cjs.map → chunk-IJW6YCJB.cjs.map} +1 -1
- package/dist/{chunk-NNAEQR3Y.cjs → chunk-K6VEUJLY.cjs} +30 -30
- package/dist/{chunk-NNAEQR3Y.cjs.map → chunk-K6VEUJLY.cjs.map} +1 -1
- package/dist/{chunk-F5IRMMZ2.cjs → chunk-K73JO4FK.cjs} +7 -7
- package/dist/{chunk-F5IRMMZ2.cjs.map → chunk-K73JO4FK.cjs.map} +1 -1
- package/dist/{chunk-4HZIXRAJ.cjs → chunk-KF2OGUAD.cjs} +11 -12
- package/dist/chunk-KF2OGUAD.cjs.map +1 -0
- package/dist/{chunk-TJQNGJHP.js → chunk-KLHC5BHS.js} +4 -4
- package/dist/{chunk-XWMXEJVZ.js → chunk-KZKBZ2AV.js} +5 -7
- package/dist/chunk-KZKBZ2AV.js.map +1 -0
- package/dist/{chunk-DG3O5NV4.cjs → chunk-LLHR6QW3.cjs} +3 -3
- package/dist/{chunk-DG3O5NV4.cjs.map → chunk-LLHR6QW3.cjs.map} +1 -1
- package/dist/{chunk-GDRLVX2A.js → chunk-LXRNFQEI.js} +4 -4
- package/dist/{chunk-VXC7Z7XB.cjs → chunk-MKQVDEHI.cjs} +5 -6
- package/dist/chunk-MKQVDEHI.cjs.map +1 -0
- package/dist/{chunk-TNQ2ZZ7W.cjs → chunk-MUMTPMWD.cjs} +7 -7
- package/dist/{chunk-TNQ2ZZ7W.cjs.map → chunk-MUMTPMWD.cjs.map} +1 -1
- package/dist/{chunk-RHWZX7PB.js → chunk-NONYIHXD.js} +4 -4
- package/dist/{chunk-XPG56DLQ.cjs → chunk-NSA7ASZ7.cjs} +8 -8
- package/dist/{chunk-XPG56DLQ.cjs.map → chunk-NSA7ASZ7.cjs.map} +1 -1
- package/dist/{chunk-6NAOAKII.js → chunk-NWFGXLQP.js} +2 -2
- package/dist/{chunk-HLI4SOH3.cjs → chunk-NYGRVB2J.cjs} +45 -45
- package/dist/{chunk-HLI4SOH3.cjs.map → chunk-NYGRVB2J.cjs.map} +1 -1
- package/dist/{chunk-UUT2VEN5.cjs → chunk-OC2OBBGM.cjs} +7 -8
- package/dist/chunk-OC2OBBGM.cjs.map +1 -0
- package/dist/{chunk-3X6QVHTD.js → chunk-OERK3T7E.js} +3 -4
- package/dist/chunk-OERK3T7E.js.map +1 -0
- package/dist/{chunk-ZJWQPZ7E.js → chunk-OQWG7NLI.js} +3 -11
- package/dist/chunk-OQWG7NLI.js.map +1 -0
- package/dist/{chunk-U34INRFO.js → chunk-PP6HS4GR.js} +5 -16
- package/dist/chunk-PP6HS4GR.js.map +1 -0
- package/dist/{chunk-OGGZIFTI.cjs → chunk-PVNBH7XN.cjs} +36 -36
- package/dist/{chunk-OGGZIFTI.cjs.map → chunk-PVNBH7XN.cjs.map} +1 -1
- package/dist/{chunk-H46ZLPNJ.cjs → chunk-QDZVZY53.cjs} +7 -7
- package/dist/{chunk-H46ZLPNJ.cjs.map → chunk-QDZVZY53.cjs.map} +1 -1
- package/dist/{chunk-ENMDOQQO.cjs → chunk-R5WI5IGR.cjs} +6 -17
- package/dist/{chunk-ENMDOQQO.cjs.map → chunk-R5WI5IGR.cjs.map} +1 -1
- package/dist/{chunk-UTYY35QX.cjs → chunk-RZMQCVAS.cjs} +3 -3
- package/dist/{chunk-UTYY35QX.cjs.map → chunk-RZMQCVAS.cjs.map} +1 -1
- package/dist/{chunk-7FV2X62W.cjs → chunk-SJKD3WCV.cjs} +7 -7
- package/dist/{chunk-7FV2X62W.cjs.map → chunk-SJKD3WCV.cjs.map} +1 -1
- package/dist/{chunk-LUDK44NZ.cjs → chunk-SJPCBRKR.cjs} +3 -3
- package/dist/{chunk-LUDK44NZ.cjs.map → chunk-SJPCBRKR.cjs.map} +1 -1
- package/dist/{chunk-3TF2GZSG.js → chunk-SONL2RCW.js} +7 -7
- package/dist/{chunk-2IXCEKLI.js → chunk-SOS4K7VC.js} +2 -2
- package/dist/{chunk-WHQGJHMD.js → chunk-TOLNPD7S.js} +4 -4
- package/dist/{chunk-FE7S4RSK.js → chunk-U5KD4BWL.js} +7 -7
- package/dist/{chunk-FHOD3FUN.js → chunk-UTOTOWPS.js} +4 -4
- package/dist/{chunk-YIOHKQ6Y.cjs → chunk-VCG647BY.cjs} +5 -13
- package/dist/chunk-VCG647BY.cjs.map +1 -0
- package/dist/{chunk-N5NXKVFJ.cjs → chunk-VPN7AR7T.cjs} +10 -10
- package/dist/{chunk-N5NXKVFJ.cjs.map → chunk-VPN7AR7T.cjs.map} +1 -1
- package/dist/{chunk-6FXFKMJ5.js → chunk-XBIMNWE6.js} +3 -3
- package/dist/{chunk-Z3IJWYUD.js → chunk-XOUNVK45.js} +2 -2
- package/dist/{chunk-3VXUOAIJ.cjs → chunk-XR72A66Q.cjs} +3 -7
- package/dist/chunk-XR72A66Q.cjs.map +1 -0
- package/dist/{chunk-ULKWUKD2.cjs → chunk-YHSCUPP6.cjs} +22 -23
- package/dist/chunk-YHSCUPP6.cjs.map +1 -0
- package/dist/{chunk-S5CMZFX6.js → chunk-YPEJH57Z.js} +6 -7
- package/dist/chunk-YPEJH57Z.js.map +1 -0
- package/dist/{chunk-BO3KK3ZQ.js → chunk-YPPG7NLW.js} +2 -6
- package/dist/chunk-YPPG7NLW.js.map +1 -0
- package/dist/{chunk-PE2SLXUS.cjs → chunk-YWXS4IPH.cjs} +5 -5
- package/dist/{chunk-PE2SLXUS.cjs.map → chunk-YWXS4IPH.cjs.map} +1 -1
- package/dist/{chunk-UC4NYF6T.js → chunk-YYA5SWXD.js} +2 -2
- package/dist/{chunk-JFV56ISS.cjs → chunk-YZEALKC4.cjs} +6 -6
- package/dist/{chunk-JFV56ISS.cjs.map → chunk-YZEALKC4.cjs.map} +1 -1
- package/dist/{chunk-IHPSRTVW.js → chunk-Z3OEYDNI.js} +4 -7
- package/dist/chunk-Z3OEYDNI.js.map +1 -0
- package/dist/{chunk-MKC6V3SY.cjs → chunk-Z6FZ7GI5.cjs} +6 -6
- package/dist/{chunk-MKC6V3SY.cjs.map → chunk-Z6FZ7GI5.cjs.map} +1 -1
- package/dist/{chunk-NFD7MPX4.cjs → chunk-ZVA5KJAJ.cjs} +11 -11
- package/dist/{chunk-NFD7MPX4.cjs.map → chunk-ZVA5KJAJ.cjs.map} +1 -1
- package/dist/color-picker/index.cjs +4 -4
- package/dist/color-picker/index.js +3 -3
- package/dist/combobox/index.cjs +6 -6
- package/dist/combobox/index.js +5 -5
- package/dist/command-palette/index.cjs +3 -3
- package/dist/command-palette/index.js +2 -2
- package/dist/context-menu/index.cjs +6 -6
- package/dist/context-menu/index.js +5 -5
- package/dist/conversation/index.cjs +8 -8
- package/dist/conversation/index.js +7 -7
- package/dist/data-grid/index.cjs +15 -15
- package/dist/data-grid/index.js +14 -14
- package/dist/date-picker/index.cjs +8 -8
- package/dist/date-picker/index.js +7 -7
- package/dist/drawer/index.cjs +5 -5
- package/dist/drawer/index.js +4 -4
- package/dist/dropdown/index.cjs +3 -3
- package/dist/dropdown/index.js +2 -2
- package/dist/header/index.cjs +6 -6
- package/dist/header/index.js +5 -5
- package/dist/index.cjs +38 -38
- package/dist/index.js +37 -37
- package/dist/inline-edit/index.cjs +5 -5
- package/dist/inline-edit/index.js +4 -4
- package/dist/input/index.cjs +4 -4
- package/dist/input/index.js +3 -3
- package/dist/menu/index.cjs +5 -5
- package/dist/menu/index.js +4 -4
- package/dist/modal/index.cjs +5 -5
- package/dist/modal/index.js +4 -4
- package/dist/navigation/index.cjs +5 -5
- package/dist/navigation/index.js +4 -4
- package/dist/number-input/index.cjs +2 -4
- package/dist/number-input/index.cjs.map +1 -1
- package/dist/number-input/index.js +1 -3
- package/dist/page-layout/index.cjs +12 -12
- package/dist/page-layout/index.js +11 -11
- package/dist/pagination/index.cjs +8 -8
- package/dist/pagination/index.js +7 -7
- package/dist/popover/index.cjs +3 -3
- package/dist/popover/index.d.cts +1 -3
- package/dist/popover/index.d.ts +1 -3
- package/dist/popover/index.js +2 -2
- package/dist/segmented-control/index.cjs +4 -4
- package/dist/segmented-control/index.js +3 -3
- package/dist/select/index.cjs +6 -6
- package/dist/select/index.js +5 -5
- package/dist/snackbar/index.cjs +5 -5
- package/dist/snackbar/index.js +4 -4
- package/dist/split-button/index.cjs +6 -6
- package/dist/split-button/index.js +5 -5
- package/dist/split-chip/index.cjs +5 -5
- package/dist/split-chip/index.js +4 -4
- package/dist/table/index.cjs +13 -13
- package/dist/table/index.js +12 -12
- package/dist/tabs/index.cjs +3 -3
- package/dist/tabs/index.js +2 -2
- package/dist/tag-input/index.cjs +6 -6
- package/dist/tag-input/index.js +5 -5
- package/dist/textarea/index.cjs +4 -4
- package/dist/textarea/index.js +3 -3
- package/dist/theme-editor/index.cjs +11 -11
- package/dist/theme-editor/index.js +10 -10
- package/dist/theme-provider/index.cjs +3 -3
- package/dist/theme-provider/index.js +2 -2
- package/dist/toolbar/index.cjs +8 -8
- package/dist/toolbar/index.js +7 -7
- package/dist/tooltip/index.cjs +3 -3
- package/dist/tooltip/index.js +2 -2
- package/package.json +4 -2
- package/dist/chunk-3VXUOAIJ.cjs.map +0 -1
- package/dist/chunk-3X6QVHTD.js.map +0 -1
- package/dist/chunk-4HZIXRAJ.cjs.map +0 -1
- package/dist/chunk-4S57PE43.js.map +0 -1
- package/dist/chunk-6LTZV6HN.js.map +0 -1
- package/dist/chunk-B2OHBIAL.cjs.map +0 -1
- package/dist/chunk-BO3KK3ZQ.js.map +0 -1
- package/dist/chunk-CFVUUMQA.cjs.map +0 -1
- package/dist/chunk-IHPSRTVW.js.map +0 -1
- package/dist/chunk-P6OJQ2RN.js.map +0 -1
- package/dist/chunk-QUSO4GFA.cjs.map +0 -1
- package/dist/chunk-S5CMZFX6.js.map +0 -1
- package/dist/chunk-SLHIVEFW.cjs.map +0 -1
- package/dist/chunk-U34INRFO.js.map +0 -1
- package/dist/chunk-ULKWUKD2.cjs.map +0 -1
- package/dist/chunk-UUT2VEN5.cjs.map +0 -1
- package/dist/chunk-VXC7Z7XB.cjs.map +0 -1
- package/dist/chunk-XIUZT4TO.js.map +0 -1
- package/dist/chunk-XWMXEJVZ.js.map +0 -1
- package/dist/chunk-YIOHKQ6Y.cjs.map +0 -1
- package/dist/chunk-ZJWQPZ7E.js.map +0 -1
- /package/dist/{chunk-V5CM5TH3.js.map → chunk-2OBOD3GO.js.map} +0 -0
- /package/dist/{chunk-V64DICJK.js.map → chunk-363IKX3C.js.map} +0 -0
- /package/dist/{chunk-L6ERHCQ2.js.map → chunk-57BVERWD.js.map} +0 -0
- /package/dist/{chunk-IKXXXVUO.js.map → chunk-7TQUJ6BJ.js.map} +0 -0
- /package/dist/{chunk-U4SVBE2M.js.map → chunk-AWPJH3UB.js.map} +0 -0
- /package/dist/{chunk-MCPGI6EI.js.map → chunk-BUSMGQJ4.js.map} +0 -0
- /package/dist/{chunk-H3C6YECZ.js.map → chunk-D2PXPX56.js.map} +0 -0
- /package/dist/{chunk-L6YJ6QTZ.js.map → chunk-DCUIT7SI.js.map} +0 -0
- /package/dist/{chunk-HYRLK462.js.map → chunk-EDPCI2JC.js.map} +0 -0
- /package/dist/{chunk-DPTTDHZ5.js.map → chunk-FAGQGGT3.js.map} +0 -0
- /package/dist/{chunk-CNTG7OOO.js.map → chunk-FAXDWZQH.js.map} +0 -0
- /package/dist/{chunk-JY77VJAZ.js.map → chunk-GHUEVNNU.js.map} +0 -0
- /package/dist/{chunk-4V2XYUQL.js.map → chunk-GLEPKX2R.js.map} +0 -0
- /package/dist/{chunk-2TIMJD4K.js.map → chunk-IBT535UH.js.map} +0 -0
- /package/dist/{chunk-TJQNGJHP.js.map → chunk-KLHC5BHS.js.map} +0 -0
- /package/dist/{chunk-GDRLVX2A.js.map → chunk-LXRNFQEI.js.map} +0 -0
- /package/dist/{chunk-RHWZX7PB.js.map → chunk-NONYIHXD.js.map} +0 -0
- /package/dist/{chunk-6NAOAKII.js.map → chunk-NWFGXLQP.js.map} +0 -0
- /package/dist/{chunk-3TF2GZSG.js.map → chunk-SONL2RCW.js.map} +0 -0
- /package/dist/{chunk-2IXCEKLI.js.map → chunk-SOS4K7VC.js.map} +0 -0
- /package/dist/{chunk-WHQGJHMD.js.map → chunk-TOLNPD7S.js.map} +0 -0
- /package/dist/{chunk-FE7S4RSK.js.map → chunk-U5KD4BWL.js.map} +0 -0
- /package/dist/{chunk-FHOD3FUN.js.map → chunk-UTOTOWPS.js.map} +0 -0
- /package/dist/{chunk-6FXFKMJ5.js.map → chunk-XBIMNWE6.js.map} +0 -0
- /package/dist/{chunk-Z3IJWYUD.js.map → chunk-XOUNVK45.js.map} +0 -0
- /package/dist/{chunk-UC4NYF6T.js.map → chunk-YYA5SWXD.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-JFV56ISS.cjs","../src/components/SegmentedControl/SegmentedControl.component.tsx"],"names":["track"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-JFV56ISS.cjs","sourcesContent":[null,"import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Tooltip } from '../Tooltip';\nimport { renderIcon, devWarn } from '../../utils';\nimport type { SegmentedControlProps } from './SegmentedControl.types';\n\n/**\n * SegmentedControl - a compact, single-select toggle group rendered as a pill.\n *\n * Semantics: `role=\"radiogroup\"` on the container, `role=\"radio\"` on each\n * segment. Supports controlled and uncontrolled usage.\n *\n * @example\n * ```tsx\n * // Controlled\n * const [view, setView] = useState('list');\n * <SegmentedControl\n * options={[\n * { value: 'list', icon: List, tooltip: 'List view' },\n * { value: 'grid', icon: LayoutGrid, tooltip: 'Grid view' },\n * { value: 'table', icon: Table2, tooltip: 'Table view' },\n * ]}\n * value={view}\n * onChange={setView}\n * />\n *\n * // With labels\n * <SegmentedControl\n * options={[\n * { value: 'day', label: 'Day' },\n * { value: 'week', label: 'Week' },\n * { value: 'month', label: 'Month' },\n * ]}\n * defaultValue=\"week\"\n * onChange={console.log}\n * />\n * ```\n */\nexport const SegmentedControl: React.FC<SegmentedControlProps> = ({\n options,\n value,\n defaultValue,\n onChange,\n size = 'md',\n color = 'primary',\n disabled = false,\n fullWidth = false,\n scrollButtons = 'auto',\n className = '',\n}) => {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? options[0]?.value ?? '',\n );\n\n const activeValue = isControlled ? value : internalValue;\n\n const handleSelect = (optValue: string) => {\n if (disabled) return;\n if (optValue === activeValue) return; // already selected\n if (!isControlled) setInternalValue(optValue);\n onChange?.(optValue);\n };\n\n const trackRef = useRef<HTMLDivElement>(null);\n\n // Roving tabindex: the group is a single tab stop, and arrow keys move\n // within it - the WAI-ARIA radiogroup pattern, which this had none of.\n // Every segment used to be its own tab stop, so a six-option control cost\n // six presses to skip past.\n //\n // The tabbable segment is the selected one; if nothing is selected (a\n // controlled `value` matching no option), the first enabled segment takes\n // the stop so the group can still be reached at all.\n const selectableValues = options.filter((opt) => !opt.disabled).map((opt) => opt.value);\n const hasSelection = selectableValues.includes(activeValue);\n const fallbackTabbableValue = selectableValues[0];\n\n const isTabbable = (optValue: string) =>\n hasSelection ? optValue === activeValue : optValue === fallbackTabbableValue;\n\n // Selection follows focus, which is what the radio pattern specifies -\n // unlike `Tabs`, where arrow keys only move focus. Disabled segments are\n // skipped rather than selected-and-ignored, and both ends wrap.\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (disabled || selectableValues.length === 0) return;\n\n const currentIndex = selectableValues.indexOf(activeValue);\n const from = currentIndex === -1 ? 0 : currentIndex;\n let targetIndex = -1;\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n targetIndex = (from + 1) % selectableValues.length;\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n targetIndex = (from - 1 + selectableValues.length) % selectableValues.length;\n } else if (event.key === 'Home') {\n targetIndex = 0;\n } else if (event.key === 'End') {\n targetIndex = selectableValues.length - 1;\n }\n\n if (targetIndex === -1) return;\n\n event.preventDefault();\n const targetValue = selectableValues[targetIndex];\n handleSelect(targetValue);\n\n // Focus has to follow the selection explicitly: the segment that was\n // focused is about to lose its `tabIndex={0}` to the newly selected one,\n // and focus does not move on its own.\n const target = trackRef.current?.querySelector<HTMLElement>(\n `[data-value=\"${CSS.escape(targetValue)}\"]`,\n );\n target?.focus();\n };\n\n // The selected segment can sit outside the scrollport - after a controlled\n // `value` change, or once focus moves to a segment off screen. `scrollLeft`\n // is set directly rather than through `scrollIntoView`, which walks the\n // whole ancestor chain and would scroll the page vertically when the\n // control is below the fold.\n useLayoutEffect(() => {\n const track = trackRef.current;\n if (!track) return;\n\n const activeItem = track.querySelector('[aria-checked=\"true\"]') as HTMLElement | null;\n if (!activeItem) return;\n\n const left = activeItem.offsetLeft;\n const right = left + activeItem.offsetWidth;\n\n if (left < track.scrollLeft) {\n track.scrollLeft = left;\n } else if (right > track.scrollLeft + track.clientWidth) {\n track.scrollLeft = right - track.clientWidth;\n }\n }, [activeValue]);\n\n // Whether either end has segments hidden past it. Drives the presence of\n // each button: none at all when the track fits, and none at the end already\n // reached, since a button there would point at nothing.\n const [scrollState, setScrollState] = useState({ canScrollPrev: false, canScrollNext: false });\n const hasScrollButtons = scrollButtons !== 'none';\n\n useEffect(() => {\n if (!hasScrollButtons) return;\n const track = trackRef.current;\n if (!track) return;\n\n const update = () => {\n const maxScroll = track.scrollWidth - track.clientWidth;\n // 1px of tolerance: fractional layout widths leave a sub-pixel\n // remainder at either end that would otherwise keep a button enabled\n // for a scroll that can no longer move anything.\n const canScrollPrev = track.scrollLeft > 1;\n const canScrollNext = track.scrollLeft < maxScroll - 1;\n setScrollState((previous) =>\n previous.canScrollPrev === canScrollPrev && previous.canScrollNext === canScrollNext\n ? previous\n : { canScrollPrev, canScrollNext },\n );\n };\n\n update();\n track.addEventListener('scroll', update, { passive: true });\n\n // The track's own box stays the same width when a label reflows or a font\n // finishes loading, so the segments have to be observed as well as the\n // container - only their sizes tell us the track started overflowing.\n const observer = new ResizeObserver(update);\n observer.observe(track);\n Array.from(track.children).forEach((child) => observer.observe(child));\n\n return () => {\n track.removeEventListener('scroll', update);\n observer.disconnect();\n };\n }, [hasScrollButtons, options.length, size, fullWidth]);\n\n const scrollByStep = (direction: -1 | 1) => {\n const track = trackRef.current;\n if (!track) return;\n\n // A step just short of a full page keeps a segment of context on screen,\n // the same way a paged scrollbar click does.\n const step = track.clientWidth * 0.8;\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n track.scrollBy({ left: direction * step, behavior: reducedMotion ? 'auto' : 'smooth' });\n };\n\n const barClasses = [\n 'eidos-segmented-bar',\n fullWidth && 'eidos-segmented-bar--full-width',\n disabled && 'eidos-segmented-bar--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const containerClasses = [\n 'eidos-segmented',\n `eidos-segmented--${size}`,\n `eidos-segmented--${color}`,\n disabled && 'eidos-segmented--disabled',\n fullWidth && 'eidos-segmented--full-width',\n // With buttons, they are the affordance - a native scrollbar under a\n // compact pill control is redundant and would break its shape.\n hasScrollButtons && 'eidos-segmented--hide-scrollbar',\n ]\n .filter(Boolean)\n .join(' ');\n\n const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;\n const showNextButton = hasScrollButtons && scrollState.canScrollNext;\n\n const scrollButtonClasses = (direction: 'prev' | 'next') =>\n [\n 'eidos-segmented-scroll-button',\n `eidos-segmented-scroll-button--${direction}`,\n `eidos-segmented-scroll-button--${size}`,\n ].join(' ');\n\n const track = (\n <div ref={trackRef} className={containerClasses} role=\"radiogroup\">\n {options.map((opt) => {\n const isActive = activeValue === opt.value;\n const isDisabled = disabled || !!opt.disabled;\n\n // An icon-only segment has no text to be named by. `tooltip` wraps\n // it in a `Tooltip`, which contributes nothing to the accessible\n // name, so such a segment was announced as just \"radio\" - identical\n // to every other segment, making the group unusable by voice or\n // screen reader. Same fallback as `Button`.\n if (!opt.label && !opt.tooltip) {\n devWarn(\n 'segmented-icon-only-name',\n `SegmentedControl: option \"${opt.value}\" has an icon but no \\`label\\` or \\`tooltip\\`, so it has no accessible name.`,\n );\n }\n\n const segment = (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n disabled={isDisabled}\n // Read back by the keyboard handler to move focus onto the newly\n // selected segment, which `value` alone can't identify in the DOM.\n data-value={opt.value}\n tabIndex={isTabbable(opt.value) ? 0 : -1}\n className={['eidos-segmented-item', isActive && 'eidos-segmented-item--active']\n .filter(Boolean)\n .join(' ')}\n onClick={() => !isDisabled && handleSelect(opt.value)}\n onKeyDown={handleKeyDown}\n aria-label={!opt.label ? opt.tooltip : undefined}\n >\n {opt.icon && renderIcon(opt.icon, 'eidos-segmented-icon')}\n {opt.label && <span className=\"eidos-segmented-label\">{opt.label}</span>}\n </button>\n );\n\n return opt.tooltip ? (\n <Tooltip key={opt.value} message={opt.tooltip}>\n {segment}\n </Tooltip>\n ) : (\n React.cloneElement(segment, { key: opt.value })\n );\n })}\n </div>\n );\n\n // The buttons are siblings of the track, never children of it:\n // `role=\"radiogroup\"` only accepts radios. They are also hidden from\n // assistive tech and skipped by Tab, because they are a pointer affordance\n // for something the keyboard already does - tabbing to a segment scrolls it\n // into view. Same arrangement as `Tabs`.\n return (\n <div className={barClasses}>\n {showPrevButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('prev')}\n onClick={() => scrollByStep(-1)}\n // `tabIndex={-1}` keeps these out of the tab order, but it does not\n // stop a *click* from focusing them - and focus landing inside an\n // `aria-hidden` subtree is an error the browser reports (\"Blocked\n // aria-hidden on an element because its descendant retained\n // focus\"). Suppressing the default mousedown behaviour keeps the\n // button unfocusable by pointer as well, while the click still\n // fires. `inert` would also prevent the click, so it is not an\n // option here.\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronLeft className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n\n {track}\n\n {showNextButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('next')}\n onClick={() => scrollByStep(1)}\n onMouseDown={(event) => event.preventDefault()} // see the prev button\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronRight className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-YZEALKC4.cjs","../src/components/SegmentedControl/SegmentedControl.component.tsx"],"names":["track"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-YZEALKC4.cjs","sourcesContent":[null,"import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Tooltip } from '../Tooltip';\nimport { renderIcon, devWarn } from '../../utils';\nimport type { SegmentedControlProps } from './SegmentedControl.types';\n\n/**\n * SegmentedControl - a compact, single-select toggle group rendered as a pill.\n *\n * Semantics: `role=\"radiogroup\"` on the container, `role=\"radio\"` on each\n * segment. Supports controlled and uncontrolled usage.\n *\n * @example\n * ```tsx\n * // Controlled\n * const [view, setView] = useState('list');\n * <SegmentedControl\n * options={[\n * { value: 'list', icon: List, tooltip: 'List view' },\n * { value: 'grid', icon: LayoutGrid, tooltip: 'Grid view' },\n * { value: 'table', icon: Table2, tooltip: 'Table view' },\n * ]}\n * value={view}\n * onChange={setView}\n * />\n *\n * // With labels\n * <SegmentedControl\n * options={[\n * { value: 'day', label: 'Day' },\n * { value: 'week', label: 'Week' },\n * { value: 'month', label: 'Month' },\n * ]}\n * defaultValue=\"week\"\n * onChange={console.log}\n * />\n * ```\n */\nexport const SegmentedControl: React.FC<SegmentedControlProps> = ({\n options,\n value,\n defaultValue,\n onChange,\n size = 'md',\n color = 'primary',\n disabled = false,\n fullWidth = false,\n scrollButtons = 'auto',\n className = '',\n}) => {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? options[0]?.value ?? '',\n );\n\n const activeValue = isControlled ? value : internalValue;\n\n const handleSelect = (optValue: string) => {\n if (disabled) return;\n if (optValue === activeValue) return; // already selected\n if (!isControlled) setInternalValue(optValue);\n onChange?.(optValue);\n };\n\n const trackRef = useRef<HTMLDivElement>(null);\n\n // Roving tabindex: the group is a single tab stop, and arrow keys move\n // within it - the WAI-ARIA radiogroup pattern, which this had none of.\n // Every segment used to be its own tab stop, so a six-option control cost\n // six presses to skip past.\n //\n // The tabbable segment is the selected one; if nothing is selected (a\n // controlled `value` matching no option), the first enabled segment takes\n // the stop so the group can still be reached at all.\n const selectableValues = options.filter((opt) => !opt.disabled).map((opt) => opt.value);\n const hasSelection = selectableValues.includes(activeValue);\n const fallbackTabbableValue = selectableValues[0];\n\n const isTabbable = (optValue: string) =>\n hasSelection ? optValue === activeValue : optValue === fallbackTabbableValue;\n\n // Selection follows focus, which is what the radio pattern specifies -\n // unlike `Tabs`, where arrow keys only move focus. Disabled segments are\n // skipped rather than selected-and-ignored, and both ends wrap.\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (disabled || selectableValues.length === 0) return;\n\n const currentIndex = selectableValues.indexOf(activeValue);\n const from = currentIndex === -1 ? 0 : currentIndex;\n let targetIndex = -1;\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n targetIndex = (from + 1) % selectableValues.length;\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n targetIndex = (from - 1 + selectableValues.length) % selectableValues.length;\n } else if (event.key === 'Home') {\n targetIndex = 0;\n } else if (event.key === 'End') {\n targetIndex = selectableValues.length - 1;\n }\n\n if (targetIndex === -1) return;\n\n event.preventDefault();\n const targetValue = selectableValues[targetIndex];\n handleSelect(targetValue);\n\n // Focus has to follow the selection explicitly: the segment that was\n // focused is about to lose its `tabIndex={0}` to the newly selected one,\n // and focus does not move on its own.\n const target = trackRef.current?.querySelector<HTMLElement>(\n `[data-value=\"${CSS.escape(targetValue)}\"]`,\n );\n target?.focus();\n };\n\n // The selected segment can sit outside the scrollport - after a controlled\n // `value` change, or once focus moves to a segment off screen. `scrollLeft`\n // is set directly rather than through `scrollIntoView`, which walks the\n // whole ancestor chain and would scroll the page vertically when the\n // control is below the fold.\n useLayoutEffect(() => {\n const track = trackRef.current;\n if (!track) return;\n\n const activeItem = track.querySelector('[aria-checked=\"true\"]') as HTMLElement | null;\n if (!activeItem) return;\n\n const left = activeItem.offsetLeft;\n const right = left + activeItem.offsetWidth;\n\n if (left < track.scrollLeft) {\n track.scrollLeft = left;\n } else if (right > track.scrollLeft + track.clientWidth) {\n track.scrollLeft = right - track.clientWidth;\n }\n }, [activeValue]);\n\n // Whether either end has segments hidden past it. Drives the presence of\n // each button: none at all when the track fits, and none at the end already\n // reached, since a button there would point at nothing.\n const [scrollState, setScrollState] = useState({ canScrollPrev: false, canScrollNext: false });\n const hasScrollButtons = scrollButtons !== 'none';\n\n useEffect(() => {\n if (!hasScrollButtons) return;\n const track = trackRef.current;\n if (!track) return;\n\n const update = () => {\n const maxScroll = track.scrollWidth - track.clientWidth;\n // 1px of tolerance: fractional layout widths leave a sub-pixel\n // remainder at either end that would otherwise keep a button enabled\n // for a scroll that can no longer move anything.\n const canScrollPrev = track.scrollLeft > 1;\n const canScrollNext = track.scrollLeft < maxScroll - 1;\n setScrollState((previous) =>\n previous.canScrollPrev === canScrollPrev && previous.canScrollNext === canScrollNext\n ? previous\n : { canScrollPrev, canScrollNext },\n );\n };\n\n update();\n track.addEventListener('scroll', update, { passive: true });\n\n // The track's own box stays the same width when a label reflows or a font\n // finishes loading, so the segments have to be observed as well as the\n // container - only their sizes tell us the track started overflowing.\n const observer = new ResizeObserver(update);\n observer.observe(track);\n Array.from(track.children).forEach((child) => observer.observe(child));\n\n return () => {\n track.removeEventListener('scroll', update);\n observer.disconnect();\n };\n }, [hasScrollButtons, options.length, size, fullWidth]);\n\n const scrollByStep = (direction: -1 | 1) => {\n const track = trackRef.current;\n if (!track) return;\n\n // A step just short of a full page keeps a segment of context on screen,\n // the same way a paged scrollbar click does.\n const step = track.clientWidth * 0.8;\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n track.scrollBy({ left: direction * step, behavior: reducedMotion ? 'auto' : 'smooth' });\n };\n\n const barClasses = [\n 'eidos-segmented-bar',\n fullWidth && 'eidos-segmented-bar--full-width',\n disabled && 'eidos-segmented-bar--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const containerClasses = [\n 'eidos-segmented',\n `eidos-segmented--${size}`,\n `eidos-segmented--${color}`,\n disabled && 'eidos-segmented--disabled',\n fullWidth && 'eidos-segmented--full-width',\n // With buttons, they are the affordance - a native scrollbar under a\n // compact pill control is redundant and would break its shape.\n hasScrollButtons && 'eidos-segmented--hide-scrollbar',\n ]\n .filter(Boolean)\n .join(' ');\n\n const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;\n const showNextButton = hasScrollButtons && scrollState.canScrollNext;\n\n const scrollButtonClasses = (direction: 'prev' | 'next') =>\n [\n 'eidos-segmented-scroll-button',\n `eidos-segmented-scroll-button--${direction}`,\n `eidos-segmented-scroll-button--${size}`,\n ].join(' ');\n\n const track = (\n <div ref={trackRef} className={containerClasses} role=\"radiogroup\">\n {options.map((opt) => {\n const isActive = activeValue === opt.value;\n const isDisabled = disabled || !!opt.disabled;\n\n // An icon-only segment has no text to be named by. `tooltip` wraps\n // it in a `Tooltip`, which contributes nothing to the accessible\n // name, so such a segment was announced as just \"radio\" - identical\n // to every other segment, making the group unusable by voice or\n // screen reader. Same fallback as `Button`.\n if (!opt.label && !opt.tooltip) {\n devWarn(\n 'segmented-icon-only-name',\n `SegmentedControl: option \"${opt.value}\" has an icon but no \\`label\\` or \\`tooltip\\`, so it has no accessible name.`,\n );\n }\n\n const segment = (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n disabled={isDisabled}\n // Read back by the keyboard handler to move focus onto the newly\n // selected segment, which `value` alone can't identify in the DOM.\n data-value={opt.value}\n tabIndex={isTabbable(opt.value) ? 0 : -1}\n className={['eidos-segmented-item', isActive && 'eidos-segmented-item--active']\n .filter(Boolean)\n .join(' ')}\n onClick={() => !isDisabled && handleSelect(opt.value)}\n onKeyDown={handleKeyDown}\n aria-label={!opt.label ? opt.tooltip : undefined}\n >\n {opt.icon && renderIcon(opt.icon, 'eidos-segmented-icon')}\n {opt.label && <span className=\"eidos-segmented-label\">{opt.label}</span>}\n </button>\n );\n\n return opt.tooltip ? (\n <Tooltip key={opt.value} message={opt.tooltip}>\n {segment}\n </Tooltip>\n ) : (\n React.cloneElement(segment, { key: opt.value })\n );\n })}\n </div>\n );\n\n // The buttons are siblings of the track, never children of it:\n // `role=\"radiogroup\"` only accepts radios. They are also hidden from\n // assistive tech and skipped by Tab, because they are a pointer affordance\n // for something the keyboard already does - tabbing to a segment scrolls it\n // into view. Same arrangement as `Tabs`.\n return (\n <div className={barClasses}>\n {showPrevButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('prev')}\n onClick={() => scrollByStep(-1)}\n // `tabIndex={-1}` keeps these out of the tab order, but it does not\n // stop a *click* from focusing them - and focus landing inside an\n // `aria-hidden` subtree is an error the browser reports (\"Blocked\n // aria-hidden on an element because its descendant retained\n // focus\"). Suppressing the default mousedown behaviour keeps the\n // button unfocusable by pointer as well, while the click still\n // fires. `inert` would also prevent the click, so it is not an\n // option here.\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronLeft className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n\n {track}\n\n {showNextButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('next')}\n onClick={() => scrollByStep(1)}\n onMouseDown={(event) => event.preventDefault()} // see the prev button\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronRight className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Input
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-GE3QCXT7.js";
|
|
4
4
|
import {
|
|
5
5
|
Dropdown
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import {
|
|
8
|
-
fullWidthModifier
|
|
9
|
-
} from "./chunk-U34INRFO.js";
|
|
6
|
+
} from "./chunk-OERK3T7E.js";
|
|
10
7
|
|
|
11
8
|
// src/components/Combobox/Combobox.component.tsx
|
|
12
9
|
import { useState, useCallback, useRef, useEffect, useMemo, useId } from "react";
|
|
@@ -364,7 +361,7 @@ var Combobox = ({
|
|
|
364
361
|
const posIconClick = hasClearableValue ? handleClearClick : handleChevronClick;
|
|
365
362
|
const containerClasses = [
|
|
366
363
|
"eidos-combobox",
|
|
367
|
-
fullWidth &&
|
|
364
|
+
fullWidth && "eidos-combobox--full-width",
|
|
368
365
|
error && "eidos-combobox--error",
|
|
369
366
|
disabled && "eidos-combobox--disabled",
|
|
370
367
|
className
|
|
@@ -445,4 +442,4 @@ Combobox.displayName = "Combobox";
|
|
|
445
442
|
export {
|
|
446
443
|
Combobox
|
|
447
444
|
};
|
|
448
|
-
//# sourceMappingURL=chunk-
|
|
445
|
+
//# sourceMappingURL=chunk-Z3OEYDNI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Combobox/Combobox.component.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef, useEffect, useMemo, useId } from 'react';\nimport { Check, ChevronDown, X, Loader2, CircleAlert } from 'lucide-react';\nimport { Input } from '../Input/Input.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\n\nimport type { ComboboxProps, ComboboxOption } from './Combobox.types';\nimport './Combobox.scss';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ntype OptionEntry =\n | { type: 'group'; group: string; key: string }\n | { type: 'option'; option: ComboboxOption; index: number; key: string };\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport const Combobox: React.FC<ComboboxProps> = ({\n options = [],\n value,\n defaultValue,\n onChange,\n onSearch,\n placeholder = 'Search or select…',\n loading = false,\n loadingText = 'Searching…',\n emptyText = 'No results found',\n allowFreeText = false,\n clearable = true,\n disabled = false,\n size = 'md',\n label,\n error,\n hint,\n fullWidth = false,\n className = '',\n maxHeight = '300px',\n renderOption,\n}) => {\n const uid = useId();\n\n // ─── Refs ─────────────────────────────────────────────────────────────────\n\n /** Entire combobox wrapper - used for click-outside detection */\n const containerRef = useRef<HTMLDivElement>(null);\n\n /** The trigger wrapper div - passed to Dropdown as externalTriggerRef for width */\n const comboboxTriggerRef = useRef<HTMLDivElement>(null);\n\n /** The 0-height span that IS the Dropdown trigger element - programmatically clicked to open */\n\n /** Native input element */\n const inputRef = useRef<HTMLInputElement>(null);\n\n /** Focusable option divs for scroll-into-view */\n const optionRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n /**\n * Synchronous open-state flag.\n * React state updates are async; reading this ref inside event handlers\n * gives us the true current value without waiting for a re-render.\n */\n const isOpenRef = useRef(false);\n\n // ─── State ────────────────────────────────────────────────────────────────\n\n const isControlled = value !== undefined;\n\n const getInitialInputValue = (): string => {\n const seed = isControlled ? value : defaultValue;\n if (!seed) return '';\n const match = options.find((o) => o.value === seed);\n return match ? match.label : allowFreeText ? seed : '';\n };\n\n const getInitialCommittedValue = (): string => {\n return isControlled ? (value ?? '') : (defaultValue ?? '');\n };\n\n const [inputValue, _setInputValue] = useState<string>(getInitialInputValue);\n const inputValueRef = useRef<string>(inputValue);\n const setInputValue = useCallback((v: string) => {\n inputValueRef.current = v;\n _setInputValue(v);\n }, []);\n\n const [committedValue, _setCommittedValue] = useState<string>(getInitialCommittedValue);\n const committedValueRef = useRef<string>(committedValue);\n const setCommittedValue = useCallback((v: string) => {\n committedValueRef.current = v;\n _setCommittedValue(v);\n }, []);\n\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n // ─── Sync controlled value ────────────────────────────────────────────────\n\n useEffect(() => {\n if (!isControlled) return;\n const v = value ?? '';\n const match = options.find((o) => o.value === v);\n const label = match ? match.label : allowFreeText ? v : '';\n setInputValue(label);\n setCommittedValue(v);\n }, [value, isControlled, options, allowFreeText, setInputValue, setCommittedValue]);\n\n // ─── Derived: filtered options ────────────────────────────────────────────\n\n const filteredOptions = useMemo<ComboboxOption[]>(() => {\n const q = inputValue.toLowerCase();\n if (!q) return options;\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [options, inputValue]);\n\n // Reset focused index when the filtered set changes\n useEffect(() => {\n setFocusedIndex(-1);\n }, [filteredOptions]);\n\n // Keep optionRefs array in sync with filteredOptions length\n useEffect(() => {\n optionRefs.current = optionRefs.current.slice(0, filteredOptions.length);\n }, [filteredOptions.length]);\n\n // ─── Derived: option entries (with group headers) ─────────────────────────\n\n const optionEntries = useMemo<OptionEntry[]>(() => {\n const entries: OptionEntry[] = [];\n const hasGroups = filteredOptions.some((o) => o.group);\n\n if (!hasGroups) {\n filteredOptions.forEach((option, index) => {\n entries.push({ type: 'option', option, index, key: option.id });\n });\n return entries;\n }\n\n // Build ordered group map while preserving insertion order\n const groupMap = new Map<string | null, ComboboxOption[]>();\n for (const option of filteredOptions) {\n const g = option.group ?? null;\n if (!groupMap.has(g)) groupMap.set(g, []);\n groupMap.get(g)!.push(option);\n }\n\n let optionIndex = 0;\n for (const [group, opts] of groupMap.entries()) {\n if (group !== null) {\n entries.push({ type: 'group', group, key: `group-${group}` });\n }\n for (const option of opts) {\n entries.push({ type: 'option', option, index: optionIndex++, key: option.id });\n }\n }\n\n return entries;\n }, [filteredOptions]);\n\n // ─── Open / Close helpers ─────────────────────────────────────────────────\n\n /**\n * Open the dropdown by programmatically clicking the 0-height span trigger.\n * The click bubbles to div.eidos-dropdown-trigger → Dropdown.handleTriggerClick → opens.\n *\n * We set isOpenRef AFTER the synthetic click so that the Dropdown's toggle\n * handler fires while isOpenRef is still false (allowing it to open).\n */\n const openDropdown = useCallback(() => {\n if (isOpenRef.current || disabled) return;\n // This used to synthesise a click on a hidden zero-height `span` so it would\n // bubble to the dropdown's trigger wrapper, because the overlay kept its\n // open state private and a click was the only way to change it.\n isOpenRef.current = true;\n setIsOpen(true);\n }, [disabled]);\n\n /**\n * Close the dropdown, optionally reverting `inputValue` to the last committed\n * value. This used to close it by remounting the whole subtree through a\n * changing `key`.\n */\n const closeDropdown = useCallback(\n (revertInput = false) => {\n isOpenRef.current = false;\n setIsOpen(false);\n setFocusedIndex(-1);\n\n if (revertInput) {\n const match = options.find((o) => o.value === committedValueRef.current);\n setInputValue(match ? match.label : allowFreeText ? committedValueRef.current : '');\n }\n },\n [options, allowFreeText, setInputValue],\n );\n\n // ─── Click-outside detection ──────────────────────────────────────────────\n\n useEffect(() => {\n const handleMouseDown = (e: MouseEvent) => {\n if (!isOpenRef.current) return;\n // defaultPrevented is set by the listbox's onMouseDown - means the user\n // clicked an option in the portal, not truly outside the combobox.\n if (e.defaultPrevented) return;\n if (containerRef.current?.contains(e.target as Node)) return;\n\n // Focus leaving to a non-focusable target: validate and close\n isOpenRef.current = false;\n setIsOpen(false);\n setFocusedIndex(-1);\n\n const current = inputValueRef.current;\n const committed = committedValueRef.current;\n\n if (!allowFreeText) {\n const match = options.find((o) => o.label.toLowerCase() === current.toLowerCase());\n if (match) {\n if (match.value !== committed) {\n setCommittedValue(match.value);\n onChange?.(match.value);\n setInputValue(match.label);\n }\n } else {\n const revertMatch = options.find((o) => o.value === committed);\n setInputValue(revertMatch ? revertMatch.label : '');\n }\n } else {\n if (current !== committed) {\n setCommittedValue(current);\n onChange?.(current);\n }\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [allowFreeText, options, onChange, setCommittedValue, setInputValue]);\n\n // ─── Input handlers ───────────────────────────────────────────────────────\n\n const handleFocus = useCallback(() => {\n openDropdown();\n }, [openDropdown]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n onSearch?.(query);\n if (!isOpenRef.current) openDropdown();\n },\n [setInputValue, onSearch, openDropdown],\n );\n\n /**\n * On blur, validate the typed value against options.\n * A 0ms defer ensures a click on a posIcon button (X / chevron) inside the\n * Input completes its onClick before we run close logic, so we can check\n * document.activeElement reliably.\n */\n const handleBlur = useCallback(() => {\n setTimeout(() => {\n // If focus came back inside the container (e.g., posIcon button clicked),\n // don't close or validate yet.\n if (containerRef.current?.contains(document.activeElement)) return;\n\n // Read both refs *inside* the deferred callback, never captured at blur\n // time - that's the whole reason they're kept in sync by the setters.\n // Anything can run in the gap this 0ms defer opens, including the click\n // that caused the blur: a controlled consumer clearing `value` from\n // another control (e.g. DataGrid's \"Clear filters\", which resets every\n // quick filter at once) updates the refs via the sync effect, and stale\n // captured values would then resurrect the label that was just cleared.\n const current = inputValueRef.current;\n const committed = committedValueRef.current;\n\n // Close\n isOpenRef.current = false;\n setIsOpen(false);\n setFocusedIndex(-1);\n\n // Validate\n if (!allowFreeText) {\n const match = options.find((o) => o.label.toLowerCase() === current.toLowerCase());\n if (match) {\n if (match.value !== committed) {\n setCommittedValue(match.value);\n onChange?.(match.value);\n setInputValue(match.label);\n } else {\n // Normalize the display label (fix casing)\n setInputValue(match.label);\n }\n } else {\n // No match - revert to last committed value\n const revertMatch = options.find((o) => o.value === committed);\n setInputValue(revertMatch ? revertMatch.label : '');\n }\n } else {\n // allowFreeText: commit whatever the user typed\n if (current !== committed) {\n setCommittedValue(current);\n onChange?.(current);\n }\n }\n }, 0);\n }, [allowFreeText, options, onChange, setCommittedValue, setInputValue]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpenRef.current) {\n openDropdown();\n setFocusedIndex(0);\n } else {\n setFocusedIndex((prev) => {\n const next = prev < filteredOptions.length - 1 ? prev + 1 : 0;\n setTimeout(\n () =>\n optionRefs.current[next]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n }),\n 0,\n );\n return next;\n });\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpenRef.current) {\n openDropdown();\n setFocusedIndex(filteredOptions.length - 1);\n } else {\n setFocusedIndex((prev) => {\n const next = prev > 0 ? prev - 1 : filteredOptions.length - 1;\n setTimeout(\n () =>\n optionRefs.current[next]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n }),\n 0,\n );\n return next;\n });\n }\n break;\n\n case 'Enter':\n e.preventDefault();\n if (isOpenRef.current && focusedIndex >= 0 && focusedIndex < filteredOptions.length) {\n handleOptionSelect(filteredOptions[focusedIndex]);\n } else if (allowFreeText && inputValue.trim()) {\n const trimmed = inputValue.trim();\n setCommittedValue(trimmed);\n onChange?.(trimmed);\n closeDropdown();\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n if (isOpenRef.current) {\n closeDropdown(true /* revert */);\n }\n break;\n\n default:\n break;\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n disabled,\n filteredOptions,\n focusedIndex,\n allowFreeText,\n inputValue,\n onChange,\n openDropdown,\n closeDropdown,\n setCommittedValue,\n ],\n );\n\n // ─── Option selection ─────────────────────────────────────────────────────\n\n const handleOptionSelect = useCallback(\n (option: ComboboxOption) => {\n if (option.disabled) return;\n setInputValue(option.label);\n setCommittedValue(option.value);\n onChange?.(option.value);\n closeDropdown();\n // Return focus to the input so the user can continue interacting\n inputRef.current?.focus();\n },\n [onChange, closeDropdown, setInputValue, setCommittedValue],\n );\n\n // ─── Clear ────────────────────────────────────────────────────────────────\n\n const handleClearClick = useCallback(() => {\n setInputValue('');\n setCommittedValue('');\n onChange?.('');\n // Re-focus input so the user can immediately start typing again\n inputRef.current?.focus();\n }, [onChange, setInputValue, setCommittedValue]);\n\n // ─── Chevron toggle ───────────────────────────────────────────────────────\n\n const handleChevronClick = useCallback(() => {\n if (isOpenRef.current) {\n closeDropdown();\n } else {\n openDropdown();\n }\n }, [closeDropdown, openDropdown]);\n\n // ─── Render: individual option ────────────────────────────────────────────\n\n const renderOptionItem = useCallback(\n (option: ComboboxOption, index: number): React.ReactNode => {\n const isSelected = option.value === committedValue;\n const isFocused = index === focusedIndex;\n\n const classes = [\n 'eidos-combobox-option',\n isSelected && 'eidos-combobox-option--selected',\n isFocused && 'eidos-combobox-option--focused',\n option.disabled && 'eidos-combobox-option--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n key={option.id}\n ref={(el) => {\n optionRefs.current[index] = el;\n }}\n className={classes}\n onClick={() => handleOptionSelect(option)}\n onMouseEnter={() => !option.disabled && setFocusedIndex(index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n id={`${uid}-option-${index}`}\n >\n {renderOption ? (\n renderOption(option)\n ) : (\n <>\n <Check\n className={`eidos-combobox-option-icon${\n !isSelected ? ' eidos-combobox-option-icon--hidden' : ''\n }`}\n />\n <span className=\"eidos-combobox-option-label\">{option.label}</span>\n {option.description && (\n <span className=\"eidos-combobox-option-description\">{option.description}</span>\n )}\n </>\n )}\n </div>\n );\n },\n [committedValue, focusedIndex, handleOptionSelect, renderOption, uid],\n );\n\n // ─── Render: dropdown content ─────────────────────────────────────────────\n\n const dropdownContent = useMemo(() => {\n if (loading) {\n return (\n <div className=\"eidos-combobox-loading\">\n <Loader2 className=\"eidos-combobox-loading-icon\" />\n <span>{loadingText}</span>\n </div>\n );\n }\n\n if (filteredOptions.length === 0) {\n return <div className=\"eidos-combobox-empty\">{emptyText}</div>;\n }\n\n return optionEntries.map((entry) => {\n if (entry.type === 'group') {\n return (\n <div key={entry.key} className=\"eidos-combobox-option-group-label\">\n {entry.group}\n </div>\n );\n }\n return renderOptionItem(entry.option, entry.index);\n });\n }, [loading, loadingText, filteredOptions.length, emptyText, optionEntries, renderOptionItem]);\n\n // ─── posIcon / posIconButton wiring ───────────────────────────────────────\n\n const hasClearableValue = clearable && !!inputValue;\n const posIcon = hasClearableValue ? X : ChevronDown;\n const posIconClick = hasClearableValue ? handleClearClick : handleChevronClick;\n\n // ─── CSS classes ──────────────────────────────────────────────────────────\n\n const containerClasses = [\n 'eidos-combobox',\n fullWidth && 'eidos-combobox--full-width',\n error && 'eidos-combobox--error',\n disabled && 'eidos-combobox--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const maxHeightValue = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n\n // ─── Render ───────────────────────────────────────────────────────────────\n\n return (\n // No ARIA on this wrapper.\n //\n // It carried `aria-expanded` and `aria-haspopup` while having no role at\n // all, which is invalid - both are only meaningful on an element whose\n // role supports them. They belong on the input, which is the combobox.\n <div ref={containerRef} className={containerClasses}>\n <div ref={comboboxTriggerRef} className=\"eidos-combobox-trigger\">\n {/*\n The Input is a direct child of eidos-combobox-trigger.\n It is NOT inside the Dropdown trigger div, so clicking it\n never bubbles to Dropdown.handleTriggerClick and never\n accidentally toggles the dropdown closed mid-edit.\n */}\n <Input\n ref={inputRef}\n value={inputValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n size={size}\n fullWidth\n label={label}\n clearable={false} // we render our own clear via posIcon\n isSelect={false}\n posIcon={posIcon}\n posIconButton\n onPosIconClick={posIconClick}\n // The same button does two jobs depending on state, so the name\n // has to follow the icon - \"Clear\" on a chevron would be a lie.\n posIconLabel={hasClearableValue ? 'Clear selection' : 'Show options'}\n // The ARIA 1.2 combobox pattern: the input *is* the combobox.\n role=\"combobox\"\n aria-expanded={isOpen}\n // `Combobox` renders its own error message rather than passing\n // `error` down, so it does not inherit `Input`'s wiring and has to\n // associate the message itself (SC 3.3.1).\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? `${uid}-error` : undefined}\n aria-autocomplete=\"list\"\n // Only while the listbox exists. `aria-controls` pointing at an id\n // that is not in the document is invalid, and that is what shipped\n // - the listbox only renders once the dropdown opens.\n aria-controls={isOpen ? `${uid}-listbox` : undefined}\n aria-activedescendant={focusedIndex >= 0 ? `${uid}-option-${focusedIndex}` : undefined}\n />\n\n {/*\n The Dropdown trigger is a 0-height span placed AFTER the Input\n in the normal document flow. Its getBoundingClientRect sits at\n exactly the bottom edge of the Input, giving the Dropdown correct\n placement without any click-toggle collision with the Input above.\n closeOnClickOutside and closeOnEscape are disabled because we own\n those interactions in our mousedown listener and onKeyDown handler.\n */}\n <Dropdown\n open={isOpen}\n onOpenChange={setIsOpen}\n // Positioning comes from `triggerRef` below; this span is only here\n // because a trigger is required. It used to carry a ref so that\n // `openDropdown` could click it.\n trigger={<span className=\"eidos-combobox-dropdown-anchor\" aria-hidden=\"true\" />}\n content={\n <div\n id={`${uid}-listbox`}\n className=\"eidos-combobox-options\"\n role=\"listbox\"\n aria-label={label ?? 'Options'}\n // Prevent the input from blurring when the user clicks an option,\n // and mark this event so the click-outside handler ignores it.\n onMouseDown={(e) => e.preventDefault()}\n >\n {dropdownContent}\n </div>\n }\n triggerRef={comboboxTriggerRef as React.RefObject<HTMLElement | null>}\n maxHeight={maxHeightValue}\n autoWidth\n closeOnClickOutside={false}\n closeOnEscape={false}\n />\n </div>\n\n {hint && !error && <span className=\"eidos-combobox-hint\">{hint}</span>}\n {error && (\n <span id={`${uid}-error`} className=\"eidos-combobox-error-message\">\n <CircleAlert className=\"eidos-combobox-error-icon\" />\n {error}\n </span>\n )}\n </div>\n );\n};\n\nCombobox.displayName = 'Combobox';\n"],"mappings":";;;;;;;;AAAA,SAAgB,UAAU,aAAa,QAAQ,WAAW,SAAS,aAAa;AAChF,SAAS,OAAO,aAAa,GAAG,SAAS,mBAAmB;AA0chD,mBACE,KADF;AA3bL,IAAM,WAAoC,CAAC;AAAA,EAChD,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,UAAU;AAAA,EACV,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AACF,MAAM;AACJ,QAAM,MAAM,MAAM;AAKlB,QAAM,eAAe,OAAuB,IAAI;AAGhD,QAAM,qBAAqB,OAAuB,IAAI;AAKtD,QAAM,WAAW,OAAyB,IAAI;AAG9C,QAAM,aAAa,OAAkC,CAAC,CAAC;AAOvD,QAAM,YAAY,OAAO,KAAK;AAI9B,QAAM,eAAe,UAAU;AAE/B,QAAM,uBAAuB,MAAc;AACzC,UAAM,OAAO,eAAe,QAAQ;AACpC,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI;AAClD,WAAO,QAAQ,MAAM,QAAQ,gBAAgB,OAAO;AAAA,EACtD;AAEA,QAAM,2BAA2B,MAAc;AAC7C,WAAO,eAAgB,SAAS,KAAO,gBAAgB;AAAA,EACzD;AAEA,QAAM,CAAC,YAAY,cAAc,IAAI,SAAiB,oBAAoB;AAC1E,QAAM,gBAAgB,OAAe,UAAU;AAC/C,QAAM,gBAAgB,YAAY,CAAC,MAAc;AAC/C,kBAAc,UAAU;AACxB,mBAAe,CAAC;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,CAAC,gBAAgB,kBAAkB,IAAI,SAAiB,wBAAwB;AACtF,QAAM,oBAAoB,OAAe,cAAc;AACvD,QAAM,oBAAoB,YAAY,CAAC,MAAc;AACnD,sBAAkB,UAAU;AAC5B,uBAAmB,CAAC;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,EAAE;AAInD,YAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,UAAM,IAAI,SAAS;AACnB,UAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC;AAC/C,UAAMA,SAAQ,QAAQ,MAAM,QAAQ,gBAAgB,IAAI;AACxD,kBAAcA,MAAK;AACnB,sBAAkB,CAAC;AAAA,EACrB,GAAG,CAAC,OAAO,cAAc,SAAS,eAAe,eAAe,iBAAiB,CAAC;AAIlF,QAAM,kBAAkB,QAA0B,MAAM;AACtD,UAAM,IAAI,WAAW,YAAY;AACjC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EAChE,GAAG,CAAC,SAAS,UAAU,CAAC;AAGxB,YAAU,MAAM;AACd,oBAAgB,EAAE;AAAA,EACpB,GAAG,CAAC,eAAe,CAAC;AAGpB,YAAU,MAAM;AACd,eAAW,UAAU,WAAW,QAAQ,MAAM,GAAG,gBAAgB,MAAM;AAAA,EACzE,GAAG,CAAC,gBAAgB,MAAM,CAAC;AAI3B,QAAM,gBAAgB,QAAuB,MAAM;AACjD,UAAM,UAAyB,CAAC;AAChC,UAAM,YAAY,gBAAgB,KAAK,CAAC,MAAM,EAAE,KAAK;AAErD,QAAI,CAAC,WAAW;AACd,sBAAgB,QAAQ,CAAC,QAAQ,UAAU;AACzC,gBAAQ,KAAK,EAAE,MAAM,UAAU,QAAQ,OAAO,KAAK,OAAO,GAAG,CAAC;AAAA,MAChE,CAAC;AACD,aAAO;AAAA,IACT;AAGA,UAAM,WAAW,oBAAI,IAAqC;AAC1D,eAAW,UAAU,iBAAiB;AACpC,YAAM,IAAI,OAAO,SAAS;AAC1B,UAAI,CAAC,SAAS,IAAI,CAAC,EAAG,UAAS,IAAI,GAAG,CAAC,CAAC;AACxC,eAAS,IAAI,CAAC,EAAG,KAAK,MAAM;AAAA,IAC9B;AAEA,QAAI,cAAc;AAClB,eAAW,CAAC,OAAO,IAAI,KAAK,SAAS,QAAQ,GAAG;AAC9C,UAAI,UAAU,MAAM;AAClB,gBAAQ,KAAK,EAAE,MAAM,SAAS,OAAO,KAAK,SAAS,KAAK,GAAG,CAAC;AAAA,MAC9D;AACA,iBAAW,UAAU,MAAM;AACzB,gBAAQ,KAAK,EAAE,MAAM,UAAU,QAAQ,OAAO,eAAe,KAAK,OAAO,GAAG,CAAC;AAAA,MAC/E;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,CAAC;AAWpB,QAAM,eAAe,YAAY,MAAM;AACrC,QAAI,UAAU,WAAW,SAAU;AAInC,cAAU,UAAU;AACpB,cAAU,IAAI;AAAA,EAChB,GAAG,CAAC,QAAQ,CAAC;AAOb,QAAM,gBAAgB;AAAA,IACpB,CAAC,cAAc,UAAU;AACvB,gBAAU,UAAU;AACpB,gBAAU,KAAK;AACf,sBAAgB,EAAE;AAElB,UAAI,aAAa;AACf,cAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,kBAAkB,OAAO;AACvE,sBAAc,QAAQ,MAAM,QAAQ,gBAAgB,kBAAkB,UAAU,EAAE;AAAA,MACpF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,eAAe,aAAa;AAAA,EACxC;AAIA,YAAU,MAAM;AACd,UAAM,kBAAkB,CAAC,MAAkB;AACzC,UAAI,CAAC,UAAU,QAAS;AAGxB,UAAI,EAAE,iBAAkB;AACxB,UAAI,aAAa,SAAS,SAAS,EAAE,MAAc,EAAG;AAGtD,gBAAU,UAAU;AACpB,gBAAU,KAAK;AACf,sBAAgB,EAAE;AAElB,YAAM,UAAU,cAAc;AAC9B,YAAM,YAAY,kBAAkB;AAEpC,UAAI,CAAC,eAAe;AAClB,cAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,MAAM,YAAY,MAAM,QAAQ,YAAY,CAAC;AACjF,YAAI,OAAO;AACT,cAAI,MAAM,UAAU,WAAW;AAC7B,8BAAkB,MAAM,KAAK;AAC7B,uBAAW,MAAM,KAAK;AACtB,0BAAc,MAAM,KAAK;AAAA,UAC3B;AAAA,QACF,OAAO;AACL,gBAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS;AAC7D,wBAAc,cAAc,YAAY,QAAQ,EAAE;AAAA,QACpD;AAAA,MACF,OAAO;AACL,YAAI,YAAY,WAAW;AACzB,4BAAkB,OAAO;AACzB,qBAAW,OAAO;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,eAAe;AACtD,WAAO,MAAM,SAAS,oBAAoB,aAAa,eAAe;AAAA,EACxE,GAAG,CAAC,eAAe,SAAS,UAAU,mBAAmB,aAAa,CAAC;AAIvE,QAAM,cAAc,YAAY,MAAM;AACpC,iBAAa;AAAA,EACf,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,eAAe;AAAA,IACnB,CAAC,MAA2C;AAC1C,YAAM,QAAQ,EAAE,OAAO;AACvB,oBAAc,KAAK;AACnB,iBAAW,KAAK;AAChB,UAAI,CAAC,UAAU,QAAS,cAAa;AAAA,IACvC;AAAA,IACA,CAAC,eAAe,UAAU,YAAY;AAAA,EACxC;AAQA,QAAM,aAAa,YAAY,MAAM;AACnC,eAAW,MAAM;AAGf,UAAI,aAAa,SAAS,SAAS,SAAS,aAAa,EAAG;AAS5D,YAAM,UAAU,cAAc;AAC9B,YAAM,YAAY,kBAAkB;AAGpC,gBAAU,UAAU;AACpB,gBAAU,KAAK;AACf,sBAAgB,EAAE;AAGlB,UAAI,CAAC,eAAe;AAClB,cAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,MAAM,YAAY,MAAM,QAAQ,YAAY,CAAC;AACjF,YAAI,OAAO;AACT,cAAI,MAAM,UAAU,WAAW;AAC7B,8BAAkB,MAAM,KAAK;AAC7B,uBAAW,MAAM,KAAK;AACtB,0BAAc,MAAM,KAAK;AAAA,UAC3B,OAAO;AAEL,0BAAc,MAAM,KAAK;AAAA,UAC3B;AAAA,QACF,OAAO;AAEL,gBAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS;AAC7D,wBAAc,cAAc,YAAY,QAAQ,EAAE;AAAA,QACpD;AAAA,MACF,OAAO;AAEL,YAAI,YAAY,WAAW;AACzB,4BAAkB,OAAO;AACzB,qBAAW,OAAO;AAAA,QACpB;AAAA,MACF;AAAA,IACF,GAAG,CAAC;AAAA,EACN,GAAG,CAAC,eAAe,SAAS,UAAU,mBAAmB,aAAa,CAAC;AAEvE,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAA6C;AAC5C,UAAI,SAAU;AAEd,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,CAAC,UAAU,SAAS;AACtB,yBAAa;AACb,4BAAgB,CAAC;AAAA,UACnB,OAAO;AACL,4BAAgB,CAAC,SAAS;AACxB,oBAAM,OAAO,OAAO,gBAAgB,SAAS,IAAI,OAAO,IAAI;AAC5D;AAAA,gBACE,MACE,WAAW,QAAQ,IAAI,GAAG,eAAe;AAAA,kBACvC,OAAO;AAAA,kBACP,UAAU;AAAA,gBACZ,CAAC;AAAA,gBACH;AAAA,cACF;AACA,qBAAO;AAAA,YACT,CAAC;AAAA,UACH;AACA;AAAA,QAEF,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,CAAC,UAAU,SAAS;AACtB,yBAAa;AACb,4BAAgB,gBAAgB,SAAS,CAAC;AAAA,UAC5C,OAAO;AACL,4BAAgB,CAAC,SAAS;AACxB,oBAAM,OAAO,OAAO,IAAI,OAAO,IAAI,gBAAgB,SAAS;AAC5D;AAAA,gBACE,MACE,WAAW,QAAQ,IAAI,GAAG,eAAe;AAAA,kBACvC,OAAO;AAAA,kBACP,UAAU;AAAA,gBACZ,CAAC;AAAA,gBACH;AAAA,cACF;AACA,qBAAO;AAAA,YACT,CAAC;AAAA,UACH;AACA;AAAA,QAEF,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,UAAU,WAAW,gBAAgB,KAAK,eAAe,gBAAgB,QAAQ;AACnF,+BAAmB,gBAAgB,YAAY,CAAC;AAAA,UAClD,WAAW,iBAAiB,WAAW,KAAK,GAAG;AAC7C,kBAAM,UAAU,WAAW,KAAK;AAChC,8BAAkB,OAAO;AACzB,uBAAW,OAAO;AAClB,0BAAc;AAAA,UAChB;AACA;AAAA,QAEF,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,UAAU,SAAS;AACrB;AAAA,cAAc;AAAA;AAAA,YAAiB;AAAA,UACjC;AACA;AAAA,QAEF;AACE;AAAA,MACJ;AAAA,IACF;AAAA;AAAA,IAEA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAIA,QAAM,qBAAqB;AAAA,IACzB,CAAC,WAA2B;AAC1B,UAAI,OAAO,SAAU;AACrB,oBAAc,OAAO,KAAK;AAC1B,wBAAkB,OAAO,KAAK;AAC9B,iBAAW,OAAO,KAAK;AACvB,oBAAc;AAEd,eAAS,SAAS,MAAM;AAAA,IAC1B;AAAA,IACA,CAAC,UAAU,eAAe,eAAe,iBAAiB;AAAA,EAC5D;AAIA,QAAM,mBAAmB,YAAY,MAAM;AACzC,kBAAc,EAAE;AAChB,sBAAkB,EAAE;AACpB,eAAW,EAAE;AAEb,aAAS,SAAS,MAAM;AAAA,EAC1B,GAAG,CAAC,UAAU,eAAe,iBAAiB,CAAC;AAI/C,QAAM,qBAAqB,YAAY,MAAM;AAC3C,QAAI,UAAU,SAAS;AACrB,oBAAc;AAAA,IAChB,OAAO;AACL,mBAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,eAAe,YAAY,CAAC;AAIhC,QAAM,mBAAmB;AAAA,IACvB,CAAC,QAAwB,UAAmC;AAC1D,YAAM,aAAa,OAAO,UAAU;AACpC,YAAM,YAAY,UAAU;AAE5B,YAAM,UAAU;AAAA,QACd;AAAA,QACA,cAAc;AAAA,QACd,aAAa;AAAA,QACb,OAAO,YAAY;AAAA,MACrB,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,KAAK,CAAC,OAAO;AACX,uBAAW,QAAQ,KAAK,IAAI;AAAA,UAC9B;AAAA,UACA,WAAW;AAAA,UACX,SAAS,MAAM,mBAAmB,MAAM;AAAA,UACxC,cAAc,MAAM,CAAC,OAAO,YAAY,gBAAgB,KAAK;AAAA,UAC7D,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,iBAAe,OAAO;AAAA,UACtB,IAAI,GAAG,GAAG,WAAW,KAAK;AAAA,UAEzB,yBACC,aAAa,MAAM,IAEnB,iCACE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,6BACT,CAAC,aAAa,wCAAwC,EACxD;AAAA;AAAA,YACF;AAAA,YACA,oBAAC,UAAK,WAAU,+BAA+B,iBAAO,OAAM;AAAA,YAC3D,OAAO,eACN,oBAAC,UAAK,WAAU,qCAAqC,iBAAO,aAAY;AAAA,aAE5E;AAAA;AAAA,QAzBG,OAAO;AAAA,MA2Bd;AAAA,IAEJ;AAAA,IACA,CAAC,gBAAgB,cAAc,oBAAoB,cAAc,GAAG;AAAA,EACtE;AAIA,QAAM,kBAAkB,QAAQ,MAAM;AACpC,QAAI,SAAS;AACX,aACE,qBAAC,SAAI,WAAU,0BACb;AAAA,4BAAC,WAAQ,WAAU,+BAA8B;AAAA,QACjD,oBAAC,UAAM,uBAAY;AAAA,SACrB;AAAA,IAEJ;AAEA,QAAI,gBAAgB,WAAW,GAAG;AAChC,aAAO,oBAAC,SAAI,WAAU,wBAAwB,qBAAU;AAAA,IAC1D;AAEA,WAAO,cAAc,IAAI,CAAC,UAAU;AAClC,UAAI,MAAM,SAAS,SAAS;AAC1B,eACE,oBAAC,SAAoB,WAAU,qCAC5B,gBAAM,SADC,MAAM,GAEhB;AAAA,MAEJ;AACA,aAAO,iBAAiB,MAAM,QAAQ,MAAM,KAAK;AAAA,IACnD,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,aAAa,gBAAgB,QAAQ,WAAW,eAAe,gBAAgB,CAAC;AAI7F,QAAM,oBAAoB,aAAa,CAAC,CAAC;AACzC,QAAM,UAAU,oBAAoB,IAAI;AACxC,QAAM,eAAe,oBAAoB,mBAAmB;AAI5D,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,aAAa;AAAA,IACb,SAAS;AAAA,IACT,YAAY;AAAA,IACZ;AAAA,EACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,iBAAiB,OAAO,cAAc,WAAW,GAAG,SAAS,OAAO;AAI1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAME,qBAAC,SAAI,KAAK,cAAc,WAAW,kBACjC;AAAA,2BAAC,SAAI,KAAK,oBAAoB,WAAU,0BAOtC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,YACV,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,WAAW;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAS;AAAA,YACT;AAAA,YACA,WAAW;AAAA,YACX,UAAU;AAAA,YACV;AAAA,YACA,eAAa;AAAA,YACb,gBAAgB;AAAA,YAGhB,cAAc,oBAAoB,oBAAoB;AAAA,YAEtD,MAAK;AAAA,YACL,iBAAe;AAAA,YAIf,gBAAc,QAAQ,OAAO;AAAA,YAC7B,oBAAkB,QAAQ,GAAG,GAAG,WAAW;AAAA,YAC3C,qBAAkB;AAAA,YAIlB,iBAAe,SAAS,GAAG,GAAG,aAAa;AAAA,YAC3C,yBAAuB,gBAAgB,IAAI,GAAG,GAAG,WAAW,YAAY,KAAK;AAAA;AAAA,QAC/E;AAAA,QAUA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,cAAc;AAAA,YAId,SAAS,oBAAC,UAAK,WAAU,kCAAiC,eAAY,QAAO;AAAA,YAC7E,SACE;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,GAAG,GAAG;AAAA,gBACV,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,cAAY,SAAS;AAAA,gBAGrB,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,gBAEpC;AAAA;AAAA,YACH;AAAA,YAEF,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,WAAS;AAAA,YACT,qBAAqB;AAAA,YACrB,eAAe;AAAA;AAAA,QACjB;AAAA,SACF;AAAA,MAEC,QAAQ,CAAC,SAAS,oBAAC,UAAK,WAAU,uBAAuB,gBAAK;AAAA,MAC9D,SACC,qBAAC,UAAK,IAAI,GAAG,GAAG,UAAU,WAAU,gCAClC;AAAA,4BAAC,eAAY,WAAU,6BAA4B;AAAA,QAClD;AAAA,SACH;AAAA,OAEJ;AAAA;AAEJ;AAEA,SAAS,cAAc;","names":["label"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkNSA7ASZ7cjs = require('./chunk-NSA7ASZ7.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkR5WI5IGRcjs = require('./chunk-R5WI5IGR.cjs');
|
|
8
8
|
|
|
9
9
|
// src/components/Drawer/Drawer.component.tsx
|
|
10
10
|
var _react = require('react');
|
|
@@ -26,7 +26,7 @@ var Drawer = ({
|
|
|
26
26
|
const titleId = _react.useId.call(void 0, );
|
|
27
27
|
const bodyId = _react.useId.call(void 0, );
|
|
28
28
|
const panelRef = _react.useRef.call(void 0, null);
|
|
29
|
-
const isClient =
|
|
29
|
+
const isClient = _chunkR5WI5IGRcjs.useIsClient.call(void 0, );
|
|
30
30
|
const TRANSITION_MS = 300;
|
|
31
31
|
const [isMounted, setIsMounted] = _react.useState.call(void 0, isOpen);
|
|
32
32
|
const [isVisible, setIsVisible] = _react.useState.call(void 0, isOpen);
|
|
@@ -75,7 +75,7 @@ var Drawer = ({
|
|
|
75
75
|
},
|
|
76
76
|
[closeOnBackdropClick, onClose]
|
|
77
77
|
);
|
|
78
|
-
|
|
78
|
+
_chunkR5WI5IGRcjs.useDialogFocus.call(void 0, isClient && isOpen && isVisible, panelRef);
|
|
79
79
|
if (!isClient || !isMounted) return null;
|
|
80
80
|
return _reactdom.createPortal.call(void 0,
|
|
81
81
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
@@ -118,7 +118,7 @@ var Drawer = ({
|
|
|
118
118
|
] }),
|
|
119
119
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { id: bodyId, className: "eidos-drawer-body", children }),
|
|
120
120
|
actions && actions.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-drawer-footer", children: actions.map((action) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
121
|
-
|
|
121
|
+
_chunkNSA7ASZ7cjs.Button,
|
|
122
122
|
{
|
|
123
123
|
variant: _nullishCoalesce(action.variant, () => ( "outlined")),
|
|
124
124
|
color: action.color,
|
|
@@ -143,4 +143,4 @@ Drawer.displayName = "Drawer";
|
|
|
143
143
|
|
|
144
144
|
|
|
145
145
|
exports.Drawer = Drawer;
|
|
146
|
-
//# sourceMappingURL=chunk-
|
|
146
|
+
//# sourceMappingURL=chunk-Z6FZ7GI5.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-Z6FZ7GI5.cjs","../src/components/Drawer/Drawer.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-Z6FZ7GI5.cjs","sourcesContent":[null,"import React, { useEffect, useCallback, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { Button } from '../Button';\nimport type { DrawerProps } from './Drawer.types';\nimport { useDialogFocus, useIsClient } from '../../utils';\n\nexport const Drawer: React.FC<DrawerProps> = ({\n isOpen,\n onClose,\n placement = 'right',\n title,\n children,\n actions,\n size = 'md',\n closeOnBackdropClick = true,\n closeOnEscape = true,\n className = '',\n}) => {\n const titleId = useId();\n const bodyId = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const isClient = useIsClient();\n\n // ── Animation state ────────────────────────────────────────────────────────\n // isMounted: whether the portal DOM node exists at all.\n // isVisible: whether the '--open' CSS class is applied (drives the transition).\n //\n // On open: mount first → one rAF → apply --open (browser sees initial\n // closed position before transitioning, so the animation fires).\n // On close: remove --open (CSS transition plays) → after 300 ms unmount.\n // 300 ms matches the CSS `transition: 0.3s` in Drawer.scss.\n const TRANSITION_MS = 300;\n const [isMounted, setIsMounted] = useState(isOpen);\n const [isVisible, setIsVisible] = useState(isOpen);\n\n useEffect(() => {\n let raf1 = 0;\n let raf2 = 0;\n let timerId: ReturnType<typeof setTimeout>;\n\n if (isOpen) {\n setIsMounted(true);\n // Double rAF: React 18 automatic batching means setIsMounted(true) may\n // not produce a committed browser paint before the first rAF fires.\n // The second frame guarantees the panel is rendered in its off-screen\n // (closed) position before the CSS transition begins.\n raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsVisible(true));\n });\n } else {\n setIsVisible(false);\n timerId = setTimeout(() => setIsMounted(false), TRANSITION_MS);\n }\n\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n clearTimeout(timerId);\n };\n }, [isOpen]);\n\n // ── Escape key + scroll lock (tied to isOpen, not isMounted) ───────────────\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (closeOnEscape && event.key === 'Escape' && isOpen) {\n onClose();\n }\n },\n [closeOnEscape, isOpen, onClose],\n );\n\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleEscapeKey);\n document.body.style.overflow = 'hidden';\n }\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n document.body.style.overflow = '';\n };\n }, [isOpen, handleEscapeKey]);\n\n // ── Backdrop click ─────────────────────────────────────────────────────────\n const handleBackdropClick = useCallback(\n (event: React.MouseEvent) => {\n if (closeOnBackdropClick && event.target === event.currentTarget) {\n onClose();\n }\n },\n [closeOnBackdropClick, onClose],\n );\n\n // Keyed to `isVisible` rather than `isOpen` or `isMounted` - see the note\n // on `Modal`. The panel is translated off-screen until `--open` lands two\n // frames after mounting, and focusing something that is off-screen scrolls\n // the page to chase it.\n // `isClient` for the same reason as `Modal`: a drawer that starts open would\n // otherwise run this against a ref whose portal has not rendered yet.\n useDialogFocus(isClient && isOpen && isVisible, panelRef);\n\n // Same reason as `Modal`: `isMounted` starts as `isOpen`, so a drawer that\n // starts open would portal on its first render and throw under SSR.\n if (!isClient || !isMounted) return null;\n\n return createPortal(\n <div\n className={[\n 'eidos-drawer',\n `eidos-drawer--${placement}`,\n isVisible && 'eidos-drawer--open',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {/* Backdrop */}\n <div className=\"eidos-drawer-backdrop\" onClick={handleBackdropClick} aria-hidden=\"true\" />\n\n {/* Panel */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={bodyId}\n className={[\n 'eidos-drawer-panel',\n `eidos-drawer-panel--${size}`,\n `eidos-drawer-panel--${placement}`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {/* Header */}\n <div className=\"eidos-drawer-header\">\n {title && (\n <h3 id={titleId} className=\"eidos-drawer-title\">\n {title}\n </h3>\n )}\n <button\n type=\"button\"\n className=\"eidos-drawer-close\"\n onClick={onClose}\n aria-label=\"Close drawer\"\n >\n <X aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Body */}\n <div id={bodyId} className=\"eidos-drawer-body\">\n {children}\n </div>\n\n {/* Footer - only rendered when actions are provided */}\n {actions && actions.length > 0 && (\n <div className=\"eidos-drawer-footer\">\n {actions.map((action) => (\n <Button\n key={action.id}\n variant={action.variant ?? 'outlined'}\n color={action.color}\n disabled={action.disabled}\n loading={action.loading}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n </div>,\n document.body,\n );\n};\n\nDrawer.displayName = 'Drawer';\n"]}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkVCG647BYcjs = require('./chunk-VCG647BY.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
var _chunkQ3GNKF74cjs = require('./chunk-Q3GNKF74.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkNSA7ASZ7cjs = require('./chunk-NSA7ASZ7.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var _chunkR5WI5IGRcjs = require('./chunk-R5WI5IGR.cjs');
|
|
14
14
|
|
|
15
15
|
// src/components/Header/Header.component.tsx
|
|
16
16
|
var _react = require('react');
|
|
@@ -64,15 +64,15 @@ var Header = ({
|
|
|
64
64
|
};
|
|
65
65
|
if (action.icon && !action.children && action.tooltip) {
|
|
66
66
|
const { icon, tooltip, ...rest } = action;
|
|
67
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
67
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNSA7ASZ7cjs.Button, { ...rest, size: "md", preIcon: icon, onClick: handleClick, children: tooltip }, index);
|
|
68
68
|
}
|
|
69
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
69
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNSA7ASZ7cjs.Button, { ...action, size: "md", onClick: handleClick }, index);
|
|
70
70
|
};
|
|
71
71
|
const titles = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-header__titles", children: [
|
|
72
72
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, TitleElement, { className: "eidos-header__title", children: title }),
|
|
73
73
|
subtitle && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-header__subtitle", children: subtitle }),
|
|
74
74
|
!!_optionalChain([meta, 'optionalAccess', _3 => _3.length]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-header__meta", children: meta.map((item, index) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "eidos-header__meta-item", children: [
|
|
75
|
-
item.icon &&
|
|
75
|
+
item.icon && _chunkR5WI5IGRcjs.renderIcon.call(void 0, item.icon, "eidos-header__meta-icon"),
|
|
76
76
|
item.label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-header__meta-label", children: item.label }),
|
|
77
77
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-header__meta-value", children: item.value })
|
|
78
78
|
] }, index)) })
|
|
@@ -84,7 +84,7 @@ var Header = ({
|
|
|
84
84
|
] }) : titles,
|
|
85
85
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-header__actions", children: [
|
|
86
86
|
overflowActions.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
87
|
-
|
|
87
|
+
_chunkVCG647BYcjs.Popover,
|
|
88
88
|
{
|
|
89
89
|
open: overflowOpen,
|
|
90
90
|
onOpenChange: setOverflowOpen,
|
|
@@ -95,7 +95,7 @@ var Header = ({
|
|
|
95
95
|
// No `aria-haspopup`/`aria-expanded` here: Popover already
|
|
96
96
|
// sets both on the wrapper it renders around this button.
|
|
97
97
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
98
|
-
|
|
98
|
+
_chunkNSA7ASZ7cjs.Button,
|
|
99
99
|
{
|
|
100
100
|
icon: _lucidereact.Ellipsis,
|
|
101
101
|
size: "md",
|
|
@@ -108,7 +108,7 @@ var Header = ({
|
|
|
108
108
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-header__overflow-actions", children: overflowActions.map(renderOverflowAction) })
|
|
109
109
|
}
|
|
110
110
|
),
|
|
111
|
-
inlineActions.map((action, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
111
|
+
inlineActions.map((action, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNSA7ASZ7cjs.Button, { size: "md", ...action }, index))
|
|
112
112
|
] })
|
|
113
113
|
] }) });
|
|
114
114
|
};
|
|
@@ -123,7 +123,7 @@ var IdentityHeader = ({
|
|
|
123
123
|
...rest
|
|
124
124
|
}) => {
|
|
125
125
|
if (avatar && media) {
|
|
126
|
-
|
|
126
|
+
_chunkR5WI5IGRcjs.devWarn.call(void 0,
|
|
127
127
|
"identity-header-avatar-and-media",
|
|
128
128
|
"IdentityHeader received both `avatar` and `media`. `media` takes precedence - drop `avatar` to silence this."
|
|
129
129
|
);
|
|
@@ -144,4 +144,4 @@ var IdentityHeader = ({
|
|
|
144
144
|
|
|
145
145
|
|
|
146
146
|
exports.Header = Header; exports.IdentityHeader = IdentityHeader;
|
|
147
|
-
//# sourceMappingURL=chunk-
|
|
147
|
+
//# sourceMappingURL=chunk-ZVA5KJAJ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-NFD7MPX4.cjs","../src/components/Header/Header.component.tsx","../src/components/Header/IdentityHeader.component.tsx"],"names":["jsx"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACdA,8BAAiF;AAMjF,2CAAyB;AAqFjB,+CAAA;AAnFD,IAAM,OAAA,EAAgC,CAAC;AAAA,EAC5C,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,EAAU,SAAA;AAAA,EACV,OAAA,EAAS,aAAA,EAAe,IAAA;AAAA,EACxB,OAAA;AAAA,EACA,qBAAA,EAAuB,GAAA;AAAA,EACvB,4BAAA,EAA8B,CAAA;AAAA,EAC9B,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU,CAAC,cAAA,EAAgB,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA;AAEd,EAAA;AACG,EAAA;AACQ,EAAA;AASpB,EAAA;AACR,IAAA;AACV,IAAA;AACuC,IAAA;AAC9B,EAAA;AAQH,EAAA;AACO,IAAA;AACR,MAAA;AACjB,MAAA;AACF,IAAA;AAEQ,IAAA;AAEgB,IAAA;AAC+B,IAAA;AAEZ,IAAA;AACnB,IAAA;AACS,IAAA;AACD,EAAA;AAEH,EAAA;AAC0B,EAAA;AACC,EAAA;AAIA,EAAA;AACL,EAAA;AAIrC,EAAA;AACyC,IAAA;AAC3B,EAAA;AAE6C,EAAA;AAIX,IAAA;AACgB,sBAAA;AACvD,MAAA;AACvB,IAAA;AAKuD,IAAA;AAClB,MAAA;AAEE,MAAA;AAIvC,IAAA;AAE4C,IAAA;AAC9C,EAAA;AAGiB,EAAA;AACW,oBAAA;AACK,IAAA;AAEtB,IAAA;AAGqC,MAAA;AACf,MAAA;AACL,sBAAA;AAGtB,IAAA;AAEJ,EAAA;AAIyB,EAAA;AASJ,IAAA;AACE,sBAAA;AACd,MAAA;AAGH,IAAA;AAEa,oBAAA;AAEX,MAAA;AAAC,QAAA;AAAA,QAAA;AACO,UAAA;AACQ,UAAA;AACJ,UAAA;AACA,UAAA;AAGA,UAAA;AACV,UAAA;AAAA;AAAA;AAGE,4BAAA;AAAC,cAAA;AAAA,cAAA;AACO,gBAAA;AACD,gBAAA;AACG,gBAAA;AACF,gBAAA;AAC+B,gBAAA;AAAA,cAAA;AACvC,YAAA;AAAA,UAAA;AAGa,UAAA;AAEf,QAAA;AACF,MAAA;AAGA,MAAA;AAEJ,IAAA;AAEJ,EAAA;AAEJ;ADvD4D;AACA;AErFjB;AAdmB;AAC5D,EAAA;AACA,EAAA;AACU,EAAA;AACE,EAAA;AACT,EAAA;AACC;AACiB,EAAA;AACnB,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEyCA,EAAAA;AAGvCA,EAAAA;AAAC,IAAA;AAAA,IAAA;AACK,MAAA;AACJ,MAAA;AACO,MAAA;AACyC,MAAA;AAAwB,IAAA;AAC1E,EAAA;AAEJ;AFqG4D;AACA;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-NFD7MPX4.cjs","sourcesContent":[null,"import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport type { HeaderActionProps, HeaderProps } from './Header.types';\nimport './Header.scss';\nimport { Button } from '../Button';\nimport { Popover } from '../Popover';\nimport { renderIcon } from '../../utils';\nimport { Ellipsis } from 'lucide-react';\n\nexport const Header: React.FC<HeaderProps> = ({\n title,\n subtitle,\n media,\n meta,\n variant = 'default',\n titleAs: TitleElement = 'h1',\n actions,\n collapseActionsBelow = 640,\n actionsVisibleWhenCollapsed = 1,\n className = '',\n}) => {\n const classes = ['eidos-header', `eidos-header--${variant}`, className].filter(Boolean).join(' ');\n\n const rootRef = useRef<HTMLDivElement>(null);\n const [isNarrow, setIsNarrow] = useState(false);\n const [overflowOpen, setOverflowOpen] = useState(false);\n\n // Measures the header's own box rather than the viewport, so the collapse\n // point matches the container queries in Header.scss - a viewport query\n // would disagree with them by the width of PageLayout's navigation rail,\n // which is itself collapsible. The 1px hero border makes this border-box\n // reading differ from the container query's content-box one by 2px; that is\n // far below any threshold worth caring about, and using one measurement for\n // both the initial pass and the observer keeps it to a single code path.\n const measure = useCallback(() => {\n const element = rootRef.current;\n if (!element) return;\n setIsNarrow(element.getBoundingClientRect().width <= collapseActionsBelow);\n }, [collapseActionsBelow]);\n\n // `useLayoutEffect` for the first measurement specifically: ResizeObserver\n // delivers its initial callback asynchronously, so relying on it alone\n // would paint the full action row for a frame before collapsing it. Reading\n // the box synchronously here collapses before paint instead. Nothing runs\n // during SSR, so the server renders the uncollapsed row and hydration\n // matches - the same client-only posture Navigation's `collapseBelow` has.\n useLayoutEffect(() => {\n if (!collapseActionsBelow) {\n setIsNarrow(false);\n return;\n }\n\n measure();\n\n const element = rootRef.current;\n if (!element || typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [collapseActionsBelow, measure]);\n\n const allActions = actions ?? [];\n const keptCount = Math.max(0, actionsVisibleWhenCollapsed);\n const isCollapsed = isNarrow && !!collapseActionsBelow && allActions.length > keptCount;\n\n // The *last* actions stay inline: a primary call to action is conventionally\n // rightmost, which is also how Header's own stories order them.\n const overflowActions = isCollapsed ? allActions.slice(0, allActions.length - keptCount) : [];\n const inlineActions = isCollapsed ? allActions.slice(allActions.length - keptCount) : allActions;\n\n // A portalled popover would otherwise stay on screen after the header grows\n // back past the threshold and its trigger stops being rendered.\n useEffect(() => {\n if (!isCollapsed && overflowOpen) setOverflowOpen(false);\n }, [isCollapsed, overflowOpen]);\n\n const renderOverflowAction = (action: HeaderActionProps, index: number) => {\n // Typed on `HTMLElement` so it satisfies both the button and the link\n // form's handler; the action's own handler is one or the other, and is\n // only ever called with the element it was attached to.\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n (action.onClick as React.MouseEventHandler<HTMLElement> | undefined)?.(event);\n setOverflowOpen(false);\n };\n\n // An icon-only action has no visible label, which is fine in a horizontal\n // row of small buttons and useless in a vertical list. Its tooltip is\n // already the label, so promote it rather than showing a bare glyph.\n if (action.icon && !action.children && action.tooltip) {\n const { icon, tooltip, ...rest } = action;\n return (\n <Button key={index} {...rest} size=\"md\" preIcon={icon} onClick={handleClick}>\n {tooltip}\n </Button>\n );\n }\n\n return <Button key={index} {...action} size=\"md\" onClick={handleClick} />;\n };\n\n const titles = (\n <div className=\"eidos-header__titles\">\n <TitleElement className=\"eidos-header__title\">{title}</TitleElement>\n {subtitle && <span className=\"eidos-header__subtitle\">{subtitle}</span>}\n {!!meta?.length && (\n <div className=\"eidos-header__meta\">\n {meta.map((item, index) => (\n <span key={index} className=\"eidos-header__meta-item\">\n {item.icon && renderIcon(item.icon, 'eidos-header__meta-icon')}\n {item.label && <span className=\"eidos-header__meta-label\">{item.label}</span>}\n <span className=\"eidos-header__meta-value\">{item.value}</span>\n </span>\n ))}\n </div>\n )}\n </div>\n );\n\n return (\n <div className={classes} ref={rootRef}>\n <div className=\"eidos-header__content\">\n {/* The `__lead` wrapper only exists when there is media to group with\n the titles. Media and titles need a tighter gap than titles and\n actions do, and a flex container has a single gap - but rendering\n the wrapper unconditionally would change the markup for every\n existing consumer, and the `eidos-*` class names are documented as\n targetable. */}\n {media ? (\n <div className=\"eidos-header__lead\">\n <div className=\"eidos-header__media\">{media}</div>\n {titles}\n </div>\n ) : (\n titles\n )}\n <div className=\"eidos-header__actions\">\n {overflowActions.length > 0 && (\n <Popover\n open={overflowOpen}\n onOpenChange={setOverflowOpen}\n placement=\"bottom\"\n maxWidth={260}\n // Popover puts `className` on its trigger wrapper, which is the\n // element that actually becomes a flex item of `__actions`.\n className=\"eidos-header__overflow-trigger\"\n trigger={\n // No `aria-haspopup`/`aria-expanded` here: Popover already\n // sets both on the wrapper it renders around this button.\n <Button\n icon={Ellipsis}\n size=\"md\"\n variant=\"outlined\"\n color=\"secondary\"\n aria-label={`${overflowActions.length} more actions`}\n />\n }\n >\n <div className=\"eidos-header__overflow-actions\">\n {overflowActions.map(renderOverflowAction)}\n </div>\n </Popover>\n )}\n {inlineActions.map((action, index) => (\n <Button key={index} size=\"md\" {...action} />\n ))}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { IdentityHeaderProps } from './IdentityHeader.types';\nimport { Header } from './Header.component';\nimport { Avatar } from '../Avatar';\nimport { devWarn } from '../../utils';\n\n/**\n * `Header` preconfigured for the \"this page is about one person or entity\"\n * shape - an avatar beside the name, supporting facts below it, actions on\n * the end - which account and profile pages share. Settings-style pages want\n * a plain `Header` instead; they have no identity to lead with.\n *\n * Deliberately thin: it pins `variant=\"hero\"`, types the avatar so consumers\n * don't have to import `Avatar` to fill the slot, and gives the shape a name\n * worth discovering. Everything else is `Header`.\n */\nexport const IdentityHeader: React.FC<IdentityHeaderProps> = ({\n avatar,\n media,\n variant = 'hero',\n className = '',\n ...rest\n}) => {\n if (avatar && media) {\n devWarn(\n 'identity-header-avatar-and-media',\n 'IdentityHeader received both `avatar` and `media`. `media` takes precedence - drop `avatar` to silence this.',\n );\n }\n\n const resolvedMedia = media ?? (avatar ? <Avatar size=\"lg\" {...avatar} /> : undefined);\n\n return (\n <Header\n {...rest}\n variant={variant}\n media={resolvedMedia}\n className={['eidos-identity-header', className].filter(Boolean).join(' ')}\n />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-ZVA5KJAJ.cjs","../src/components/Header/Header.component.tsx","../src/components/Header/IdentityHeader.component.tsx"],"names":["jsx"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACdA,8BAAiF;AAMjF,2CAAyB;AAqFjB,+CAAA;AAnFD,IAAM,OAAA,EAAgC,CAAC;AAAA,EAC5C,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,EAAU,SAAA;AAAA,EACV,OAAA,EAAS,aAAA,EAAe,IAAA;AAAA,EACxB,OAAA;AAAA,EACA,qBAAA,EAAuB,GAAA;AAAA,EACvB,4BAAA,EAA8B,CAAA;AAAA,EAC9B,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU,CAAC,cAAA,EAAgB,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA;AAEd,EAAA;AACG,EAAA;AACQ,EAAA;AASpB,EAAA;AACR,IAAA;AACV,IAAA;AACuC,IAAA;AAC9B,EAAA;AAQH,EAAA;AACO,IAAA;AACR,MAAA;AACjB,MAAA;AACF,IAAA;AAEQ,IAAA;AAEgB,IAAA;AAC+B,IAAA;AAEZ,IAAA;AACnB,IAAA;AACS,IAAA;AACD,EAAA;AAEH,EAAA;AAC0B,EAAA;AACC,EAAA;AAIA,EAAA;AACL,EAAA;AAIrC,EAAA;AACyC,IAAA;AAC3B,EAAA;AAE6C,EAAA;AAIX,IAAA;AACgB,sBAAA;AACvD,MAAA;AACvB,IAAA;AAKuD,IAAA;AAClB,MAAA;AAEE,MAAA;AAIvC,IAAA;AAE4C,IAAA;AAC9C,EAAA;AAGiB,EAAA;AACW,oBAAA;AACK,IAAA;AAEtB,IAAA;AAGqC,MAAA;AACf,MAAA;AACL,sBAAA;AAGtB,IAAA;AAEJ,EAAA;AAIyB,EAAA;AASJ,IAAA;AACE,sBAAA;AACd,MAAA;AAGH,IAAA;AAEa,oBAAA;AAEX,MAAA;AAAC,QAAA;AAAA,QAAA;AACO,UAAA;AACQ,UAAA;AACJ,UAAA;AACA,UAAA;AAGA,UAAA;AACV,UAAA;AAAA;AAAA;AAGE,4BAAA;AAAC,cAAA;AAAA,cAAA;AACO,gBAAA;AACD,gBAAA;AACG,gBAAA;AACF,gBAAA;AAC+B,gBAAA;AAAA,cAAA;AACvC,YAAA;AAAA,UAAA;AAGa,UAAA;AAEf,QAAA;AACF,MAAA;AAGA,MAAA;AAEJ,IAAA;AAEJ,EAAA;AAEJ;ADvD4D;AACA;AErFjB;AAdmB;AAC5D,EAAA;AACA,EAAA;AACU,EAAA;AACE,EAAA;AACT,EAAA;AACC;AACiB,EAAA;AACnB,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEyCA,EAAAA;AAGvCA,EAAAA;AAAC,IAAA;AAAA,IAAA;AACK,MAAA;AACJ,MAAA;AACO,MAAA;AACyC,MAAA;AAAwB,IAAA;AAC1E,EAAA;AAEJ;AFqG4D;AACA;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-ZVA5KJAJ.cjs","sourcesContent":[null,"import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport type { HeaderActionProps, HeaderProps } from './Header.types';\nimport './Header.scss';\nimport { Button } from '../Button';\nimport { Popover } from '../Popover';\nimport { renderIcon } from '../../utils';\nimport { Ellipsis } from 'lucide-react';\n\nexport const Header: React.FC<HeaderProps> = ({\n title,\n subtitle,\n media,\n meta,\n variant = 'default',\n titleAs: TitleElement = 'h1',\n actions,\n collapseActionsBelow = 640,\n actionsVisibleWhenCollapsed = 1,\n className = '',\n}) => {\n const classes = ['eidos-header', `eidos-header--${variant}`, className].filter(Boolean).join(' ');\n\n const rootRef = useRef<HTMLDivElement>(null);\n const [isNarrow, setIsNarrow] = useState(false);\n const [overflowOpen, setOverflowOpen] = useState(false);\n\n // Measures the header's own box rather than the viewport, so the collapse\n // point matches the container queries in Header.scss - a viewport query\n // would disagree with them by the width of PageLayout's navigation rail,\n // which is itself collapsible. The 1px hero border makes this border-box\n // reading differ from the container query's content-box one by 2px; that is\n // far below any threshold worth caring about, and using one measurement for\n // both the initial pass and the observer keeps it to a single code path.\n const measure = useCallback(() => {\n const element = rootRef.current;\n if (!element) return;\n setIsNarrow(element.getBoundingClientRect().width <= collapseActionsBelow);\n }, [collapseActionsBelow]);\n\n // `useLayoutEffect` for the first measurement specifically: ResizeObserver\n // delivers its initial callback asynchronously, so relying on it alone\n // would paint the full action row for a frame before collapsing it. Reading\n // the box synchronously here collapses before paint instead. Nothing runs\n // during SSR, so the server renders the uncollapsed row and hydration\n // matches - the same client-only posture Navigation's `collapseBelow` has.\n useLayoutEffect(() => {\n if (!collapseActionsBelow) {\n setIsNarrow(false);\n return;\n }\n\n measure();\n\n const element = rootRef.current;\n if (!element || typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [collapseActionsBelow, measure]);\n\n const allActions = actions ?? [];\n const keptCount = Math.max(0, actionsVisibleWhenCollapsed);\n const isCollapsed = isNarrow && !!collapseActionsBelow && allActions.length > keptCount;\n\n // The *last* actions stay inline: a primary call to action is conventionally\n // rightmost, which is also how Header's own stories order them.\n const overflowActions = isCollapsed ? allActions.slice(0, allActions.length - keptCount) : [];\n const inlineActions = isCollapsed ? allActions.slice(allActions.length - keptCount) : allActions;\n\n // A portalled popover would otherwise stay on screen after the header grows\n // back past the threshold and its trigger stops being rendered.\n useEffect(() => {\n if (!isCollapsed && overflowOpen) setOverflowOpen(false);\n }, [isCollapsed, overflowOpen]);\n\n const renderOverflowAction = (action: HeaderActionProps, index: number) => {\n // Typed on `HTMLElement` so it satisfies both the button and the link\n // form's handler; the action's own handler is one or the other, and is\n // only ever called with the element it was attached to.\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n (action.onClick as React.MouseEventHandler<HTMLElement> | undefined)?.(event);\n setOverflowOpen(false);\n };\n\n // An icon-only action has no visible label, which is fine in a horizontal\n // row of small buttons and useless in a vertical list. Its tooltip is\n // already the label, so promote it rather than showing a bare glyph.\n if (action.icon && !action.children && action.tooltip) {\n const { icon, tooltip, ...rest } = action;\n return (\n <Button key={index} {...rest} size=\"md\" preIcon={icon} onClick={handleClick}>\n {tooltip}\n </Button>\n );\n }\n\n return <Button key={index} {...action} size=\"md\" onClick={handleClick} />;\n };\n\n const titles = (\n <div className=\"eidos-header__titles\">\n <TitleElement className=\"eidos-header__title\">{title}</TitleElement>\n {subtitle && <span className=\"eidos-header__subtitle\">{subtitle}</span>}\n {!!meta?.length && (\n <div className=\"eidos-header__meta\">\n {meta.map((item, index) => (\n <span key={index} className=\"eidos-header__meta-item\">\n {item.icon && renderIcon(item.icon, 'eidos-header__meta-icon')}\n {item.label && <span className=\"eidos-header__meta-label\">{item.label}</span>}\n <span className=\"eidos-header__meta-value\">{item.value}</span>\n </span>\n ))}\n </div>\n )}\n </div>\n );\n\n return (\n <div className={classes} ref={rootRef}>\n <div className=\"eidos-header__content\">\n {/* The `__lead` wrapper only exists when there is media to group with\n the titles. Media and titles need a tighter gap than titles and\n actions do, and a flex container has a single gap - but rendering\n the wrapper unconditionally would change the markup for every\n existing consumer, and the `eidos-*` class names are documented as\n targetable. */}\n {media ? (\n <div className=\"eidos-header__lead\">\n <div className=\"eidos-header__media\">{media}</div>\n {titles}\n </div>\n ) : (\n titles\n )}\n <div className=\"eidos-header__actions\">\n {overflowActions.length > 0 && (\n <Popover\n open={overflowOpen}\n onOpenChange={setOverflowOpen}\n placement=\"bottom\"\n maxWidth={260}\n // Popover puts `className` on its trigger wrapper, which is the\n // element that actually becomes a flex item of `__actions`.\n className=\"eidos-header__overflow-trigger\"\n trigger={\n // No `aria-haspopup`/`aria-expanded` here: Popover already\n // sets both on the wrapper it renders around this button.\n <Button\n icon={Ellipsis}\n size=\"md\"\n variant=\"outlined\"\n color=\"secondary\"\n aria-label={`${overflowActions.length} more actions`}\n />\n }\n >\n <div className=\"eidos-header__overflow-actions\">\n {overflowActions.map(renderOverflowAction)}\n </div>\n </Popover>\n )}\n {inlineActions.map((action, index) => (\n <Button key={index} size=\"md\" {...action} />\n ))}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { IdentityHeaderProps } from './IdentityHeader.types';\nimport { Header } from './Header.component';\nimport { Avatar } from '../Avatar';\nimport { devWarn } from '../../utils';\n\n/**\n * `Header` preconfigured for the \"this page is about one person or entity\"\n * shape - an avatar beside the name, supporting facts below it, actions on\n * the end - which account and profile pages share. Settings-style pages want\n * a plain `Header` instead; they have no identity to lead with.\n *\n * Deliberately thin: it pins `variant=\"hero\"`, types the avatar so consumers\n * don't have to import `Avatar` to fill the slot, and gives the shape a name\n * worth discovering. Everything else is `Header`.\n */\nexport const IdentityHeader: React.FC<IdentityHeaderProps> = ({\n avatar,\n media,\n variant = 'hero',\n className = '',\n ...rest\n}) => {\n if (avatar && media) {\n devWarn(\n 'identity-header-avatar-and-media',\n 'IdentityHeader received both `avatar` and `media`. `media` takes precedence - drop `avatar` to silence this.',\n );\n }\n\n const resolvedMedia = media ?? (avatar ? <Avatar size=\"lg\" {...avatar} /> : undefined);\n\n return (\n <Header\n {...rest}\n variant={variant}\n media={resolvedMedia}\n className={['eidos-identity-header', className].filter(Boolean).join(' ')}\n />\n );\n};\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
3
|
+
var _chunkSJPCBRKRcjs = require('../chunk-SJPCBRKR.cjs');
|
|
4
|
+
require('../chunk-MKQVDEHI.cjs');
|
|
5
|
+
require('../chunk-R5WI5IGR.cjs');
|
|
6
6
|
require('../chunk-CJT7L764.cjs');
|
|
7
7
|
require('../chunk-DZUJEN5N.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
exports.ColorPicker =
|
|
10
|
+
exports.ColorPicker = _chunkSJPCBRKRcjs.ColorPicker;
|
|
11
11
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ColorPicker
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-DCUIT7SI.js";
|
|
4
|
+
import "../chunk-OERK3T7E.js";
|
|
5
|
+
import "../chunk-PP6HS4GR.js";
|
|
6
6
|
import "../chunk-V3T7RO4F.js";
|
|
7
7
|
import "../chunk-5WRI5ZAA.js";
|
|
8
8
|
export {
|
package/dist/combobox/index.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
6
|
-
require('../chunk-
|
|
7
|
-
require('../chunk-
|
|
3
|
+
var _chunkHKLLKNRQcjs = require('../chunk-HKLLKNRQ.cjs');
|
|
4
|
+
require('../chunk-KF2OGUAD.cjs');
|
|
5
|
+
require('../chunk-MKQVDEHI.cjs');
|
|
6
|
+
require('../chunk-RZMQCVAS.cjs');
|
|
7
|
+
require('../chunk-R5WI5IGR.cjs');
|
|
8
8
|
require('../chunk-CJT7L764.cjs');
|
|
9
9
|
require('../chunk-DZUJEN5N.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
exports.Combobox =
|
|
12
|
+
exports.Combobox = _chunkHKLLKNRQcjs.Combobox;
|
|
13
13
|
//# sourceMappingURL=index.cjs.map
|
package/dist/combobox/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Combobox
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-Z3OEYDNI.js";
|
|
4
|
+
import "../chunk-GE3QCXT7.js";
|
|
5
|
+
import "../chunk-OERK3T7E.js";
|
|
6
|
+
import "../chunk-BUSMGQJ4.js";
|
|
7
|
+
import "../chunk-PP6HS4GR.js";
|
|
8
8
|
import "../chunk-V3T7RO4F.js";
|
|
9
9
|
import "../chunk-5WRI5ZAA.js";
|
|
10
10
|
export {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkFJSK2RT7cjs = require('../chunk-FJSK2RT7.cjs');
|
|
4
4
|
require('../chunk-VW32UTUE.cjs');
|
|
5
5
|
require('../chunk-KVIL4EP4.cjs');
|
|
6
|
-
require('../chunk-
|
|
6
|
+
require('../chunk-R5WI5IGR.cjs');
|
|
7
7
|
require('../chunk-CJT7L764.cjs');
|
|
8
8
|
require('../chunk-DZUJEN5N.cjs');
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
exports.CommandPalette =
|
|
11
|
+
exports.CommandPalette = _chunkFJSK2RT7cjs.CommandPalette;
|
|
12
12
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CommandPalette
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-GLEPKX2R.js";
|
|
4
4
|
import "../chunk-XUZOU2EB.js";
|
|
5
5
|
import "../chunk-LYH3EKKQ.js";
|
|
6
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-PP6HS4GR.js";
|
|
7
7
|
import "../chunk-V3T7RO4F.js";
|
|
8
8
|
import "../chunk-5WRI5ZAA.js";
|
|
9
9
|
export {
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
3
|
+
var _chunk5HRVHEHEcjs = require('../chunk-5HRVHEHE.cjs');
|
|
4
|
+
require('../chunk-VPN7AR7T.cjs');
|
|
5
|
+
require('../chunk-MKQVDEHI.cjs');
|
|
6
6
|
require('../chunk-KVIL4EP4.cjs');
|
|
7
|
-
require('../chunk-
|
|
8
|
-
require('../chunk-
|
|
7
|
+
require('../chunk-RZMQCVAS.cjs');
|
|
8
|
+
require('../chunk-R5WI5IGR.cjs');
|
|
9
9
|
require('../chunk-CJT7L764.cjs');
|
|
10
10
|
require('../chunk-DZUJEN5N.cjs');
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
exports.ContextMenu =
|
|
13
|
+
exports.ContextMenu = _chunk5HRVHEHEcjs.ContextMenu;
|
|
14
14
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ContextMenu
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-YYA5SWXD.js";
|
|
4
|
+
import "../chunk-TOLNPD7S.js";
|
|
5
|
+
import "../chunk-OERK3T7E.js";
|
|
6
6
|
import "../chunk-LYH3EKKQ.js";
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
7
|
+
import "../chunk-BUSMGQJ4.js";
|
|
8
|
+
import "../chunk-PP6HS4GR.js";
|
|
9
9
|
import "../chunk-V3T7RO4F.js";
|
|
10
10
|
import "../chunk-5WRI5ZAA.js";
|
|
11
11
|
export {
|