@opengovsg/oui 0.0.0-snapshot-20250813090518 → 0.0.0-snapshot-20250813172831

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 (142) hide show
  1. package/dist/cjs/badge/badge.cjs +4 -4
  2. package/dist/cjs/badge/use-badge.cjs +6 -6
  3. package/dist/cjs/banner/banner.cjs +4 -4
  4. package/dist/cjs/button/button.cjs +4 -4
  5. package/dist/cjs/calendar/calendar-bottom-content.cjs +2 -2
  6. package/dist/cjs/calendar/calendar-header.cjs +2 -2
  7. package/dist/cjs/calendar/calendar-month-day-selector.cjs +4 -4
  8. package/dist/cjs/calendar/calendar.cjs +4 -4
  9. package/dist/cjs/calendar/hooks/use-calendar-selectors.cjs +4 -4
  10. package/dist/cjs/calendar/utils.cjs +3 -3
  11. package/dist/cjs/checkbox/checkbox.cjs +1 -1
  12. package/dist/cjs/combo-box/combo-box-fuzzy.cjs +6 -6
  13. package/dist/cjs/combo-box/combo-box-item.cjs +2 -2
  14. package/dist/cjs/combo-box/combo-box.cjs +5 -5
  15. package/dist/cjs/date-field/date-field.cjs +4 -4
  16. package/dist/cjs/date-picker/date-picker.cjs +6 -7
  17. package/dist/cjs/date-range-picker/date-range-picker.cjs +8 -8
  18. package/dist/cjs/govt-banner/govt-banner.cjs +3 -3
  19. package/dist/cjs/hooks/use-callback-ref.cjs +4 -4
  20. package/dist/cjs/hooks/use-controllable-state.cjs +2 -2
  21. package/dist/cjs/index.cjs +20 -9
  22. package/dist/cjs/input/input.cjs +2 -2
  23. package/dist/cjs/menu/menu.cjs +7 -7
  24. package/dist/cjs/node_modules/.pnpm/@react-aria_focus@3.20.5_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/focus/dist/useFocusRing.cjs +45 -0
  25. package/dist/cjs/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/context.cjs +21 -0
  26. package/dist/cjs/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/textSelection.cjs +72 -0
  27. package/dist/cjs/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/useFocus.cjs +60 -0
  28. package/dist/cjs/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/useFocusVisible.cjs +210 -0
  29. package/dist/cjs/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/useFocusWithin.cjs +100 -0
  30. package/dist/cjs/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/useHover.cjs +152 -0
  31. package/dist/cjs/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/usePress.cjs +676 -0
  32. package/dist/cjs/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/utils.cjs +160 -0
  33. package/dist/cjs/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_check_private_redeclaration.cjs +9 -0
  34. package/dist/cjs/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_apply_descriptor_get.cjs +9 -0
  35. package/dist/cjs/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_apply_descriptor_set.cjs +16 -0
  36. package/dist/cjs/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_extract_field_descriptor.cjs +9 -0
  37. package/dist/cjs/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_private_field_get.cjs +11 -0
  38. package/dist/cjs/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_private_field_init.cjs +10 -0
  39. package/dist/cjs/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_private_field_set.cjs +12 -0
  40. package/dist/cjs/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/Icon.cjs +4 -4
  41. package/dist/cjs/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/createLucideIcon.cjs +3 -3
  42. package/dist/cjs/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/chevrons-right.cjs +22 -0
  43. package/dist/cjs/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/ellipsis.cjs +23 -0
  44. package/dist/cjs/pagination/hooks/use-pagination.cjs +117 -0
  45. package/dist/cjs/pagination/index.cjs +17 -0
  46. package/dist/cjs/pagination/pagination-cursor.cjs +18 -0
  47. package/dist/cjs/pagination/pagination-item.cjs +18 -0
  48. package/dist/cjs/pagination/pagination.cjs +263 -0
  49. package/dist/cjs/pagination/use-pagination-item.cjs +87 -0
  50. package/dist/cjs/pagination/use-pagination.cjs +251 -0
  51. package/dist/cjs/range-calendar/range-calendar.cjs +7 -7
  52. package/dist/cjs/ripple/use-ripple.cjs +4 -4
  53. package/dist/cjs/select/select.cjs +5 -5
  54. package/dist/cjs/spinner/use-spinner.cjs +3 -3
  55. package/dist/cjs/system/react-utils/context.cjs +3 -3
  56. package/dist/cjs/system/react-utils/dom-props.cjs +186 -0
  57. package/dist/cjs/system/react-utils/filter-dom-props.cjs +46 -0
  58. package/dist/cjs/system/react-utils/index.cjs +2 -0
  59. package/dist/cjs/system/react-utils/refs.cjs +3 -3
  60. package/dist/cjs/system/utils.cjs +3 -3
  61. package/dist/cjs/tabs/tabs.cjs +2 -2
  62. package/dist/cjs/tag-field/tag-field-item.cjs +2 -2
  63. package/dist/cjs/tag-field/tag-field-list.cjs +4 -4
  64. package/dist/cjs/tag-field/tag-field-root.cjs +14 -14
  65. package/dist/cjs/tag-field/tag-field-state-context.cjs +2 -2
  66. package/dist/cjs/tag-field/tag-field-tag-list.cjs +3 -3
  67. package/dist/cjs/tag-field/tag-field-trigger.cjs +2 -2
  68. package/dist/cjs/tag-field/tag-field.cjs +5 -5
  69. package/dist/cjs/tag-field/use-tag-field-state.cjs +6 -6
  70. package/dist/cjs/tag-field/use-tag-field.cjs +4 -4
  71. package/dist/cjs/text-area/text-area.cjs +2 -2
  72. package/dist/cjs/text-area-field/text-area-field.cjs +1 -1
  73. package/dist/cjs/text-field/text-field.cjs +1 -1
  74. package/dist/cjs/toggle/toggle.cjs +3 -3
  75. package/dist/esm/banner/banner.js +1 -1
  76. package/dist/esm/button/button.js +1 -1
  77. package/dist/esm/calendar/calendar-month-day-selector.js +2 -2
  78. package/dist/esm/checkbox/checkbox.js +1 -1
  79. package/dist/esm/combo-box/combo-box.js +2 -2
  80. package/dist/esm/date-field/date-field.js +1 -1
  81. package/dist/esm/date-picker/date-picker.js +4 -5
  82. package/dist/esm/date-range-picker/date-range-picker.js +5 -5
  83. package/dist/esm/index.js +8 -3
  84. package/dist/esm/menu/menu.js +1 -1
  85. package/dist/esm/node_modules/.pnpm/@react-aria_focus@3.20.5_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/focus/dist/useFocusRing.js +43 -0
  86. package/dist/esm/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/context.js +19 -0
  87. package/dist/esm/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/textSelection.js +69 -0
  88. package/dist/esm/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/useFocus.js +58 -0
  89. package/dist/esm/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/useFocusVisible.js +205 -0
  90. package/dist/esm/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/useFocusWithin.js +98 -0
  91. package/dist/esm/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/useHover.js +150 -0
  92. package/dist/esm/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/usePress.js +674 -0
  93. package/dist/esm/node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/utils.js +155 -0
  94. package/dist/esm/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_check_private_redeclaration.js +7 -0
  95. package/dist/esm/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_apply_descriptor_get.js +7 -0
  96. package/dist/esm/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_apply_descriptor_set.js +14 -0
  97. package/dist/esm/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_extract_field_descriptor.js +7 -0
  98. package/dist/esm/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_private_field_get.js +9 -0
  99. package/dist/esm/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_private_field_init.js +8 -0
  100. package/dist/esm/node_modules/.pnpm/@swc_helpers@0.5.17/node_modules/@swc/helpers/esm/_class_private_field_set.js +10 -0
  101. package/dist/esm/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/chevrons-right.js +17 -0
  102. package/dist/esm/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/ellipsis.js +18 -0
  103. package/dist/esm/pagination/hooks/use-pagination.js +114 -0
  104. package/dist/esm/pagination/index.js +6 -0
  105. package/dist/esm/pagination/pagination-cursor.js +16 -0
  106. package/dist/esm/pagination/pagination-item.js +16 -0
  107. package/dist/esm/pagination/pagination.js +261 -0
  108. package/dist/esm/pagination/use-pagination-item.js +85 -0
  109. package/dist/esm/pagination/use-pagination.js +248 -0
  110. package/dist/esm/range-calendar/range-calendar.js +1 -1
  111. package/dist/esm/select/select.js +3 -3
  112. package/dist/esm/system/react-utils/dom-props.js +183 -0
  113. package/dist/esm/system/react-utils/filter-dom-props.js +44 -0
  114. package/dist/esm/system/react-utils/index.js +1 -0
  115. package/dist/esm/tag-field/tag-field.js +3 -3
  116. package/dist/esm/text-area-field/text-area-field.js +1 -1
  117. package/dist/esm/text-field/text-field.js +1 -1
  118. package/dist/types/index.d.mts +1 -0
  119. package/dist/types/index.d.ts +1 -0
  120. package/dist/types/index.d.ts.map +1 -1
  121. package/dist/types/pagination/hooks/use-pagination.d.ts +51 -0
  122. package/dist/types/pagination/hooks/use-pagination.d.ts.map +1 -0
  123. package/dist/types/pagination/index.d.ts +7 -0
  124. package/dist/types/pagination/index.d.ts.map +1 -0
  125. package/dist/types/pagination/pagination-cursor.d.ts +9 -0
  126. package/dist/types/pagination/pagination-cursor.d.ts.map +1 -0
  127. package/dist/types/pagination/pagination-item.d.ts +5 -0
  128. package/dist/types/pagination/pagination-item.d.ts.map +1 -0
  129. package/dist/types/pagination/pagination.d.ts +5 -0
  130. package/dist/types/pagination/pagination.d.ts.map +1 -0
  131. package/dist/types/pagination/use-pagination-item.d.ts +51 -0
  132. package/dist/types/pagination/use-pagination-item.d.ts.map +1 -0
  133. package/dist/types/pagination/use-pagination.d.ts +353 -0
  134. package/dist/types/pagination/use-pagination.d.ts.map +1 -0
  135. package/dist/types/system/react-utils/context.d.ts.map +1 -1
  136. package/dist/types/system/react-utils/dom-props.d.ts +3 -0
  137. package/dist/types/system/react-utils/dom-props.d.ts.map +1 -0
  138. package/dist/types/system/react-utils/filter-dom-props.d.ts +39 -0
  139. package/dist/types/system/react-utils/filter-dom-props.d.ts.map +1 -0
  140. package/dist/types/system/react-utils/index.d.ts +1 -0
  141. package/dist/types/system/react-utils/index.d.ts.map +1 -1
  142. package/package.json +6 -4
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ "use client";
3
+ import { useMemo } from 'react';
4
+ import { useFocusRing as $f7dceffc5ad7768b$export$4e328f61c538687f } from '../node_modules/.pnpm/@react-aria_focus@3.20.5_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/focus/dist/useFocusRing.js';
5
+ import { useRouter, mergeProps, chain, shouldClientNavigate } from '@react-aria/utils';
6
+ import { useHover as $6179b936705e76d3$export$ae780daf29e6d456 } from '../node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/useHover.js';
7
+ import { usePress as $f6c31cce2adf654f$export$45712eceda6fad21 } from '../node_modules/.pnpm/@react-aria_interactions@3.25.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@react-aria/interactions/dist/usePress.js';
8
+ import { cn, dataAttr } from '@opengovsg/oui-theme';
9
+ import { filterDOMProps } from '../system/react-utils/filter-dom-props.js';
10
+ import { useDomRef } from '../system/react-utils/refs.js';
11
+
12
+ function usePaginationItem(props) {
13
+ const {
14
+ as,
15
+ ref,
16
+ value,
17
+ children,
18
+ isActive,
19
+ isDisabled,
20
+ onPress,
21
+ onClick,
22
+ getAriaLabel,
23
+ className,
24
+ ...otherProps
25
+ } = props;
26
+ const isLink = !!props?.href;
27
+ const Component = as || isLink ? "a" : "li";
28
+ const shouldFilterDOMProps = typeof Component === "string";
29
+ const domRef = useDomRef(ref);
30
+ const router = useRouter();
31
+ const ariaLabel = useMemo(
32
+ () => isActive ? `${getAriaLabel?.(value)} active` : getAriaLabel?.(value),
33
+ [isActive, getAriaLabel, value]
34
+ );
35
+ const { isPressed, pressProps } = $f6c31cce2adf654f$export$45712eceda6fad21({
36
+ isDisabled,
37
+ onPress
38
+ });
39
+ const { focusProps, isFocused, isFocusVisible } = $f7dceffc5ad7768b$export$4e328f61c538687f({});
40
+ const { isHovered, hoverProps } = $6179b936705e76d3$export$ae780daf29e6d456({ isDisabled });
41
+ const getItemProps = (props2 = {}) => {
42
+ return {
43
+ ref: domRef,
44
+ role: "button",
45
+ tabIndex: isDisabled ? -1 : 0,
46
+ "aria-label": ariaLabel,
47
+ "aria-current": dataAttr(isActive),
48
+ "aria-disabled": dataAttr(isDisabled),
49
+ "data-disabled": dataAttr(isDisabled),
50
+ "data-active": dataAttr(isActive),
51
+ "data-focus": dataAttr(isFocused),
52
+ "data-hover": dataAttr(isHovered),
53
+ "data-pressed": dataAttr(isPressed),
54
+ "data-focus-visible": dataAttr(isFocusVisible),
55
+ ...mergeProps(
56
+ props2,
57
+ pressProps,
58
+ focusProps,
59
+ hoverProps,
60
+ filterDOMProps(otherProps, {
61
+ enabled: shouldFilterDOMProps
62
+ })
63
+ ),
64
+ className: cn(className, props2.className),
65
+ onClick: (e) => {
66
+ chain(pressProps?.onClick, onClick)(e);
67
+ if (!router.isNative && e.currentTarget instanceof HTMLAnchorElement && e.currentTarget.href && // If props are applied to a router Link component, it may have already prevented default.
68
+ !e.isDefaultPrevented() && shouldClientNavigate(e.currentTarget, e) && props2.href) {
69
+ e.preventDefault();
70
+ router.open(e.currentTarget, e, props2.href, props2.routerOptions);
71
+ }
72
+ }
73
+ };
74
+ };
75
+ return {
76
+ Component,
77
+ children,
78
+ ariaLabel,
79
+ isFocused,
80
+ isFocusVisible,
81
+ getItemProps
82
+ };
83
+ }
84
+
85
+ export { usePaginationItem };
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ "use client";
3
+ import { useRef, useCallback, useEffect } from 'react';
4
+ import scrollIntoView from 'scroll-into-view-if-needed';
5
+ import { useDeepCompareMemo } from 'use-deep-compare';
6
+ import { useIntersectionObserver } from 'usehooks-ts';
7
+ import { paginationStyles, cn, dataAttr } from '@opengovsg/oui-theme';
8
+ import { mapPropsVariants } from '../system/utils.js';
9
+ import { usePagination as usePagination$1, PaginationItemType } from './hooks/use-pagination.js';
10
+ import { useDomRef } from '../system/react-utils/refs.js';
11
+
12
+ const CURSOR_TRANSITION_TIMEOUT = 300;
13
+ function usePagination(originalProps) {
14
+ const [props, variantProps] = mapPropsVariants(
15
+ originalProps,
16
+ paginationStyles.variantKeys
17
+ );
18
+ const {
19
+ as,
20
+ ref,
21
+ classNames,
22
+ dotsJump = 5,
23
+ loop = false,
24
+ showControls = false,
25
+ total = 1,
26
+ initialPage = 1,
27
+ page,
28
+ siblings,
29
+ boundaries,
30
+ onChange,
31
+ className,
32
+ renderItem,
33
+ getItemAriaLabel: getItemAriaLabelProp,
34
+ ...otherProps
35
+ } = props;
36
+ const Component = as || "nav";
37
+ const domRef = useDomRef(ref);
38
+ const cursorRef = useRef(null);
39
+ const itemsRef = useRef(null);
40
+ const cursorTimer = useRef(null);
41
+ const disableAnimation = originalProps?.disableAnimation ?? false;
42
+ const disableCursorAnimation = originalProps?.disableCursorAnimation ?? disableAnimation ?? false;
43
+ function getItemsRefMap() {
44
+ if (!itemsRef.current) {
45
+ itemsRef.current = /* @__PURE__ */ new Map();
46
+ }
47
+ return itemsRef.current;
48
+ }
49
+ function getItemRef(node, value) {
50
+ const map = getItemsRefMap();
51
+ if (node) {
52
+ map.set(value, node);
53
+ } else {
54
+ map.delete(value);
55
+ }
56
+ }
57
+ const scrollTo = useCallback(
58
+ (value, skipAnimation) => {
59
+ const map = getItemsRefMap();
60
+ const node = map.get(value);
61
+ if (!node || !cursorRef.current) return;
62
+ if (cursorTimer.current) {
63
+ clearTimeout(cursorTimer.current);
64
+ }
65
+ scrollIntoView(node, {
66
+ scrollMode: "always",
67
+ behavior: "smooth",
68
+ block: "start",
69
+ inline: "start",
70
+ boundary: domRef.current
71
+ });
72
+ const { offsetLeft } = node;
73
+ if (skipAnimation) {
74
+ cursorRef.current.setAttribute("data-moving", "false");
75
+ cursorRef.current.style.transform = `translateX(${offsetLeft}px) scale(1)`;
76
+ return;
77
+ }
78
+ cursorRef.current.setAttribute("data-moving", "true");
79
+ cursorRef.current.style.transform = `translateX(${offsetLeft}px) scale(1.1)`;
80
+ cursorTimer.current = setTimeout(() => {
81
+ if (cursorRef.current) {
82
+ cursorRef.current.style.transform = `translateX(${offsetLeft}px) scale(1)`;
83
+ }
84
+ cursorTimer.current = setTimeout(() => {
85
+ cursorRef.current?.setAttribute("data-moving", "false");
86
+ if (cursorTimer.current) {
87
+ clearTimeout(cursorTimer.current);
88
+ }
89
+ }, CURSOR_TRANSITION_TIMEOUT);
90
+ }, CURSOR_TRANSITION_TIMEOUT);
91
+ },
92
+ [domRef]
93
+ );
94
+ const { range, activePage, setPage, previous, next, first, last } = usePagination$1({
95
+ page,
96
+ total,
97
+ initialPage,
98
+ siblings,
99
+ boundaries,
100
+ showControls,
101
+ onChange
102
+ });
103
+ const [setRef, isVisible] = useIntersectionObserver();
104
+ useEffect(() => {
105
+ if (domRef.current) {
106
+ setRef(domRef.current);
107
+ }
108
+ }, [domRef, setRef]);
109
+ const activePageRef = useRef(activePage);
110
+ useEffect(() => {
111
+ if (activePage && !disableAnimation && isVisible) {
112
+ scrollTo(activePage, activePage === activePageRef.current);
113
+ }
114
+ activePageRef.current = activePage;
115
+ }, [
116
+ page,
117
+ activePage,
118
+ disableAnimation,
119
+ disableCursorAnimation,
120
+ isVisible,
121
+ originalProps.dotsJump,
122
+ originalProps.isCompact,
123
+ originalProps.showControls,
124
+ scrollTo
125
+ ]);
126
+ const slots = useDeepCompareMemo(
127
+ () => paginationStyles({
128
+ ...variantProps,
129
+ disableAnimation,
130
+ disableCursorAnimation
131
+ }),
132
+ [variantProps, disableCursorAnimation, disableAnimation]
133
+ );
134
+ const baseStyles = cn(classNames?.base, className);
135
+ const onNext = () => {
136
+ if (loop && activePage === total) {
137
+ return first();
138
+ }
139
+ return next();
140
+ };
141
+ const onPrevious = () => {
142
+ if (loop && activePage === 1) {
143
+ return last();
144
+ }
145
+ return previous();
146
+ };
147
+ const getBaseProps = (props2 = {}) => {
148
+ return {
149
+ ref: domRef,
150
+ role: "navigation",
151
+ "aria-label": props2["aria-label"] || "pagination navigation",
152
+ "data-slot": "base",
153
+ "data-controls": dataAttr(showControls),
154
+ "data-loop": dataAttr(loop),
155
+ "data-dots-jump": dotsJump,
156
+ "data-total": total,
157
+ "data-active-page": activePage,
158
+ className: slots.base({ class: cn(baseStyles, props2?.className) }),
159
+ ...otherProps,
160
+ ...props2
161
+ };
162
+ };
163
+ const getWrapperProps = (props2 = {}) => {
164
+ return {
165
+ "data-slot": "wrapper",
166
+ "data-disabled": dataAttr(variantProps.isDisabled),
167
+ role: "none",
168
+ className: slots.wrapper({
169
+ class: cn(classNames?.wrapper, props2?.className)
170
+ }),
171
+ ...props2
172
+ };
173
+ };
174
+ const getItemAriaLabel = (page2) => {
175
+ if (!page2) return;
176
+ if (getItemAriaLabelProp) {
177
+ return getItemAriaLabelProp(page2);
178
+ }
179
+ switch (page2) {
180
+ case PaginationItemType.DOTS:
181
+ return "dots element";
182
+ case PaginationItemType.PREV:
183
+ return "previous page button";
184
+ case PaginationItemType.NEXT:
185
+ return "next page button";
186
+ case "first":
187
+ return "first page button";
188
+ case "last":
189
+ return "last page button";
190
+ default:
191
+ return `pagination item ${page2}`;
192
+ }
193
+ };
194
+ const getItemProps = (props2 = {}) => {
195
+ return {
196
+ ref: (node) => getItemRef(node, props2.value),
197
+ "aria-disabled": dataAttr(variantProps.isDisabled),
198
+ "data-disabled": dataAttr(variantProps.isDisabled),
199
+ "data-slot": "item",
200
+ isActive: props2.value === activePage,
201
+ className: slots.item({
202
+ class: cn(classNames?.item, props2?.className)
203
+ }),
204
+ onPress: () => {
205
+ if (props2.value !== activePage) {
206
+ setPage(props2.value);
207
+ }
208
+ },
209
+ ...props2
210
+ };
211
+ };
212
+ const getCursorProps = (props2 = {}) => {
213
+ return {
214
+ ref: cursorRef,
215
+ activePage,
216
+ "data-slot": "cursor",
217
+ className: slots.cursor({
218
+ class: cn(classNames?.cursor, props2?.className)
219
+ }),
220
+ ...props2
221
+ };
222
+ };
223
+ return {
224
+ Component,
225
+ showControls,
226
+ dotsJump,
227
+ slots,
228
+ classNames,
229
+ loop,
230
+ total,
231
+ range,
232
+ activePage,
233
+ getItemRef,
234
+ disableAnimation,
235
+ disableCursorAnimation,
236
+ setPage,
237
+ onPrevious,
238
+ onNext,
239
+ renderItem,
240
+ getBaseProps,
241
+ getWrapperProps,
242
+ getItemProps,
243
+ getCursorProps,
244
+ getItemAriaLabel
245
+ };
246
+ }
247
+
248
+ export { CURSOR_TRANSITION_TIMEOUT, usePagination };
@@ -6,12 +6,12 @@ import { CalendarDate, today, getLocalTimeZone, getDayOfWeek } from '@internatio
6
6
  import { RangeCalendar as RangeCalendar$1, Provider, CalendarGrid, CalendarGridBody, Text, RangeCalendarStateContext, useLocale, CalendarCell } from 'react-aria-components';
7
7
  import { useDeepCompareMemo } from 'use-deep-compare';
8
8
  import { calendarStyles, composeRenderProps, cn, dataAttr } from '@opengovsg/oui-theme';
9
- import { CalendarStyleContext, useCalendarStyleContext } from '../calendar/calendar-style-context.js';
10
9
  import { AgnosticCalendarStateContext } from '../calendar/agnostic-calendar-state-context.js';
11
10
  import { CalendarBottomContent } from '../calendar/calendar-bottom-content.js';
12
11
  import { CalendarGridHeader } from '../calendar/calendar-grid-header.js';
13
12
  import { CalendarHeader } from '../calendar/calendar-header.js';
14
13
  import { forwardRefGeneric, mapPropsVariants } from '../system/utils.js';
14
+ import { CalendarStyleContext, useCalendarStyleContext } from '../calendar/calendar-style-context.js';
15
15
 
16
16
  const RangeCalendar = forwardRefGeneric(function RangeCalendar2(originalProps, ref) {
17
17
  const [props, variantProps] = mapPropsVariants(
@@ -4,12 +4,12 @@ import { jsx, jsxs } from 'react/jsx-runtime';
4
4
  import { useMemo } from 'react';
5
5
  import { Provider, Select as Select$1, SelectValue, Virtualizer, ListLayout, ListBox } from 'react-aria-components';
6
6
  import { selectStyles, composeRenderProps } from '@opengovsg/oui-theme';
7
- import { Button } from '../button/button.js';
8
- import { Label, Description, FieldError } from '../field/field.js';
9
- import { Popover } from '../popover/popover.js';
10
7
  import { mapPropsVariants } from '../system/utils.js';
11
8
  import { SelectVariantContext } from './select-variant-context.js';
9
+ import { Label, Description, FieldError } from '../field/field.js';
12
10
  import ChevronDown from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js';
11
+ import { Popover } from '../popover/popover.js';
12
+ import { Button } from '../button/button.js';
13
13
 
14
14
  const calculateEstimatedRowHeight = (size) => {
15
15
  switch (size) {
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ const DOMPropNames = /* @__PURE__ */ new Set([
3
+ "id",
4
+ "type",
5
+ "style",
6
+ "title",
7
+ "role",
8
+ "tabIndex",
9
+ "htmlFor",
10
+ "width",
11
+ "height",
12
+ "abbr",
13
+ "accept",
14
+ "acceptCharset",
15
+ "accessKey",
16
+ "action",
17
+ "allowFullScreen",
18
+ "allowTransparency",
19
+ "alt",
20
+ "async",
21
+ "autoComplete",
22
+ "autoFocus",
23
+ "autoPlay",
24
+ "cellPadding",
25
+ "cellSpacing",
26
+ "challenge",
27
+ "charset",
28
+ "checked",
29
+ "cite",
30
+ "class",
31
+ "className",
32
+ "cols",
33
+ "colSpan",
34
+ "command",
35
+ "content",
36
+ "contentEditable",
37
+ "contextMenu",
38
+ "controls",
39
+ "coords",
40
+ "crossOrigin",
41
+ "data",
42
+ "dateTime",
43
+ "default",
44
+ "defer",
45
+ "dir",
46
+ "disabled",
47
+ "download",
48
+ "draggable",
49
+ "dropzone",
50
+ "encType",
51
+ "enterKeyHint",
52
+ "for",
53
+ "form",
54
+ "formAction",
55
+ "formEncType",
56
+ "formMethod",
57
+ "formNoValidate",
58
+ "formTarget",
59
+ "frameBorder",
60
+ "headers",
61
+ "hidden",
62
+ "high",
63
+ "href",
64
+ "hrefLang",
65
+ "httpEquiv",
66
+ "icon",
67
+ "inputMode",
68
+ "isMap",
69
+ "itemId",
70
+ "itemProp",
71
+ "itemRef",
72
+ "itemScope",
73
+ "itemType",
74
+ "kind",
75
+ "label",
76
+ "lang",
77
+ "list",
78
+ "loop",
79
+ "manifest",
80
+ "max",
81
+ "maxLength",
82
+ "media",
83
+ "mediaGroup",
84
+ "method",
85
+ "min",
86
+ "minLength",
87
+ "multiple",
88
+ "muted",
89
+ "name",
90
+ "noValidate",
91
+ "open",
92
+ "optimum",
93
+ "pattern",
94
+ "ping",
95
+ "placeholder",
96
+ "poster",
97
+ "preload",
98
+ "radioGroup",
99
+ "referrerPolicy",
100
+ "readOnly",
101
+ "rel",
102
+ "required",
103
+ "rows",
104
+ "rowSpan",
105
+ "sandbox",
106
+ "scope",
107
+ "scoped",
108
+ "scrolling",
109
+ "seamless",
110
+ "selected",
111
+ "shape",
112
+ "size",
113
+ "sizes",
114
+ "slot",
115
+ "sortable",
116
+ "span",
117
+ "spellCheck",
118
+ "src",
119
+ "srcDoc",
120
+ "srcSet",
121
+ "start",
122
+ "step",
123
+ "target",
124
+ "translate",
125
+ "typeMustMatch",
126
+ "useMap",
127
+ "value",
128
+ "wmode",
129
+ "wrap"
130
+ ]);
131
+ const DOMEventNames = /* @__PURE__ */ new Set([
132
+ "onCopy",
133
+ "onCut",
134
+ "onPaste",
135
+ "onLoad",
136
+ "onError",
137
+ "onWheel",
138
+ "onScroll",
139
+ "onCompositionEnd",
140
+ "onCompositionStart",
141
+ "onCompositionUpdate",
142
+ "onKeyDown",
143
+ "onKeyPress",
144
+ "onKeyUp",
145
+ "onFocus",
146
+ "onBlur",
147
+ "onChange",
148
+ "onInput",
149
+ "onSubmit",
150
+ "onClick",
151
+ "onContextMenu",
152
+ "onDoubleClick",
153
+ "onDrag",
154
+ "onDragEnd",
155
+ "onDragEnter",
156
+ "onDragExit",
157
+ "onDragLeave",
158
+ "onDragOver",
159
+ "onDragStart",
160
+ "onDrop",
161
+ "onMouseDown",
162
+ "onMouseEnter",
163
+ "onMouseLeave",
164
+ "onMouseMove",
165
+ "onMouseOut",
166
+ "onMouseOver",
167
+ "onMouseUp",
168
+ "onPointerDown",
169
+ "onPointerEnter",
170
+ "onPointerLeave",
171
+ "onPointerUp",
172
+ "onSelect",
173
+ "onTouchCancel",
174
+ "onTouchEnd",
175
+ "onTouchMove",
176
+ "onTouchStart",
177
+ "onAnimationStart",
178
+ "onAnimationEnd",
179
+ "onAnimationIteration",
180
+ "onTransitionEnd"
181
+ ]);
182
+
183
+ export { DOMEventNames, DOMPropNames };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ import { DOMEventNames, DOMPropNames } from './dom-props.js';
3
+
4
+ const propRe = /^(data-.*)$/;
5
+ const ariaRe = /^(aria-.*)$/;
6
+ const funcRe = /^(on[A-Z].*)$/;
7
+ function filterDOMProps(props, opts = {}) {
8
+ const {
9
+ labelable = true,
10
+ enabled = true,
11
+ propNames,
12
+ omitPropNames,
13
+ omitEventNames,
14
+ omitDataProps,
15
+ omitEventProps
16
+ } = opts;
17
+ const filteredProps = {};
18
+ if (!enabled) {
19
+ return props;
20
+ }
21
+ for (const prop in props) {
22
+ if (omitPropNames?.has(prop)) {
23
+ continue;
24
+ }
25
+ if (omitEventNames?.has(prop) && funcRe.test(prop)) {
26
+ continue;
27
+ }
28
+ if (funcRe.test(prop) && !DOMEventNames.has(prop)) {
29
+ continue;
30
+ }
31
+ if (omitDataProps && propRe.test(prop)) {
32
+ continue;
33
+ }
34
+ if (omitEventProps && funcRe.test(prop)) {
35
+ continue;
36
+ }
37
+ if (Object.prototype.hasOwnProperty.call(props, prop) && (DOMPropNames.has(prop) || labelable && ariaRe.test(prop) || propNames?.has(prop) || propRe.test(prop)) || funcRe.test(prop)) {
38
+ filteredProps[prop] = props[prop];
39
+ }
40
+ }
41
+ return filteredProps;
42
+ }
43
+
44
+ export { filterDOMProps };
@@ -1,3 +1,4 @@
1
1
  "use strict";
2
2
  export { createContext } from './context.js';
3
3
  export { useDomRef } from './refs.js';
4
+ export { filterDOMProps } from './filter-dom-props.js';
@@ -4,15 +4,15 @@ import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { createElement } from 'react';
5
5
  import { composeRenderProps } from 'react-aria-components';
6
6
  import { tagFieldStyles } from '@opengovsg/oui-theme';
7
- import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
8
- import { Input } from '../input/input.js';
9
- import { Popover } from '../popover/popover.js';
10
7
  import { TagFieldItem } from './tag-field-item.js';
11
8
  import { TagFieldList } from './tag-field-list.js';
12
9
  import { TagFieldRoot } from './tag-field-root.js';
13
10
  import { TagFieldTagList } from './tag-field-tag-list.js';
14
11
  import { TagFieldTrigger } from './tag-field-trigger.js';
15
12
  import ChevronDown from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js';
13
+ import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
14
+ import { Input } from '../input/input.js';
15
+ import { Popover } from '../popover/popover.js';
16
16
 
17
17
  function TagField({
18
18
  classNames,
@@ -3,8 +3,8 @@
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { TextField } from 'react-aria-components';
5
5
  import { composeTailwindRenderProps } from '@opengovsg/oui-theme';
6
- import { Label, Description, FieldError } from '../field/field.js';
7
6
  import { TextArea } from '../text-area/text-area.js';
7
+ import { Label, Description, FieldError } from '../field/field.js';
8
8
 
9
9
  function TextAreaField({
10
10
  label,
@@ -3,8 +3,8 @@
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { TextField as TextField$1 } from 'react-aria-components';
5
5
  import { composeTailwindRenderProps } from '@opengovsg/oui-theme';
6
- import { Label, Description, FieldError } from '../field/field.js';
7
6
  import { Input } from '../input/input.js';
7
+ import { Label, Description, FieldError } from '../field/field.js';
8
8
 
9
9
  function TextField({
10
10
  label,
@@ -24,4 +24,5 @@ export * from "./date-field";
24
24
  export * from "./date-picker";
25
25
  export * from "./date-range-picker";
26
26
  export * from "./checkbox";
27
+ export * from "./pagination";
27
28
  //# sourceMappingURL=index.d.ts.map
@@ -24,4 +24,5 @@ export * from "./date-field";
24
24
  export * from "./date-picker";
25
25
  export * from "./date-range-picker";
26
26
  export * from "./checkbox";
27
+ export * from "./pagination";
27
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,QAAQ,CAAA;AACtB,cAAc,WAAW,CAAA;AACzB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,QAAQ,CAAA;AACtB,cAAc,WAAW,CAAA;AACzB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}