@xylabs/react-button 5.1.6 → 5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonEx.d.ts","sourceRoot":"","sources":["../../../src/components/ButtonEx.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAA;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGxD,QAAA,MAAM,QAAQ,yFAEZ,CAAA;AAIF,OAAO,EAAE,QAAQ,EAAE,CAAA"}
1
+ {"version":3,"file":"ButtonEx.d.ts","sourceRoot":"","sources":["../../../src/components/ButtonEx.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAA;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGxD,QAAA,MAAM,QAAQ,yFAOZ,CAAA;AAIF,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -1,14 +1,27 @@
1
1
  import type { ButtonProps } from '@mui/material';
2
2
  import type { BoxlikeComponentProps, BusyProps } from '@xylabs/react-shared';
3
3
  import type { NavigateOptions, To } from 'react-router-dom';
4
- interface ButtonExProps extends Omit<ButtonProps, 'ref'>, BoxlikeComponentProps, BusyProps {
4
+ export interface ButtonBaseExProps extends Omit<ButtonProps, 'ref' | 'href'>, BoxlikeComponentProps, BusyProps {
5
5
  disableUserEvents?: boolean;
6
6
  funnel?: string;
7
7
  intent?: string;
8
8
  placement?: string;
9
9
  target?: string;
10
- to?: To;
10
+ }
11
+ export interface ButtonToExProps extends ButtonBaseExProps {
12
+ href?: never;
13
+ to: To;
11
14
  toOptions?: NavigateOptions;
12
15
  }
13
- export type { ButtonExProps };
16
+ export interface ButtonHrefExProps extends ButtonBaseExProps {
17
+ href: string;
18
+ to?: never;
19
+ toOptions?: never;
20
+ }
21
+ export interface ButtonClickExProps extends ButtonBaseExProps {
22
+ href?: never;
23
+ to?: never;
24
+ toOptions?: never;
25
+ }
26
+ export type ButtonExProps = ButtonToExProps | ButtonHrefExProps | ButtonClickExProps;
14
27
  //# sourceMappingURL=ButtonExProps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonExProps.d.ts","sourceRoot":"","sources":["../../../src/components/ButtonExProps.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAE3D,UAAU,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,qBAAqB,EAAE,SAAS;IACxF,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,EAAE,CAAA;IACP,SAAS,CAAC,EAAE,eAAe,CAAA;CAC5B;AAED,YAAY,EAAE,aAAa,EAAE,CAAA"}
1
+ {"version":3,"file":"ButtonExProps.d.ts","sourceRoot":"","sources":["../../../src/components/ButtonExProps.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAE3D,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC,EAAE,qBAAqB,EAAE,SAAS;IAC5G,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,EAAE,EAAE,EAAE,CAAA;IACN,SAAS,CAAC,EAAE,eAAe,CAAA;CAC5B;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,SAAS,CAAC,EAAE,KAAK,CAAA;CAClB;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,SAAS,CAAC,EAAE,KAAK,CAAA;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,iBAAiB,GAAG,kBAAkB,CAAA"}
@@ -84,12 +84,17 @@ var ButtonToEx = /* @__PURE__ */ forwardRef2(({ to, toOptions, onClick, ...props
84
84
  ButtonToEx.displayName = "ButtonToExXYLabs";
85
85
 
86
86
  // src/components/ButtonEx.tsx
87
- var ButtonEx = /* @__PURE__ */ forwardRef3(({ to, ...props }, ref) => {
88
- return to ? /* @__PURE__ */ React3.createElement(ButtonToEx, {
89
- to,
90
- ref,
91
- ...props
92
- }) : /* @__PURE__ */ React3.createElement(ButtonExBase, props);
87
+ var ButtonEx = /* @__PURE__ */ forwardRef3((props, ref) => {
88
+ if (props.to) {
89
+ const { to, ...additionalProps } = props;
90
+ return /* @__PURE__ */ React3.createElement(ButtonToEx, {
91
+ to,
92
+ ref,
93
+ ...additionalProps
94
+ });
95
+ } else {
96
+ return /* @__PURE__ */ React3.createElement(ButtonExBase, props);
97
+ }
93
98
  });
94
99
  ButtonEx.displayName = "ButtonExXYLabs";
95
100
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/ButtonEx.tsx","../../src/components/ButtonExBase.tsx","../../src/components/ButtonExTo.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\nimport { ButtonExBase } from './ButtonExBase.tsx'\nimport type { ButtonExProps } from './ButtonExProps.tsx'\nimport { ButtonToEx } from './ButtonExTo.tsx'\n\nconst ButtonEx = forwardRef<HTMLButtonElement, ButtonExProps>(({ to, ...props }, ref) => {\n return to ? <ButtonToEx to={to} ref={ref} {...props} /> : <ButtonExBase {...props} />\n})\n\nButtonEx.displayName = 'ButtonExXYLabs'\n\nexport { ButtonEx }\n","import { Button, useTheme } from '@mui/material'\nimport { useUserEvents } from '@xylabs/react-pixel'\nimport {\n BusyCircularProgress, BusyLinearProgress, mergeBoxlikeStyles,\n} from '@xylabs/react-shared'\nimport type { MouseEvent } from 'react'\nimport React, { forwardRef } from 'react'\n\nimport type { ButtonExProps } from './ButtonExProps.tsx'\n\nconst ButtonExBase = forwardRef<HTMLButtonElement, ButtonExProps>(({\n funnel, intent, target, placement, disableUserEvents, href, ...props\n}, ref) => {\n const theme = useTheme()\n const userEvents = useUserEvents()\n const {\n busy, busyVariant = 'linear', busyOpacity, onClick, children, ...rootProps\n } = mergeBoxlikeStyles<ButtonExProps>(theme, props)\n\n const localOnClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (busy) {\n // If it is busy, do not allow href clicks\n event.preventDefault()\n } else {\n const elementName = props['aria-label'] ?? event.currentTarget.textContent\n // we do this crazy navigate thing so that we can set it up outside the promise so that safari does not block it\n const windowToNavigate = () => (target && href) ? window.open('', target) ?? globalThis : globalThis\n const callOnClickAndFollowHref = (windowToNav = windowToNavigate()) => {\n onClick?.(event)\n if (href) {\n windowToNav.location.href = href\n }\n }\n if (!disableUserEvents && userEvents) {\n event.preventDefault()\n const windowToNav = windowToNavigate()\n if (href) {\n userEvents.userClick({\n elementName, intent, funnel, placement,\n }).then(() => {\n callOnClickAndFollowHref(windowToNav)\n }).catch((ex) => {\n console.error('User event failed', elementName, funnel, placement, ex)\n callOnClickAndFollowHref(windowToNav)\n })\n }\n onClick?.(event)\n } else {\n callOnClickAndFollowHref()\n }\n }\n }\n\n return (\n <Button ref={ref} href={href} onClick={localOnClick} target={target} {...rootProps}>\n {busy && busyVariant === 'linear'\n ? <BusyLinearProgress rounded opacity={busyOpacity ?? 0} />\n : null}\n {busy && busyVariant === 'circular'\n ? <BusyCircularProgress rounded size={24} opacity={busyOpacity ?? 0.5} />\n : null}\n {children}\n </Button>\n )\n})\n\nButtonExBase.displayName = 'ButtonExBaseXYLabs'\n\nexport { ButtonExBase }\n","import type { MouseEvent } from 'react'\nimport React, { forwardRef } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { ButtonExBase } from './ButtonExBase.tsx'\nimport type { ButtonExProps } from './ButtonExProps.tsx'\n\nconst ButtonToEx = forwardRef<HTMLButtonElement, ButtonExProps>(({\n to, toOptions, onClick, ...props\n}, ref) => {\n const navigate = useNavigate()\n const localOnClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (to) {\n navigate(to, toOptions)\n }\n }\n\n return <ButtonExBase ref={ref} onClick={localOnClick} {...props} />\n})\n\nButtonToEx.displayName = 'ButtonToExXYLabs'\n\nexport { ButtonToEx }\n"],"mappings":";;;;AAAA,OAAOA,UAASC,cAAAA,mBAAkB;;;ACAlC,SAASC,QAAQC,gBAAgB;AACjC,SAASC,qBAAqB;AAC9B,SACEC,sBAAsBC,oBAAoBC,0BACrC;AAEP,OAAOC,SAASC,kBAAkB;AAIlC,IAAMC,eAAeC,2BAA6C,CAAC,EACjEC,QAAQC,QAAQC,QAAQC,WAAWC,mBAAmBC,MAAM,GAAGC,MAAAA,GAC9DC,QAAAA;AACD,QAAMC,QAAQC,SAAAA;AACd,QAAMC,aAAaC,cAAAA;AACnB,QAAM,EACJC,MAAMC,cAAc,UAAUC,aAAaC,SAASC,UAAU,GAAGC,UAAAA,IAC/DC,mBAAkCV,OAAOF,KAAAA;AAE7C,QAAMa,eAAe,wBAACC,UAAAA;AACpB,QAAIR,MAAM;AAERQ,YAAMC,eAAc;IACtB,OAAO;AACL,YAAMC,cAAchB,MAAM,YAAA,KAAiBc,MAAMG,cAAcC;AAE/D,YAAMC,mBAAmB,6BAAOvB,UAAUG,OAAQqB,OAAOC,KAAK,IAAIzB,MAAAA,KAAW0B,aAAaA,YAAjE;AACzB,YAAMC,2BAA2B,wBAACC,cAAcL,iBAAAA,MAAkB;AAChEV,kBAAUK,KAAAA;AACV,YAAIf,MAAM;AACRyB,sBAAYC,SAAS1B,OAAOA;QAC9B;MACF,GALiC;AAMjC,UAAI,CAACD,qBAAqBM,YAAY;AACpCU,cAAMC,eAAc;AACpB,cAAMS,cAAcL,iBAAAA;AACpB,YAAIpB,MAAM;AACRK,qBAAWsB,UAAU;YACnBV;YAAarB;YAAQD;YAAQG;UAC/B,CAAA,EAAG8B,KAAK,MAAA;AACNJ,qCAAyBC,WAAAA;UAC3B,CAAA,EAAGI,MAAM,CAACC,OAAAA;AACRC,oBAAQC,MAAM,qBAAqBf,aAAatB,QAAQG,WAAWgC,EAAAA;AACnEN,qCAAyBC,WAAAA;UAC3B,CAAA;QACF;AACAf,kBAAUK,KAAAA;MACZ,OAAO;AACLS,iCAAAA;MACF;IACF;EACF,GAhCqB;AAkCrB,SACE,sBAAA,cAACS,QAAAA;IAAO/B;IAAUF;IAAYU,SAASI;IAAcjB;IAAiB,GAAGe;KACtEL,QAAQC,gBAAgB,WACrB,sBAAA,cAAC0B,oBAAAA;IAAmBC,SAAAA;IAAQC,SAAS3B,eAAe;OACpD,MACHF,QAAQC,gBAAgB,aACrB,sBAAA,cAAC6B,sBAAAA;IAAqBF,SAAAA;IAAQG,MAAM;IAAIF,SAAS3B,eAAe;OAChE,MACHE,QAAAA;AAGP,CAAA;AAEAlB,aAAa8C,cAAc;;;ACjE3B,OAAOC,UAASC,cAAAA,mBAAkB;AAClC,SAASC,mBAAmB;AAK5B,IAAMC,aAAaC,gBAAAA,YAA6C,CAAC,EAC/DC,IAAIC,WAAWC,SAAS,GAAGC,MAAAA,GAC1BC,QAAAA;AACD,QAAMC,WAAWC,YAAAA;AACjB,QAAMC,eAAe,wBAACC,UAAAA;AACpBN,cAAUM,KAAAA;AACV,QAAIR,IAAI;AACNK,eAASL,IAAIC,SAAAA;IACf;EACF,GALqB;AAOrB,SAAO,gBAAAQ,OAAA,cAACC,cAAAA;IAAaN;IAAUF,SAASK;IAAe,GAAGJ;;AAC5D,CAAA;AAEAL,WAAWa,cAAc;;;AFfzB,IAAMC,WAAWC,gBAAAA,YAA6C,CAAC,EAAEC,IAAI,GAAGC,MAAAA,GAASC,QAAAA;AAC/E,SAAOF,KAAK,gBAAAG,OAAA,cAACC,YAAAA;IAAWJ;IAAQE;IAAW,GAAGD;OAAY,gBAAAE,OAAA,cAACE,cAAiBJ,KAAAA;AAC9E,CAAA;AAEAH,SAASQ,cAAc;","names":["React","forwardRef","Button","useTheme","useUserEvents","BusyCircularProgress","BusyLinearProgress","mergeBoxlikeStyles","React","forwardRef","ButtonExBase","forwardRef","funnel","intent","target","placement","disableUserEvents","href","props","ref","theme","useTheme","userEvents","useUserEvents","busy","busyVariant","busyOpacity","onClick","children","rootProps","mergeBoxlikeStyles","localOnClick","event","preventDefault","elementName","currentTarget","textContent","windowToNavigate","window","open","globalThis","callOnClickAndFollowHref","windowToNav","location","userClick","then","catch","ex","console","error","Button","BusyLinearProgress","rounded","opacity","BusyCircularProgress","size","displayName","React","forwardRef","useNavigate","ButtonToEx","forwardRef","to","toOptions","onClick","props","ref","navigate","useNavigate","localOnClick","event","React","ButtonExBase","displayName","ButtonEx","forwardRef","to","props","ref","React","ButtonToEx","ButtonExBase","displayName"]}
1
+ {"version":3,"sources":["../../src/components/ButtonEx.tsx","../../src/components/ButtonExBase.tsx","../../src/components/ButtonExTo.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\nimport { ButtonExBase } from './ButtonExBase.tsx'\nimport type { ButtonExProps } from './ButtonExProps.tsx'\nimport { ButtonToEx } from './ButtonExTo.tsx'\n\nconst ButtonEx = forwardRef<HTMLButtonElement, ButtonExProps>((props, ref) => {\n if (props.to) {\n const { to, ...additionalProps } = props\n return <ButtonToEx to={to} ref={ref} {...additionalProps} />\n } else {\n return <ButtonExBase {...props} />\n }\n})\n\nButtonEx.displayName = 'ButtonExXYLabs'\n\nexport { ButtonEx }\n","import { Button, useTheme } from '@mui/material'\nimport { useUserEvents } from '@xylabs/react-pixel'\nimport {\n BusyCircularProgress, BusyLinearProgress, mergeBoxlikeStyles,\n} from '@xylabs/react-shared'\nimport type { MouseEvent } from 'react'\nimport React, { forwardRef } from 'react'\n\nimport type { ButtonExProps } from './ButtonExProps.tsx'\n\nconst ButtonExBase = forwardRef<HTMLButtonElement, ButtonExProps>(({\n funnel, intent, target, placement, disableUserEvents, href, ...props\n}, ref) => {\n const theme = useTheme()\n const userEvents = useUserEvents()\n const {\n busy, busyVariant = 'linear', busyOpacity, onClick, children, ...rootProps\n } = mergeBoxlikeStyles<ButtonExProps>(theme, props)\n\n const localOnClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (busy) {\n // If it is busy, do not allow href clicks\n event.preventDefault()\n } else {\n const elementName = props['aria-label'] ?? event.currentTarget.textContent\n // we do this crazy navigate thing so that we can set it up outside the promise so that safari does not block it\n const windowToNavigate = () => (target && href) ? window.open('', target) ?? globalThis : globalThis\n const callOnClickAndFollowHref = (windowToNav = windowToNavigate()) => {\n onClick?.(event)\n if (href) {\n windowToNav.location.href = href\n }\n }\n if (!disableUserEvents && userEvents) {\n event.preventDefault()\n const windowToNav = windowToNavigate()\n if (href) {\n userEvents.userClick({\n elementName, intent, funnel, placement,\n }).then(() => {\n callOnClickAndFollowHref(windowToNav)\n }).catch((ex) => {\n console.error('User event failed', elementName, funnel, placement, ex)\n callOnClickAndFollowHref(windowToNav)\n })\n }\n onClick?.(event)\n } else {\n callOnClickAndFollowHref()\n }\n }\n }\n\n return (\n <Button ref={ref} href={href} onClick={localOnClick} target={target} {...rootProps}>\n {busy && busyVariant === 'linear'\n ? <BusyLinearProgress rounded opacity={busyOpacity ?? 0} />\n : null}\n {busy && busyVariant === 'circular'\n ? <BusyCircularProgress rounded size={24} opacity={busyOpacity ?? 0.5} />\n : null}\n {children}\n </Button>\n )\n})\n\nButtonExBase.displayName = 'ButtonExBaseXYLabs'\n\nexport { ButtonExBase }\n","import type { MouseEvent } from 'react'\nimport React, { forwardRef } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { ButtonExBase } from './ButtonExBase.tsx'\nimport type { ButtonExProps } from './ButtonExProps.tsx'\n\nconst ButtonToEx = forwardRef<HTMLButtonElement, ButtonExProps>(({\n to, toOptions, onClick, ...props\n}, ref) => {\n const navigate = useNavigate()\n const localOnClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (to) {\n navigate(to, toOptions)\n }\n }\n\n return <ButtonExBase ref={ref} onClick={localOnClick} {...props} />\n})\n\nButtonToEx.displayName = 'ButtonToExXYLabs'\n\nexport { ButtonToEx }\n"],"mappings":";;;;AAAA,OAAOA,UAASC,cAAAA,mBAAkB;;;ACAlC,SAASC,QAAQC,gBAAgB;AACjC,SAASC,qBAAqB;AAC9B,SACEC,sBAAsBC,oBAAoBC,0BACrC;AAEP,OAAOC,SAASC,kBAAkB;AAIlC,IAAMC,eAAeC,2BAA6C,CAAC,EACjEC,QAAQC,QAAQC,QAAQC,WAAWC,mBAAmBC,MAAM,GAAGC,MAAAA,GAC9DC,QAAAA;AACD,QAAMC,QAAQC,SAAAA;AACd,QAAMC,aAAaC,cAAAA;AACnB,QAAM,EACJC,MAAMC,cAAc,UAAUC,aAAaC,SAASC,UAAU,GAAGC,UAAAA,IAC/DC,mBAAkCV,OAAOF,KAAAA;AAE7C,QAAMa,eAAe,wBAACC,UAAAA;AACpB,QAAIR,MAAM;AAERQ,YAAMC,eAAc;IACtB,OAAO;AACL,YAAMC,cAAchB,MAAM,YAAA,KAAiBc,MAAMG,cAAcC;AAE/D,YAAMC,mBAAmB,6BAAOvB,UAAUG,OAAQqB,OAAOC,KAAK,IAAIzB,MAAAA,KAAW0B,aAAaA,YAAjE;AACzB,YAAMC,2BAA2B,wBAACC,cAAcL,iBAAAA,MAAkB;AAChEV,kBAAUK,KAAAA;AACV,YAAIf,MAAM;AACRyB,sBAAYC,SAAS1B,OAAOA;QAC9B;MACF,GALiC;AAMjC,UAAI,CAACD,qBAAqBM,YAAY;AACpCU,cAAMC,eAAc;AACpB,cAAMS,cAAcL,iBAAAA;AACpB,YAAIpB,MAAM;AACRK,qBAAWsB,UAAU;YACnBV;YAAarB;YAAQD;YAAQG;UAC/B,CAAA,EAAG8B,KAAK,MAAA;AACNJ,qCAAyBC,WAAAA;UAC3B,CAAA,EAAGI,MAAM,CAACC,OAAAA;AACRC,oBAAQC,MAAM,qBAAqBf,aAAatB,QAAQG,WAAWgC,EAAAA;AACnEN,qCAAyBC,WAAAA;UAC3B,CAAA;QACF;AACAf,kBAAUK,KAAAA;MACZ,OAAO;AACLS,iCAAAA;MACF;IACF;EACF,GAhCqB;AAkCrB,SACE,sBAAA,cAACS,QAAAA;IAAO/B;IAAUF;IAAYU,SAASI;IAAcjB;IAAiB,GAAGe;KACtEL,QAAQC,gBAAgB,WACrB,sBAAA,cAAC0B,oBAAAA;IAAmBC,SAAAA;IAAQC,SAAS3B,eAAe;OACpD,MACHF,QAAQC,gBAAgB,aACrB,sBAAA,cAAC6B,sBAAAA;IAAqBF,SAAAA;IAAQG,MAAM;IAAIF,SAAS3B,eAAe;OAChE,MACHE,QAAAA;AAGP,CAAA;AAEAlB,aAAa8C,cAAc;;;ACjE3B,OAAOC,UAASC,cAAAA,mBAAkB;AAClC,SAASC,mBAAmB;AAK5B,IAAMC,aAAaC,gBAAAA,YAA6C,CAAC,EAC/DC,IAAIC,WAAWC,SAAS,GAAGC,MAAAA,GAC1BC,QAAAA;AACD,QAAMC,WAAWC,YAAAA;AACjB,QAAMC,eAAe,wBAACC,UAAAA;AACpBN,cAAUM,KAAAA;AACV,QAAIR,IAAI;AACNK,eAASL,IAAIC,SAAAA;IACf;EACF,GALqB;AAOrB,SAAO,gBAAAQ,OAAA,cAACC,cAAAA;IAAaN;IAAUF,SAASK;IAAe,GAAGJ;;AAC5D,CAAA;AAEAL,WAAWa,cAAc;;;AFfzB,IAAMC,WAAWC,gBAAAA,YAA6C,CAACC,OAAOC,QAAAA;AACpE,MAAID,MAAME,IAAI;AACZ,UAAM,EAAEA,IAAI,GAAGC,gBAAAA,IAAoBH;AACnC,WAAO,gBAAAI,OAAA,cAACC,YAAAA;MAAWH;MAAQD;MAAW,GAAGE;;EAC3C,OAAO;AACL,WAAO,gBAAAC,OAAA,cAACE,cAAiBN,KAAAA;EAC3B;AACF,CAAA;AAEAF,SAASS,cAAc;","names":["React","forwardRef","Button","useTheme","useUserEvents","BusyCircularProgress","BusyLinearProgress","mergeBoxlikeStyles","React","forwardRef","ButtonExBase","forwardRef","funnel","intent","target","placement","disableUserEvents","href","props","ref","theme","useTheme","userEvents","useUserEvents","busy","busyVariant","busyOpacity","onClick","children","rootProps","mergeBoxlikeStyles","localOnClick","event","preventDefault","elementName","currentTarget","textContent","windowToNavigate","window","open","globalThis","callOnClickAndFollowHref","windowToNav","location","userClick","then","catch","ex","console","error","Button","BusyLinearProgress","rounded","opacity","BusyCircularProgress","size","displayName","React","forwardRef","useNavigate","ButtonToEx","forwardRef","to","toOptions","onClick","props","ref","navigate","useNavigate","localOnClick","event","React","ButtonExBase","displayName","ButtonEx","forwardRef","props","ref","to","additionalProps","React","ButtonToEx","ButtonExBase","displayName"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/react-button",
3
- "version": "5.1.6",
3
+ "version": "5.2.0",
4
4
  "description": "Common React library for all XY Labs projects that use React",
5
5
  "keywords": [
6
6
  "utility",
@@ -37,15 +37,15 @@
37
37
  "packages/*"
38
38
  ],
39
39
  "dependencies": {
40
- "@xylabs/react-pixel": "^5.1.6",
41
- "@xylabs/react-shared": "^5.1.6",
40
+ "@xylabs/react-pixel": "^5.2.0",
41
+ "@xylabs/react-shared": "^5.2.0",
42
42
  "react-router-dom": "^6.27.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@mui/material": "^6.1.3",
46
46
  "@storybook/react": "^8.3.5",
47
47
  "@types/react": "^18.3.11",
48
- "@xylabs/react-flexbox": "^5.1.6",
48
+ "@xylabs/react-flexbox": "^5.2.0",
49
49
  "@xylabs/ts-scripts-yarn3": "^4.2.1",
50
50
  "@xylabs/tsconfig-react": "^4.2.1",
51
51
  "react": "^18.3.1",
@@ -4,8 +4,13 @@ import { ButtonExBase } from './ButtonExBase.tsx'
4
4
  import type { ButtonExProps } from './ButtonExProps.tsx'
5
5
  import { ButtonToEx } from './ButtonExTo.tsx'
6
6
 
7
- const ButtonEx = forwardRef<HTMLButtonElement, ButtonExProps>(({ to, ...props }, ref) => {
8
- return to ? <ButtonToEx to={to} ref={ref} {...props} /> : <ButtonExBase {...props} />
7
+ const ButtonEx = forwardRef<HTMLButtonElement, ButtonExProps>((props, ref) => {
8
+ if (props.to) {
9
+ const { to, ...additionalProps } = props
10
+ return <ButtonToEx to={to} ref={ref} {...additionalProps} />
11
+ } else {
12
+ return <ButtonExBase {...props} />
13
+ }
9
14
  })
10
15
 
11
16
  ButtonEx.displayName = 'ButtonExXYLabs'
@@ -2,14 +2,30 @@ import type { ButtonProps } from '@mui/material'
2
2
  import type { BoxlikeComponentProps, BusyProps } from '@xylabs/react-shared'
3
3
  import type { NavigateOptions, To } from 'react-router-dom'
4
4
 
5
- interface ButtonExProps extends Omit<ButtonProps, 'ref'>, BoxlikeComponentProps, BusyProps {
5
+ export interface ButtonBaseExProps extends Omit<ButtonProps, 'ref' | 'href'>, BoxlikeComponentProps, BusyProps {
6
6
  disableUserEvents?: boolean
7
7
  funnel?: string
8
8
  intent?: string
9
9
  placement?: string
10
10
  target?: string
11
- to?: To
11
+ }
12
+
13
+ export interface ButtonToExProps extends ButtonBaseExProps {
14
+ href?: never
15
+ to: To
12
16
  toOptions?: NavigateOptions
13
17
  }
14
18
 
15
- export type { ButtonExProps }
19
+ export interface ButtonHrefExProps extends ButtonBaseExProps {
20
+ href: string
21
+ to?: never
22
+ toOptions?: never
23
+ }
24
+
25
+ export interface ButtonClickExProps extends ButtonBaseExProps {
26
+ href?: never
27
+ to?: never
28
+ toOptions?: never
29
+ }
30
+
31
+ export type ButtonExProps = ButtonToExProps | ButtonHrefExProps | ButtonClickExProps