@dynamic-framework/ui-react 2.2.0 → 2.3.1

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.
Files changed (57) hide show
  1. package/README.md +8 -0
  2. package/dist/css/dynamic-ui.css +2215 -224
  3. package/dist/css/dynamic-ui.min.css +2 -2
  4. package/dist/index.esm.js +197 -132
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/index.js +195 -130
  7. package/dist/index.js.map +1 -1
  8. package/dist/types/components/DBadge/DBadge.d.ts +3 -2
  9. package/dist/types/components/DButton/DButton.d.ts +3 -2
  10. package/dist/types/components/DButtonIcon/DButtonIcon.d.ts +3 -7
  11. package/dist/types/components/DCollapse/DCollapse.d.ts +1 -2
  12. package/dist/types/components/DDatePicker/DDatePicker.d.ts +2 -1
  13. package/dist/types/components/DDatePicker/components/DDatePickerTime.d.ts +4 -6
  14. package/dist/types/components/DInputPin/DInputPin.d.ts +2 -1
  15. package/dist/types/components/DPopover/DPopover.d.ts +2 -7
  16. package/dist/types/components/DSelect/DSelect.d.ts +2 -1
  17. package/dist/types/components/DSelect/components/DSelectOptionCheck.d.ts +1 -1
  18. package/dist/types/components/DTabs/DTabs.d.ts +3 -1
  19. package/package.json +11 -15
  20. package/src/style/_shame.scss +2 -2
  21. package/src/style/abstracts/_mixins.scss +4 -4
  22. package/src/style/abstracts/_utilities.scss +68 -11
  23. package/src/style/abstracts/variables/_+import.scss +2 -2
  24. package/src/style/abstracts/variables/_alerts.scss +1 -1
  25. package/src/style/abstracts/variables/_border.scss +9 -0
  26. package/src/style/abstracts/variables/_buttons.scss +1 -1
  27. package/src/style/abstracts/variables/_carousel.scss +13 -1
  28. package/src/style/abstracts/variables/_colors.scss +2 -2
  29. package/src/style/abstracts/variables/_navs.scss +23 -27
  30. package/src/style/base/_+import.scss +1 -0
  31. package/src/style/base/_badge.scss +1 -1
  32. package/src/style/base/_carousel.scss +44 -0
  33. package/src/style/base/_collapse.scss +21 -8
  34. package/src/style/base/_nav.scss +10 -59
  35. package/src/style/base/_type.scss +4 -0
  36. package/src/style/components/_+import.scss +0 -1
  37. package/src/style/components/_d-avatar.scss +2 -2
  38. package/src/style/components/_d-box.scss +10 -10
  39. package/src/style/components/_d-carousel.scss +26 -4
  40. package/src/style/components/_d-chip.scss +13 -3
  41. package/src/style/components/_d-credit-card.scss +22 -12
  42. package/src/style/components/_d-icon.scss +17 -0
  43. package/src/style/components/_d-select.scss +59 -25
  44. package/src/style/components/_d-stepper-desktop.scss +2 -2
  45. package/src/style/components/_d-tabs.scss +7 -18
  46. package/src/style/components/_d-timeline.scss +6 -5
  47. package/src/style/components/_d-voucher.scss +1 -1
  48. package/src/style/helpers/_+import.scss +1 -0
  49. package/src/style/helpers/_animations.scss +13 -0
  50. package/src/style/root/_root.scss +8 -4
  51. package/dist/css/dynamic-ui-non-root.css +0 -50044
  52. package/dist/css/dynamic-ui-non-root.min.css +0 -6
  53. package/dist/css/dynamic-ui-root.css +0 -1116
  54. package/dist/css/dynamic-ui-root.min.css +0 -6
  55. package/src/style/components/_d-collapse-icon-text.scss +0 -16
  56. package/src/style/dynamic-ui-non-root.scss +0 -17
  57. package/src/style/dynamic-ui-root.scss +0 -5
package/dist/index.esm.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import classNames from 'classnames';
3
- import React, { useEffect, useState, useCallback, useMemo, useContext, createContext, useLayoutEffect, useSyncExternalStore, forwardRef, useId, useRef } from 'react';
3
+ import React, { useEffect, useState, useCallback, useMemo, useContext, createContext, useLayoutEffect, useSyncExternalStore, forwardRef, useId, useRef, isValidElement, cloneElement, createRef } from 'react';
4
4
  import { __rest } from 'tslib';
5
5
  import * as LucideIcons from 'lucide-react';
6
6
  import { createPortal } from 'react-dom';
@@ -11,15 +11,15 @@ import currency from 'currency.js';
11
11
  import DatePicker from 'react-datepicker';
12
12
  import { getYear, format, getMonth } from 'date-fns';
13
13
  import Select, { components } from 'react-select';
14
+ import { getErrorMessage, ErrorBoundary } from 'react-error-boundary';
15
+ export { getErrorMessage, useErrorBoundary } from 'react-error-boundary';
14
16
  import { InputMask } from '@react-input/mask';
17
+ import { defaultCountries, parseCountry, usePhoneInput, CountrySelector } from 'react-international-phone';
18
+ import { PhoneNumberUtil } from 'google-libphonenumber';
15
19
  import ResponsivePagination from 'react-responsive-pagination';
16
20
  import { useFloating, autoUpdate, offset, flip, shift, useClick, useDismiss, useRole, useInteractions, useId as useId$1, FloatingFocusManager, arrow, useHover, useFocus, FloatingPortal, FloatingArrow } from '@floating-ui/react';
17
21
  import { Toaster, toast } from 'react-hot-toast';
18
- import { defaultCountries, parseCountry, usePhoneInput, CountrySelector } from 'react-international-phone';
19
- import { PhoneNumberUtil } from 'google-libphonenumber';
20
22
  import html2canvas from 'html2canvas';
21
- import { getErrorMessage, ErrorBoundary } from 'react-error-boundary';
22
- export { getErrorMessage, useErrorBoundary } from 'react-error-boundary';
23
23
  import i18n from 'i18next';
24
24
  import { initReactI18next } from 'react-i18next';
25
25
 
@@ -412,21 +412,6 @@ function DIconBase({ icon, color, style, className, size, useListenerSize = fals
412
412
  const icons = LucideIcons;
413
413
  return icons[icon] || null;
414
414
  }, [icon, useMaterialIcons]);
415
- const colorStyle = useMemo(() => {
416
- if (color) {
417
- return { [`--${PREFIX_BS}icon-component-color`]: `var(--${PREFIX_BS}${color})` };
418
- }
419
- return {};
420
- }, [color]);
421
- const backgroundStyle = useMemo(() => {
422
- if (hasCircle) {
423
- if (color) {
424
- return { [`--${PREFIX_BS}icon-component-bg-color`]: `rgba(var(--${PREFIX_BS}${color}-rgb), 0.1)` };
425
- }
426
- return { [`--${PREFIX_BS}icon-component-bg-color`]: `rgba(var(--${PREFIX_BS}body-color-rgb), 0.1)` };
427
- }
428
- return {};
429
- }, [hasCircle, color]);
430
415
  const { responsivePropValue } = useResponsiveProp(useListenerSize);
431
416
  const resolvedSize = useMemo(() => {
432
417
  if (!size)
@@ -435,8 +420,8 @@ function DIconBase({ icon, color, style, className, size, useListenerSize = fals
435
420
  return size;
436
421
  return responsivePropValue(size);
437
422
  }, [responsivePropValue, size]);
438
- const generateStyleVariables = useMemo(() => (Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, resolvedSize && { [`--${PREFIX_BS}icon-component-size`]: resolvedSize }), colorStyle), backgroundStyle), hasCircle && { [`--${PREFIX_BS}icon-component-padding`]: `calc(var(--${PREFIX_BS}icon-component-size, 24px) * 0.4)` }), style)), [resolvedSize, colorStyle, backgroundStyle, hasCircle, style]);
439
- const generateClasses = useMemo(() => (Object.assign({ 'd-icon': true }, className && { [className]: true })), [className]);
423
+ const generateStyleVariables = useMemo(() => (Object.assign(Object.assign(Object.assign({}, resolvedSize && { [`--${PREFIX_BS}icon-component-size`]: resolvedSize }), hasCircle && { [`--${PREFIX_BS}icon-component-padding`]: `calc(var(--${PREFIX_BS}icon-component-size, 24px) * 0.4)` }), style)), [resolvedSize, hasCircle, style]);
424
+ const generateClasses = useMemo(() => (Object.assign(Object.assign(Object.assign({ 'd-icon': true }, className && { [className]: true }), { 'd-icon-has-circle': hasCircle }), color && { [`d-icon-color-${color}`]: true })), [className, hasCircle, color]);
440
425
  const iconSize = useMemo(() => {
441
426
  if (resolvedSize) {
442
427
  const numSize = parseInt(resolvedSize, 10);
@@ -491,14 +476,24 @@ function DAvatar({ id, size, image, name: nameProp, useNameAsInitials = false, c
491
476
  return (jsxs("div", Object.assign({ className: classNames(generateClasses, className), style: style, id: id }, dataAttributes, { children: [image && jsx("img", { src: image, alt: nameProp, className: "d-avatar-img" }), (name && !image) && jsx("span", { className: "d-avatar-name", children: name })] })));
492
477
  }
493
478
 
494
- function DBadge({ text, soft = false, color = 'primary', id, rounded, className, size, style, iconStart, iconEnd, iconMaterialStyle, iconFamilyClass, iconFamilyPrefix, dataAttributes, }) {
479
+ function DBadge(props) {
480
+ const { text, soft = false, color = 'primary', id, rounded, className, size, style, iconStart, iconEnd, iconMaterialStyle, iconFamilyClass, iconFamilyPrefix, dataAttributes, } = props;
481
+ // Responsive size resolution using useResponsiveProp
482
+ const { responsivePropValue } = useResponsiveProp(true);
483
+ const resolvedSize = useMemo(() => {
484
+ if (!size)
485
+ return undefined;
486
+ if (typeof size === 'string')
487
+ return size;
488
+ return responsivePropValue(size);
489
+ }, [responsivePropValue, size]);
495
490
  const generateClasses = useMemo(() => ({
496
491
  badge: true,
497
492
  [`badge-${color}`]: !!color && !soft,
498
493
  [`badge-soft-${color}`]: !!color && soft,
499
494
  'rounded-pill': !!rounded,
500
- [`badge-${size}`]: !!size,
501
- }), [rounded, soft, color, size]);
495
+ [`badge-${resolvedSize}`]: !!resolvedSize,
496
+ }), [rounded, soft, color, resolvedSize]);
502
497
  return (jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, id && { id }, dataAttributes, { children: [iconStart && (jsx(DIcon, { icon: iconStart, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })), jsx("span", { children: text }), iconEnd && (jsx(DIcon, { icon: iconEnd, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle }))] })));
503
498
  }
504
499
 
@@ -593,7 +588,7 @@ function DInput(_a, ref) {
593
588
  [`input-group-${size}`]: !!size,
594
589
  'input-group': true,
595
590
  'has-validation': invalid || valid,
596
- }), children: [!!inputStart && (jsx("div", { className: "input-group-text", id: `${id}InputStart`, children: inputStart })), iconStart && (jsx("button", { type: "button", className: "input-group-text", id: `${id}Start`, onClick: handleOnIconStartClick, disabled: disabled || loading || iconStartDisabled, "aria-label": iconStartAriaLabel, tabIndex: onIconStartClick ? iconStartTabIndex : -1, children: jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle }) })), dynamicComponent, (iconEnd && !loading) && (jsx("button", { type: "button", className: "input-group-text", id: `${id}End`, onClick: handleOnIconEndClick, disabled: disabled || loading || iconEndDisabled, "aria-label": iconEndAriaLabel, tabIndex: onIconEndClick ? iconEndTabIndex : -1, children: jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }) })), loading && (jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", "data-testid": "loading-spinner", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
591
+ }), children: [!!inputStart && (jsx("div", { className: "input-group-text", id: `${id}InputStart`, children: inputStart })), iconStart && (onIconStartClick ? (jsx("button", { type: "button", className: "input-group-text", id: `${id}Start`, onClick: handleOnIconStartClick, disabled: disabled || loading || iconStartDisabled, "aria-label": iconStartAriaLabel || (typeof iconStart === 'string' ? iconStart : 'start icon'), tabIndex: iconStartTabIndex, children: jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle }) })) : (jsx("div", { className: "input-group-text", id: `${id}Start`, "aria-hidden": "true", tabIndex: -1, children: jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix, materialStyle: iconStartMaterialStyle }) }))), dynamicComponent, (iconEnd && !loading) && (onIconEndClick ? (jsx("button", { type: "button", className: "input-group-text", id: `${id}End`, onClick: handleOnIconEndClick, disabled: disabled || loading || iconEndDisabled, "aria-label": iconEndAriaLabel || (typeof iconEnd === 'string' ? iconEnd : 'end icon'), tabIndex: iconEndTabIndex, children: jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }) })) : (jsx("div", { className: "input-group-text", id: `${id}End`, "aria-hidden": "true", tabIndex: -1, children: jsx(DIcon, { icon: iconEnd, familyClass: iconEndFamilyClass, familyPrefix: iconEndFamilyPrefix, materialStyle: iconEndMaterialStyle }) }))), loading && (jsx("div", { className: "input-group-text", id: `${id}Loading`, children: jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", "data-testid": "loading-spinner", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }) })), !!inputEnd && (jsx("div", { className: "input-group-text", id: `${id}InputEnd`, children: inputEnd }))] }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
597
592
  }
598
593
  const ForwardedDInput = forwardRef(DInput);
599
594
  ForwardedDInput.displayName = 'DInput';
@@ -1003,7 +998,16 @@ function DBoxFile(_a) {
1003
998
  }
1004
999
 
1005
1000
  const DButton = forwardRef((props, ref) => {
1006
- const { color = 'primary', size, variant, text, children, iconStart, iconStartFamilyClass, iconStartFamilyPrefix, iconStartMaterialStyle, iconEnd, iconEndFamilyClass, iconEndFamilyPrefix, iconEndMaterialStyle, loading = false, loadingText, loadingAriaLabel, disabled = false, className, style, dataAttributes, onClick, type = 'button', target, rel } = props, rest = __rest(props, ["color", "size", "variant", "text", "children", "iconStart", "iconStartFamilyClass", "iconStartFamilyPrefix", "iconStartMaterialStyle", "iconEnd", "iconEndFamilyClass", "iconEndFamilyPrefix", "iconEndMaterialStyle", "loading", "loadingText", "loadingAriaLabel", "disabled", "className", "style", "dataAttributes", "onClick", "type", "target", "rel"]);
1001
+ const { color = 'primary', size, variant, text, children, iconStart, iconStartFamilyClass, iconStartFamilyPrefix, iconStartMaterialStyle, iconEnd, iconEndFamilyClass, iconEndFamilyPrefix, iconEndMaterialStyle, loading = false, loadingText, loadingAriaLabel, disabled = false, className, style, dataAttributes, onClick, type = 'button', target, rel, href, 'aria-label': ariaLabelProp } = props, rest = __rest(props, ["color", "size", "variant", "text", "children", "iconStart", "iconStartFamilyClass", "iconStartFamilyPrefix", "iconStartMaterialStyle", "iconEnd", "iconEndFamilyClass", "iconEndFamilyPrefix", "iconEndMaterialStyle", "loading", "loadingText", "loadingAriaLabel", "disabled", "className", "style", "dataAttributes", "onClick", "type", "target", "rel", "href", 'aria-label']);
1002
+ // Responsive size resolution using useResponsiveProp
1003
+ const { responsivePropValue } = useResponsiveProp(true);
1004
+ const resolvedSize = useMemo(() => {
1005
+ if (!size)
1006
+ return undefined;
1007
+ if (typeof size === 'string')
1008
+ return size;
1009
+ return responsivePropValue(size);
1010
+ }, [responsivePropValue, size]);
1007
1011
  const [buttonWidth, setButtonWidth] = useState();
1008
1012
  const buttonRef = useRef(null);
1009
1013
  const isDisabled = useMemo(() => disabled || loading, [disabled, loading]);
@@ -1015,16 +1019,13 @@ const DButton = forwardRef((props, ref) => {
1015
1019
  return {
1016
1020
  btn: true,
1017
1021
  [variantClass]: true,
1018
- [`btn-${size}`]: !!size,
1022
+ [`btn-${resolvedSize}`]: !!resolvedSize,
1019
1023
  loading,
1020
1024
  };
1021
- }, [variant, color, size, loading]);
1022
- const ariaLabel = useMemo(() => {
1023
- const ariaLabelProp = rest['aria-label'];
1024
- return loading
1025
- ? loadingAriaLabel || ariaLabelProp || text
1026
- : ariaLabelProp || text;
1027
- }, [loading, loadingAriaLabel, rest, text]);
1025
+ }, [variant, color, loading, resolvedSize]);
1026
+ const ariaLabel = useMemo(() => (loading
1027
+ ? loadingAriaLabel || ariaLabelProp || text
1028
+ : ariaLabelProp || text), [loading, loadingAriaLabel, text, ariaLabelProp]);
1028
1029
  const handleClick = useCallback((event) => {
1029
1030
  if (disabled || loading) {
1030
1031
  event.preventDefault();
@@ -1040,8 +1041,8 @@ const DButton = forwardRef((props, ref) => {
1040
1041
  }
1041
1042
  // eslint-disable-next-line react-hooks/exhaustive-deps
1042
1043
  }, [content, iconEnd, iconStart]);
1043
- if (props.href) {
1044
- return (jsxs("a", Object.assign({ href: props.href, target: target, rel: rel, ref: (node) => {
1044
+ if (href) {
1045
+ return (jsxs("a", Object.assign({ href: href, target: target, rel: rel, ref: (node) => {
1045
1046
  buttonRef.current = node;
1046
1047
  if (typeof ref === 'function')
1047
1048
  ref(node);
@@ -1069,7 +1070,8 @@ const DButton = forwardRef((props, ref) => {
1069
1070
  });
1070
1071
  DButton.displayName = 'DButton';
1071
1072
 
1072
- function DButtonIcon({ id, icon, size, className, variant, state, loadingAriaLabel, iconMaterialStyle, ariaLabel, color = 'primary', type = 'button', loading = false, disabled = false, href, target, rel, stopPropagationEnabled = true, style, iconFamilyClass, iconFamilyPrefix, dataAttributes, onClick, }) {
1073
+ function DButtonIcon(_a) {
1074
+ var { id, icon, size, className, variant, state, loadingAriaLabel, iconMaterialStyle, disabled = false, color = 'primary', loading = false, href, target, rel, stopPropagationEnabled = true, style, iconFamilyClass, iconFamilyPrefix, dataAttributes, onClick, 'aria-label': ariaLabelProp } = _a, rest = __rest(_a, ["id", "icon", "size", "className", "variant", "state", "loadingAriaLabel", "iconMaterialStyle", "disabled", "color", "loading", "href", "target", "rel", "stopPropagationEnabled", "style", "iconFamilyClass", "iconFamilyPrefix", "dataAttributes", "onClick", 'aria-label']);
1073
1075
  const generateClasses = useMemo(() => {
1074
1076
  const variantClass = variant
1075
1077
  ? `btn-${variant}-${color}`
@@ -1087,15 +1089,15 @@ function DButtonIcon({ id, icon, size, className, variant, state, loadingAriaLab
1087
1089
  }
1088
1090
  onClick === null || onClick === void 0 ? void 0 : onClick(event);
1089
1091
  }, [stopPropagationEnabled, onClick, isDisabled]);
1090
- const newAriaLabel = useMemo(() => (loading
1091
- ? (loadingAriaLabel || ariaLabel)
1092
- : (ariaLabel)), [ariaLabel, loading, loadingAriaLabel]);
1092
+ const ariaLabel = useMemo(() => (loading
1093
+ ? loadingAriaLabel || ariaLabelProp
1094
+ : ariaLabelProp), [loading, loadingAriaLabel, ariaLabelProp]);
1093
1095
  if (href) {
1094
- return (jsx("a", Object.assign({ href: href, target: target, rel: rel, className: classNames(generateClasses, className), style: style, onClick: clickHandler, "aria-label": newAriaLabel, "aria-disabled": isDisabled, id: id }, dataAttributes, { children: loading
1096
+ return (jsx("a", Object.assign({ id: id, href: href, target: target, rel: rel, className: classNames(generateClasses, className), style: style, onClick: clickHandler, "aria-label": ariaLabel, "aria-disabled": isDisabled }, dataAttributes, { children: loading
1095
1097
  ? (jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }))
1096
1098
  : (jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })) })));
1097
1099
  }
1098
- return (jsx("button", Object.assign({ className: classNames(generateClasses, className), style: style, type: type, disabled: isDisabled, onClick: clickHandler, "aria-label": newAriaLabel, id: id }, dataAttributes, { children: loading
1100
+ return (jsx("button", Object.assign({ className: classNames(generateClasses, className), style: style, disabled: state === 'disabled' || loading, onClick: clickHandler, "aria-label": ariaLabel }, dataAttributes, rest, { children: loading
1099
1101
  ? (jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }))
1100
1102
  : (jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })) })));
1101
1103
  }
@@ -1155,7 +1157,7 @@ function DChip({ color = 'primary', text, icon, iconFamilyClass, iconFamilyPrefi
1155
1157
  return (jsxs("span", Object.assign({ className: classNames(generateClasses, className), style: style }, dataAttributes, { children: [icon && (jsx("div", { className: "d-chip-icon-container", children: jsx(DIcon, { icon: icon, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle }) })), jsx("span", { children: text }), showClose && (jsx("button", { type: "button", className: "d-chip-icon-container", onClick: onClose, "aria-label": closeAriaLabel, children: jsx(DIcon, { icon: iconClose, familyClass: iconCloseFamilyClass, familyPrefix: iconCloseFamilyPrefix, materialStyle: iconCloseMaterialStyle }) }))] })));
1156
1158
  }
1157
1159
 
1158
- function DCollapse({ id, className, style, Component, hasSeparator = false, defaultCollapsed = true, onChange, children, iconOpen: iconOpenProp, iconClose: iconCloseProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle = false, dataAttributes, }) {
1160
+ function DCollapse({ id, className, style, Component, defaultCollapsed = true, onChange, children, iconOpen: iconOpenProp, iconClose: iconCloseProp, iconFamilyClass, iconFamilyPrefix, iconMaterialStyle = false, dataAttributes, }) {
1159
1161
  const [collapsed, setCollapsed] = useState(defaultCollapsed);
1160
1162
  const onChangeCollapse = () => {
1161
1163
  setCollapsed((prev) => {
@@ -1172,12 +1174,9 @@ function DCollapse({ id, className, style, Component, hasSeparator = false, defa
1172
1174
  const { iconMap: { chevronDown, chevronUp, }, } = useDContext();
1173
1175
  const iconOpen = useMemo(() => iconOpenProp || chevronDown, [chevronDown, iconOpenProp]);
1174
1176
  const iconClose = useMemo(() => iconCloseProp || chevronUp, [chevronUp, iconCloseProp]);
1175
- const generateStyles = useMemo(() => ({
1176
- [`--${PREFIX_BS}collapse-separator-display`]: hasSeparator ? 'block' : 'none',
1177
- }), [hasSeparator]);
1178
- return (jsxs("div", Object.assign({ id: id, className: classNames('collapse-container', className), style: style }, dataAttributes, { children: [jsxs("button", { className: "collapse-button", type: "button", onClick: onChangeCollapse, children: [jsx("div", { className: "flex-grow-1", children: Component }), jsx(DIcon, { color: "gray", size: "1rem", icon: collapsed ? iconOpen : iconClose, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })] }), !collapsed && (jsx("div", { className: classNames({
1179
- 'collapse-body': true,
1180
- }), style: generateStyles, children: children }))] })));
1177
+ return (jsxs("div", Object.assign({ id: id, className: classNames('collapse-container', className), style: style }, dataAttributes, { children: [jsxs("button", { className: "collapse-button", type: "button", onClick: onChangeCollapse, children: [jsx("div", { className: "flex-grow-1", children: Component }), jsx(DIcon, { color: "primary", size: "1.25rem", icon: collapsed ? iconOpen : iconClose, familyClass: iconFamilyClass, familyPrefix: iconFamilyPrefix, materialStyle: iconMaterialStyle })] }), jsx("div", { className: classNames('collapse-body-wrapper', {
1178
+ show: !collapsed,
1179
+ }), children: jsx("div", { className: "collapse-body", children: children }) })] })));
1181
1180
  }
1182
1181
 
1183
1182
  function formatCurrency(amount, options) {
@@ -1199,10 +1198,9 @@ function DCurrencyText({ value, className, style, dataAttributes, }) {
1199
1198
  return (jsx("span", Object.assign({ className: className, style: style }, dataAttributes, { children: valueFormatted })));
1200
1199
  }
1201
1200
 
1202
- function DDatePickerTime({ value, onChange, id, }) {
1203
- return (jsx(ForwardedDInput, { className: "d-datepicker-time", type: "time", value: value, id: id, onChange: (time) => {
1204
- onChange === null || onChange === void 0 ? void 0 : onChange(time);
1205
- } }));
1201
+ function DDatePickerTime(_a) {
1202
+ var rest = __rest(_a, []);
1203
+ return (jsx(ForwardedDInput, Object.assign({ className: "d-datepicker-time", type: "time" }, rest)));
1206
1204
  }
1207
1205
 
1208
1206
  function DDatePickerInput(_a, ref) {
@@ -1213,62 +1211,11 @@ function DDatePickerInput(_a, ref) {
1213
1211
  const ForwardedDDatePickerInput = forwardRef(DDatePickerInput);
1214
1212
  ForwardedDDatePickerInput.displayName = 'DDatePickerInput';
1215
1213
 
1216
- function DInputCheck(_a) {
1217
- var { id: idProp, type, name, label, ariaLabel, checked = false, disabled = false, invalid = false, valid = false, indeterminate, inputClassName, value, hint, onChange, className, style, dataAttributes } = _a, props = __rest(_a, ["id", "type", "name", "label", "ariaLabel", "checked", "disabled", "invalid", "valid", "indeterminate", "inputClassName", "value", "hint", "onChange", "className", "style", "dataAttributes"]);
1218
- const innerRef = useRef(null);
1219
- const innerId = useId();
1220
- const id = useMemo(() => idProp || innerId, [idProp, innerId]);
1221
- const handleChange = useCallback((event) => {
1222
- onChange === null || onChange === void 0 ? void 0 : onChange(event);
1223
- }, [onChange]);
1224
- const ariaDescribedby = useMemo(() => ([
1225
- !!hint && `${id}Hint`,
1226
- ]
1227
- .filter(Boolean)
1228
- .join(' ')), [
1229
- id,
1230
- hint,
1231
- ]);
1232
- useEffect(() => {
1233
- if (innerRef.current) {
1234
- innerRef.current.indeterminate = Boolean(indeterminate);
1235
- }
1236
- }, [indeterminate]);
1237
- useEffect(() => {
1238
- if (innerRef.current) {
1239
- innerRef.current.checked = checked;
1240
- }
1241
- }, [checked]);
1242
- const inputComponent = useMemo(() => (jsx("input", Object.assign({ ref: innerRef, onChange: handleChange, className: classNames('form-check-input', {
1243
- 'is-invalid': invalid,
1244
- 'is-valid': valid,
1245
- }, inputClassName), style: style, id: id, disabled: disabled, type: type, name: name, value: value, "aria-label": ariaLabel }, ariaDescribedby && { 'aria-describedby': ariaDescribedby }, props))), [
1246
- handleChange,
1247
- invalid,
1248
- valid,
1249
- inputClassName,
1250
- style,
1251
- id,
1252
- disabled,
1253
- type,
1254
- name,
1255
- value,
1256
- ariaLabel,
1257
- ariaDescribedby,
1258
- props,
1259
- ]);
1260
- if (!label) {
1261
- return inputComponent;
1262
- }
1263
- return (jsxs("div", Object.assign({ className: classNames('form-check', className) }, dataAttributes, { children: [inputComponent, jsx("label", { className: "form-check-label", htmlFor: id, children: label }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
1264
- }
1265
-
1266
1214
  function DSelectOptionCheck(_a) {
1267
- var { innerProps, children, isSelected } = _a, props = __rest(_a, ["innerProps", "children", "isSelected"]);
1268
- return (jsx(components.Option, Object.assign({ className: classNames({
1269
- 'd-select__option': true,
1270
- 'd-select__option--is-checkbox': true,
1271
- }), isSelected: isSelected, innerProps: innerProps }, props, { children: jsxs("label", { htmlFor: `${innerProps.id}Check`, children: [jsx(DInputCheck, { type: "checkbox", checked: isSelected, id: `${innerProps.id}Check` }), children] }) })));
1215
+ var { children, isSelected } = _a, props = __rest(_a, ["children", "isSelected"]);
1216
+ return (jsxs(components.Option, Object.assign({}, props, { isSelected: isSelected, className: classNames('d-select__option'), children: [jsx("span", { className: classNames('d-select__check', {
1217
+ 'd-select__check--selected': isSelected,
1218
+ }), "aria-hidden": "true" }), jsx("span", { className: "d-select__label", children: children })] })));
1272
1219
  }
1273
1220
 
1274
1221
  function DSelectOptionIcon(_a) {
@@ -1339,7 +1286,7 @@ function DSelectPlaceholder(_a) {
1339
1286
  }
1340
1287
 
1341
1288
  function DSelect(_a) {
1342
- var { id: idProp, className, style, label, hint, iconFamilyClass, iconFamilyPrefix, iconStart, iconStartFamilyClass, iconStartFamilyPrefix, iconStartAriaLabel, iconStartTabIndex, iconEnd, iconEndFamilyClass, iconEndFamilyPrefix, iconEndAriaLabel, iconEndTabIndex, invalid, valid, menuWithMaxContent = false, disabled, clearable, loading, floatingLabel = false, rtl, searchable, multi, components, defaultValue, placeholder, onIconStartClick, onIconEndClick, dataAttributes } = _a, props = __rest(_a, ["id", "className", "style", "label", "hint", "iconFamilyClass", "iconFamilyPrefix", "iconStart", "iconStartFamilyClass", "iconStartFamilyPrefix", "iconStartAriaLabel", "iconStartTabIndex", "iconEnd", "iconEndFamilyClass", "iconEndFamilyPrefix", "iconEndAriaLabel", "iconEndTabIndex", "invalid", "valid", "menuWithMaxContent", "disabled", "clearable", "loading", "floatingLabel", "rtl", "searchable", "multi", "components", "defaultValue", "placeholder", "onIconStartClick", "onIconEndClick", "dataAttributes"]);
1289
+ var { id: idProp, className, style, label, hint, iconFamilyClass, iconFamilyPrefix, iconStart, iconStartFamilyClass, iconStartFamilyPrefix, iconStartAriaLabel, iconStartTabIndex, iconEnd, iconEndFamilyClass, iconEndFamilyPrefix, iconEndAriaLabel, iconEndTabIndex, invalid, valid, menuWithMaxContent = false, disabled, clearable, loading, floatingLabel = false, rtl, searchable, multi, components, defaultValue, placeholder, onIconStartClick, onIconEndClick, dataAttributes, ariaLabel = 'Search for an option' } = _a, props = __rest(_a, ["id", "className", "style", "label", "hint", "iconFamilyClass", "iconFamilyPrefix", "iconStart", "iconStartFamilyClass", "iconStartFamilyPrefix", "iconStartAriaLabel", "iconStartTabIndex", "iconEnd", "iconEndFamilyClass", "iconEndFamilyPrefix", "iconEndAriaLabel", "iconEndTabIndex", "invalid", "valid", "menuWithMaxContent", "disabled", "clearable", "loading", "floatingLabel", "rtl", "searchable", "multi", "components", "defaultValue", "placeholder", "onIconStartClick", "onIconEndClick", "dataAttributes", "ariaLabel"]);
1343
1290
  const innerId = useId();
1344
1291
  const id = useMemo(() => idProp || innerId, [idProp, innerId]);
1345
1292
  const handleOnIconStartClick = useCallback(() => {
@@ -1355,7 +1302,7 @@ function DSelect(_a) {
1355
1302
  'input-group': true,
1356
1303
  'has-validation': invalid,
1357
1304
  disabled: disabled || loading,
1358
- }), children: [iconStart && (jsx("button", { type: "button", className: "input-group-text", id: `${id}Start`, onClick: handleOnIconStartClick, disabled: disabled || loading, "aria-label": iconStartAriaLabel, tabIndex: iconStartTabIndex, children: jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix }) })), jsx(Select, Object.assign({ id: `${id}Container`, inputId: id, styles: {
1305
+ }), children: [iconStart && (jsx("button", { type: "button", className: "input-group-text", id: `${id}Start`, onClick: handleOnIconStartClick, disabled: disabled || loading, "aria-label": iconStartAriaLabel, tabIndex: iconStartTabIndex, children: jsx(DIcon, { icon: iconStart, familyClass: iconStartFamilyClass, familyPrefix: iconStartFamilyPrefix }) })), jsx(Select, Object.assign({ id: `${id}Container`, inputId: id, "aria-label": ariaLabel, styles: {
1359
1306
  control: (base) => (Object.assign(Object.assign({}, base), { minHeight: 'unset' })),
1360
1307
  container: (base) => (Object.assign(Object.assign({}, base), { flex: 1 })),
1361
1308
  menu: (base) => (Object.assign(Object.assign({}, base), { width: menuWithMaxContent ? 'max-context' : '100%', zIndex: 1000 })),
@@ -1410,16 +1357,16 @@ function DDatePickerHeaderSelector({ date, changeYear, changeMonth, decreaseMont
1410
1357
  }, [date]);
1411
1358
  const [startYear, endYear] = getYearRange();
1412
1359
  if (pickerType === PickerType.Year) {
1413
- return (jsxs("div", { className: classNames('react-datepicker__header-selector react-datepicker__header-year-selector', className), style: style, children: [jsx(DButtonIcon, { icon: iconPrev || chevronLeft, size: iconSize, variant: "link", onClick: decreaseYear, disabled: prevYearButtonDisabled, ariaLabel: prevYearAriaLabel, className: "header-button" }), jsx("p", { children: `${startYear} - ${endYear}` }), jsx(DButtonIcon, { icon: iconNext || chevronRight, size: iconSize, variant: "link", onClick: increaseYear, disabled: nextYearButtonDisabled, ariaLabel: nextYearAriaLabel, className: "header-button" })] }));
1360
+ return (jsxs("div", { className: classNames('react-datepicker__header-selector react-datepicker__header-year-selector', className), style: style, children: [jsx(DButtonIcon, { icon: iconPrev || chevronLeft, size: iconSize, variant: "link", onClick: decreaseYear, disabled: prevYearButtonDisabled, "aria-label": prevYearAriaLabel, className: "header-button" }), jsx("p", { children: `${startYear} - ${endYear}` }), jsx(DButtonIcon, { icon: iconNext || chevronRight, size: iconSize, variant: "link", onClick: increaseYear, disabled: nextYearButtonDisabled, "aria-label": nextYearAriaLabel, className: "header-button" })] }));
1414
1361
  }
1415
1362
  if (pickerType === PickerType.Quarter || pickerType === PickerType.Month) {
1416
- return (jsxs("div", { className: classNames(`react-datepicker__header-selector react-datepicker__header-${pickerType}-selector`, className), style: style, children: [jsx(DButtonIcon, { icon: iconPrev || chevronLeft, size: iconSize, variant: "link", onClick: decreaseYear, disabled: prevMonthButtonDisabled, ariaLabel: prevMonthAriaLabel, className: "header-button", style: { visibility: customHeaderCount === 0 ? 'visible' : 'hidden' } }), jsx("div", { className: "d-flex justify-content-center flex-grow-1", children: showHeaderSelectors ? (jsx(DSelect$1, { options: years, value: defaultYear, defaultValue: defaultYear, onChange: (year) => changeYear(Number(year === null || year === void 0 ? void 0 : year.value)), searchable: false })) : (jsx("p", { children: defaultYear === null || defaultYear === void 0 ? void 0 : defaultYear.label })) }), jsx(DButtonIcon, { icon: iconNext || chevronRight, size: iconSize, variant: "link", onClick: increaseYear, disabled: nextMonthButtonDisabled, ariaLabel: nextMonthAriaLabel, className: "header-button", style: { visibility: customHeaderCount === monthsShown - 1 ? 'visible' : 'hidden' } })] }));
1363
+ return (jsxs("div", { className: classNames(`react-datepicker__header-selector react-datepicker__header-${pickerType}-selector`, className), style: style, children: [jsx(DButtonIcon, { icon: iconPrev || chevronLeft, size: iconSize, variant: "link", onClick: decreaseYear, disabled: prevMonthButtonDisabled, "aria-label": prevMonthAriaLabel, className: "header-button", style: { visibility: customHeaderCount === 0 ? 'visible' : 'hidden' } }), jsx("div", { className: "d-flex justify-content-center flex-grow-1", children: showHeaderSelectors ? (jsx(DSelect$1, { options: years, value: defaultYear, defaultValue: defaultYear, onChange: (year) => changeYear(Number(year === null || year === void 0 ? void 0 : year.value)), searchable: false })) : (jsx("p", { children: defaultYear === null || defaultYear === void 0 ? void 0 : defaultYear.label })) }), jsx(DButtonIcon, { icon: iconNext || chevronRight, size: iconSize, variant: "link", onClick: increaseYear, disabled: nextMonthButtonDisabled, "aria-label": nextMonthAriaLabel, className: "header-button", style: { visibility: customHeaderCount === monthsShown - 1 ? 'visible' : 'hidden' } })] }));
1417
1364
  }
1418
- return (jsxs(Fragment, { children: [jsxs("div", { className: "datepicker-top-header", children: [showHeaderSelectors && (jsx(DSelect$1, { options: years, value: defaultYear, defaultValue: defaultYear, onChange: (year) => changeYear(Number(year === null || year === void 0 ? void 0 : year.value)), searchable: false, className: "custom-year-selector" })), jsx("h4", { className: "mb-0 fw-normal", children: format(monthDate, formatHeaderDate, { locale }) })] }), jsxs("div", { className: classNames('react-datepicker__header-selector react-datepicker__header-day-selector', className), style: style, children: [jsx(DButtonIcon, { icon: iconPrev || chevronLeft, size: iconSize, variant: "link", onClick: decreaseMonth, disabled: prevMonthButtonDisabled, ariaLabel: prevMonthAriaLabel, className: "header-button", style: { visibility: customHeaderCount === 0 ? 'visible' : 'hidden' } }), showHeaderSelectors ? (jsx(DSelect$1, { options: months, value: defaultMonth, defaultValue: defaultMonth, onChange: (month) => changeMonth((month === null || month === void 0 ? void 0 : month.value) || 0), searchable: false, className: "custom-month-selector" })) : (jsx("p", { children: `${defaultMonth.label} ${defaultYear === null || defaultYear === void 0 ? void 0 : defaultYear.label}` })), jsx(DButtonIcon, { icon: iconNext || chevronRight, size: iconSize, variant: "link", onClick: increaseMonth, disabled: nextMonthButtonDisabled, ariaLabel: nextMonthAriaLabel, className: "header-button", style: { visibility: customHeaderCount === monthsShown - 1 ? 'visible' : 'hidden' } })] })] }));
1365
+ return (jsxs(Fragment, { children: [jsxs("div", { className: "datepicker-top-header", children: [showHeaderSelectors && (jsx(DSelect$1, { options: years, value: defaultYear, defaultValue: defaultYear, onChange: (year) => changeYear(Number(year === null || year === void 0 ? void 0 : year.value)), searchable: false, className: "custom-year-selector" })), jsx("h4", { className: "mb-0 fw-normal", children: format(monthDate, formatHeaderDate, { locale }) })] }), jsxs("div", { className: classNames('react-datepicker__header-selector react-datepicker__header-day-selector', className), style: style, children: [jsx(DButtonIcon, { icon: iconPrev || chevronLeft, size: iconSize, variant: "link", onClick: decreaseMonth, disabled: prevMonthButtonDisabled, "aria-label": prevMonthAriaLabel, className: "header-button", style: { visibility: customHeaderCount === 0 ? 'visible' : 'hidden' } }), showHeaderSelectors ? (jsx(DSelect$1, { options: months, value: defaultMonth, defaultValue: defaultMonth, onChange: (month) => changeMonth((month === null || month === void 0 ? void 0 : month.value) || 0), searchable: false, className: "custom-month-selector" })) : (jsx("p", { children: `${defaultMonth.label} ${defaultYear === null || defaultYear === void 0 ? void 0 : defaultYear.label}` })), jsx(DButtonIcon, { icon: iconNext || chevronRight, size: iconSize, variant: "link", onClick: increaseMonth, disabled: nextMonthButtonDisabled, "aria-label": nextMonthAriaLabel, className: "header-button", style: { visibility: customHeaderCount === monthsShown - 1 ? 'visible' : 'hidden' } })] })] }));
1419
1366
  }
1420
1367
 
1421
1368
  function DDatePicker(_a) {
1422
- var { inputLabel, inputHint, inputAriaLabel, inputActionAriaLabel = 'open calendar', inputId = 'input-calendar', timeId = 'input-time', timeInputLabel, minYearSelect, maxYearSelect, iconHeaderSize, iconMaterialStyle, iconInput, headerPrevMonthAriaLabel, headerNextMonthAriaLabel, invalid = false, valid = false, renderCustomHeader: renderCustomHeaderProp, className, dateFormatCalendar: dateFormatCalendarProp, style, dataAttributes, placeholder, showHeaderSelectors, formatHeaderDate } = _a, props = __rest(_a, ["inputLabel", "inputHint", "inputAriaLabel", "inputActionAriaLabel", "inputId", "timeId", "timeInputLabel", "minYearSelect", "maxYearSelect", "iconHeaderSize", "iconMaterialStyle", "iconInput", "headerPrevMonthAriaLabel", "headerNextMonthAriaLabel", "invalid", "valid", "renderCustomHeader", "className", "dateFormatCalendar", "style", "dataAttributes", "placeholder", "showHeaderSelectors", "formatHeaderDate"]);
1369
+ var { inputLabel, inputHint, inputAriaLabel, ariaLabelInputTime, inputActionAriaLabel = 'open calendar', inputId = 'input-calendar', timeId = 'input-time', timeInputLabel, minYearSelect, maxYearSelect, iconHeaderSize, iconMaterialStyle, iconInput, headerPrevMonthAriaLabel, headerNextMonthAriaLabel, invalid = false, valid = false, renderCustomHeader: renderCustomHeaderProp, className, dateFormatCalendar: dateFormatCalendarProp, style, dataAttributes, placeholder, showHeaderSelectors, formatHeaderDate } = _a, props = __rest(_a, ["inputLabel", "inputHint", "inputAriaLabel", "ariaLabelInputTime", "inputActionAriaLabel", "inputId", "timeId", "timeInputLabel", "minYearSelect", "maxYearSelect", "iconHeaderSize", "iconMaterialStyle", "iconInput", "headerPrevMonthAriaLabel", "headerNextMonthAriaLabel", "invalid", "valid", "renderCustomHeader", "className", "dateFormatCalendar", "style", "dataAttributes", "placeholder", "showHeaderSelectors", "formatHeaderDate"]);
1423
1370
  const pickerType = useMemo(() => {
1424
1371
  if (props.showQuarterYearPicker)
1425
1372
  return PickerType.Quarter;
@@ -1447,7 +1394,7 @@ function DDatePicker(_a) {
1447
1394
  ]);
1448
1395
  const defaultRenderCustomHeader = useCallback((headerProps) => (jsx(DatePickerHeader, Object.assign({}, headerProps))), [DatePickerHeader]);
1449
1396
  const renderCustomHeader = useMemo(() => (renderCustomHeaderProp || defaultRenderCustomHeader), [defaultRenderCustomHeader, renderCustomHeaderProp]);
1450
- return (jsx(DatePicker, Object.assign({}, dataAttributes, props, { calendarClassName: "d-date-picker", renderCustomHeader: renderCustomHeader, placeholderText: placeholder, customInput: (jsx(ForwardedDDatePickerInput, { id: inputId, "aria-label": inputAriaLabel, iconEndAriaLabel: inputActionAriaLabel, iconMaterialStyle: iconMaterialStyle, iconEnd: iconInput, inputLabel: inputLabel, className: className, style: style, invalid: invalid, valid: valid, hint: inputHint })), customTimeInput: (jsx(DDatePickerTime, { id: timeId })) })));
1397
+ return (jsx(DatePicker, Object.assign({}, dataAttributes, props, { calendarClassName: "d-date-picker", renderCustomHeader: renderCustomHeader, placeholderText: placeholder, customInput: (jsx(ForwardedDDatePickerInput, { id: inputId, "aria-label": inputAriaLabel, iconEndAriaLabel: inputActionAriaLabel, iconMaterialStyle: iconMaterialStyle, iconEnd: iconInput, inputLabel: inputLabel, className: className, style: style, invalid: invalid, valid: valid, hint: inputHint })), customTimeInput: (jsx(DDatePickerTime, { id: timeId, "aria-label": ariaLabelInputTime })) })));
1451
1398
  }
1452
1399
 
1453
1400
  function DLayoutPane({ className, style, children, cols, colsXs, colsSm, colsMd, colsLg, colsXl, colsXxl, dataAttributes, }) {
@@ -1724,7 +1671,57 @@ function DPasswordStrengthMeter({ id, label = 'Password', placeholder, value = '
1724
1671
  return (jsxs("div", Object.assign({ className: className, style: style }, dataAttributes, { children: [jsx(ForwardedDInputPassword, { id: id, label: label, placeholder: placeholder, value: password, name: name, disabled: disabled, invalid: invalid, onChange: handleChange }), jsx(PasswordChecksList, { password: password, validationMessages: validationMessages, enabledChecks: enabledChecks })] })));
1725
1672
  }
1726
1673
 
1727
- function DInputPin({ id: idProp, label = '', placeholder, type = 'text', disabled = false, loading = false, secret = false, characters = 4, innerInputMode = 'text', hint, invalid = false, valid = false, className, style, dataAttributes, onChange, }) {
1674
+ function DInputCheck(_a) {
1675
+ var { id: idProp, type, name, label, ariaLabel, checked = false, disabled = false, invalid = false, valid = false, indeterminate, inputClassName, value, hint, onChange, className, style, dataAttributes } = _a, props = __rest(_a, ["id", "type", "name", "label", "ariaLabel", "checked", "disabled", "invalid", "valid", "indeterminate", "inputClassName", "value", "hint", "onChange", "className", "style", "dataAttributes"]);
1676
+ const innerRef = useRef(null);
1677
+ const innerId = useId();
1678
+ const id = useMemo(() => idProp || innerId, [idProp, innerId]);
1679
+ const handleChange = useCallback((event) => {
1680
+ onChange === null || onChange === void 0 ? void 0 : onChange(event);
1681
+ }, [onChange]);
1682
+ const ariaDescribedby = useMemo(() => ([
1683
+ !!hint && `${id}Hint`,
1684
+ ]
1685
+ .filter(Boolean)
1686
+ .join(' ')), [
1687
+ id,
1688
+ hint,
1689
+ ]);
1690
+ useEffect(() => {
1691
+ if (innerRef.current) {
1692
+ innerRef.current.indeterminate = Boolean(indeterminate);
1693
+ }
1694
+ }, [indeterminate]);
1695
+ useEffect(() => {
1696
+ if (innerRef.current) {
1697
+ innerRef.current.checked = checked;
1698
+ }
1699
+ }, [checked]);
1700
+ const inputComponent = useMemo(() => (jsx("input", Object.assign({ ref: innerRef, onChange: handleChange, className: classNames('form-check-input', {
1701
+ 'is-invalid': invalid,
1702
+ 'is-valid': valid,
1703
+ }, inputClassName), style: style, id: id, disabled: disabled, type: type, name: name, value: value, "aria-label": ariaLabel }, ariaDescribedby && { 'aria-describedby': ariaDescribedby }, props))), [
1704
+ handleChange,
1705
+ invalid,
1706
+ valid,
1707
+ inputClassName,
1708
+ style,
1709
+ id,
1710
+ disabled,
1711
+ type,
1712
+ name,
1713
+ value,
1714
+ ariaLabel,
1715
+ ariaDescribedby,
1716
+ props,
1717
+ ]);
1718
+ if (!label) {
1719
+ return inputComponent;
1720
+ }
1721
+ return (jsxs("div", Object.assign({ className: classNames('form-check', className) }, dataAttributes, { children: [inputComponent, jsx("label", { className: "form-check-label", htmlFor: id, children: label }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
1722
+ }
1723
+
1724
+ function DInputPin({ id: idProp, label = '', placeholder, type = 'text', disabled = false, loading = false, secret = false, characters = 4, innerInputMode = 'text', hint, invalid = false, valid = false, className, style, dataAttributes, onChange, 'aria-label': ariaLabel = 'Pin character number', }) {
1728
1725
  const innerId = useId();
1729
1726
  const id = useMemo(() => idProp || innerId, [idProp, innerId]);
1730
1727
  const [pattern, setPattern] = useState('');
@@ -1801,7 +1798,7 @@ function DInputPin({ id: idProp, label = '', placeholder, type = 'text', disable
1801
1798
  'form-control': true,
1802
1799
  'is-invalid': invalid,
1803
1800
  'is-valid': valid,
1804
- }), value: activeInput[index], type: secret ? 'password' : type, "aria-describedby": `${id}State`, inputMode: innerInputMode, id: `pinIndex${index}`, name: `pin-${index}`, maxLength: 1, onInput: (event) => nextInput(event, index), onKeyDown: (event) => prevInput(event, index), onFocus: () => focusInput(index), onWheel: wheelInput, onClick: (event) => event.preventDefault(), onPaste: (event) => handlePaste(event), autoComplete: "off", placeholder: placeholder, disabled: disabled || loading, required: true }, type === 'number' && ({ min: 0, max: 9 })), index))), loading && (jsx("div", { className: "input-group-text", children: jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }) }))] }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
1801
+ }), value: activeInput[index], type: secret ? 'password' : type, "aria-label": `${ariaLabel} ${index + 1} of ${characters}`, inputMode: innerInputMode, id: `pinIndex${index}`, name: `pin-${index}`, maxLength: 1, onInput: (event) => nextInput(event, index), onKeyDown: (event) => prevInput(event, index), onFocus: () => focusInput(index), onWheel: wheelInput, onClick: (event) => event.preventDefault(), onPaste: (event) => handlePaste(event), autoComplete: "off", placeholder: placeholder, disabled: disabled || loading, required: true }, type === 'number' && ({ min: 0, max: 9 })), index))), loading && (jsx("div", { className: "input-group-text", children: jsx("span", { className: "spinner-border spinner-border-sm", role: "status", "aria-hidden": "true", children: jsx("span", { className: "visually-hidden", children: "Loading..." }) }) }))] }), hint && (jsx("div", { className: "form-text", id: `${id}Hint`, children: hint }))] })));
1805
1802
  }
1806
1803
 
1807
1804
  function DInputSelect({ id: idProp, name, label = '', className, style, options = [], disabled = false, loading = false, iconStart, iconStartFamilyClass, iconStartFamilyPrefix, iconStartAriaLabel, iconEnd, iconEndFamilyClass, iconEndFamilyPrefix, iconEndAriaLabel, hint, value, size, floatingLabel = false, invalid = false, valid = false, dataAttributes, valueExtractor, labelExtractor, onChange, onBlur, onIconStartClick, onIconEndClick, }) {
@@ -2115,9 +2112,7 @@ function DPopover({ children, renderComponent, open, setOpen, adjustContentToRen
2115
2112
  }, [open]);
2116
2113
  const onOpenChange = useCallback((value) => {
2117
2114
  setIsOpen(value);
2118
- if (setOpen) {
2119
- setOpen(value);
2120
- }
2115
+ setOpen === null || setOpen === void 0 ? void 0 : setOpen(value);
2121
2116
  }, [setOpen]);
2122
2117
  const { refs, floatingStyles, context, } = useFloating({
2123
2118
  open: isOpen,
@@ -2141,7 +2136,12 @@ function DPopover({ children, renderComponent, open, setOpen, adjustContentToRen
2141
2136
  const generateStyleVariables = useMemo(() => (Object.assign(Object.assign({}, style), (adjustContentToRender && {
2142
2137
  [`--${PREFIX_BS}popover-component-min-width`]: 'auto',
2143
2138
  }))), [style, adjustContentToRender]);
2144
- return (jsxs("div", Object.assign({ className: classNames('d-popover', className), style: generateStyleVariables }, dataAttributes, { children: [jsx("div", Object.assign({ ref: refs.setReference }, getReferenceProps(), { children: renderComponent(isOpen) })), isOpen && (jsx(FloatingFocusManager, { context: context, modal: false, children: jsx("div", Object.assign({ className: classNames('d-popover-content', {
2139
+ const triggerElement = renderComponent(isOpen);
2140
+ if (!isValidElement(triggerElement)) {
2141
+ throw new Error('renderComponent must return a valid React element');
2142
+ }
2143
+ const reference = cloneElement(triggerElement, Object.assign({ ref: refs.setReference }, getReferenceProps(triggerElement.props)));
2144
+ return (jsxs("div", Object.assign({ className: classNames('d-popover', className), style: generateStyleVariables }, dataAttributes, { children: [reference, isOpen && (jsx(FloatingFocusManager, { context: context, modal: false, children: jsx("div", Object.assign({ className: classNames('d-popover-content', {
2145
2145
  'w-100': adjustContentToRender,
2146
2146
  }), ref: refs.setFloating, style: floatingStyles, "aria-labelledby": headingId }, getFloatingProps(), { children: children })) }))] })));
2147
2147
  }
@@ -2250,7 +2250,7 @@ function DTooltip({ className, childrenClassName, style, offSet = ARROW_HEIGHT +
2250
2250
  function DTimeline({ className, style, dataAttributes, items, }) {
2251
2251
  return (jsx("div", Object.assign({ style: style, className: classNames('d-timeline', className) }, dataAttributes, { children: items.map((item, index) => (jsxs("div", { className: classNames('d-timeline-item', {
2252
2252
  [`d-timeline-item-${item.status}`]: item.status,
2253
- }), children: [jsx("div", { className: "d-timeline-item-connector" }), jsx("div", { className: "d-timeline-item-icon", children: jsx("i", { className: `bi bi-${item.icon || 'check'}` }) }), jsxs("div", { className: "d-timeline-item-content", children: [jsx("div", { className: "d-timeline-item-title", children: item.title }), item.description && jsx("div", { className: "d-timeline-item-description", children: item.description }), item.time && jsx("div", { className: "d-timeline-item-time", children: item.time }), item.children] })] }, index))) })));
2253
+ }), children: [jsx("div", { className: "d-timeline-item-connector" }), jsx("div", { className: "d-timeline-item-icon", children: jsx(DIcon, { icon: item.icon || 'check', size: "1rem" }) }), jsxs("div", { className: "d-timeline-item-content", children: [jsx("div", { className: "d-timeline-item-title", children: item.title }), item.description && jsx("div", { className: "d-timeline-item-description", children: item.description }), item.time && jsx("div", { className: "d-timeline-item-time", children: item.time }), item.children] })] }, index))) })));
2254
2254
  }
2255
2255
 
2256
2256
  const TabContext = createContext(undefined);
@@ -2270,7 +2270,7 @@ function DTabContent({ tab, children, className, style, }) {
2270
2270
  return (jsx("div", { className: classNames('tab-pane fade show active', className), id: `${tab}Pane`, role: "tabpanel", tabIndex: 0, "aria-labelledby": `${tab}Tab`, style: style, children: children }));
2271
2271
  }
2272
2272
 
2273
- function DTabs({ children, defaultSelected, onChange, options, className, classNameTab, style, vertical, variant = 'underline', dataAttributes, }) {
2273
+ function DTabs({ children, defaultSelected, onChange, options, className, classNameTab, style, vertical, variant = 'underline', dataAttributes, ariaLabel, ariaLabelledBy, }) {
2274
2274
  const [selected, setSelected] = useState(defaultSelected);
2275
2275
  const onSelect = useCallback((option) => {
2276
2276
  if (option.tab) {
@@ -2281,17 +2281,83 @@ function DTabs({ children, defaultSelected, onChange, options, className, classN
2281
2281
  useEffect(() => {
2282
2282
  setSelected(defaultSelected);
2283
2283
  }, [defaultSelected]);
2284
+ const generateClasses = useMemo(() => (Object.assign({ nav: true, 'flex-column align-items-center': vertical && variant !== 'tabs', [`nav-${variant}`]: true }, className && { [className]: true })), [vertical, variant, className]);
2285
+ const tabRefs = useRef([]);
2286
+ useEffect(() => {
2287
+ tabRefs.current = options.map((_, i) => tabRefs.current[i] || createRef());
2288
+ }, [options]);
2289
+ // Ensure selected is never disabled
2290
+ useEffect(() => {
2291
+ if (options.length === 0)
2292
+ return;
2293
+ const selectedOption = options.find((opt) => opt.tab === selected);
2294
+ if (selectedOption && selectedOption.disabled) {
2295
+ const firstEnabled = options.find((opt) => !opt.disabled);
2296
+ if (firstEnabled)
2297
+ setSelected(firstEnabled.tab);
2298
+ }
2299
+ }, [options, selected]);
2300
+ // Declarative focus management
2301
+ const focusTab = (idx) => {
2302
+ var _a;
2303
+ if ((_a = tabRefs.current[idx]) === null || _a === void 0 ? void 0 : _a.current) {
2304
+ tabRefs.current[idx].current.focus();
2305
+ }
2306
+ };
2307
+ // Focus selected tab when selected changes
2308
+ useEffect(() => {
2309
+ const idx = options.findIndex((opt) => opt.tab === selected && !opt.disabled);
2310
+ if (idx !== -1) {
2311
+ focusTab(idx);
2312
+ }
2313
+ }, [selected, options]);
2314
+ const handleKeyDown = useCallback((idx, e) => {
2315
+ const count = options.length;
2316
+ if (count === 0)
2317
+ return;
2318
+ let next = idx;
2319
+ let prev = idx;
2320
+ if (e.key === 'ArrowRight' || (vertical && e.key === 'ArrowDown')) {
2321
+ e.preventDefault();
2322
+ for (let i = 0; i < count; i += 1) {
2323
+ next = (next + 1) % count;
2324
+ if (!options[next].disabled) {
2325
+ focusTab(next);
2326
+ setSelected(options[next].tab);
2327
+ break;
2328
+ }
2329
+ }
2330
+ }
2331
+ if (e.key === 'ArrowLeft' || (vertical && e.key === 'ArrowUp')) {
2332
+ e.preventDefault();
2333
+ for (let i = 0; i < count; i += 1) {
2334
+ prev = (prev - 1 + count) % count;
2335
+ if (!options[prev].disabled) {
2336
+ focusTab(prev);
2337
+ setSelected(options[prev].tab);
2338
+ break;
2339
+ }
2340
+ }
2341
+ }
2342
+ }, [options, vertical]);
2343
+ let tablistProps = {};
2344
+ if (ariaLabelledBy) {
2345
+ tablistProps = { 'aria-labelledby': ariaLabelledBy };
2346
+ }
2347
+ else if (ariaLabel) {
2348
+ tablistProps = { 'aria-label': ariaLabel };
2349
+ }
2284
2350
  const isSelected = useCallback((tab) => (selected === tab), [selected]);
2285
2351
  const value = useMemo(() => ({
2286
2352
  isSelected,
2287
2353
  }), [isSelected]);
2288
- const generateClasses = useMemo(() => (Object.assign({ nav: true, 'flex-column align-items-center': vertical && variant !== 'tabs', [`nav-${variant}`]: true }, className && { [className]: true })), [vertical, variant, className]);
2289
2354
  return (jsx(TabContext.Provider, { value: value, children: jsxs("div", Object.assign({ className: classNames({
2290
2355
  'd-flex w-100': true,
2291
2356
  'flex-column': !vertical || variant === 'tabs',
2292
- }), style: style }, dataAttributes, { children: [jsx("nav", { className: classNames(generateClasses), children: options.map((option) => (jsx("button", { id: `${option.tab}Tab`, className: classNames('nav-link', {
2293
- active: option.tab === selected,
2294
- }, classNameTab), type: "button", role: "tab", "aria-controls": `${option.tab}Pane`, "aria-selected": option.tab === selected, disabled: option.disabled, onClick: () => onSelect(option), children: option.label }, option.tab))) }), jsx("div", { className: "tab-content w-100", children: children })] })) }));
2357
+ }), style: style }, dataAttributes, { children: [jsx("ul", Object.assign({ className: classNames(generateClasses), role: "tablist", "aria-orientation": vertical ? 'vertical' : undefined }, tablistProps, { children: options.map((option, idx) => {
2358
+ const isTabSelected = !!option.tab && option.tab === selected;
2359
+ return (jsx("li", { role: "presentation", className: "nav-item", children: jsx("button", { ref: tabRefs.current[idx], id: `${option.tab}Tab`, className: classNames('nav-link', { active: isTabSelected }, classNameTab), type: "button", role: "tab", "aria-controls": `${option.tab}Pane`, "aria-selected": isTabSelected, tabIndex: isTabSelected ? 0 : -1, disabled: option.disabled, onClick: () => onSelect(option), onKeyDown: (e) => handleKeyDown(idx, e), children: option.label }) }, option.tab));
2360
+ }) })), jsx("div", { className: "tab-content w-100", children: children })] })) }));
2295
2361
  }
2296
2362
  var DTabs$1 = Object.assign(DTabs, {
2297
2363
  Tab: DTabContent,
@@ -2481,7 +2547,7 @@ const BRAND_LOGOS = {
2481
2547
  mastercard: 'https://cdn.modyo.cloud/uploads/f686b9aa-65ab-4369-9db3-89ceece84f29/original/mastercard.png',
2482
2548
  };
2483
2549
  function DCreditCard({ brand = 'visa', name, number, holderText = 'Card Holder', logoImage, isChipVisible = true, className, isVertical = false, }) {
2484
- return (jsxs("div", { className: classNames('d-credit-card overflow-hidden text-white', 'position-relative rounded-3', 'd-flex', isVertical && 'is-vertical', className), children: [jsxs("div", { className: "d-credit-card-header", children: [jsx("img", { src: logoImage || BRAND_LOGOS[brand] || DEFAULT_IMAGE, alt: brand, className: "d-credit-card-logo", width: 100 }), isChipVisible && (jsx("div", { className: "d-credit-card-chip p-2 rounded-2", children: jsx("img", { src: CHIP_IMAGE, alt: "chip", width: 30, className: "d-credit-card-chip-image" }) }))] }), jsxs("div", { className: "d-credit-card-details mt-auto d-none d-sm-block", children: [jsx("div", { className: "d-credit-card-number d-none d-sm-block mb-4", children: number }), jsx("small", { className: "d-block opacity-50", children: holderText }), jsx("span", { className: "name", children: name })] })] }));
2550
+ return (jsxs("div", { className: classNames('d-credit-card', isVertical && 'is-vertical', className), children: [jsxs("div", { className: "d-credit-card-header", children: [jsx("img", { src: logoImage || BRAND_LOGOS[brand] || DEFAULT_IMAGE, alt: brand, className: "d-credit-card-logo", width: 100 }), isChipVisible && (jsx("div", { className: "d-credit-card-chip", children: jsx("img", { src: CHIP_IMAGE, alt: "chip", width: 30, className: "d-credit-card-chip-image" }) }))] }), jsxs("div", { className: "d-credit-card-details", children: [jsx("div", { className: "d-credit-card-number", children: number }), jsx("small", { className: "d-credit-card-holder-text", children: holderText }), jsx("span", { className: "d-credit-card-name", children: name })] })] }));
2485
2551
  }
2486
2552
 
2487
2553
  const getItemClass = (action) => {
@@ -2503,7 +2569,6 @@ function DDropdown({ actions, dropdownToggle, className, }) {
2503
2569
  document.addEventListener('mousedown', handleClickOutside);
2504
2570
  return () => document.removeEventListener('mousedown', handleClickOutside);
2505
2571
  }, []);
2506
- // 🆕 Calcular posición del menú al abrir
2507
2572
  useEffect(() => {
2508
2573
  if (open && dropdownRef.current) {
2509
2574
  const rect = dropdownRef.current.getBoundingClientRect();
@@ -2530,7 +2595,7 @@ function DDropdown({ actions, dropdownToggle, className, }) {
2530
2595
  }
2531
2596
  }
2532
2597
  else {
2533
- ToggleElement = (jsx(DButtonIcon, { variant: "link", stopPropagationEnabled: false, onClick: () => setOpen(!open), icon: "MoreVertical" }));
2598
+ ToggleElement = (jsx(DButtonIcon, { variant: "link", stopPropagationEnabled: false, "aria-label": "Toggle Dropdown", "aria-haspopup": "menu", "aria-expanded": open, onClick: () => setOpen(!open), icon: "MoreVertical" }));
2534
2599
  }
2535
2600
  return (jsxs("div", { className: `dropdown position-relative drop-${position} ${className}`, ref: dropdownRef, children: [ToggleElement, jsx("ul", { style: {
2536
2601
  position: 'absolute',
@@ -2705,7 +2770,7 @@ const defaultMessage = (secs) => (secs > 0
2705
2770
  : "Didn't get any code?");
2706
2771
  function OtpCountdown({ seconds, resendText, message, }) {
2707
2772
  const { secondsLeft, restartCountdown } = useCountdown(seconds);
2708
- return (jsxs("div", { className: "d-flex gap-2 align-items-center", children: [jsx("p", { className: "mb-0", children: message ? message(secondsLeft) : defaultMessage(secondsLeft) }), jsx(DButton, { text: resendText, variant: "link", disabled: secondsLeft > 0, onClick: restartCountdown })] }));
2773
+ return (jsxs("div", { className: "d-flex gap-2 align-items-center", children: [jsx("p", { className: "mb-0 flex-1", children: message ? message(secondsLeft) : defaultMessage(secondsLeft) }), jsx(DButton, { text: resendText, variant: "link", className: "text-nowrap", disabled: secondsLeft > 0, onClick: restartCountdown })] }));
2709
2774
  }
2710
2775
 
2711
2776
  const TEXT_PROPS = {