eidos-ui 3.1.0 → 3.2.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 +4 -0
- package/dist/Header.types-0XovUp0T.d.ts +79 -0
- package/dist/Header.types-Ce5Cj301.d.cts +79 -0
- package/dist/{Navigation.types-CpS3EYNz.d.ts → Navigation.types-By5HfPTi.d.ts} +8 -0
- package/dist/{Navigation.types-sUO9wqOp.d.cts → Navigation.types-_MrYqqUI.d.cts} +8 -0
- package/dist/{SegmentedControl.types-Dm4SnwCK.d.cts → SegmentedControl.types-BofrEYyd.d.cts} +16 -1
- package/dist/{SegmentedControl.types-CK8EiShd.d.ts → SegmentedControl.types-cjLwwBAm.d.ts} +16 -1
- package/dist/alert/index.cjs +4 -4
- package/dist/alert/index.js +3 -3
- package/dist/button/index.cjs +3 -3
- package/dist/button/index.js +2 -2
- package/dist/chip/index.cjs +3 -3
- package/dist/chip/index.js +2 -2
- package/dist/{chunk-RWOX2NJN.js → chunk-25PSIDPC.js} +2 -2
- package/dist/{chunk-IFVT5UCY.js → chunk-2QEKSRVX.js} +14 -10
- package/dist/chunk-2QEKSRVX.js.map +1 -0
- package/dist/{chunk-4BKTBV2I.js → chunk-2R77XZEP.js} +6 -2
- package/dist/chunk-2R77XZEP.js.map +1 -0
- package/dist/{chunk-H5HWFOWZ.js → chunk-2WP27QAN.js} +8 -8
- package/dist/{chunk-EXITZVB2.js → chunk-3RLGH45H.js} +6 -6
- package/dist/{chunk-442U3W6R.cjs → chunk-4MZ7HEQC.cjs} +5 -5
- package/dist/{chunk-442U3W6R.cjs.map → chunk-4MZ7HEQC.cjs.map} +1 -1
- package/dist/{chunk-R4PU2TBM.js → chunk-4ZWAJTNH.js} +3 -3
- package/dist/{chunk-RHOT7AEI.cjs → chunk-55J4LEKT.cjs} +8 -7
- package/dist/chunk-55J4LEKT.cjs.map +1 -0
- package/dist/{chunk-REVK7IGN.js → chunk-5WH3JMR5.js} +8 -7
- package/dist/chunk-5WH3JMR5.js.map +1 -0
- package/dist/{chunk-GT22EGJP.cjs → chunk-65PC3YDT.cjs} +14 -10
- package/dist/chunk-65PC3YDT.cjs.map +1 -0
- package/dist/{chunk-KQD7CQ4Z.cjs → chunk-6CSUUQ5M.cjs} +10 -6
- package/dist/chunk-6CSUUQ5M.cjs.map +1 -0
- package/dist/{chunk-GR2PMCVN.cjs → chunk-75TDY7XF.cjs} +5 -5
- package/dist/{chunk-GR2PMCVN.cjs.map → chunk-75TDY7XF.cjs.map} +1 -1
- package/dist/{chunk-FRUOA2QU.cjs → chunk-75VXB3H2.cjs} +7 -3
- package/dist/chunk-75VXB3H2.cjs.map +1 -0
- package/dist/{chunk-F26VIKNF.js → chunk-ATL7325T.js} +3 -3
- package/dist/{chunk-TEJIPPZR.js → chunk-BC5I2MYB.js} +7 -4
- package/dist/chunk-BC5I2MYB.js.map +1 -0
- package/dist/{chunk-GHQ6SQPI.js → chunk-BHVHM66Z.js} +6 -6
- package/dist/{chunk-N2IGZIEX.cjs → chunk-CJGFRPAS.cjs} +3 -3
- package/dist/{chunk-N2IGZIEX.cjs.map → chunk-CJGFRPAS.cjs.map} +1 -1
- package/dist/{chunk-GEHL4LKK.cjs → chunk-CUJBNRJJ.cjs} +8 -2
- package/dist/chunk-CUJBNRJJ.cjs.map +1 -0
- package/dist/{chunk-DAXZRNNO.cjs → chunk-D2SKXRKP.cjs} +8 -8
- package/dist/{chunk-DAXZRNNO.cjs.map → chunk-D2SKXRKP.cjs.map} +1 -1
- package/dist/{chunk-KBG77JHC.js → chunk-EAJHEYZM.js} +8 -2
- package/dist/chunk-EAJHEYZM.js.map +1 -0
- package/dist/{chunk-G77YR73R.cjs → chunk-EBSKRZXI.cjs} +8 -8
- package/dist/{chunk-G77YR73R.cjs.map → chunk-EBSKRZXI.cjs.map} +1 -1
- package/dist/{chunk-B5G5XVFJ.cjs → chunk-EH42ND5Q.cjs} +5 -5
- package/dist/{chunk-B5G5XVFJ.cjs.map → chunk-EH42ND5Q.cjs.map} +1 -1
- package/dist/{chunk-WUBQJVB7.cjs → chunk-EL3YXTOW.cjs} +9 -6
- package/dist/chunk-EL3YXTOW.cjs.map +1 -0
- package/dist/{chunk-Y53HCLGW.js → chunk-FALDCW2E.js} +2 -2
- package/dist/{chunk-D5IY2HUV.cjs → chunk-FXZJL2AM.cjs} +5 -5
- package/dist/{chunk-D5IY2HUV.cjs.map → chunk-FXZJL2AM.cjs.map} +1 -1
- package/dist/{chunk-KJZUYC4X.cjs → chunk-HI6WCX4T.cjs} +10 -9
- package/dist/chunk-HI6WCX4T.cjs.map +1 -0
- package/dist/{chunk-LFWPQYWX.cjs → chunk-I3CSPYHG.cjs} +3 -3
- package/dist/{chunk-LFWPQYWX.cjs.map → chunk-I3CSPYHG.cjs.map} +1 -1
- package/dist/{chunk-EZME5CLK.cjs → chunk-J5RMLZ4P.cjs} +3 -3
- package/dist/{chunk-EZME5CLK.cjs.map → chunk-J5RMLZ4P.cjs.map} +1 -1
- package/dist/{chunk-VHMOKXUT.js → chunk-JRLUZDKA.js} +8 -7
- package/dist/chunk-JRLUZDKA.js.map +1 -0
- package/dist/{chunk-LIFUHQH5.cjs → chunk-KBGFDHKD.cjs} +19 -19
- package/dist/{chunk-LIFUHQH5.cjs.map → chunk-KBGFDHKD.cjs.map} +1 -1
- package/dist/{chunk-ZHFPV43D.js → chunk-KNQ6NN6L.js} +5 -5
- package/dist/{chunk-2ZY7M72Q.js → chunk-KQJ3IAFT.js} +10 -7
- package/dist/chunk-KQJ3IAFT.js.map +1 -0
- package/dist/{chunk-74MBKLYI.js → chunk-L23WWO3D.js} +9 -5
- package/dist/chunk-L23WWO3D.js.map +1 -0
- package/dist/{chunk-YJXZR7RL.js → chunk-L5Q6UDY3.js} +4 -4
- package/dist/{chunk-5BX4Q76D.cjs → chunk-LVHZBCTA.cjs} +3 -3
- package/dist/{chunk-5BX4Q76D.cjs.map → chunk-LVHZBCTA.cjs.map} +1 -1
- package/dist/{chunk-SENVA467.js → chunk-M7PF4FKQ.js} +6 -2
- package/dist/chunk-M7PF4FKQ.js.map +1 -0
- package/dist/chunk-ND526PMG.cjs +145 -0
- package/dist/chunk-ND526PMG.cjs.map +1 -0
- package/dist/{chunk-TRLBYA5G.cjs → chunk-NEYLNRVG.cjs} +5 -5
- package/dist/{chunk-TRLBYA5G.cjs.map → chunk-NEYLNRVG.cjs.map} +1 -1
- package/dist/{chunk-ZEZK664O.js → chunk-NWJ6NETE.js} +13 -13
- package/dist/{chunk-U5FHQ73U.cjs → chunk-NZO2I5AL.cjs} +15 -12
- package/dist/chunk-NZO2I5AL.cjs.map +1 -0
- package/dist/{chunk-5ZL6PYU3.js → chunk-O2AACVSF.js} +3 -3
- package/dist/chunk-O3LG7B2J.cjs +186 -0
- package/dist/chunk-O3LG7B2J.cjs.map +1 -0
- package/dist/{chunk-SHYSLWQG.js → chunk-OAK7HFOJ.js} +4 -4
- package/dist/{chunk-QF2RAUPB.cjs → chunk-OAPOGYA5.cjs} +7 -3
- package/dist/chunk-OAPOGYA5.cjs.map +1 -0
- package/dist/{chunk-SKEWTQJ7.cjs → chunk-OMLXP2CK.cjs} +7 -7
- package/dist/{chunk-SKEWTQJ7.cjs.map → chunk-OMLXP2CK.cjs.map} +1 -1
- package/dist/{chunk-VSTQEHVZ.js → chunk-PR7CVQ4R.js} +10 -7
- package/dist/chunk-PR7CVQ4R.js.map +1 -0
- package/dist/{chunk-6HUHH6Y4.cjs → chunk-Q6ICDKQZ.cjs} +22 -19
- package/dist/chunk-Q6ICDKQZ.cjs.map +1 -0
- package/dist/{chunk-NGVOXM7P.js → chunk-QIITXVRG.js} +4 -4
- package/dist/{chunk-GI6VJYOS.js → chunk-QUDVJUZU.js} +3 -3
- package/dist/chunk-QZX3A4FX.js +886 -0
- package/dist/chunk-QZX3A4FX.js.map +1 -0
- package/dist/chunk-R3WPVTGY.cjs +886 -0
- package/dist/chunk-R3WPVTGY.cjs.map +1 -0
- package/dist/{chunk-SN6EWQDJ.js → chunk-RYOQYYDO.js} +3 -3
- package/dist/chunk-S4S4LB63.js +186 -0
- package/dist/chunk-S4S4LB63.js.map +1 -0
- package/dist/{chunk-67RFMV6K.js → chunk-T2KB3DJJ.js} +2 -2
- package/dist/{chunk-5VM2256W.cjs → chunk-TEVZHN5I.cjs} +11 -10
- package/dist/chunk-TEVZHN5I.cjs.map +1 -0
- package/dist/{chunk-RKA2OJRT.js → chunk-TJC7UELT.js} +18 -18
- package/dist/{chunk-SKTDGCWJ.cjs → chunk-UOOGS6N7.cjs} +48 -48
- package/dist/{chunk-SKTDGCWJ.cjs.map → chunk-UOOGS6N7.cjs.map} +1 -1
- package/dist/{chunk-SE7MWOC7.cjs → chunk-VRQBDTLT.cjs} +32 -32
- package/dist/{chunk-SE7MWOC7.cjs.map → chunk-VRQBDTLT.cjs.map} +1 -1
- package/dist/{chunk-AXBYJ2OY.cjs → chunk-WFEORBLC.cjs} +8 -8
- package/dist/{chunk-AXBYJ2OY.cjs.map → chunk-WFEORBLC.cjs.map} +1 -1
- package/dist/chunk-WKDT2XFQ.js +145 -0
- package/dist/chunk-WKDT2XFQ.js.map +1 -0
- package/dist/{chunk-APK5OQRV.cjs → chunk-WWYJNWJY.cjs} +6 -6
- package/dist/{chunk-APK5OQRV.cjs.map → chunk-WWYJNWJY.cjs.map} +1 -1
- package/dist/{chunk-A7WQINIG.js → chunk-X3U7SDOZ.js} +7 -6
- package/dist/chunk-X3U7SDOZ.js.map +1 -0
- package/dist/{chunk-LEMCJW57.js → chunk-YDPEHUMH.js} +2 -2
- package/dist/{chunk-GGSII6Y2.cjs → chunk-ZGT4LT5Y.cjs} +33 -33
- package/dist/{chunk-GGSII6Y2.cjs.map → chunk-ZGT4LT5Y.cjs.map} +1 -1
- package/dist/{chunk-LUL6RZ4M.cjs → chunk-ZNWIHUHZ.cjs} +3 -3
- package/dist/{chunk-LUL6RZ4M.cjs.map → chunk-ZNWIHUHZ.cjs.map} +1 -1
- package/dist/{chunk-S3CT536K.js → chunk-ZPDETHQ7.js} +2 -2
- package/dist/color-picker/index.cjs +4 -3
- package/dist/color-picker/index.cjs.map +1 -1
- package/dist/color-picker/index.js +3 -2
- package/dist/combobox/index.cjs +5 -5
- package/dist/combobox/index.js +4 -4
- package/dist/context-menu/index.cjs +5 -5
- package/dist/context-menu/index.js +4 -4
- package/dist/conversation/index.cjs +28 -0
- package/dist/conversation/index.cjs.map +1 -0
- package/dist/conversation/index.d.cts +254 -0
- package/dist/conversation/index.d.ts +254 -0
- package/dist/conversation/index.js +28 -0
- package/dist/conversation/index.js.map +1 -0
- package/dist/data-grid/index.cjs +16 -16
- package/dist/data-grid/index.d.cts +1 -1
- package/dist/data-grid/index.d.ts +1 -1
- package/dist/data-grid/index.js +15 -15
- package/dist/date-picker/index.cjs +7 -7
- package/dist/date-picker/index.js +6 -6
- package/dist/drawer/index.cjs +4 -4
- package/dist/drawer/index.js +3 -3
- package/dist/dropdown/index.cjs +3 -2
- package/dist/dropdown/index.cjs.map +1 -1
- package/dist/dropdown/index.js +2 -1
- package/dist/header/index.cjs +8 -4
- package/dist/header/index.cjs.map +1 -1
- package/dist/header/index.d.cts +35 -4
- package/dist/header/index.d.ts +35 -4
- package/dist/header/index.js +9 -5
- package/dist/index.cjs +66 -56
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1147 -295
- package/dist/index.d.cts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js +84 -74
- package/dist/inline-edit/index.cjs +4 -4
- package/dist/inline-edit/index.js +3 -3
- package/dist/input/index.cjs +3 -3
- package/dist/input/index.js +2 -2
- package/dist/menu/index.cjs +4 -4
- package/dist/menu/index.js +3 -3
- package/dist/modal/index.cjs +4 -4
- package/dist/modal/index.js +3 -3
- package/dist/navigation/index.cjs +4 -4
- package/dist/navigation/index.d.cts +2 -2
- package/dist/navigation/index.d.ts +2 -2
- package/dist/navigation/index.js +3 -3
- package/dist/number-input/index.cjs +3 -2
- package/dist/number-input/index.cjs.map +1 -1
- package/dist/number-input/index.js +2 -1
- package/dist/page-layout/index.cjs +10 -9
- package/dist/page-layout/index.cjs.map +1 -1
- package/dist/page-layout/index.d.cts +2 -2
- package/dist/page-layout/index.d.ts +2 -2
- package/dist/page-layout/index.js +9 -8
- package/dist/pagination/index.cjs +7 -7
- package/dist/pagination/index.js +6 -6
- package/dist/segmented-control/index.cjs +3 -3
- package/dist/segmented-control/index.d.cts +2 -2
- package/dist/segmented-control/index.d.ts +2 -2
- package/dist/segmented-control/index.js +2 -2
- package/dist/select/index.cjs +5 -5
- package/dist/select/index.js +4 -4
- package/dist/snackbar/index.cjs +4 -4
- package/dist/snackbar/index.js +3 -3
- package/dist/split-button/index.cjs +5 -5
- package/dist/split-button/index.js +4 -4
- package/dist/table/index.cjs +16 -16
- package/dist/table/index.cjs.map +1 -1
- package/dist/table/index.js +15 -15
- package/dist/tabs/index.cjs +3 -3
- package/dist/tabs/index.js +2 -2
- package/dist/tag-input/index.cjs +5 -5
- package/dist/tag-input/index.js +4 -4
- package/dist/textarea/index.cjs +3 -3
- package/dist/textarea/index.js +2 -2
- 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 +6 -6
- package/dist/toolbar/index.js +5 -5
- package/package.json +1 -1
- package/dist/Header.types-B3QtuiL-.d.cts +0 -21
- package/dist/Header.types-C6w0FBY8.d.ts +0 -21
- package/dist/chunk-2ZY7M72Q.js.map +0 -1
- package/dist/chunk-4BKTBV2I.js.map +0 -1
- package/dist/chunk-5VM2256W.cjs.map +0 -1
- package/dist/chunk-6HUHH6Y4.cjs.map +0 -1
- package/dist/chunk-74MBKLYI.js.map +0 -1
- package/dist/chunk-A7WQINIG.js.map +0 -1
- package/dist/chunk-AAA6TR5I.cjs +0 -67
- package/dist/chunk-AAA6TR5I.cjs.map +0 -1
- package/dist/chunk-FRUOA2QU.cjs.map +0 -1
- package/dist/chunk-GEHL4LKK.cjs.map +0 -1
- package/dist/chunk-GT22EGJP.cjs.map +0 -1
- package/dist/chunk-IFVT5UCY.js.map +0 -1
- package/dist/chunk-KBG77JHC.js.map +0 -1
- package/dist/chunk-KJZUYC4X.cjs.map +0 -1
- package/dist/chunk-KQD7CQ4Z.cjs.map +0 -1
- package/dist/chunk-O5WEKLNF.js +0 -21
- package/dist/chunk-O5WEKLNF.js.map +0 -1
- package/dist/chunk-P7IQY5YH.js +0 -67
- package/dist/chunk-P7IQY5YH.js.map +0 -1
- package/dist/chunk-QF2RAUPB.cjs.map +0 -1
- package/dist/chunk-REVK7IGN.js.map +0 -1
- package/dist/chunk-RHOT7AEI.cjs.map +0 -1
- package/dist/chunk-SENVA467.js.map +0 -1
- package/dist/chunk-TEJIPPZR.js.map +0 -1
- package/dist/chunk-U5FHQ73U.cjs.map +0 -1
- package/dist/chunk-VHMOKXUT.js.map +0 -1
- package/dist/chunk-VSTQEHVZ.js.map +0 -1
- package/dist/chunk-WUBQJVB7.cjs.map +0 -1
- package/dist/chunk-Z4SLV6WG.cjs +0 -21
- package/dist/chunk-Z4SLV6WG.cjs.map +0 -1
- /package/dist/{chunk-RWOX2NJN.js.map → chunk-25PSIDPC.js.map} +0 -0
- /package/dist/{chunk-H5HWFOWZ.js.map → chunk-2WP27QAN.js.map} +0 -0
- /package/dist/{chunk-EXITZVB2.js.map → chunk-3RLGH45H.js.map} +0 -0
- /package/dist/{chunk-R4PU2TBM.js.map → chunk-4ZWAJTNH.js.map} +0 -0
- /package/dist/{chunk-F26VIKNF.js.map → chunk-ATL7325T.js.map} +0 -0
- /package/dist/{chunk-GHQ6SQPI.js.map → chunk-BHVHM66Z.js.map} +0 -0
- /package/dist/{chunk-Y53HCLGW.js.map → chunk-FALDCW2E.js.map} +0 -0
- /package/dist/{chunk-ZHFPV43D.js.map → chunk-KNQ6NN6L.js.map} +0 -0
- /package/dist/{chunk-YJXZR7RL.js.map → chunk-L5Q6UDY3.js.map} +0 -0
- /package/dist/{chunk-ZEZK664O.js.map → chunk-NWJ6NETE.js.map} +0 -0
- /package/dist/{chunk-5ZL6PYU3.js.map → chunk-O2AACVSF.js.map} +0 -0
- /package/dist/{chunk-SHYSLWQG.js.map → chunk-OAK7HFOJ.js.map} +0 -0
- /package/dist/{chunk-NGVOXM7P.js.map → chunk-QIITXVRG.js.map} +0 -0
- /package/dist/{chunk-GI6VJYOS.js.map → chunk-QUDVJUZU.js.map} +0 -0
- /package/dist/{chunk-SN6EWQDJ.js.map → chunk-RYOQYYDO.js.map} +0 -0
- /package/dist/{chunk-67RFMV6K.js.map → chunk-T2KB3DJJ.js.map} +0 -0
- /package/dist/{chunk-RKA2OJRT.js.map → chunk-TJC7UELT.js.map} +0 -0
- /package/dist/{chunk-LEMCJW57.js.map → chunk-YDPEHUMH.js.map} +0 -0
- /package/dist/{chunk-S3CT536K.js.map → chunk-ZPDETHQ7.js.map} +0 -0
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { T as TextButtonProps, I as IconButtonProps } from './Button.types-BH0CPyPx.js';
|
|
2
|
-
|
|
3
|
-
interface HeaderProps {
|
|
4
|
-
/**
|
|
5
|
-
* Page or section title. Accepts inline nodes alongside the text - a
|
|
6
|
-
* status `Pill`/`Chip` beside the title is the common case - not just a
|
|
7
|
-
* string. Keep the children inline-level; the title is a heading.
|
|
8
|
-
*/
|
|
9
|
-
title: React.ReactNode;
|
|
10
|
-
/** Supporting text rendered below the title. */
|
|
11
|
-
subtitle?: React.ReactNode;
|
|
12
|
-
/** Trailing action buttons, rendered right-aligned. */
|
|
13
|
-
actions?: HeaderActionProps[];
|
|
14
|
-
className?: string;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Restricted, discriminated subset of ButtonProps for Header actions.
|
|
18
|
-
*/
|
|
19
|
-
type HeaderActionProps = Pick<TextButtonProps, 'variant' | 'color' | 'loading' | 'disabled' | 'preIcon' | 'posIcon' | 'icon' | 'children' | 'onClick' | 'tooltip'> | Pick<IconButtonProps, 'variant' | 'color' | 'loading' | 'disabled' | 'preIcon' | 'posIcon' | 'icon' | 'children' | 'onClick' | 'tooltip'>;
|
|
20
|
-
|
|
21
|
-
export type { HeaderActionProps as H, HeaderProps as a };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ThemeProvider/ThemeProvider.component.tsx","../src/components/ThemeProvider/ThemeProvider.context.tsx","../src/components/ThemeProvider/ThemeProvider.color.ts","../src/components/ThemeProvider/ThemeProvider.tokens.ts","../src/components/ThemeProvider/ThemeProvider.fonts.ts"],"sourcesContent":["import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { devWarn } from '../../utils';\nimport { ThemeContext } from './ThemeProvider.context';\nimport { buildTokens, diffFromDefault, resolveTheme, themeToCss } from './ThemeProvider.tokens';\nimport type { ThemeConfig, ThemeContextValue, ThemeProviderProps } from './ThemeProvider.types';\n\nconst EMPTY_THEME: ThemeConfig = {};\n\n/**\n * Number of providers currently mounted.\n *\n * Because tokens are written to `document.documentElement` (see the component\n * comment for why), providers do not compose: two of them target the same\n * element, so whichever applied a given token last wins for the entire page -\n * including for the subtree of the other one. That looks like a broken theme\n * rather than a misuse, so it is worth saying out loud.\n */\nlet mountedProviders = 0;\n\n/** Merges `patch` over `base` one level into `colors`/`typography`. */\nconst mergeTheme = (base: ThemeConfig, patch: ThemeConfig): ThemeConfig => ({\n colors: { ...base.colors, ...patch.colors },\n typography: { ...base.typography, ...patch.typography },\n});\n\n/**\n * Applies a theme by writing CSS custom properties to `document.documentElement`.\n *\n * Two deliberate choices worth knowing:\n *\n * **The target is `documentElement`, not a wrapper element.** Every overlay in\n * this library (`Dropdown`, `Modal`, `Drawer`, `Snackbar`, `Tooltip`, …) portals\n * to `document.body`, so tokens scoped to a wrapper `<div>` would leave every\n * popup rendering the preset instead.\n *\n * **Properties are set through the CSSOM** (`style.setProperty`), which no CSP\n * directive gates - `style-src` and `style-src-attr` only cover the `style`\n * HTML attribute and stylesheet loads. Nothing here needs a nonce, and no\n * `<style>` element is ever created. See `ContentSecurityPolicy.mdx`.\n *\n * Under SSR the server sends the preset from `dist/index.css` and the theme is\n * applied on hydration; use `toCss()` if you need a themed first paint.\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n theme: controlledTheme,\n defaultTheme: initialTheme,\n onThemeChange,\n}) => {\n const isControlled = controlledTheme !== undefined;\n const [uncontrolledTheme, setUncontrolledTheme] = useState<ThemeConfig>(\n initialTheme ?? EMPTY_THEME,\n );\n const theme = isControlled ? controlledTheme : uncontrolledTheme;\n\n useEffect(() => {\n mountedProviders += 1;\n if (mountedProviders > 1) {\n devWarn(\n 'theme-multiple-providers',\n `ThemeProvider: ${mountedProviders} providers are mounted at once. They all write to document.documentElement, so the last one to apply each token wins for the whole page - nested or sibling providers cannot theme separate subtrees. Use a single provider at your app root.`,\n );\n }\n return () => {\n mountedProviders -= 1;\n };\n }, []);\n\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme]);\n const tokens = useMemo(() => diffFromDefault(buildTokens(resolvedTheme)), [resolvedTheme]);\n\n // Names written on the previous pass, so properties dropped from the theme\n // are removed rather than left behind at their last value.\n const appliedRef = useRef<string[]>([]);\n\n useLayoutEffect(() => {\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n\n for (const name of appliedRef.current) {\n if (!(name in tokens)) root.style.removeProperty(name);\n }\n for (const [name, value] of Object.entries(tokens)) {\n root.style.setProperty(name, value);\n }\n appliedRef.current = Object.keys(tokens);\n\n return () => {\n for (const name of appliedRef.current) {\n root.style.removeProperty(name);\n }\n appliedRef.current = [];\n };\n }, [tokens]);\n\n const commit = useCallback(\n (next: ThemeConfig) => {\n if (!isControlled) setUncontrolledTheme(next);\n onThemeChange?.(next);\n },\n [isControlled, onThemeChange],\n );\n\n const setTheme = useCallback((next: ThemeConfig) => commit(next), [commit]);\n\n const updateTheme = useCallback(\n (patch: ThemeConfig) => commit(mergeTheme(theme, patch)),\n [commit, theme],\n );\n\n const resetTheme = useCallback(() => commit(EMPTY_THEME), [commit]);\n\n const toCss = useCallback(() => themeToCss(resolvedTheme), [resolvedTheme]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme,\n resolvedTheme,\n setTheme,\n updateTheme,\n resetTheme,\n isDefault: Object.keys(tokens).length === 0,\n toCss,\n }),\n [theme, resolvedTheme, setTheme, updateTheme, resetTheme, tokens, toCss],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n};\n\nThemeProvider.displayName = 'ThemeProvider';\n","import { createContext, useContext } from 'react';\nimport type { ThemeContextValue } from './ThemeProvider.types';\n\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\n/**\n * Reads the active theme. Throws outside a `ThemeProvider`, matching\n * `useSnackbarContext` - a silent fallback would make a missing provider look\n * like a theme that simply is not applying.\n */\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n","/**\n * Colour maths for the theme system.\n *\n * All conversions are done in JS and emitted as `#rrggbb`, so browser support\n * for `oklch()` is irrelevant here - nothing in the generated CSS uses a modern\n * colour function.\n *\n * OKLab is used rather than HSL for every interpolation. HSL lightness\n * interpolation is ~40 lines shorter but produces muddy, desaturated ramps for\n * exactly the saturated brand hues this feature exists to support, because its\n * \"lightness\" is not perceptual.\n */\n\n// ============================================================================\n// sRGB <-> OKLab\n// ============================================================================\n\nexport interface Oklch {\n /** Perceptual lightness, 0-1. */\n l: number;\n /** Chroma (colourfulness), 0 to ~0.4 in sRGB. */\n c: number;\n /** Hue angle in radians. */\n h: number;\n}\n\nconst srgbToLinear = (v: number): number =>\n v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n\nconst linearToSrgb = (v: number): number =>\n v <= 0.0031308 ? 12.92 * v : 1.055 * Math.pow(v, 1 / 2.4) - 0.055;\n\nconst clamp01 = (v: number): number => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Parses `#rgb` / `#rrggbb` into 0-1 sRGB channels. Returns null if unparseable. */\nexport const parseHex = (hex: string): [number, number, number] | null => {\n if (typeof hex !== 'string') return null;\n const raw = hex.trim().replace(/^#/, '');\n const full =\n raw.length === 3\n ? raw\n .split('')\n .map((c) => c + c)\n .join('')\n : raw;\n if (!/^[0-9a-fA-F]{6}$/.test(full)) return null;\n const n = parseInt(full, 16);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255];\n};\n\nexport const isValidHex = (hex: string): boolean => parseHex(hex) !== null;\n\nconst toHex = ([r, g, b]: [number, number, number]): string =>\n '#' +\n [r, g, b]\n .map((v) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, '0'),\n )\n .join('');\n\n/** `#rrggbb` -> the comma-separated triple the `--x-rgb` tokens use. */\nexport const hexToRgbTriple = (hex: string): string => {\n const rgb = parseHex(hex);\n if (!rgb) return '0, 0, 0';\n return rgb.map((v) => Math.round(v * 255)).join(', ');\n};\n\nconst linearToOklab = ([r, g, b]: [number, number, number]): [number, number, number] => {\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n};\n\nconst oklabToLinear = ([L, A, B]: [number, number, number]): [number, number, number] => {\n const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;\n const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;\n const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n};\n\nexport const hexToOklch = (hex: string): Oklch => {\n const rgb = parseHex(hex) ?? [0, 0, 0];\n const [l, a, b] = linearToOklab(rgb.map(srgbToLinear) as [number, number, number]);\n return { l, c: Math.hypot(a, b), h: Math.atan2(b, a) };\n};\n\nconst inGamut = ([r, g, b]: [number, number, number]): boolean =>\n [r, g, b].every((v) => v >= -1e-4 && v <= 1 + 1e-4);\n\n/**\n * Largest chroma that still fits in sRGB at this lightness and hue.\n *\n * Needed because OKLab is a much larger space than sRGB: naively keeping a\n * colour's chroma while changing its lightness frequently lands outside the\n * gamut, where channels clip and the hue visibly shifts.\n */\nconst maxChroma = (l: number, h: number): number => {\n let lo = 0;\n let hi = 0.45;\n for (let i = 0; i < 24; i++) {\n const mid = (lo + hi) / 2;\n if (inGamut(oklabToLinear([l, mid * Math.cos(h), mid * Math.sin(h)]))) lo = mid;\n else hi = mid;\n }\n return lo;\n};\n\nexport const oklchToHex = ({ l, c, h }: Oklch): string => {\n const lc = clamp01(l);\n const cc = Math.min(Math.max(c, 0), maxChroma(lc, h));\n return toHex(\n oklabToLinear([lc, cc * Math.cos(h), cc * Math.sin(h)]).map(linearToSrgb) as [\n number,\n number,\n number,\n ],\n );\n};\n\n// ============================================================================\n// WCAG 2.1 contrast\n// ============================================================================\n\n/**\n * WCAG 2.1 is used rather than APCA. APCA models perception better but is\n * still a draft (targeted at WCAG 3), while WCAG 2 is what consumers are\n * actually audited against. Its known weakness - mis-ranking some mid-tone\n * blues and greens - is accepted for that reason.\n */\nexport const relativeLuminance = (hex: string): number => {\n const [r, g, b] = (parseHex(hex) ?? [0, 0, 0]).map(srgbToLinear);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/** Contrast ratio between two colours, 1 (identical) to 21 (black on white). */\nexport const contrastRatio = (a: string, b: string): number => {\n const [x, y] = [relativeLuminance(a), relativeLuminance(b)];\n return (Math.max(x, y) + 0.05) / (Math.min(x, y) + 0.05);\n};\n\n/** The two foreground candidates, matching `--white` and `--gray-900`. */\nexport const CONTRAST_LIGHT = '#ffffff';\nexport const CONTRAST_DARK = '#0f172a';\n\n/**\n * Foreground to place on `fill`.\n *\n * White wins unless it drops below 3:1, at which point the better of the two\n * candidates is used. The threshold is deliberately 3:1 rather than \"whichever\n * scores higher\": on mid-tone reds the dark candidate often scores marginally\n * better while looking plainly wrong, and every preset base clears 4.5:1\n * against white anyway.\n */\nexport const pickContrast = (fill: string): string => {\n const onLight = contrastRatio(fill, CONTRAST_LIGHT);\n if (onLight >= 3) return CONTRAST_LIGHT;\n return onLight >= contrastRatio(fill, CONTRAST_DARK) ? CONTRAST_LIGHT : CONTRAST_DARK;\n};\n\n// ============================================================================\n// Ramp generation\n// ============================================================================\n\n/** The ramp steps, in the order `--x-50` … `--x-900` are declared. */\nexport const RAMP_STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900] as const;\n\nexport type RampStep = (typeof RAMP_STEPS)[number];\n\n/** The step the supplied base colour occupies; the ramp is built around it. */\nconst BASE_STEP = 500;\n\n/**\n * Target lightness per step, and how much of the base's chroma to keep.\n *\n * Measured from the preset indigo ramp, so feeding the preset primary through\n * `buildRamp` lands close to the shipped `--primary-*` values rather than\n * something arbitrary. It is deliberately not an exact reproduction - see the\n * note on `buildRamp`.\n */\nconst RAMP_CURVE: Record<RampStep, { l: number; chroma: number }> = {\n 50: { l: 0.962, chroma: 0.09 },\n 100: { l: 0.93, chroma: 0.16 },\n 200: { l: 0.87, chroma: 0.3 },\n 300: { l: 0.785, chroma: 0.51 },\n 400: { l: 0.68, chroma: 0.77 },\n 500: { l: 0.558, chroma: 1.0 },\n 600: { l: 0.511, chroma: 1.12 },\n 700: { l: 0.457, chroma: 1.05 },\n 800: { l: 0.398, chroma: 0.87 },\n 900: { l: 0.359, chroma: 0.66 },\n};\n\n/** Ceiling/floor the generated ends aim for, leaving the base itself untouched. */\nconst LIGHT_CEILING = 0.985;\nconst DARK_FLOOR = 0.22;\n\n/** Minimum lightness gap between adjacent steps, so none can collapse together. */\nconst MIN_STEP_DELTA = 0.012;\n\n/**\n * Generates a 50-900 ramp around `base`, which is placed at the 500 step.\n *\n * The base's own hue is always preserved, and `--x-500` is returned as the base\n * hex verbatim, so the colour a consumer picked is never silently replaced.\n *\n * The curve above is *rescaled* to whatever lightness headroom the base leaves,\n * rather than being applied absolutely or simply shifted:\n *\n * - Applying it absolutely would reassign the base - pick a pale yellow and\n * `--x-500` would come back a mid-olive, contradicting `--x-color`.\n * - Shifting it so 500 sits at the base's lightness pushes the light end past\n * `l = 1`, where it clips and 50/100/200/300 all come out pure white.\n *\n * Rescaling keeps the ends anchored (50 stays near-white, 900 stays dark) and\n * compresses only the side with less room - the scale is capped at 1 so a base\n * sitting where the curve expects it reproduces the curve exactly rather than\n * being stretched past it.\n *\n * Two inputs are genuinely degenerate and are handled rather than solved: a\n * base at or above `LIGHT_CEILING` has no room for tints, and one with zero\n * chroma (pure white, black, any gray) has no saturation to separate them with\n * either. For those the light end converges, and `isRampViable` reports it so\n * the caller can warn. Realistic light picks are fine - `#fde047` still yields\n * five distinct tints.\n */\nexport const buildRamp = (base: string): Record<RampStep, string> => {\n const { l: baseL, c: baseC, h } = hexToOklch(base);\n const anchor = RAMP_CURVE[BASE_STEP].l;\n\n // Headroom available above and below the base, versus what the curve wants.\n // Capped at 1: this may only compress the curve, never stretch it.\n const lightSpan = RAMP_CURVE[50].l - anchor;\n const darkSpan = anchor - RAMP_CURVE[900].l;\n const lightScale =\n lightSpan > 0 ? Math.min(1, Math.max(0, LIGHT_CEILING - baseL) / lightSpan) : 0;\n const darkScale = darkSpan > 0 ? Math.min(1, Math.max(0, baseL - DARK_FLOOR) / darkSpan) : 0;\n\n const out = {} as Record<RampStep, string>;\n for (const step of RAMP_STEPS) {\n if (step === BASE_STEP) {\n out[step] = base;\n continue;\n }\n const { l: curveL, chroma } = RAMP_CURVE[step];\n const offset = curveL - anchor;\n const l = baseL + offset * (offset > 0 ? lightScale : darkScale);\n out[step] = oklchToHex({ l, c: baseC * chroma, h });\n }\n\n return enforceSeparation(out, h, baseC);\n};\n\n/**\n * Walks outward from the base step, pushing any step that ended up too close to\n * its neighbour further away. Only bites for extreme inputs (near-white,\n * near-black, zero-chroma), where the rescale above has almost no room left.\n */\nconst enforceSeparation = (\n ramp: Record<RampStep, string>,\n h: number,\n baseC: number,\n): Record<RampStep, string> => {\n const baseIndex = RAMP_STEPS.indexOf(BASE_STEP);\n const lightness = RAMP_STEPS.map((s) => hexToOklch(ramp[s]).l);\n\n // Lighter steps: walk from the base toward 50, each must be lighter.\n for (let i = baseIndex - 1; i >= 0; i--) {\n const limit = lightness[i + 1] + MIN_STEP_DELTA;\n if (lightness[i] < limit) lightness[i] = Math.min(1, limit);\n }\n // Darker steps: walk from the base toward 900, each must be darker.\n for (let i = baseIndex + 1; i < RAMP_STEPS.length; i++) {\n const limit = lightness[i - 1] - MIN_STEP_DELTA;\n if (lightness[i] > limit) lightness[i] = Math.max(0, limit);\n }\n\n const out = {} as Record<RampStep, string>;\n RAMP_STEPS.forEach((step, i) => {\n if (step === BASE_STEP) {\n out[step] = ramp[step];\n return;\n }\n out[step] = oklchToHex({\n l: lightness[i],\n c: baseC * RAMP_CURVE[step].chroma,\n h,\n });\n });\n return out;\n};\n\n/** How far `--x-dark` / `--x-light` sit from the base, in OKLab lightness. */\nconst DARK_DELTA = 0.086;\nconst LIGHT_DELTA = 0.169;\n\n/** Below this lightness there is no room left to darken, so the hover lightens. */\nconst HOVER_INVERT_BELOW = DARK_DELTA * 1.5;\n\n/**\n * The hover/active colour. Must differ *visibly* from the base and stay legible\n * as text on white, since `--x-dark` is used both as a fill (Button, Chip\n * hovers) and as text (Snackbar, link hover in `global.scss`).\n *\n * A fixed ramp step is not good enough: for a near-white base the 600 step\n * lands barely darker than the base and the hover reads as no change at all.\n * Hence a guaranteed delta.\n *\n * For a base that is already near-black the delta is applied *upwards* instead.\n * Clamping to a floor would return a colour lighter than the base while still\n * being named \"dark\", and returning the base unchanged would leave the control\n * with no hover affordance at all; lightening is what dark-surface design\n * systems do anyway.\n */\nexport const deriveDark = (base: string): string => {\n const { l, c, h } = hexToOklch(base);\n const target = l < HOVER_INVERT_BELOW ? l + DARK_DELTA : l - DARK_DELTA;\n return oklchToHex({ l: target, c, h });\n};\n\n/**\n * The light companion. Lightening has a hard ceiling, so for an already-pale\n * base this lands very close to it - acceptable, as `--x-light` is a public\n * token that nothing inside the library currently consumes.\n */\nexport const deriveLight = (base: string): string => {\n const { l, c, h } = hexToOklch(base);\n return oklchToHex({ l: Math.min(LIGHT_CEILING, l + LIGHT_DELTA), c, h });\n};\n\n/**\n * Whether `base` leaves enough lightness headroom to generate a usable 50-900\n * ramp. False only for near-white and near-black, where the tint or shade end\n * necessarily converges - the caller surfaces that as a developer warning\n * rather than silently shipping identical tokens.\n *\n * Deliberately does not test chroma: an unsaturated gray separates perfectly\n * well by lightness alone, and a saturated light colour like `#fde047` still\n * produces five distinct tints. Only the extremes genuinely fail.\n */\nexport const isRampViable = (base: string): boolean => {\n const { l } = hexToOklch(base);\n return l < 0.95 && l > 0.12;\n};\n","import { devWarn } from '../../utils';\nimport {\n RAMP_STEPS,\n buildRamp,\n deriveDark,\n deriveLight,\n hexToRgbTriple,\n isValidHex,\n isRampViable,\n pickContrast,\n} from './ThemeProvider.color';\nimport type {\n ResolvedTheme,\n ThemeColorKey,\n ThemeColorValue,\n ThemeConfig,\n} from './ThemeProvider.types';\n\nexport const THEME_COLOR_KEYS: readonly ThemeColorKey[] = [\n 'primary',\n 'secondary',\n 'success',\n 'danger',\n 'warning',\n 'info',\n 'hyperlink',\n] as const;\n\n/**\n * `hyperlink` is link text on a surface, never a fill, so it has no\n * `--hyperlink-contrast` token - nothing in the library would read it.\n */\nconst FILL_COLOR_KEYS: readonly ThemeColorKey[] = [\n 'primary',\n 'secondary',\n 'success',\n 'danger',\n 'warning',\n 'info',\n] as const;\n\n/** Only `primary` has a 50-900 ramp in `variables.scss`. */\nconst RAMP_COLOR_KEY: ThemeColorKey = 'primary';\n\n/** The eight preset `--font-size-*` values, in declaration order. */\nconst FONT_SIZE_STEPS: readonly [string, number][] = [\n ['xs', 0.75],\n ['sm', 0.875],\n ['base', 1],\n ['md', 1.1],\n ['lg', 1.125],\n ['xl', 1.25],\n ['2xl', 1.5],\n ['3xl', 1.875],\n] as const;\n\n/**\n * The shipped values from `src/styles/variables.scss`.\n *\n * This is a literal copy, not something derived: the ramp is hand-tuned and no\n * generator reproduces it byte for byte. Keeping it literal means a theme equal\n * to the preset writes no CSS properties at all, so default rendering is\n * identical to `dist/index.css`.\n *\n * Must be kept in sync with `variables.scss` by hand. The bases are all chosen\n * to clear WCAG AA against white text; see the comment at the top of that file.\n */\nexport const defaultTheme: Required<ThemeConfig> = {\n colors: {\n primary: '#5c5de8',\n secondary: '#617087',\n success: '#007f57',\n danger: '#d6272f',\n warning: '#9c6300',\n info: '#007a90',\n hyperlink: '#007b84',\n },\n typography: {\n fontFamily:\n \"'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\",\n monoFamily:\n \"'JetBrains Mono', 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Source Code Pro', monospace\",\n fontScale: 1,\n },\n};\n\n/** The preset `--primary-*` ramp, needed so an unthemed primary emits nothing. */\nconst DEFAULT_PRIMARY_RAMP: Record<number, string> = {\n 50: '#eef2ff',\n 100: '#e0e7ff',\n 200: '#c7d2fe',\n 300: '#a5b4fc',\n 400: '#818cf8',\n 500: '#5c5de8',\n 600: '#4f46e5',\n 700: '#4338ca',\n 800: '#3730a3',\n 900: '#312e81',\n};\n\nexport const FONT_SCALE_MIN = 0.875;\nexport const FONT_SCALE_MAX = 1.25;\n\nconst normalizeColor = (value: ThemeColorValue): { base: string; contrast?: string } =>\n typeof value === 'string' ? { base: value } : value;\n\n/** Fills every absent field from the preset. */\nexport const resolveTheme = (theme: ThemeConfig): ResolvedTheme => {\n const colors = {} as ResolvedTheme['colors'];\n\n for (const key of THEME_COLOR_KEYS) {\n const supplied = theme.colors?.[key];\n const fallback = normalizeColor(defaultTheme.colors[key]!);\n if (supplied === undefined) {\n colors[key] = fallback;\n continue;\n }\n const { base, contrast } = normalizeColor(supplied);\n if (!isValidHex(base)) {\n devWarn(\n `theme-color-${key}`,\n `ThemeProvider: colors.${key} is not a valid hex colour (received ${JSON.stringify(base)}). Falling back to the preset.`,\n );\n colors[key] = fallback;\n continue;\n }\n if (contrast !== undefined && !isValidHex(contrast)) {\n devWarn(\n `theme-contrast-${key}`,\n `ThemeProvider: colors.${key}.contrast is not a valid hex colour (received ${JSON.stringify(contrast)}). It will be computed instead.`,\n );\n colors[key] = { base };\n continue;\n }\n colors[key] = contrast === undefined ? { base } : { base, contrast };\n }\n\n const scale = theme.typography?.fontScale;\n let fontScale = defaultTheme.typography.fontScale!;\n if (scale !== undefined) {\n if (!Number.isFinite(scale) || scale < FONT_SCALE_MIN || scale > FONT_SCALE_MAX) {\n devWarn(\n 'theme-font-scale',\n `ThemeProvider: typography.fontScale must be between ${FONT_SCALE_MIN} and ${FONT_SCALE_MAX} (received ${String(scale)}). Falling back to ${fontScale}.`,\n );\n } else {\n fontScale = scale;\n }\n }\n\n return {\n colors,\n typography: {\n fontFamily: theme.typography?.fontFamily || defaultTheme.typography.fontFamily!,\n monoFamily: theme.typography?.monoFamily || defaultTheme.typography.monoFamily!,\n fontScale,\n },\n };\n};\n\n/**\n * Expands a resolved theme into the flat `--token: value` map to apply.\n *\n * Every family contributes `--x-color`, `--x-rgb`, `--x-dark` and `--x-light`;\n * the six fill families also get `--x-contrast`, and `primary` additionally\n * gets the full `--primary-50…900` ramp.\n */\nexport const buildTokens = (resolved: ResolvedTheme): Record<string, string> => {\n const tokens: Record<string, string> = {};\n\n for (const key of THEME_COLOR_KEYS) {\n const { base, contrast } = resolved.colors[key];\n tokens[`--${key}-color`] = base;\n tokens[`--${key}-rgb`] = hexToRgbTriple(base);\n tokens[`--${key}-dark`] = deriveDark(base);\n tokens[`--${key}-light`] = deriveLight(base);\n\n if (FILL_COLOR_KEYS.includes(key)) {\n tokens[`--${key}-contrast`] = contrast ?? pickContrast(base);\n }\n\n if (key === RAMP_COLOR_KEY) {\n const isPreset = base === normalizeColor(defaultTheme.colors[key]!).base;\n // The preset ramp is hand-tuned, so reuse it verbatim rather than\n // regenerating a near-identical one.\n const ramp = isPreset ? DEFAULT_PRIMARY_RAMP : buildRamp(base);\n if (!isPreset && !isRampViable(base)) {\n devWarn(\n `theme-ramp-${key}`,\n `ThemeProvider: colors.${key} (${base}) is too light or too dark to generate a usable --${key}-50…900 scale; several steps will be identical. Pick a colour with more headroom.`,\n );\n }\n for (const step of RAMP_STEPS) {\n tokens[`--${key}-${step}`] = ramp[step];\n }\n }\n }\n\n const { fontFamily, monoFamily, fontScale } = resolved.typography;\n tokens['--font-family-primary'] = fontFamily;\n tokens['--font-family-mono'] = monoFamily;\n for (const [name, rem] of FONT_SIZE_STEPS) {\n // Trailing zeros trimmed so 1 * 0.75 reads as `0.75rem`, not `0.750rem`.\n tokens[`--font-size-${name}`] = `${parseFloat((rem * fontScale).toFixed(4))}rem`;\n }\n\n return tokens;\n};\n\n/** Tokens for the preset, used to tell which of them are actually overrides. */\nconst DEFAULT_TOKENS = buildTokens(resolveTheme(defaultTheme));\n\n/**\n * Only the tokens that differ from the preset.\n *\n * This is what makes an unthemed `ThemeProvider` a no-op: it writes nothing, so\n * `dist/index.css` stays authoritative and there is no inline-style churn on\n * `documentElement` for values that already match.\n */\nexport const diffFromDefault = (tokens: Record<string, string>): Record<string, string> => {\n const diff: Record<string, string> = {};\n for (const [name, value] of Object.entries(tokens)) {\n if (DEFAULT_TOKENS[name] !== value) diff[name] = value;\n }\n return diff;\n};\n\n/**\n * The resolved theme as a `:root { … }` block.\n *\n * Paste the output into your own stylesheet to bake a theme in at build time -\n * that avoids the brief flash of the preset that any runtime theme has when the\n * value arrives after first paint, and needs no JavaScript at all.\n */\nexport const themeToCss = (resolved: ResolvedTheme): string => {\n const tokens = buildTokens(resolved);\n const body = Object.entries(tokens)\n .map(([name, value]) => ` ${name}: ${value};`)\n .join('\\n');\n return `:root {\\n${body}\\n}`;\n};\n","/**\n * Runtime font registration for the theme system.\n *\n * `--font-family-primary` only *names* families - it cannot make a font\n * available. Selecting \"Plus Jakarta Sans\" on a machine that doesn't have it\n * installed silently falls through to the next stack entry, which is why a\n * theme needs a way to supply the font data itself.\n *\n * ## Why this is CSP-safe\n *\n * Fonts are registered with the CSS Font Loading API from an `ArrayBuffer`:\n *\n * ```ts\n * document.fonts.add(new FontFace(family, buffer));\n * ```\n *\n * CSP's `font-src` directive governs *fetching* a font resource by URL - it is\n * what gates `@font-face { src: url(...) }` and the string form of the\n * `FontFace` constructor. The binary form performs no fetch at all, so there is\n * no request for `font-src` to check and no allowance to configure. Notably\n * this also avoids `blob:` URLs, which *would* require `font-src blob:`.\n *\n * No `<style>` element is created either, so nothing here needs a nonce - the\n * same position as the rest of the theme system.\n */\n\n/** A font registered at runtime, as listed by the editor. */\nexport interface RegisteredFont {\n /** The family name to reference in a font stack. */\n family: string;\n /** Where it came from, so the UI can distinguish uploads from built-ins. */\n source: 'upload';\n}\n\n/**\n * Turns a filename into a usable CSS family name.\n *\n * Deliberately conservative: the real family name lives in the font's internal\n * `name` table, and parsing SFNT tables to read it would be a disproportionate\n * amount of binary handling for a label. The filename is what the user\n * recognises anyway.\n */\nexport const familyNameFromFile = (filename: string): string => {\n const base = filename.replace(/\\.[^.]+$/, '');\n const cleaned = base\n // Strip the weight/style suffixes font vendors append.\n .replace(/[-_](regular|normal|book|roman)$/i, '')\n .replace(/[-_]+/g, ' ')\n // A quoted family name may contain spaces but not quotes or control chars.\n .replace(/[\"'\\\\]/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n return cleaned || 'Custom Font';\n};\n\n/** Wraps a family name for use in a CSS font stack if it needs quoting. */\nexport const quoteFamily = (family: string): string =>\n /^[a-zA-Z][a-zA-Z0-9-]*$/.test(family) ? family : `'${family}'`;\n\n/**\n * Builds a full stack from a custom family, keeping sensible fallbacks so the\n * page stays readable if the font is ever unavailable.\n */\nexport const toFontStack = (family: string, mono = false): string =>\n mono\n ? `${quoteFamily(family)}, 'SF Mono', Monaco, monospace`\n : `${quoteFamily(family)}, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif`;\n\n/** Font formats accepted for upload, as an `accept` attribute value. */\nexport const FONT_ACCEPT = '.woff2,.woff,.ttf,.otf';\n\nconst SUPPORTED_EXTENSIONS = /\\.(woff2|woff|ttf|otf)$/i;\n\nexport const isSupportedFontFile = (filename: string): boolean =>\n SUPPORTED_EXTENSIONS.test(filename);\n\n/**\n * Registers font data with the document so a theme can reference its family.\n *\n * Resolves with the family name actually registered. Rejects if the data is not\n * a font the browser can parse, or if the Font Loading API is unavailable\n * (notably during SSR, where there is no `document` to register against).\n */\nexport const registerFontFace = async (family: string, data: ArrayBuffer): Promise<string> => {\n if (typeof document === 'undefined' || !document.fonts) {\n throw new Error('registerFontFace requires a document with the CSS Font Loading API.');\n }\n\n // ArrayBuffer source - no URL is fetched, so CSP's font-src never applies.\n const face = new FontFace(family, data);\n await face.load();\n document.fonts.add(face);\n // No cache invalidation needed: only positive results are cached, and this\n // family could not have been cached positive while it was still unavailable.\n // `document.fonts.add` also fires `loadingdone`, which wakes subscribers.\n return family;\n};\n\n/** Reads a File and registers it, returning the family name it was given. */\nexport const registerFontFile = async (file: File, family?: string): Promise<string> => {\n if (!isSupportedFontFile(file.name)) {\n throw new Error(`Unsupported font format: ${file.name}. Use ${FONT_ACCEPT}.`);\n }\n const buffer = await file.arrayBuffer();\n return registerFontFace(family ?? familyNameFromFile(file.name), buffer);\n};\n\n/**\n * CSS generic families, which always resolve and must never be reported\n * missing. They also cannot be probed by the method below, since asking for\n * `monospace, monospace` measures identically to `monospace` alone.\n */\nconst GENERIC_FAMILIES = new Set([\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n 'inherit',\n 'initial',\n 'unset',\n]);\n\n/**\n * Mixed-width glyphs, so a real font is very unlikely to measure identically\n * to a fallback by coincidence.\n */\nconst PROBE_TEXT = 'mmmmmmmmmmlliI0OWw@';\n\n/** Two structurally different fallbacks - a font need only differ from one. */\nconst PROBE_FALLBACKS = ['monospace', 'serif'] as const;\n\n/**\n * Cached per family - **positive results only**.\n *\n * A negative answer is not stable: web fonts load asynchronously (always, with\n * `font-display: swap`), so a family probed during the first render is\n * legitimately unavailable and becomes available moments later. Caching that\n * `false` pinned the answer forever, which showed a permanent \"not installed\"\n * warning for fonts that had in fact loaded.\n *\n * A positive answer cannot go stale the same way - a loaded font is not\n * unloaded - so those are worth keeping. Re-probing the misses costs one canvas\n * measurement each.\n */\nconst availabilityCache = new Map<string, true>();\n\n/**\n * Notifies when the set of usable fonts changes, so a caller rendering an\n * availability state can re-check.\n *\n * Both signals are needed: `loadingdone` covers fonts that begin loading after\n * subscription, while `ready` covers those already in flight when the listener\n * was attached - which is the common case for a stylesheet's `@font-face`\n * rules, since they start loading before any component mounts.\n */\nexport const subscribeToFontLoads = (onChange: () => void): (() => void) => {\n if (typeof document === 'undefined' || !document.fonts) return () => {};\n\n let active = true;\n const handler = () => {\n if (active) onChange();\n };\n\n document.fonts.addEventListener('loadingdone', handler);\n void document.fonts.ready.then(handler);\n\n return () => {\n active = false;\n document.fonts.removeEventListener('loadingdone', handler);\n };\n};\n\n/**\n * Whether a font family will actually render, rather than silently falling\n * through to the next entry in the stack.\n *\n * **`document.fonts.check` cannot answer this.** Per spec it reports whether\n * the faces *in the FontFaceSet* matching the query are loaded, so with no\n * matching face it returns `true` vacuously. Verified in a real browser: it\n * answers `true` for `'Totally Not A Real Font 12345'`, and therefore for every\n * uninstalled system font too. Using it here produced a check that could never\n * fail.\n *\n * Instead the family is measured on a canvas against two fallbacks. If it\n * resolves to anything real, the text measures differently from at least one\n * fallback alone; if it does not resolve, the browser renders that fallback and\n * the widths match exactly.\n */\nexport const isFontAvailable = (family: string): boolean => {\n const name = family.trim().replace(/^['\"]|['\"]$/g, '');\n if (!name) return true;\n if (GENERIC_FAMILIES.has(name.toLowerCase())) return true;\n if (typeof document === 'undefined') return true;\n\n if (availabilityCache.get(name)) return true;\n\n try {\n const context = document.createElement('canvas').getContext('2d');\n if (!context) return true;\n\n const available = PROBE_FALLBACKS.some((fallback) => {\n context.font = `100px ${fallback}`;\n const baseline = context.measureText(PROBE_TEXT).width;\n context.font = `100px ${quoteFamily(name)}, ${fallback}`;\n // An invalid font shorthand leaves `font` untouched, which measures as\n // the baseline and correctly reports the family as unavailable.\n return Math.abs(context.measureText(PROBE_TEXT).width - baseline) > 0.5;\n });\n\n if (available) availabilityCache.set(name, true);\n return available;\n } catch {\n // Never report a font missing because probing itself failed - and don't\n // cache a failure, so a later call can still get a real answer.\n return true;\n }\n};\n\n/** Whether the first family in a stack will render. */\nexport const isFontStackAvailable = (stack: string): boolean =>\n isFontAvailable(stack.split(',')[0] ?? '');\n"],"mappings":"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","names":["value"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Dropdown/Dropdown.context.types.ts","../src/components/Dropdown/Dropdown.context.tsx","../src/components/Dropdown/Dropdown.hooks.ts","../src/components/Dropdown/Dropdown.component.tsx"],"sourcesContent":["import { createContext } from 'react';\n\nexport interface DropdownContextValue {\n level: number;\n}\n\nexport const DropdownContext = createContext<DropdownContextValue>({ level: 0 });\n","import React from 'react';\nimport { DropdownContext } from './Dropdown.context.types';\n\nexport const DropdownProvider: React.FC<{ children: React.ReactNode; level?: number }> = ({\n children,\n level = 0,\n}) => {\n return <DropdownContext.Provider value={{ level }}>{children}</DropdownContext.Provider>;\n};\n","import { useContext } from 'react';\nimport { DropdownContext } from './Dropdown.context.types';\n\nexport const useDropdownContext = () => {\n return useContext(DropdownContext);\n};\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { DropdownProps, DropdownState } from './Dropdown.types';\nimport { DropdownProvider } from './Dropdown.context';\nimport { useDropdownContext } from './Dropdown.hooks';\n\nconst DropdownInternal: React.FC<DropdownProps> = ({\n trigger,\n content,\n placement: preferredPlacement = 'bottom',\n align = 'start',\n delay = 0,\n disabled = false,\n defaultOpen = false,\n triggerClassName = '',\n contentClassName = '',\n closeOnClickOutside = true,\n closeOnEscape = true,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n autoWidth = true,\n fullWidth = false,\n triggerRef: externalTriggerRef,\n isNested = false,\n dropdownLevel,\n dropdownGroup,\n}) => {\n const context = useDropdownContext();\n const actualLevel = dropdownLevel !== undefined ? dropdownLevel : context.level;\n const [dropdownState, setDropdownState] = useState<DropdownState>({\n isVisible: defaultOpen,\n isPositioned: false,\n position: { top: 0, left: 0, placement: preferredPlacement },\n });\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const isScrollingRef = useRef(false);\n\n // The element to actually measure/anchor against. When a consumer passes\n // `triggerRef`, that's an explicit statement of \"this is what I want the\n // dropdown positioned relative to\" - it must win over the internal wrapper\n // div, not just inform sizing. Consumers occasionally need `trigger` to be\n // a small anchor node (e.g. a 0-height span) sitting inside a larger,\n // variable-content field (chips, wrapped text); anchoring position to the\n // wrapper instead of that field silently drifts as soon as the field's\n // internal layout changes, since the wrapper only ever contains `trigger`\n // itself, never the field around it.\n const getTriggerElement = useCallback(\n (): HTMLElement | null => externalTriggerRef?.current ?? triggerRef.current,\n [externalTriggerRef],\n );\n\n const calculateDynamicSizing = useCallback(\n (triggerRect: DOMRect) => {\n // Shrink the panel to its content by default. This prevents the\n // position:fixed element from expanding to viewport width when children\n // use `width:100%` or `flex:1`. `minWidth` (set below) still wins when\n // the trigger is wider than the content, as CSS min-width overrides width.\n const styles: Record<string, string | number> = { width: 'max-content' };\n\n if (autoWidth && (externalTriggerRef?.current || triggerRef.current)) {\n const triggerWidth = triggerRect.width;\n styles.minWidth = triggerWidth;\n }\n\n if (minWidth !== undefined) {\n styles.minWidth = typeof minWidth === 'number' ? `${minWidth}px` : minWidth;\n }\n if (maxWidth !== undefined) {\n if (maxWidth === 'auto') {\n styles.maxWidth = 'none';\n } else {\n styles.maxWidth = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n }\n }\n if (minHeight !== undefined) {\n styles.minHeight = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n }\n if (maxHeight !== undefined) {\n if (maxHeight === 'auto') {\n styles.maxHeight = 'none';\n } else {\n styles.maxHeight = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n }\n }\n\n const hasHeightConstraint = minHeight !== undefined || maxHeight !== undefined;\n if (hasHeightConstraint) {\n styles.overflowY = 'auto';\n } else {\n styles.overflowY = 'visible';\n }\n\n return styles;\n },\n [autoWidth, externalTriggerRef, minWidth, maxWidth, minHeight, maxHeight],\n );\n\n const calculateOptimalPosition = useCallback(\n (triggerRect: DOMRect, contentRect: DOMRect) => {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 8;\n\n let placement: 'top' | 'bottom' | 'left' | 'right' = preferredPlacement;\n let top = 0;\n let left = 0;\n\n // Helpers for cross-axis alignment\n const alignedLeft = (() => {\n switch (align) {\n case 'end':\n return triggerRect.right - contentRect.width;\n case 'center':\n return triggerRect.left + (triggerRect.width - contentRect.width) / 2;\n default:\n return triggerRect.left; // \"start\"\n }\n })();\n const alignedTop = (() => {\n switch (align) {\n case 'end':\n return triggerRect.bottom - contentRect.height;\n case 'center':\n return triggerRect.top + (triggerRect.height - contentRect.height) / 2;\n default:\n return triggerRect.top; // \"start\"\n }\n })();\n\n switch (preferredPlacement) {\n case 'top':\n top = triggerRect.top - contentRect.height - gap;\n left = alignedLeft;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = alignedLeft;\n break;\n case 'left':\n top = alignedTop;\n left = triggerRect.left - contentRect.width - gap;\n break;\n case 'right':\n top = alignedTop;\n left = triggerRect.right + gap;\n break;\n }\n\n if (placement === 'top' && top < gap) {\n placement = 'bottom';\n top = triggerRect.bottom + gap;\n } else if (placement === 'bottom' && top + contentRect.height > viewportHeight - gap) {\n placement = 'top';\n top = triggerRect.top - contentRect.height - gap;\n } else if (placement === 'left' && left < gap) {\n placement = 'right';\n left = triggerRect.right + gap;\n } else if (placement === 'right' && left + contentRect.width > viewportWidth - gap) {\n placement = 'left';\n left = triggerRect.left - contentRect.width - gap;\n }\n\n // Always clamp to both viewport edges - not just the near one - regardless\n // of whether an explicit min/max size was passed. `autoWidth` consumers\n // (Combobox, Select, TagInput suggestions, Menu, ...) never set\n // minWidth/maxWidth, so gating this on those props left the far edge\n // (right/bottom) completely unclamped and let content overflow the\n // viewport whenever it rendered wider/taller than its trigger.\n top = Math.max(gap, Math.min(top, viewportHeight - contentRect.height - gap));\n\n left = Math.max(gap, Math.min(left, viewportWidth - contentRect.width - gap));\n\n return { top, left, placement };\n },\n [preferredPlacement, align],\n );\n\n const handleScroll = useCallback(() => {\n if (!dropdownState.isVisible || !dropdownState.isPositioned || isScrollingRef.current) return;\n\n isScrollingRef.current = true;\n\n animationFrameRef.current = requestAnimationFrame(() => {\n const triggerElement = getTriggerElement();\n if (triggerElement && contentRef.current) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n\n isScrollingRef.current = false;\n });\n }, [\n dropdownState.isVisible,\n dropdownState.isPositioned,\n calculateOptimalPosition,\n getTriggerElement,\n ]);\n\n const handleTriggerClick = useCallback(() => {\n if (disabled) return;\n\n if (dropdownState.isVisible) {\n setDropdownState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n } else {\n if (dropdownGroup) {\n const siblingDropdowns = document.querySelectorAll(\n `[data-dropdown-group=\"${dropdownGroup}\"][data-dropdown-content]`,\n );\n siblingDropdowns.forEach((dropdown) => {\n const dropdownElement = dropdown as HTMLElement;\n\n dropdownElement.dispatchEvent(new CustomEvent('closeSibling'));\n });\n }\n\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => {\n setDropdownState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }, delay);\n } else {\n setDropdownState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }\n }\n }, [disabled, dropdownState.isVisible, delay, dropdownGroup]);\n\n useEffect(() => {\n const handleCloseSibling = () => {\n if (dropdownState.isVisible) {\n setDropdownState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }\n };\n\n const currentContentRef = contentRef.current;\n if (currentContentRef) {\n currentContentRef.addEventListener('closeSibling', handleCloseSibling);\n }\n\n return () => {\n if (currentContentRef) {\n currentContentRef.removeEventListener('closeSibling', handleCloseSibling);\n }\n };\n }, [dropdownState.isVisible]);\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (!closeOnClickOutside || !dropdownState.isVisible) return;\n\n const target = event.target as Node;\n\n if (contentRef.current?.contains(target)) {\n return;\n }\n\n if (getTriggerElement()?.contains(target)) {\n return;\n }\n\n const allDropdowns = document.querySelectorAll('[data-dropdown-content]');\n for (const dropdown of allDropdowns) {\n if (dropdown === contentRef.current) continue;\n\n if (dropdown.contains(target)) {\n const clickedDropdownLevel = parseInt(\n dropdown.getAttribute('data-dropdown-level') || '0',\n );\n\n if (clickedDropdownLevel > actualLevel) {\n return;\n }\n }\n }\n\n setDropdownState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n },\n [closeOnClickOutside, dropdownState.isVisible, actualLevel, getTriggerElement],\n );\n\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (closeOnEscape && event.key === 'Escape' && dropdownState.isVisible) {\n setDropdownState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }\n },\n [closeOnEscape, dropdownState.isVisible],\n );\n\n useEffect(() => {\n const triggerElement = getTriggerElement();\n if (\n dropdownState.isVisible &&\n !dropdownState.isPositioned &&\n contentRef.current &&\n triggerElement\n ) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n isPositioned: true,\n }));\n }\n }, [\n dropdownState.isVisible,\n dropdownState.isPositioned,\n calculateOptimalPosition,\n getTriggerElement,\n ]);\n\n useEffect(() => {\n const handleResize = () => {\n const triggerElement = getTriggerElement();\n if (\n dropdownState.isVisible &&\n dropdownState.isPositioned &&\n contentRef.current &&\n triggerElement\n ) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [\n dropdownState.isVisible,\n dropdownState.isPositioned,\n calculateOptimalPosition,\n getTriggerElement,\n ]);\n\n useEffect(() => {\n if (dropdownState.isVisible) {\n window.addEventListener('scroll', handleScroll, { passive: true });\n\n document.body.addEventListener('scroll', handleScroll, { passive: true });\n }\n\n return () => {\n window.removeEventListener('scroll', handleScroll);\n document.body.removeEventListener('scroll', handleScroll);\n };\n }, [dropdownState.isVisible, handleScroll]);\n\n useEffect(() => {\n if (dropdownState.isVisible) {\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [dropdownState.isVisible, handleClickOutside, handleEscapeKey]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, []);\n\n return (\n <>\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className={`eidos-dropdown-trigger ${fullWidth ? 'eidos-dropdown-trigger--fullWidth' : ''} ${triggerClassName}`}\n role=\"button\"\n tabIndex={-1}\n >\n {trigger}\n </div>\n {dropdownState.isVisible &&\n createPortal(\n <div\n ref={contentRef}\n data-dropdown-content\n data-dropdown-level={actualLevel}\n data-dropdown-group={dropdownGroup || ''}\n className={`eidos-dropdown-content eidos-dropdown-content--${dropdownState.position.placement} ${isNested ? 'eidos-dropdown-content--nested' : ''} ${dropdownState.isPositioned ? 'eidos-dropdown-content--positioned' : ''} ${contentClassName || ''}`}\n style={{\n top: dropdownState.position.top,\n left: dropdownState.position.left,\n ...calculateDynamicSizing(\n getTriggerElement()?.getBoundingClientRect() || new DOMRect(),\n ),\n }}\n role=\"menu\"\n >\n {content}\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nexport const Dropdown: React.FC<DropdownProps> = (props) => {\n const context = useDropdownContext();\n const nextLevel = props.dropdownLevel !== undefined ? props.dropdownLevel : context.level + 1;\n\n return (\n <DropdownProvider level={nextLevel}>\n <DropdownInternal {...props} />\n </DropdownProvider>\n );\n};\n\nDropdown.displayName = 'Dropdown';\n"],"mappings":"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","names":["jsx"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-5VM2256W.cjs","../src/components/Input/Input.component.tsx"],"names":["currentValue"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-5VM2256W.cjs","sourcesContent":[null,"import React, { forwardRef, useState, useId } from 'react';\nimport { Eye, EyeOff, CircleAlert, X, ChevronDown } from 'lucide-react';\nimport { renderIcon } from '../../utils';\nimport type { InputProps } from './Input.types';\nimport { Tooltip } from '../Tooltip/Tooltip.component';\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n className = '',\n width,\n label,\n error,\n disclaimerIcon,\n disclaimerContent,\n preIcon,\n posIcon,\n posIconButton = false,\n onPosIconClick,\n type = 'text',\n id,\n name,\n required,\n isSelect = false,\n clearable = true,\n fullWidth = false,\n ...inputProps\n },\n ref,\n ) => {\n // Extract defaultValue so it never reaches the native <input> alongside `value`.\n // Passing both causes React's \"controlled/uncontrolled\" warning because we always\n // set value={currentValue} below - defaultValue is only needed to seed local state.\n const { defaultValue, ...restInputProps } = inputProps;\n\n const [showPassword, setShowPassword] = useState(false);\n const [localValue, setLocalValue] = useState(defaultValue || '');\n const [isFocused, setIsFocused] = useState(false);\n\n // Auto-generate id and name if not provided\n const generatedId = useId();\n const inputId = id || `input-${generatedId}`;\n const inputName = name || inputId;\n\n // Determine if using controlled or uncontrolled mode\n const isControlled = restInputProps.value !== undefined;\n const currentValue = isControlled ? restInputProps.value : localValue;\n\n // For select inputs, don't manage localValue - let the select component handle it\n // This prevents the Input's clear button from showing\n\n // Determine if label should float (only when there's content - static behavior)\n // For select inputs, keep label completely static (never float)\n const shouldFloatLabel = isSelect ? false : currentValue || defaultValue;\n\n // Check if field is required (from props or enhanced register function)\n const isRequired = required || Boolean('required' in restInputProps && restInputProps.required);\n\n // Handle number input to allow decimals and negative numbers\n const handleNumberInput = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (type === 'number') {\n const allowedKeys = [\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Escape',\n 'Enter',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n ];\n const isNumber = /[0-9]/.test(e.key);\n const isDecimal = /[.,]/.test(e.key);\n const isMinus = e.key === '-';\n const isAllowedKey = allowedKeys.includes(e.key);\n const isControlKey = e.ctrlKey || e.metaKey;\n\n // Allow minus only at the beginning or when no text is selected\n if (isMinus) {\n const selectionStart = e.currentTarget.selectionStart || 0;\n const selectionEnd = e.currentTarget.selectionEnd || 0;\n const hasSelection = selectionStart !== selectionEnd;\n\n // Allow if at beginning or if replacing selected text\n if (selectionStart !== 0 && !hasSelection) {\n e.preventDefault();\n return;\n }\n }\n\n // Allow decimal only once\n if (isDecimal) {\n const currentValue = e.currentTarget.value;\n const hasDecimal = /[.,]/.test(currentValue);\n if (hasDecimal) {\n e.preventDefault();\n return;\n }\n }\n\n if (!isNumber && !isDecimal && !isMinus && !isAllowedKey && !isControlKey) {\n e.preventDefault();\n }\n }\n };\n\n // Handle input change for number inputs\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n // Only update localValue if uncontrolled and not a select input\n if (!isControlled && !isSelect) {\n setLocalValue(value);\n }\n restInputProps.onChange?.(e);\n };\n\n // Handle clear button\n const handleClear = () => {\n // Update localValue if uncontrolled\n if (!isControlled) {\n setLocalValue('');\n }\n\n // Create a proper synthetic event for React Hook Form\n const syntheticEvent = {\n target: {\n value: '',\n name: inputName,\n id: inputId,\n type: actualType,\n },\n } as React.ChangeEvent<HTMLInputElement>;\n\n // Call the form's onChange handler\n restInputProps.onChange?.(syntheticEvent);\n\n // Also try to update the input element directly\n if (ref && typeof ref === 'object' && ref.current) {\n ref.current.value = '';\n }\n };\n\n // Handle focus and blur\n const handleFocus = () => {\n setIsFocused(true);\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n };\n\n // Determine actual input type (handle password visibility)\n const actualType = type === 'password' ? (showPassword ? 'text' : 'password') : type;\n\n // Generate CSS classes\n const inputClasses = [\n 'eidos-input',\n `eidos-input--${variant}`,\n `eidos-input--${color}`,\n `eidos-input--${size}`,\n fullWidth && `eidos-input--fullWidth`,\n loading && `eidos-input--loading`,\n error && `eidos-input--error`,\n ]\n .filter(Boolean)\n .join(' ');\n\n const wrapperClasses = [\n 'eidos-input-wrapper',\n `eidos-input-wrapper--${variant}`,\n `eidos-input-wrapper--${color}`,\n `eidos-input-wrapper--${size}`,\n fullWidth && `eidos-input-wrapper--fullWidth`,\n loading && `eidos-input-wrapper--loading`,\n isFocused && `eidos-input-wrapper--focused`,\n error && `eidos-input-wrapper--error`,\n ]\n .filter(Boolean)\n .join(' ');\n\n const labelClasses = [\n 'eidos-input-label',\n shouldFloatLabel && `eidos-input-label--floating`,\n disclaimerIcon && `eidos-input-label--with-icon`,\n error && `eidos-input-label--error`,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n className={`eidos-input-container ${fullWidth ? `eidos-input-container--fullWidth` : ''} ${className}`}\n // `width` sizes the whole field, so it belongs on the container rather\n // than on the inner <input> (which is a `flex: 1 1 0` child of the\n // wrapper and only ever fills whatever the wrapper gives it). Applying\n // it here also keeps it a *preferred* width: `max-width: 100%` lets the\n // field shrink inside a narrower parent instead of overflowing it.\n style={\n width\n ? { width: typeof width === 'number' ? `${width}px` : width, maxWidth: '100%' }\n : undefined\n }\n >\n {label && (\n <label htmlFor={inputId} className={labelClasses}>\n <span className={`eidos-input-label-text`}>{label}</span>\n {isRequired && <span className={`eidos-input-required-asterisk`}>*</span>}\n {disclaimerIcon &&\n (disclaimerContent ? (\n <Tooltip message={disclaimerContent}>\n <span className={`eidos-input-disclaimer-icon`}>\n {renderIcon(disclaimerIcon, `eidos-input-disclaimer-icon-svg`)}\n </span>\n </Tooltip>\n ) : (\n <span className={`eidos-input-disclaimer-icon`}>\n {renderIcon(disclaimerIcon, `eidos-input-disclaimer-icon-svg`)}\n </span>\n ))}\n </label>\n )}\n\n <div className={wrapperClasses}>\n {preIcon && (\n <span className={`eidos-input-pre-icon`}>\n {renderIcon(preIcon, `eidos-input-pre-icon-svg`)}\n </span>\n )}\n\n <input\n ref={ref}\n id={inputId}\n name={inputName}\n type={actualType}\n className={inputClasses}\n disabled={disabled || loading}\n onKeyDown={handleNumberInput}\n {...restInputProps}\n value={currentValue}\n onFocus={(e) => {\n handleFocus();\n restInputProps.onFocus?.(e);\n }}\n onBlur={(e) => {\n handleBlur();\n restInputProps.onBlur?.(e);\n }}\n onChange={handleInputChange}\n />\n\n {type === 'password' && (\n <button\n type=\"button\"\n className={`eidos-input-password-toggle`}\n onClick={() => setShowPassword(!showPassword)}\n disabled={disabled || loading}\n tabIndex={-1}\n >\n {showPassword ? (\n <EyeOff className={`eidos-input-password-toggle-icon`} />\n ) : (\n <Eye className={`eidos-input-password-toggle-icon`} />\n )}\n </button>\n )}\n\n {/* Clear button - show when there's content and clearable is enabled (default: true) */}\n {currentValue &&\n String(currentValue).trim().length > 0 &&\n type !== 'password' &&\n !isSelect &&\n clearable !== false && (\n <button\n type=\"button\"\n className={`eidos-input-clear-button`}\n onClick={handleClear}\n disabled={disabled || loading}\n tabIndex={-1}\n >\n <X className={`eidos-input-clear-button-icon`} />\n </button>\n )}\n\n {posIcon && !posIconButton && (\n <span className={`eidos-input-pos-icon`}>\n {renderIcon(posIcon, `eidos-input-pos-icon-svg`)}\n </span>\n )}\n\n {posIcon && posIconButton && onPosIconClick && (\n <button\n type=\"button\"\n className={`eidos-input-pos-icon-button`}\n onClick={onPosIconClick}\n disabled={disabled || loading}\n tabIndex={-1}\n >\n {renderIcon(posIcon, `eidos-input-pos-icon-svg`)}\n </button>\n )}\n\n {/* Chevron for select inputs */}\n {isSelect && (\n <span className={`eidos-input-select-chevron`}>\n <ChevronDown className={`eidos-input-pos-icon-svg`} />\n </span>\n )}\n </div>\n\n {error && (\n <div className={`eidos-input-error-message`}>\n <CircleAlert className={`eidos-input-error-icon`} />\n <span>{error}</span>\n </div>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6HUHH6Y4.cjs","../node_modules/dayjs/dayjs.min.js","../node_modules/dayjs/plugin/utc.js","../node_modules/dayjs/plugin/timezone.js","../node_modules/dayjs/plugin/weekOfYear.js","../src/components/DatePicker/DatePicker.component.tsx","../src/components/DatePicker/Calendar.component.tsx","../src/components/DatePicker/TimeInput.component.tsx"],"names":["t","e","n","r","i","s","u","a","M","m","f","l","$","y","v","g","D","o","d","c","h","import_dayjs","dayjs","weekOfYear","useCallback","jsx","useState"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6HUHH6Y4.cjs","sourcesContent":[null,"!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var r=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),r.call(this,t)};var o=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else o.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s;if(0===u)return this.utc(f);var r=this.clone();if(f)return r.$offset=u,r.$u=!1,r;var o=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(r=this.local().add(u+o,t)).$offset=u,r.$x.$localOffset=o,r};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,r){var o,a=function(t,n,i){void 0===i&&(i={});var r=new Date(t),o=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",r=t+\"|\"+i,o=e[r];return o||(o=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[r]=o),o}(n,i);return o.formatToParts(r)},u=function(e,n){for(var i=a(e,n),o=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(o[c]=parseInt(m,10))}var l=o[3],d=24===l?0:l,h=o[0]+\"-\"+o[1]+\"-\"+o[2]+\" \"+d+\":\"+o[4]+\":\"+o[5]+\":000\",v=+e;return(r.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){if(void 0===t&&(t=o),!this.isValid())return this;var n,i=this.utcOffset(),a=this.toDate(),f=a.toLocaleString(\"en-US\",{timeZone:t}),s=u(+a,t);if(!Number(s))n=this.utcOffset(0,e);else if(n=r(f,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(s,!0),e){var m=n.utcOffset();n=n.add(i-m,\"minute\")}return n.$x.$timezone=t,n},f.offsetName=function(t){var e=this.$x.$timezone||r.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=r(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},r.tz=function(t,e,n){var i=n&&e,a=n||e||o,f=u(+r(),a);if(\"string\"!=typeof t)return r(t).tz(a);var s=r.utc(t,i).valueOf();if(Number.isNaN(s)){var m=r(NaN);return m.$x.$timezone=a,m}var c=function(t,e,n){var i=t-60*e*1e3,r=u(i,n);if(e===r)return[i,e];var o=u(i-=60*(r-e)*1e3,n);return r===o?[i,r]:[t-60*Math.min(r,o)*1e3,Math.max(r,o)]}(s,f,a),l=c[0],d=c[1],h=r(l).utcOffset(d);return h.$x.$timezone=a,h},r.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},r.tz.setDefault=function(t){o=t}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_weekOfYear=t()}(this,(function(){\"use strict\";var e=\"week\",t=\"year\";return function(i,n,r){var f=n.prototype;f.week=function(i){if(void 0===i&&(i=null),null!==i)return this.add(7*(i-this.week()),\"day\");var n=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var f=r(this).startOf(t).add(1,t).date(n),s=r(this).endOf(e);if(f.isBefore(s))return 1}var a=r(this).startOf(t).date(n).startOf(e).subtract(1,\"millisecond\"),o=this.diff(a,e,!0);return o<0?r(this).startOf(\"week\").week():Math.ceil(o)},f.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}));","import React, { useState, useCallback, useRef, useMemo } from 'react';\nimport dayjs, { Dayjs } from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport { Calendar as CalendarIcon, X } from 'lucide-react';\nimport { Input } from '../Input/Input.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport { Calendar } from './Calendar.component';\nimport { TimeInput } from './TimeInput.component';\nimport type {\n DatePickerProps,\n DateSelectionMode,\n DateTimeValue,\n TimeValue,\n RangeTimeValue,\n} from './DatePicker.types';\n\n// Initialize dayjs plugins\ndayjs.extend(utc);\ndayjs.extend(timezone);\n\nexport const DatePicker = <T extends DateSelectionMode = 'single'>({\n mode,\n value,\n onChange,\n granularity = 'day',\n time = { enabled: false },\n calendar = { numberOfCalendars: 2 },\n format = {\n displayFormat: 'MMM DD, YYYY',\n inputFormat: 'YYYY-MM-DD',\n timeFormat: 'HH:mm',\n timezone: 'UTC',\n },\n placeholder = 'Select date...',\n disabled = false,\n required = false,\n name,\n id,\n inputProps = {},\n minDate,\n maxDate,\n disabledDates = [],\n disabledDaysOfWeek = [],\n className = '',\n fullWidth = false,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n autoWidth = false,\n}: DatePickerProps<T>) => {\n const [dropdownKey, setDropdownKey] = useState(0);\n // Two different, deliberately different, notions of \"timezone\" are in\n // play here, matching two genuinely different kinds of value:\n //\n // - Date-only (time.enabled === false): a pure calendar date has no\n // wall-clock moment attached to it, so there's nothing for a timezone\n // to sensibly represent. It's anchored to a fixed `pickerTimezone`\n // (default UTC) so the same calendar date always serializes to the\n // same ISO instant no matter which machine picks it - see\n // `composeDateOnly`.\n // - Date + time (time.enabled === true): this genuinely represents a\n // real-world instant, e.g. a meeting at a specific wall-clock time -\n // exactly the case a timezone exists to disambiguate. That instant\n // should be computed from *the picking user's own local offset*\n // (someone in UTC+3 typing \"15:00\" means 12:00 UTC), and later\n // displayed by converting that same UTC instant into *each viewer's\n // own* local offset (that same instant shows as \"12:00\" to a UTC+0\n // viewer). That's exactly plain, un-anchored dayjs/Date behavior with\n // no explicit timezone forcing at all, so this path intentionally\n // does not use `pickerTimezone` anywhere.\n const pickerTimezone = format.timezone || 'UTC';\n // Combines a calendar date (only its Y-M-D is read, so it's timezone-\n // agnostic going in) with a start/end-of-day boundary, anchored to\n // `pickerTimezone` - only ever used for date-only values.\n const composeDateOnly = useCallback(\n (date: Dayjs, boundary: 'start' | 'end' = 'start') => {\n const anchored = dayjs.tz(date.format('YYYY-MM-DD'), pickerTimezone);\n return boundary === 'end' ? anchored.endOf('day') : anchored.startOf('day');\n },\n [pickerTimezone],\n );\n // Combines a calendar date with a time-of-day using plain local\n // semantics (no timezone forcing) - only ever used for date+time values,\n // see the note above.\n const composeLocalDateTime = useCallback(\n (date: Dayjs, t: TimeValue): Dayjs =>\n date\n .hour(t.hours)\n .minute(t.minutes)\n .second(t.seconds || 0),\n [],\n );\n // Re-anchors an already-stored ISO instant's calendar day (read in the\n // browser's own local timezone, matching how it was written) onto a new\n // time-of-day - used when the user edits a TimeInput without re-picking\n // the date, so that edit actually changes the returned value instead of\n // only updating the separate `value.time` field alongside an unchanged\n // `value.date`. Deliberately local, not anchored to `pickerTimezone` -\n // see the note above.\n const recomposeIsoWithTime = useCallback(\n (isoString: string, t: TimeValue): string =>\n dayjs(isoString)\n .hour(t.hours)\n .minute(t.minutes)\n .second(t.seconds || 0)\n .toISOString(),\n [],\n );\n // Month granularity always shows a single year/month grid - side-by-side\n // \"next month\" calendars don't make sense once there are no day cells.\n const numberOfCalendars = granularity === 'month' ? 1 : calendar.numberOfCalendars || 2;\n const independentCalendars = calendar.independent ?? false;\n // One entry per visible calendar. In the default (non-independent) mode\n // these always stay consecutive months, kept in sync from a single shared\n // control (see `handleCalendarMonthChange`) - the array shape is the same\n // either way, only how a change to one entry propagates differs.\n const [calendarDates, setCalendarDates] = useState<Dayjs[]>(() =>\n Array.from({ length: numberOfCalendars }, (_, i) => dayjs().add(i, 'month')),\n );\n const handleCalendarMonthChange = useCallback(\n (index: number, newDate: Dayjs) => {\n if (!independentCalendars) {\n // Coupled: every calendar shifts together, re-anchored so `index`\n // lands on `newDate` - e.g. moving calendar 1 to November re-anchors\n // calendar 0 to October, same as before this was array-based.\n const anchor = newDate.subtract(index, 'month');\n setCalendarDates(\n Array.from({ length: numberOfCalendars }, (_, i) => anchor.add(i, 'month')),\n );\n return;\n }\n\n // Independent: only this calendar moves, clamped so it can never reach\n // or cross an immediate neighbor's month - two calendars both landing\n // on (or swapping past) the same month would be exactly the confusing\n // state independent mode exists to let users avoid, just self-inflicted\n // instead of automatic.\n setCalendarDates((prev) => {\n const next = [...prev];\n let clamped = newDate;\n const left = prev[index - 1];\n const right = prev[index + 1];\n if (left && !clamped.isAfter(left, 'month')) {\n clamped = left.add(1, 'month');\n }\n if (right && !clamped.isBefore(right, 'month')) {\n clamped = right.subtract(1, 'month');\n }\n next[index] = clamped;\n return next;\n });\n },\n [independentCalendars, numberOfCalendars],\n );\n const triggerRef = useRef<HTMLDivElement>(null);\n\n // Convert the string-based constraint props to the Dayjs objects Calendar\n // actually consumes for its `isBefore`/`isAfter`/`isSame` comparisons.\n const minDateObj = useMemo(() => (minDate ? dayjs(minDate) : undefined), [minDate]);\n const maxDateObj = useMemo(() => (maxDate ? dayjs(maxDate) : undefined), [maxDate]);\n const disabledDatesObj = useMemo(() => disabledDates.map((d) => dayjs(d)), [disabledDates]);\n\n // Default time values\n const defaultStartTime = useMemo<TimeValue>(() => ({ hours: 0, minutes: 0, seconds: 0 }), []);\n const defaultEndTime = useMemo<TimeValue>(() => ({ hours: 23, minutes: 59, seconds: 59 }), []);\n\n // Helper function to convert stored ISO strings back to the calendar date\n // they represent, for calendar-grid display (which day to highlight).\n const toLocalDateString = useCallback(\n (isoString: string | null): string | null => {\n if (!isoString) return null;\n const parsed = dayjs(isoString);\n // Date-only values were anchored to `pickerTimezone` when stored (see\n // `composeDateOnly`) - reading them back via the browser's ambient\n // timezone instead would recover the wrong calendar day for anyone\n // not in that same timezone. Date+time values were deliberately\n // never anchored (see the note above `pickerTimezone`), so they stay\n // on local interpretation, matching how they were written.\n return (time.enabled ? parsed : parsed.tz(pickerTimezone)).format('YYYY-MM-DD');\n },\n [time.enabled, pickerTimezone],\n );\n\n // Convert current value to calendar-compatible format\n const { selectedDates, rangeStart, rangeEnd } = useMemo(() => {\n if (!value?.date) {\n return { selectedDates: [], rangeStart: null, rangeEnd: null };\n }\n\n switch (mode) {\n case 'single': {\n const isoString = value.date as string | null;\n const localDateStr = toLocalDateString(isoString);\n return {\n selectedDates: localDateStr ? [dayjs(localDateStr)] : [],\n rangeStart: null,\n rangeEnd: null,\n };\n }\n case 'multiple': {\n const isoStrings = value.date as string[];\n const localDateStrings = isoStrings\n .map((d) => toLocalDateString(d))\n .filter(Boolean) as string[];\n return {\n selectedDates: localDateStrings.map((d) => dayjs(d)),\n rangeStart: null,\n rangeEnd: null,\n };\n }\n case 'range': {\n const range = value.date as { start: string | null; end: string | null };\n const startStr = toLocalDateString(range.start);\n const endStr = toLocalDateString(range.end);\n return {\n selectedDates: [],\n rangeStart: startStr ? dayjs(startStr) : null,\n rangeEnd: endStr ? dayjs(endStr) : null,\n };\n }\n default:\n return { selectedDates: [], rangeStart: null, rangeEnd: null };\n }\n }, [value, mode, toLocalDateString]);\n\n // Handle date selection from calendar - always return ISO strings. Uses\n // `composeDateOnly` (fixed `pickerTimezone` anchor) when time.enabled is\n // false, `composeLocalDateTime` (plain local semantics) when true - see\n // the note above `pickerTimezone` for why these need to differ.\n const handleDateSelect = useCallback(\n (selectedDate: Dayjs) => {\n // `granularity === 'month'` means the calendar only ever hands us a\n // day *within* the picked month (see Calendar's month grid) - the\n // stored/returned value is always that month's last day, while the\n // day-of-week boundary semantics below ('start' of day vs 'end' of\n // day) are unaffected.\n const effectiveDate = granularity === 'month' ? selectedDate.endOf('month') : selectedDate;\n const compareUnit = granularity === 'month' ? 'month' : 'day';\n\n switch (mode) {\n case 'single': {\n let dateWithTime: Dayjs;\n // Preserve whatever time the user already configured via\n // TimeInput rather than resetting to the default every time a\n // different date is picked.\n const activeTime = (value?.time as TimeValue) ?? defaultStartTime;\n if (time.enabled) {\n dateWithTime = composeLocalDateTime(effectiveDate, activeTime);\n } else {\n dateWithTime = composeDateOnly(effectiveDate, 'start');\n }\n\n const newValue: DateTimeValue<T> = {\n date: dateWithTime.toISOString() as DateTimeValue<T>['date'],\n time: time.enabled ? (activeTime as DateTimeValue<T>['time']) : undefined,\n };\n\n onChange?.(newValue);\n setDropdownKey((prev) => prev + 1); // Close dropdown\n break;\n }\n\n case 'multiple': {\n const currentDates = (value?.date as string[]) || [];\n const currentDayjs = currentDates.map((d) => dayjs(d));\n\n // Check if date is already selected\n const existingIndex = currentDayjs.findIndex((d) => d.isSame(effectiveDate, compareUnit));\n let newDates: Dayjs[];\n\n if (existingIndex >= 0) {\n // Remove if already selected\n newDates = currentDayjs.filter((_, index) => index !== existingIndex);\n } else {\n // Add new date, preserving the shared time already configured.\n const activeTime = (value?.time as TimeValue) ?? defaultStartTime;\n const dateWithTime = time.enabled\n ? composeLocalDateTime(effectiveDate, activeTime)\n : composeDateOnly(effectiveDate, 'start');\n newDates = [...currentDayjs, dateWithTime];\n }\n\n // Always return ISO strings\n const newValue: DateTimeValue<T> = {\n date: newDates.map((d) => d.toISOString()) as DateTimeValue<T>['date'],\n time: time.enabled\n ? (((value?.time as TimeValue) ?? defaultStartTime) as DateTimeValue<T>['time'])\n : undefined,\n };\n\n onChange?.(newValue);\n break;\n }\n\n case 'range': {\n const currentRange = (value?.date as { start: string | null; end: string | null }) || {\n start: null,\n end: null,\n };\n const currentRangeTime = (value?.time as RangeTimeValue) || {\n start: defaultStartTime,\n end: defaultEndTime,\n };\n\n if (!currentRange.start || (currentRange.start && currentRange.end)) {\n // Start new range, preserving the already-configured start time.\n const startWithTime = time.enabled\n ? composeLocalDateTime(effectiveDate, currentRangeTime.start)\n : composeDateOnly(effectiveDate, 'start');\n\n // Always return ISO string\n const newValue: DateTimeValue<T> = {\n date: { start: startWithTime.toISOString(), end: null } as DateTimeValue<T>['date'],\n time: time.enabled ? (currentRangeTime as DateTimeValue<T>['time']) : undefined,\n };\n\n onChange?.(newValue);\n } else {\n // Complete the range. Date-only starts were anchored to\n // `pickerTimezone` when stored (see `composeDateOnly`) -\n // re-read it the same way so the \"is end before start\"\n // comparison below lines up with the day it actually\n // represents. Date+time starts were never anchored, so\n // they stay on local interpretation, matching how they\n // were written.\n const start = time.enabled\n ? dayjs(currentRange.start)\n : dayjs(currentRange.start).tz(pickerTimezone);\n let end = effectiveDate;\n\n // Ensure end is after start\n if (end.isBefore(start, compareUnit)) {\n end = start;\n }\n\n end = time.enabled\n ? composeLocalDateTime(end, currentRangeTime.end)\n : composeDateOnly(end, 'end');\n\n // Always return ISO strings\n const newValue: DateTimeValue<T> = {\n date: {\n start: currentRange.start,\n end: end.toISOString(),\n } as DateTimeValue<T>['date'],\n time: time.enabled ? (currentRangeTime as DateTimeValue<T>['time']) : undefined,\n };\n\n onChange?.(newValue);\n setDropdownKey((prev) => prev + 1); // Close dropdown after completing range\n }\n break;\n }\n }\n },\n [\n mode,\n time,\n value,\n onChange,\n defaultStartTime,\n defaultEndTime,\n composeDateOnly,\n composeLocalDateTime,\n pickerTimezone,\n granularity,\n ],\n );\n\n // Format display value\n const displayValue = useMemo(() => {\n if (!value?.date) return '';\n\n const displayFmt =\n format.displayFormat || (granularity === 'month' ? 'MMM YYYY' : 'MMM DD, YYYY');\n // Date-only values were anchored to `pickerTimezone` when stored (see\n // `composeDateOnly`) - display them in that same timezone rather than\n // the viewer's ambient one, so the trigger shows the actual calendar\n // date that was picked. Date+time values were deliberately never\n // anchored (see the note above `pickerTimezone`) - the viewer's own\n // local timezone is exactly what should convert that instant for\n // display, e.g. a UTC+3-scheduled 15:00 meeting showing as 12:00 to a\n // UTC+0 viewer.\n const parseDateOnlyAware = (iso: string) =>\n time.enabled ? dayjs(iso) : dayjs(iso).tz(pickerTimezone);\n\n switch (mode) {\n case 'single': {\n const date = parseDateOnlyAware(value.date as string);\n let result = date.format(displayFmt);\n if (time.enabled) {\n const timeStr = time.includeSeconds ? date.format('HH:mm:ss') : date.format('HH:mm');\n result += ` ${timeStr}`;\n }\n return result;\n }\n\n case 'multiple': {\n const dates = value.date as string[];\n if (time.enabled) {\n const formattedDates = dates.map((d) => {\n const date = parseDateOnlyAware(d);\n const dateStr = date.format(displayFmt);\n const timeStr = time.includeSeconds ? date.format('HH:mm:ss') : date.format('HH:mm');\n return `${dateStr} ${timeStr}`;\n });\n return formattedDates.join(', ');\n } else {\n const formattedDates = dates.map((d) => parseDateOnlyAware(d).format(displayFmt));\n return formattedDates.join(', ');\n }\n }\n\n case 'range': {\n const rangeValue = value.date as { start: string | null; end: string | null };\n const parts: string[] = [];\n\n if (rangeValue.start) {\n const startDate = parseDateOnlyAware(rangeValue.start);\n let startStr = startDate.format(displayFmt);\n if (time.enabled) {\n const timeStr = time.includeSeconds\n ? startDate.format('HH:mm:ss')\n : startDate.format('HH:mm');\n startStr += ` ${timeStr}`;\n }\n parts.push(startStr);\n }\n\n if (rangeValue.end) {\n const endDate = parseDateOnlyAware(rangeValue.end);\n let endStr = endDate.format(displayFmt);\n if (time.enabled) {\n const timeStr = time.includeSeconds\n ? endDate.format('HH:mm:ss')\n : endDate.format('HH:mm');\n endStr += ` ${timeStr}`;\n }\n parts.push(endStr);\n }\n\n return parts.join(' - ');\n }\n\n default:\n return '';\n }\n }, [value, mode, time, format, pickerTimezone, granularity]);\n\n // Handle clear\n const handleClear = useCallback(\n (e?: React.MouseEvent) => {\n if (e) {\n e.stopPropagation();\n }\n\n const clearedValue = (() => {\n if (mode === 'multiple') {\n return {\n date: [] as unknown as DateTimeValue<T>['date'],\n time: time.enabled\n ? (defaultStartTime as unknown as DateTimeValue<T>['time'])\n : undefined,\n } as DateTimeValue<T>;\n } else if (mode === 'range') {\n return {\n date: { start: null, end: null } as unknown as DateTimeValue<T>['date'],\n time: time.enabled\n ? ({\n start: defaultStartTime,\n end: defaultEndTime,\n } as unknown as DateTimeValue<T>['time'])\n : undefined,\n } as DateTimeValue<T>;\n } else {\n return {\n date: null as unknown as DateTimeValue<T>['date'],\n time: time.enabled\n ? (defaultStartTime as unknown as DateTimeValue<T>['time'])\n : undefined,\n } as DateTimeValue<T>;\n }\n })();\n\n onChange?.(clearedValue);\n setDropdownKey((prev) => prev + 1); // Close dropdown\n },\n [mode, time, onChange, defaultStartTime, defaultEndTime],\n );\n\n // Create trigger element\n const triggerElement = (\n <div\n ref={triggerRef}\n className={`eidos-date-picker-trigger${fullWidth ? ' eidos-date-picker-trigger--fullWidth' : ''}`}\n >\n <Input\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n name={name}\n id={id}\n // Forwarded, not just set on the wrapper above: the wrapper stretching\n // to 100% does nothing on its own while the Input inside it keeps its\n // own intrinsic width. Mirrors Select, which forwards it the same way.\n fullWidth={fullWidth}\n readOnly={true}\n preIcon={CalendarIcon}\n posIcon={displayValue ? X : undefined}\n posIconButton={!!displayValue}\n onPosIconClick={displayValue ? handleClear : undefined}\n {...inputProps}\n clearable={false}\n />\n </div>\n );\n\n // Create dropdown content with calendar(s) and time inputs\n const dropdownContent = (\n <div className={'eidos-date-picker-content'}>\n {/* Multiple calendars with container-level navigation */}\n <div className={'eidos-date-picker-calendars-wrapper'}>\n {Array.from({ length: numberOfCalendars }, (_, index) => {\n const calendarDate = calendarDates[index] ?? dayjs().add(index, 'month');\n return (\n <Calendar\n key={index}\n currentDate={calendarDate}\n selectedDates={selectedDates}\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n mode={mode}\n granularity={granularity}\n onDateSelect={handleDateSelect}\n onMonthChange={(newDate) => handleCalendarMonthChange(index, newDate)}\n minDate={minDateObj}\n maxDate={maxDateObj}\n disabledDates={disabledDatesObj}\n disabledDaysOfWeek={disabledDaysOfWeek}\n showWeekNumbers={calendar.showWeekNumbers}\n firstDayOfWeek={calendar.firstDayOfWeek}\n // Non-independent: only the first calendar's control is\n // interactive, since it's the one every other calendar\n // actually follows. Independent: every calendar gets one.\n showNavigation={independentCalendars || index === 0}\n />\n );\n })}\n </div>\n\n {/* Time inputs */}\n {time.enabled && (\n <div className={'eidos-date-picker-time-container'}>\n {mode === 'single' && (\n <TimeInput\n value={(value?.time as TimeValue) || defaultStartTime}\n onChange={(newTime) => {\n // Recompose the actual returned value with the new\n // time, not just the separate `time` field - see\n // `recomposeIsoWithTime`.\n const currentIso = value?.date as string | null;\n const newValue = {\n ...value,\n date: (currentIso\n ? recomposeIsoWithTime(currentIso, newTime)\n : currentIso) as DateTimeValue<T>['date'],\n time: newTime,\n } as DateTimeValue<T>;\n onChange?.(newValue);\n }}\n includeSeconds={time.includeSeconds}\n disabled={disabled}\n label=\"Time\"\n />\n )}\n\n {mode === 'multiple' && (\n <TimeInput\n value={(value?.time as TimeValue) || defaultStartTime}\n onChange={(newTime) => {\n // Recompose every selected date with the new shared\n // time - see `recomposeIsoWithTime`.\n const currentDates = (value?.date as string[]) || [];\n const newValue = {\n ...value,\n date: currentDates.map((d) =>\n recomposeIsoWithTime(d, newTime),\n ) as DateTimeValue<T>['date'],\n time: newTime,\n } as DateTimeValue<T>;\n onChange?.(newValue);\n }}\n includeSeconds={time.includeSeconds}\n disabled={disabled}\n label=\"Time for all dates\"\n />\n )}\n\n {mode === 'range' && (\n <div className={'eidos-date-picker-range-time-inputs'}>\n <TimeInput\n value={(value?.time as RangeTimeValue)?.start || defaultStartTime}\n onChange={(newTime) => {\n const currentRangeTime = (value?.time as RangeTimeValue) || {\n start: defaultStartTime,\n end: defaultEndTime,\n };\n // Recompose just the start of the range with the new\n // time - see `recomposeIsoWithTime`.\n const currentRange = (value?.date as {\n start: string | null;\n end: string | null;\n }) || {\n start: null,\n end: null,\n };\n const newValue = {\n ...value,\n date: {\n ...currentRange,\n start: currentRange.start\n ? recomposeIsoWithTime(currentRange.start, newTime)\n : currentRange.start,\n } as DateTimeValue<T>['date'],\n time: {\n ...currentRangeTime,\n start: newTime,\n },\n } as DateTimeValue<T>;\n onChange?.(newValue);\n }}\n includeSeconds={time.includeSeconds}\n disabled={disabled}\n label=\"Start time\"\n />\n <TimeInput\n value={(value?.time as RangeTimeValue)?.end || defaultEndTime}\n onChange={(newTime) => {\n const currentRangeTime = (value?.time as RangeTimeValue) || {\n start: defaultStartTime,\n end: defaultEndTime,\n };\n // Recompose just the end of the range with the new\n // time - see `recomposeIsoWithTime`.\n const currentRange = (value?.date as {\n start: string | null;\n end: string | null;\n }) || {\n start: null,\n end: null,\n };\n const newValue = {\n ...value,\n date: {\n ...currentRange,\n end: currentRange.end\n ? recomposeIsoWithTime(currentRange.end, newTime)\n : currentRange.end,\n } as DateTimeValue<T>['date'],\n time: {\n ...currentRangeTime,\n end: newTime,\n },\n } as DateTimeValue<T>;\n onChange?.(newValue);\n }}\n includeSeconds={time.includeSeconds}\n disabled={disabled}\n label=\"End time\"\n />\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return (\n <div\n className={`eidos-date-picker-container${fullWidth ? ' eidos-date-picker-container--fullWidth' : ''} ${className}`.trim()}\n >\n <Dropdown\n key={dropdownKey}\n trigger={triggerElement}\n content={dropdownContent}\n placement=\"bottom\"\n minWidth={minWidth}\n maxWidth={maxWidth || 'none'}\n minHeight={minHeight}\n maxHeight={maxHeight || 'none'}\n autoWidth={autoWidth}\n // Dropdown wraps `trigger` in its own `.eidos-dropdown-trigger` div,\n // which stays shrink-to-fit unless told otherwise - so without this,\n // `fullWidth` stopped at that wrapper and the trigger input never\n // stretched. Select forwards it here for the same reason.\n fullWidth={fullWidth}\n triggerRef={triggerRef as React.RefObject<HTMLElement | null>}\n />\n </div>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n","import React, { useMemo, useCallback } from 'react';\nimport dayjs, { Dayjs } from 'dayjs';\nimport weekOfYear from 'dayjs/plugin/weekOfYear';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\n\n// Initialize dayjs plugins\ndayjs.extend(weekOfYear);\nimport { Select } from '../Select/Select.component';\nimport type { CalendarProps } from './DatePicker.types';\nimport { Button } from '../Button/Button.component';\n\nexport const Calendar: React.FC<CalendarProps> = ({\n currentDate,\n selectedDates,\n rangeStart,\n rangeEnd,\n // mode, // TODO: Use this for different selection behaviors\n granularity = 'day',\n onDateSelect,\n onMonthChange,\n minDate,\n maxDate,\n disabledDates = [],\n disabledDaysOfWeek = [],\n showWeekNumbers = false,\n firstDayOfWeek = 1, // Monday\n showNavigation = true,\n}) => {\n // Generate month options (12 months)\n const monthOptions = useMemo(() => {\n return Array.from({ length: 12 }, (_, i) => ({\n id: i.toString(),\n label: dayjs().month(i).format('MMMM'),\n value: i.toString(),\n }));\n }, []);\n\n // Generate year options (current year ± 50 years)\n const yearOptions = useMemo(() => {\n const currentYear = dayjs().year();\n const years = [];\n for (let year = currentYear - 50; year <= currentYear + 50; year++) {\n years.push({\n id: year.toString(),\n label: year.toString(),\n value: year.toString(),\n });\n }\n return years;\n }, []);\n\n // Handle month selection\n const handleMonthSelect = useCallback(\n (value: string | string[]) => {\n if (typeof value === 'string') {\n const newDate = currentDate.month(parseInt(value));\n onMonthChange(newDate);\n }\n },\n [currentDate, onMonthChange],\n );\n\n // Handle year selection\n const handleYearSelect = useCallback(\n (value: string | string[]) => {\n if (typeof value === 'string') {\n const newDate = currentDate.year(parseInt(value));\n onMonthChange(newDate);\n }\n },\n [currentDate, onMonthChange],\n );\n\n // Handle navigation arrows\n const handlePrevMonth = useCallback(() => {\n onMonthChange(currentDate.subtract(1, 'month'));\n }, [currentDate, onMonthChange]);\n\n const handleNextMonth = useCallback(() => {\n onMonthChange(currentDate.add(1, 'month'));\n }, [currentDate, onMonthChange]);\n\n const handlePrevYear = useCallback(() => {\n onMonthChange(currentDate.subtract(1, 'year'));\n }, [currentDate, onMonthChange]);\n\n const handleNextYear = useCallback(() => {\n onMonthChange(currentDate.add(1, 'year'));\n }, [currentDate, onMonthChange]);\n\n // Generate the 12 months of `currentDate`'s year - used instead of\n // `calendarDays` when `granularity === 'month'`.\n const monthCells = useMemo(() => {\n return Array.from({ length: 12 }, (_, i) => {\n const monthDate = currentDate.month(i).startOf('month');\n const isToday = monthDate.isSame(dayjs(), 'month');\n const isSelected = selectedDates.some((date) => date.isSame(monthDate, 'month'));\n const isDisabled =\n (minDate && monthDate.endOf('month').isBefore(minDate, 'month')) ||\n (maxDate && monthDate.isAfter(maxDate, 'month'));\n\n const isRangeStart = rangeStart?.isSame(monthDate, 'month') || false;\n const isRangeEnd = rangeEnd?.isSame(monthDate, 'month') || false;\n const isInRange =\n rangeStart &&\n rangeEnd &&\n monthDate.isAfter(rangeStart, 'month') &&\n monthDate.isBefore(rangeEnd, 'month');\n\n return {\n date: monthDate,\n isToday,\n isSelected,\n isDisabled,\n isRangeStart,\n isRangeEnd,\n isInRange,\n };\n });\n }, [currentDate, selectedDates, rangeStart, rangeEnd, minDate, maxDate]);\n\n // Generate calendar days\n const calendarDays = useMemo(() => {\n const startOfMonth = currentDate.startOf('month');\n\n // Get the first day of the week for the first day of the month\n let startOfCalendar = startOfMonth.startOf('week');\n if (firstDayOfWeek === 1) {\n // Monday\n startOfCalendar =\n startOfMonth.day() === 0\n ? startOfMonth.subtract(6, 'day')\n : startOfMonth.startOf('week').add(1, 'day');\n }\n\n // Generate 42 days (6 weeks * 7 days)\n const days = [];\n let current = startOfCalendar;\n\n for (let i = 0; i < 42; i++) {\n const isCurrentMonth = current.month() === currentDate.month();\n const isToday = current.isSame(dayjs(), 'day');\n const isSelected = selectedDates.some((date) => date.isSame(current, 'day'));\n const isDisabled =\n (minDate && current.isBefore(minDate, 'day')) ||\n (maxDate && current.isAfter(maxDate, 'day')) ||\n disabledDates.some((date) => date.isSame(current, 'day')) ||\n disabledDaysOfWeek.includes(current.day());\n\n // Range logic\n const isRangeStart = rangeStart?.isSame(current, 'day') || false;\n const isRangeEnd = rangeEnd?.isSame(current, 'day') || false;\n const isInRange =\n rangeStart &&\n rangeEnd &&\n current.isAfter(rangeStart, 'day') &&\n current.isBefore(rangeEnd, 'day');\n\n days.push({\n date: current,\n isCurrentMonth,\n isToday,\n isSelected,\n isDisabled,\n isRangeStart,\n isRangeEnd,\n isInRange,\n });\n\n current = current.add(1, 'day');\n }\n\n return days;\n }, [\n currentDate,\n selectedDates,\n rangeStart,\n rangeEnd,\n minDate,\n maxDate,\n disabledDates,\n disabledDaysOfWeek,\n firstDayOfWeek,\n ]);\n\n // Generate weekday headers\n const weekDays = useMemo(() => {\n const days = [];\n let start =\n firstDayOfWeek === 0 ? dayjs().startOf('week') : dayjs().startOf('week').add(1, 'day');\n\n for (let i = 0; i < 7; i++) {\n days.push(start.format('dd'));\n start = start.add(1, 'day');\n }\n return days;\n }, [firstDayOfWeek]);\n\n // Handle date click\n const handleDateClick = useCallback(\n (date: Dayjs) => {\n onDateSelect(date);\n },\n [onDateSelect],\n );\n\n return (\n <div className={'eidos-calendar'}>\n {/* Header with navigation - only interactive when this calendar actually\n\t\t\t navigates independently of its neighbors (see `showNavigation` doc).\n\t\t\t Showing editable, interactive controls that silently move a sibling\n\t\t\t calendar instead of themselves is exactly the confusing behavior this\n\t\t\t is meant to avoid; a plain label is honest about what will happen. */}\n <div className={'eidos-calendar-header'}>\n {showNavigation ? (\n granularity === 'month' ? (\n <>\n <Button variant=\"text\" icon={ChevronLeft} onClick={handlePrevYear} />\n\n <div className={'eidos-calendar-selectors'}>\n <Select\n options={yearOptions}\n value={currentDate.year().toString()}\n onChange={handleYearSelect}\n clearable={false}\n dropdownProps={{\n dropdownGroup: 'calendar-navigation',\n }}\n />\n </div>\n\n <Button variant=\"text\" icon={ChevronRight} onClick={handleNextYear} />\n </>\n ) : (\n <>\n <Button variant=\"text\" icon={ChevronLeft} onClick={handlePrevMonth} />\n\n <div className={'eidos-calendar-selectors'}>\n <Select\n options={monthOptions}\n value={currentDate.month().toString()}\n onChange={handleMonthSelect}\n clearable={false}\n dropdownProps={{\n dropdownGroup: 'calendar-navigation',\n }}\n />\n <Select\n options={yearOptions}\n value={currentDate.year().toString()}\n onChange={handleYearSelect}\n clearable={false}\n dropdownProps={{\n dropdownGroup: 'calendar-navigation',\n }}\n />\n </div>\n\n <Button variant=\"text\" icon={ChevronRight} onClick={handleNextMonth} />\n </>\n )\n ) : (\n <div className={'eidos-calendar-label'}>\n {currentDate.format(granularity === 'month' ? 'YYYY' : 'MMMM YYYY')}\n </div>\n )}\n </div>\n\n {/* Calendar grid */}\n {granularity === 'month' ? (\n <div className={'eidos-calendar-month-cells'}>\n {monthCells.map((month, index) => (\n <button\n key={index}\n type=\"button\"\n className={`eidos-calendar-date-cell eidos-calendar-month-cell ${month.isToday ? 'eidos-calendar-today' : ''} ${month.isSelected ? 'eidos-calendar-selected' : ''} ${month.isDisabled ? 'eidos-calendar-disabled' : ''} ${month.isRangeStart ? 'eidos-calendar-range-start' : ''} ${month.isRangeEnd ? 'eidos-calendar-range-end' : ''} ${month.isInRange ? 'eidos-calendar-in-range' : ''}`.trim()}\n onClick={() => !month.isDisabled && handleDateClick(month.date)}\n disabled={month.isDisabled}\n >\n {month.date.format('MMM')}\n </button>\n ))}\n </div>\n ) : (\n <div className={'eidos-calendar-grid'}>\n {/* Week numbers column (optional) */}\n {showWeekNumbers && (\n <div className={'eidos-calendar-week-numbers-column'}>\n <div className={'eidos-calendar-week-number-header'}></div>\n {Array.from({ length: 6 }, (_, weekIndex) => {\n const weekStart = calendarDays[weekIndex * 7].date;\n return (\n <div key={weekIndex} className={'eidos-calendar-week-number'}>\n {weekStart.format('W')}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Main calendar content */}\n <div className={'eidos-calendar-content'}>\n {/* Weekday headers */}\n <div className={'eidos-calendar-week-days'}>\n {weekDays.map((day, index) => (\n <div key={index} className={'eidos-calendar-week-day'}>\n {day}\n </div>\n ))}\n </div>\n\n {/* Date cells */}\n <div className={'eidos-calendar-date-cells'}>\n {calendarDays.map((day, index) => (\n <button\n key={index}\n type=\"button\"\n className={`eidos-calendar-date-cell ${!day.isCurrentMonth ? 'eidos-calendar-other-month' : ''} ${day.isToday ? 'eidos-calendar-today' : ''} ${day.isSelected ? 'eidos-calendar-selected' : ''} ${day.isDisabled ? 'eidos-calendar-disabled' : ''} ${day.isRangeStart ? 'eidos-calendar-range-start' : ''} ${day.isRangeEnd ? 'eidos-calendar-range-end' : ''} ${day.isInRange ? 'eidos-calendar-in-range' : ''}`.trim()}\n onClick={() => !day.isDisabled && handleDateClick(day.date)}\n disabled={day.isDisabled}\n >\n {day.date.date()}\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { Input } from '../Input/Input.component';\nimport type { TimeValue } from './DatePicker.types';\n\nexport interface TimeInputProps {\n value: TimeValue;\n onChange: (time: TimeValue) => void;\n includeSeconds?: boolean;\n disabled?: boolean;\n label?: string;\n}\n\nexport const TimeInput: React.FC<TimeInputProps> = ({\n value,\n onChange,\n includeSeconds = false,\n disabled = false,\n label = 'Time',\n}) => {\n const [hours, setHours] = useState(value.hours.toString().padStart(2, '0'));\n const [minutes, setMinutes] = useState(value.minutes.toString().padStart(2, '0'));\n const [seconds, setSeconds] = useState((value.seconds || 0).toString().padStart(2, '0'));\n\n // Update local state when value prop changes\n useEffect(() => {\n setHours(value.hours.toString().padStart(2, '0'));\n setMinutes(value.minutes.toString().padStart(2, '0'));\n setSeconds((value.seconds || 0).toString().padStart(2, '0'));\n }, [value]);\n\n const handleTimeChange = useCallback(\n (newHours: number, newMinutes: number, newSeconds: number) => {\n onChange({\n hours: newHours,\n minutes: newMinutes,\n seconds: newSeconds,\n });\n },\n [onChange],\n );\n\n const handleHoursChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newHours = Math.max(0, Math.min(23, parseInt(e.target.value) || 0));\n setHours(newHours.toString().padStart(2, '0'));\n handleTimeChange(newHours, value.minutes, value.seconds || 0);\n },\n [handleTimeChange, value.minutes, value.seconds],\n );\n\n const handleMinutesChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newMinutes = Math.max(0, Math.min(59, parseInt(e.target.value) || 0));\n setMinutes(newMinutes.toString().padStart(2, '0'));\n handleTimeChange(value.hours, newMinutes, value.seconds || 0);\n },\n [handleTimeChange, value.hours, value.seconds],\n );\n\n const handleSecondsChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newSeconds = Math.max(0, Math.min(59, parseInt(e.target.value) || 0));\n setSeconds(newSeconds.toString().padStart(2, '0'));\n handleTimeChange(value.hours, value.minutes, newSeconds);\n },\n [handleTimeChange, value.hours, value.minutes],\n );\n\n return (\n <div className={'eidos-time-input'}>\n {label && <label className={'eidos-time-input-label'}>{label}</label>}\n <div className={'eidos-time-input-inputs'}>\n <div className={'eidos-time-input-input-group'}>\n <Input\n type=\"number\"\n value={hours}\n onChange={handleHoursChange}\n disabled={disabled}\n min={0}\n max={23}\n placeholder=\"HH\"\n size=\"sm\"\n className={'eidos-time-input-time-field'}\n />\n <span className={'eidos-time-input-separator'}>:</span>\n </div>\n <div className={'eidos-time-input-input-group'}>\n <Input\n type=\"number\"\n value={minutes}\n onChange={handleMinutesChange}\n disabled={disabled}\n min={0}\n max={59}\n placeholder=\"MM\"\n size=\"sm\"\n className={'eidos-time-input-time-field'}\n />\n {includeSeconds && <span className={'eidos-time-input-separator'}>:</span>}\n </div>\n {includeSeconds && (\n <div className={'eidos-time-input-input-group'}>\n <Input\n type=\"number\"\n value={seconds}\n onChange={handleSecondsChange}\n disabled={disabled}\n min={0}\n max={59}\n placeholder=\"SS\"\n size=\"sm\"\n className={'eidos-time-input-time-field'}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Tabs/Tabs.component.tsx"],"sourcesContent":["import React, { useState, useRef, useContext, useEffect, useLayoutEffect } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { renderIcon } from '../../utils';\nimport type { TabsProps, TabProps, TabPanelProps, TabsContextValue } from './Tabs.types';\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\nconst useTabsContext = (): TabsContextValue => {\n const ctx = useContext(TabsContext);\n if (!ctx) throw new Error('Tab/TabPanel must be used inside <Tabs>');\n return ctx;\n};\n\n// ============================================================================\n// TAB - individual tab trigger button\n// Defined before Tabs so Tabs can use `child.type === Tab` for child separation.\n// ============================================================================\n\nexport const Tab: React.FC<TabProps> = ({\n value,\n children,\n disabled = false,\n icon,\n className = '',\n}) => {\n const { activeValue, onSelect, size, fullWidth, listRef } = useTabsContext();\n const isActive = activeValue === value;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n const list = listRef.current;\n if (!list) return;\n\n const allTabs = Array.from(\n list.querySelectorAll('[role=\"tab\"]:not([disabled])'),\n ) as HTMLElement[];\n const currentIndex = allTabs.indexOf(e.currentTarget);\n if (currentIndex === -1) return;\n\n let targetIndex = -1;\n if (e.key === 'ArrowRight') targetIndex = (currentIndex + 1) % allTabs.length;\n else if (e.key === 'ArrowLeft')\n targetIndex = (currentIndex - 1 + allTabs.length) % allTabs.length;\n else if (e.key === 'Home') targetIndex = 0;\n else if (e.key === 'End') targetIndex = allTabs.length - 1;\n\n if (targetIndex !== -1) {\n e.preventDefault();\n allTabs[targetIndex].focus();\n }\n };\n\n const tabClasses = [\n 'eidos-tab',\n `eidos-tab--${size}`,\n isActive && 'eidos-tab--active',\n disabled && 'eidos-tab--disabled',\n fullWidth && 'eidos-tab--fullWidth',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n id={`eidos-tab-${value}`}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`eidos-tabpanel-${value}`}\n tabIndex={isActive ? 0 : -1}\n disabled={disabled}\n className={tabClasses}\n onClick={() => !disabled && onSelect(value)}\n onKeyDown={handleKeyDown}\n type=\"button\"\n >\n {icon && <span className=\"eidos-tab-icon\">{renderIcon(icon, 'eidos-tab-icon-svg')}</span>}\n <span className=\"eidos-tab-label\">{children}</span>\n </button>\n );\n};\n\nTab.displayName = 'Tab';\n\n// ============================================================================\n// TAB PANEL - content region shown when its value matches the active tab\n// Defined before Tabs for the same `child.type === TabPanel` check.\n// ============================================================================\n\nexport const TabPanel: React.FC<TabPanelProps> = ({ value, children, className = '' }) => {\n const { activeValue } = useTabsContext();\n const isActive = activeValue === value;\n\n if (!isActive) return null;\n\n return (\n <div\n id={`eidos-tabpanel-${value}`}\n role=\"tabpanel\"\n aria-labelledby={`eidos-tab-${value}`}\n tabIndex={0}\n className={['eidos-tab-panel', className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n};\n\nTabPanel.displayName = 'TabPanel';\n\n// ============================================================================\n// TABS - root container; provides context, separates tab/panel children\n// ============================================================================\n\nexport const Tabs: React.FC<TabsProps> = ({\n value,\n defaultValue,\n onChange,\n variant = 'line',\n size = 'md',\n color = 'primary',\n fullWidth = false,\n scrollButtons = 'auto',\n className = '',\n children,\n}) => {\n const isControlled = value !== undefined;\n const [localValue, setLocalValue] = useState(defaultValue ?? '');\n const activeValue = isControlled ? value! : localValue;\n\n // Separate Tab and TabPanel children so the list and panels render in\n // distinct DOM regions, regardless of how the consumer orders them.\n const tabChildren: React.ReactElement[] = [];\n const panelChildren: React.ReactElement[] = [];\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n if (child.type === Tab) {\n tabChildren.push(child);\n } else if (child.type === TabPanel) {\n panelChildren.push(child);\n }\n });\n\n const listRef = useRef<HTMLDivElement>(null);\n const indicatorRef = useRef<HTMLSpanElement>(null);\n // Tracks whether the indicator has been positioned at least once so we can\n // skip the CSS transition on the very first render and avoid it animating\n // from the top-left corner to the initial tab.\n const hasPositioned = useRef(false);\n\n useLayoutEffect(() => {\n if (variant !== 'line') return;\n const list = listRef.current;\n const indicator = indicatorRef.current;\n if (!list || !indicator) return;\n\n const activeTab = list.querySelector('[aria-selected=\"true\"]') as HTMLElement | null;\n if (!activeTab) return;\n\n // Suppress the CSS transition on the initial paint so the indicator snaps\n // into place rather than sliding from 0.\n if (!hasPositioned.current) {\n indicator.style.transition = 'none';\n }\n\n indicator.style.left = `${activeTab.offsetLeft}px`;\n indicator.style.width = `${activeTab.offsetWidth}px`;\n\n if (!hasPositioned.current) {\n // Force a synchronous reflow so the browser commits the no-transition\n // position before we re-enable the transition for future clicks.\n void indicator.offsetWidth;\n indicator.style.transition = '';\n hasPositioned.current = true;\n }\n }, [activeValue, variant, fullWidth]);\n\n // The list scrolls horizontally when the strip is wider than its container,\n // so an activated tab can sit outside the scrollport - reachable by keyboard\n // (`End`) or by a controlled `value` change, but invisible. `scrollLeft` is\n // adjusted directly rather than via `scrollIntoView`, which walks the whole\n // ancestor chain and would scroll the page vertically when the strip is below\n // the fold.\n useLayoutEffect(() => {\n const list = listRef.current;\n if (!list) return;\n\n const activeTab = list.querySelector('[aria-selected=\"true\"]') as HTMLElement | null;\n if (!activeTab) return;\n\n const left = activeTab.offsetLeft;\n const right = left + activeTab.offsetWidth;\n\n if (left < list.scrollLeft) {\n list.scrollLeft = left;\n } else if (right > list.scrollLeft + list.clientWidth) {\n list.scrollLeft = right - list.clientWidth;\n }\n }, [activeValue]);\n\n // Whether either end of the strip has content hidden past it. Drives both\n // the presence of the scroll buttons (neither end scrollable = the strip\n // fits, so no buttons) and their disabled state at the extremes.\n const [scrollState, setScrollState] = useState({ canScrollPrev: false, canScrollNext: false });\n const hasScrollButtons = scrollButtons !== 'none';\n\n useEffect(() => {\n if (!hasScrollButtons) return;\n const list = listRef.current;\n if (!list) return;\n\n const update = () => {\n const maxScroll = list.scrollWidth - list.clientWidth;\n // 1px of tolerance: fractional layout widths leave a sub-pixel remainder\n // at either end that would otherwise keep a button enabled for a scroll\n // that can no longer move anything.\n const canScrollPrev = list.scrollLeft > 1;\n const canScrollNext = list.scrollLeft < maxScroll - 1;\n setScrollState((previous) =>\n previous.canScrollPrev === canScrollPrev && previous.canScrollNext === canScrollNext\n ? previous\n : { canScrollPrev, canScrollNext },\n );\n };\n\n update();\n list.addEventListener('scroll', update, { passive: true });\n\n // The list's own box stays the same width when a tab's label reflows or a\n // font finishes loading, so the tabs have to be observed as well as the\n // container - only their sizes tell us the strip started overflowing.\n const observer = new ResizeObserver(update);\n observer.observe(list);\n Array.from(list.children).forEach((child) => observer.observe(child));\n\n return () => {\n list.removeEventListener('scroll', update);\n observer.disconnect();\n };\n }, [hasScrollButtons, tabChildren.length, size, variant, fullWidth]);\n\n const scrollByStep = (direction: -1 | 1) => {\n const list = listRef.current;\n if (!list) return;\n\n // A step just short of a full page keeps a tab of context on screen, the\n // same way a paged scrollbar click does.\n const step = list.clientWidth * 0.8;\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n list.scrollBy({ left: direction * step, behavior: reducedMotion ? 'auto' : 'smooth' });\n };\n\n const onSelect = (newValue: string) => {\n if (!isControlled) {\n setLocalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const rootClasses = ['eidos-tabs', `eidos-tabs--${variant}`, `eidos-tabs--${color}`, className]\n .filter(Boolean)\n .join(' ');\n\n const listClasses = [\n 'eidos-tabs-list',\n `eidos-tabs-list--${size}`,\n fullWidth && 'eidos-tabs-list--fullWidth',\n // With buttons, they are the affordance - a native scrollbar underneath\n // them is redundant, and on a space-taking one it would also sit over the\n // `line` variant's rule.\n hasScrollButtons && 'eidos-tabs-list--hideScrollbar',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Each button exists only while its own direction has somewhere to go: none\n // at all when the strip fits, and none at the end you have reached. A\n // disabled button would be pointing at nothing. They are positioned\n // absolutely, so appearing and disappearing never moves the tabs.\n const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;\n const showNextButton = hasScrollButtons && scrollState.canScrollNext;\n\n const scrollButtonClasses = (direction: 'prev' | 'next') =>\n [\n 'eidos-tabs-scroll-button',\n `eidos-tabs-scroll-button--${direction}`,\n `eidos-tabs-scroll-button--${size}`,\n ].join(' ');\n\n const contextValue: TabsContextValue = {\n activeValue,\n onSelect,\n variant,\n size,\n color,\n fullWidth,\n listRef,\n };\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div className={rootClasses}>\n {/* The buttons are siblings of the tab list, never children of it:\n `role=\"tablist\"` only accepts tabs. They are also hidden from\n assistive tech and skipped by Tab, because they are a pointer\n affordance for something the keyboard already does - arrow keys\n move between tabs and scroll the active one into view. */}\n <div className=\"eidos-tabs-bar\">\n {showPrevButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('prev')}\n onClick={() => scrollByStep(-1)}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronLeft className=\"eidos-tabs-scroll-button-icon\" />\n </button>\n )}\n\n <div ref={listRef} className={listClasses} role=\"tablist\">\n {tabChildren}\n {variant === 'line' && (\n <span ref={indicatorRef} className=\"eidos-tabs-indicator\" aria-hidden=\"true\" />\n )}\n </div>\n\n {showNextButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('next')}\n onClick={() => scrollByStep(1)}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronRight className=\"eidos-tabs-scroll-button-icon\" />\n </button>\n )}\n </div>\n\n <div className=\"eidos-tabs-panels\">{panelChildren}</div>\n </div>\n </TabsContext.Provider>\n );\n};\n\nTabs.displayName = 'Tabs';\n"],"mappings":"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","names":[]}
|