@opengovsg/oui 0.0.29 → 0.0.31

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 (106) hide show
  1. package/dist/cjs/avatar/avatar-context.cjs +12 -0
  2. package/dist/cjs/avatar/avatar-group-context.cjs +88 -0
  3. package/dist/cjs/avatar/avatar-group.cjs +60 -0
  4. package/dist/cjs/avatar/avatar.cjs +132 -0
  5. package/dist/cjs/avatar/hooks/use-img-loading-status.cjs +68 -0
  6. package/dist/cjs/avatar/index.cjs +23 -0
  7. package/dist/cjs/avatar/utils.cjs +9 -0
  8. package/dist/cjs/banner/banner.cjs +1 -1
  9. package/dist/cjs/checkbox/checkbox.cjs +3 -3
  10. package/dist/cjs/combo-box/combo-box.cjs +1 -1
  11. package/dist/cjs/date-field/date-field.cjs +1 -1
  12. package/dist/cjs/date-picker/date-picker.cjs +5 -4
  13. package/dist/cjs/date-range-picker/date-range-picker.cjs +3 -3
  14. package/dist/cjs/file-dropzone/file-dropzone.cjs +12 -8
  15. package/dist/cjs/file-dropzone/file-info.cjs +3 -2
  16. package/dist/cjs/file-dropzone/utils.cjs +4 -4
  17. package/dist/cjs/hooks/use-scroll-position.cjs +53 -0
  18. package/dist/cjs/index.cjs +61 -47
  19. package/dist/cjs/modal/modal-content.cjs +1 -1
  20. package/dist/cjs/navbar/navbar-menu/menu.cjs +2 -2
  21. package/dist/cjs/navbar/navbar-menu/toggle.cjs +3 -2
  22. package/dist/cjs/navbar/navbar.cjs +25 -1
  23. package/dist/cjs/navbar/use-navbar.cjs +42 -32
  24. package/dist/cjs/node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/user.cjs +22 -0
  25. package/dist/cjs/number-field/number-field.cjs +2 -2
  26. package/dist/cjs/range-calendar/range-calendar.cjs +1 -1
  27. package/dist/cjs/select/select.cjs +2 -2
  28. package/dist/cjs/tag-field/tag-field.cjs +1 -1
  29. package/dist/cjs/text-area-field/text-area-field.cjs +1 -1
  30. package/dist/cjs/text-field/text-field.cjs +1 -1
  31. package/dist/esm/avatar/avatar-context.js +9 -0
  32. package/dist/esm/avatar/avatar-group-context.js +84 -0
  33. package/dist/esm/avatar/avatar-group.js +58 -0
  34. package/dist/esm/avatar/avatar.js +128 -0
  35. package/dist/esm/avatar/hooks/use-img-loading-status.js +66 -0
  36. package/dist/esm/avatar/index.js +13 -0
  37. package/dist/esm/avatar/utils.js +7 -0
  38. package/dist/esm/banner/banner.js +1 -1
  39. package/dist/esm/checkbox/checkbox.js +3 -3
  40. package/dist/esm/combo-box/combo-box.js +1 -1
  41. package/dist/esm/date-field/date-field.js +1 -1
  42. package/dist/esm/date-picker/date-picker.js +5 -4
  43. package/dist/esm/date-range-picker/date-range-picker.js +3 -3
  44. package/dist/esm/file-dropzone/file-dropzone.js +12 -8
  45. package/dist/esm/file-dropzone/file-info.js +3 -2
  46. package/dist/esm/file-dropzone/utils.js +4 -4
  47. package/dist/esm/hooks/use-scroll-position.js +51 -0
  48. package/dist/esm/index.js +20 -15
  49. package/dist/esm/modal/modal-content.js +1 -1
  50. package/dist/esm/navbar/navbar-menu/menu.js +2 -2
  51. package/dist/esm/navbar/navbar-menu/toggle.js +3 -2
  52. package/dist/esm/navbar/navbar.js +26 -2
  53. package/dist/esm/navbar/use-navbar.js +43 -33
  54. package/dist/esm/node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/user.js +17 -0
  55. package/dist/esm/number-field/number-field.js +2 -2
  56. package/dist/esm/range-calendar/range-calendar.js +1 -1
  57. package/dist/esm/select/select.js +2 -2
  58. package/dist/esm/tag-field/tag-field.js +1 -1
  59. package/dist/esm/text-area-field/text-area-field.js +1 -1
  60. package/dist/esm/text-field/text-field.js +1 -1
  61. package/dist/types/avatar/avatar-context.d.ts +12 -0
  62. package/dist/types/avatar/avatar-context.d.ts.map +1 -0
  63. package/dist/types/avatar/avatar-group-context.d.ts +70 -0
  64. package/dist/types/avatar/avatar-group-context.d.ts.map +1 -0
  65. package/dist/types/avatar/avatar-group.d.ts +5 -0
  66. package/dist/types/avatar/avatar-group.d.ts.map +1 -0
  67. package/dist/types/avatar/avatar.d.ts +18 -0
  68. package/dist/types/avatar/avatar.d.ts.map +1 -0
  69. package/dist/types/avatar/hooks/use-img-loading-status.d.ts +4 -0
  70. package/dist/types/avatar/hooks/use-img-loading-status.d.ts.map +1 -0
  71. package/dist/types/avatar/index.d.ts +15 -0
  72. package/dist/types/avatar/index.d.ts.map +1 -0
  73. package/dist/types/avatar/utils.d.ts +2 -0
  74. package/dist/types/avatar/utils.d.ts.map +1 -0
  75. package/dist/types/calendar/calendar.d.ts.map +1 -1
  76. package/dist/types/checkbox/checkbox-group-style-context.d.ts +1 -1
  77. package/dist/types/checkbox/checkbox-group-style-context.d.ts.map +1 -1
  78. package/dist/types/date-field/date-field.d.ts.map +1 -1
  79. package/dist/types/file-dropzone/file-dropzone.d.ts +8 -2
  80. package/dist/types/file-dropzone/file-dropzone.d.ts.map +1 -1
  81. package/dist/types/file-dropzone/file-info.d.ts.map +1 -1
  82. package/dist/types/file-dropzone/types.d.ts +1 -0
  83. package/dist/types/file-dropzone/types.d.ts.map +1 -1
  84. package/dist/types/file-dropzone/utils.d.ts +2 -1
  85. package/dist/types/file-dropzone/utils.d.ts.map +1 -1
  86. package/dist/types/hooks/use-scroll-position.d.ts +29 -0
  87. package/dist/types/hooks/use-scroll-position.d.ts.map +1 -0
  88. package/dist/types/index.d.mts +1 -0
  89. package/dist/types/index.d.ts +1 -0
  90. package/dist/types/index.d.ts.map +1 -1
  91. package/dist/types/menu/menu.d.ts.map +1 -1
  92. package/dist/types/navbar/navbar-context.d.ts +10 -2
  93. package/dist/types/navbar/navbar-context.d.ts.map +1 -1
  94. package/dist/types/navbar/navbar-menu/menu.d.ts.map +1 -1
  95. package/dist/types/navbar/navbar-menu/toggle.d.ts.map +1 -1
  96. package/dist/types/navbar/navbar.d.ts.map +1 -1
  97. package/dist/types/navbar/use-navbar.d.ts +33 -1
  98. package/dist/types/navbar/use-navbar.d.ts.map +1 -1
  99. package/dist/types/range-calendar/range-calendar.d.ts.map +1 -1
  100. package/dist/types/system/react-utils/context.d.ts +4 -4
  101. package/dist/types/system/react-utils/context.d.ts.map +1 -1
  102. package/dist/types/system/utils.d.ts.map +1 -1
  103. package/dist/types/tabs/tabs.d.ts.map +1 -1
  104. package/dist/types/tag-field/tag-field-item.d.ts.map +1 -1
  105. package/dist/types/tag-field/tag-field-list.d.ts.map +1 -1
  106. package/package.json +3 -3
@@ -3,6 +3,7 @@
3
3
 
4
4
  var useControllableState = require('./hooks/use-controllable-state.cjs');
5
5
  var useDraggable = require('./hooks/use-draggable.cjs');
6
+ var button = require('./button/button.cjs');
6
7
  var govtBanner = require('./govt-banner/govt-banner.cjs');
7
8
  var ripple = require('./ripple/ripple.cjs');
8
9
  var useRipple = require('./ripple/use-ripple.cjs');
@@ -12,17 +13,31 @@ var toggle = require('./toggle/toggle.cjs');
12
13
  var skipNavLink = require('./skip-nav-link/skip-nav-link.cjs');
13
14
  var input = require('./input/input.cjs');
14
15
  var textField = require('./text-field/text-field.cjs');
16
+ var field = require('./field/field.cjs');
15
17
  var textArea = require('./text-area/text-area.cjs');
16
18
  var textAreaField = require('./text-area-field/text-area-field.cjs');
19
+ var comboBox = require('./combo-box/combo-box.cjs');
20
+ var comboBoxFuzzy = require('./combo-box/combo-box-fuzzy.cjs');
21
+ var comboBoxItem = require('./combo-box/combo-box-item.cjs');
22
+ var comboBoxVariantContext = require('./combo-box/combo-box-variant-context.cjs');
17
23
  var tagField = require('./tag-field/tag-field.cjs');
18
24
  var tagFieldItem = require('./tag-field/tag-field-item.cjs');
19
25
  var select = require('./select/select.cjs');
20
26
  var selectItem = require('./select/select-item.cjs');
21
27
  var selectVariantContext = require('./select/select-variant-context.cjs');
28
+ var calendar = require('./calendar/calendar.cjs');
29
+ var calendarStyleContext = require('./calendar/calendar-style-context.cjs');
30
+ var utils = require('./calendar/utils.cjs');
31
+ var date = require('@internationalized/date');
22
32
  var rangeCalendar = require('./range-calendar/range-calendar.cjs');
23
33
  var menu = require('./menu/menu.cjs');
24
34
  var popover = require('./popover/popover.cjs');
25
35
  var tabs = require('./tabs/tabs.cjs');
36
+ var dateField = require('./date-field/date-field.cjs');
37
+ var datePicker = require('./date-picker/date-picker.cjs');
38
+ var dateRangePicker = require('./date-range-picker/date-range-picker.cjs');
39
+ var checkbox = require('./checkbox/checkbox.cjs');
40
+ var checkboxGroupStyleContext = require('./checkbox/checkbox-group-style-context.cjs');
26
41
  var pagination = require('./pagination/pagination.cjs');
27
42
  var paginationCursor = require('./pagination/pagination-cursor.cjs');
28
43
  var paginationItem = require('./pagination/pagination-item.cjs');
@@ -48,29 +63,20 @@ var toggle$1 = require('./navbar/navbar-menu/toggle.cjs');
48
63
  var navbarItem = require('./navbar/navbar-item.cjs');
49
64
  var useNavbar = require('./navbar/use-navbar.cjs');
50
65
  var navbarContext = require('./navbar/navbar-context.cjs');
51
- var button = require('./button/button.cjs');
52
- var field = require('./field/field.cjs');
53
- var comboBox = require('./combo-box/combo-box.cjs');
54
- var comboBoxFuzzy = require('./combo-box/combo-box-fuzzy.cjs');
55
- var comboBoxItem = require('./combo-box/combo-box-item.cjs');
56
- var comboBoxVariantContext = require('./combo-box/combo-box-variant-context.cjs');
66
+ var index = require('./avatar/index.cjs');
57
67
  var banner = require('./banner/banner.cjs');
58
68
  var badge = require('./badge/badge.cjs');
59
- var date = require('@internationalized/date');
60
- var calendar = require('./calendar/calendar.cjs');
61
- var calendarStyleContext = require('./calendar/calendar-style-context.cjs');
62
- var utils = require('./calendar/utils.cjs');
63
- var dateField = require('./date-field/date-field.cjs');
64
- var datePicker = require('./date-picker/date-picker.cjs');
65
- var dateRangePicker = require('./date-range-picker/date-range-picker.cjs');
66
- var checkbox = require('./checkbox/checkbox.cjs');
67
- var checkboxGroupStyleContext = require('./checkbox/checkbox-group-style-context.cjs');
68
69
  var sonner = require('sonner');
70
+ var avatarContext = require('./avatar/avatar-context.cjs');
71
+ var avatarGroup = require('./avatar/avatar-group.cjs');
72
+ var avatarGroupContext = require('./avatar/avatar-group-context.cjs');
73
+ var avatar = require('./avatar/avatar.cjs');
69
74
 
70
75
 
71
76
 
72
77
  exports.useControllableState = useControllableState.useControllableState;
73
78
  exports.useDraggable = useDraggable.useDraggable;
79
+ exports.Button = button.Button;
74
80
  exports.GovtBanner = govtBanner.GovtBanner;
75
81
  exports.Ripple = ripple.Ripple;
76
82
  exports.useRipple = useRipple.useRipple;
@@ -80,14 +86,37 @@ exports.Toggle = toggle.Toggle;
80
86
  exports.SkipNavLink = skipNavLink.SkipNavLink;
81
87
  exports.Input = input.Input;
82
88
  exports.TextField = textField.TextField;
89
+ exports.Description = field.Description;
90
+ exports.FieldError = field.FieldError;
91
+ exports.FieldErrorIcon = field.FieldErrorIcon;
92
+ exports.FieldGroup = field.FieldGroup;
93
+ exports.Label = field.Label;
83
94
  exports.TextArea = textArea.TextArea;
84
95
  exports.TextAreaField = textAreaField.TextAreaField;
96
+ exports.ComboBox = comboBox.ComboBox;
97
+ exports.ComboBoxEmptyState = comboBox.ComboBoxEmptyState;
98
+ exports.ComboBoxFuzzy = comboBoxFuzzy.ComboBoxFuzzy;
99
+ exports.ComboBoxItem = comboBoxItem.ComboBoxItem;
100
+ exports.ComboBoxVariantContext = comboBoxVariantContext.ComboBoxVariantContext;
101
+ exports.useComboBoxVariantContext = comboBoxVariantContext.useComboBoxVariantContext;
85
102
  exports.TagField = tagField.TagField;
86
103
  exports.TagFieldItem = tagFieldItem.TagFieldItem;
87
104
  exports.Select = select.Select;
88
105
  exports.SelectItem = selectItem.SelectItem;
89
106
  exports.SelectVariantContext = selectVariantContext.SelectVariantContext;
90
107
  exports.useSelectVariantContext = selectVariantContext.useSelectVariantContext;
108
+ exports.Calendar = calendar.Calendar;
109
+ exports.CalendarStateWrapper = calendar.CalendarStateWrapper;
110
+ exports.CalendarStyleContext = calendarStyleContext.CalendarStyleContext;
111
+ exports.useCalendarStyleContext = calendarStyleContext.useCalendarStyleContext;
112
+ exports.getEraFormat = utils.getEraFormat;
113
+ exports.useGenerateLocalizedMonths = utils.useGenerateLocalizedMonths;
114
+ exports.useGenerateLocalizedYears = utils.useGenerateLocalizedYears;
115
+ exports.useLocalizedMonthYear = utils.useLocalizedMonthYear;
116
+ Object.defineProperty(exports, "CalendarDate", {
117
+ enumerable: true,
118
+ get: function () { return date.CalendarDate; }
119
+ });
91
120
  exports.RangeCalendar = rangeCalendar.RangeCalendar;
92
121
  exports.RangeCalendarCell = rangeCalendar.RangeCalendarCell;
93
122
  exports.RangeCalendarStateWrapper = rangeCalendar.RangeCalendarStateWrapper;
@@ -106,6 +135,14 @@ exports.TabPanel = tabs.TabPanel;
106
135
  exports.Tabs = tabs.Tabs;
107
136
  exports.TabsVariantContext = tabs.TabsVariantContext;
108
137
  exports.useTabsVariantContext = tabs.useTabsVariantContext;
138
+ exports.DateField = dateField.DateField;
139
+ exports.DateInput = dateField.DateInput;
140
+ exports.DatePicker = datePicker.DatePicker;
141
+ exports.DateRangePicker = dateRangePicker.DateRangePicker;
142
+ exports.Checkbox = checkbox.Checkbox;
143
+ exports.CheckboxGroup = checkbox.CheckboxGroup;
144
+ exports.CheckboxGroupStyleContext = checkboxGroupStyleContext.CheckboxGroupStyleContext;
145
+ exports.useCheckboxGroupStyleContext = checkboxGroupStyleContext.useCheckboxGroupStyleContext;
109
146
  exports.Pagination = pagination.Pagination;
110
147
  exports.PaginationCursor = paginationCursor.PaginationCursor;
111
148
  exports.PaginationItem = paginationItem.PaginationItem;
@@ -135,41 +172,18 @@ exports.NavbarItem = navbarItem.NavbarItem;
135
172
  exports.useNavbar = useNavbar.useNavbar;
136
173
  exports.NavbarProvider = navbarContext.NavbarProvider;
137
174
  exports.useNavbarContext = navbarContext.useNavbarContext;
138
- exports.Button = button.Button;
139
- exports.Description = field.Description;
140
- exports.FieldError = field.FieldError;
141
- exports.FieldErrorIcon = field.FieldErrorIcon;
142
- exports.FieldGroup = field.FieldGroup;
143
- exports.Label = field.Label;
144
- exports.ComboBox = comboBox.ComboBox;
145
- exports.ComboBoxEmptyState = comboBox.ComboBoxEmptyState;
146
- exports.ComboBoxFuzzy = comboBoxFuzzy.ComboBoxFuzzy;
147
- exports.ComboBoxItem = comboBoxItem.ComboBoxItem;
148
- exports.ComboBoxVariantContext = comboBoxVariantContext.ComboBoxVariantContext;
149
- exports.useComboBoxVariantContext = comboBoxVariantContext.useComboBoxVariantContext;
175
+ exports.Avatar = index.Avatar;
150
176
  exports.Banner = banner.Banner;
151
177
  exports.Badge = badge.Badge;
152
- Object.defineProperty(exports, "CalendarDate", {
153
- enumerable: true,
154
- get: function () { return date.CalendarDate; }
155
- });
156
- exports.Calendar = calendar.Calendar;
157
- exports.CalendarStateWrapper = calendar.CalendarStateWrapper;
158
- exports.CalendarStyleContext = calendarStyleContext.CalendarStyleContext;
159
- exports.useCalendarStyleContext = calendarStyleContext.useCalendarStyleContext;
160
- exports.getEraFormat = utils.getEraFormat;
161
- exports.useGenerateLocalizedMonths = utils.useGenerateLocalizedMonths;
162
- exports.useGenerateLocalizedYears = utils.useGenerateLocalizedYears;
163
- exports.useLocalizedMonthYear = utils.useLocalizedMonthYear;
164
- exports.DateField = dateField.DateField;
165
- exports.DateInput = dateField.DateInput;
166
- exports.DatePicker = datePicker.DatePicker;
167
- exports.DateRangePicker = dateRangePicker.DateRangePicker;
168
- exports.Checkbox = checkbox.Checkbox;
169
- exports.CheckboxGroup = checkbox.CheckboxGroup;
170
- exports.CheckboxGroupStyleContext = checkboxGroupStyleContext.CheckboxGroupStyleContext;
171
- exports.useCheckboxGroupStyleContext = checkboxGroupStyleContext.useCheckboxGroupStyleContext;
172
178
  Object.defineProperty(exports, "toast", {
173
179
  enumerable: true,
174
180
  get: function () { return sonner.toast; }
175
181
  });
182
+ exports.AvatarContext = avatarContext.AvatarContext;
183
+ exports.useAvatarContext = avatarContext.useAvatarContext;
184
+ exports.AvatarGroup = avatarGroup.AvatarGroup;
185
+ exports.AvatarGroupProvider = avatarGroupContext.AvatarGroupProvider;
186
+ exports.useAvatarGroup = avatarGroupContext.useAvatarGroup;
187
+ exports.AvatarFallback = avatar.AvatarFallback;
188
+ exports.AvatarImage = avatar.AvatarImage;
189
+ exports.AvatarRoot = avatar.AvatarRoot;
@@ -7,10 +7,10 @@ var $670gB$react = require('react');
7
7
  var reactAria = require('react-aria');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
+ var button = require('../button/button.cjs');
10
11
  var i18n = require('./i18n.cjs');
11
12
  var modalVariantContext = require('./modal-variant-context.cjs');
12
13
  var x = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.cjs');
13
- var button = require('../button/button.cjs');
14
14
 
15
15
  function ModalContent({
16
16
  closeButtonContent: closeButtonContentProp,
@@ -16,7 +16,7 @@ const NavbarMenu = utils.forwardRef(
16
16
  const {
17
17
  slots,
18
18
  isMenuOpen,
19
- height,
19
+ menuTopOffsetPx,
20
20
  classNames,
21
21
  setIsMenuOpen,
22
22
  domRef: parentRef,
@@ -46,7 +46,7 @@ const NavbarMenu = utils.forwardRef(
46
46
  style: {
47
47
  ...style,
48
48
  // @ts-expect-error due to not having any type declaration for CSS variables in React style prop
49
- "--navbar-height": typeof height === "number" ? `${height}px` : height
49
+ "--menu-offset": menuTopOffsetPx
50
50
  },
51
51
  onKeyDown: reactAria.chain(handleKeyDown, onKeyDown),
52
52
  ...props,
@@ -26,13 +26,14 @@ const NavbarMenuToggle = ({
26
26
  isMenuOpen,
27
27
  setIsMenuOpen,
28
28
  menuRef,
29
- position
29
+ position,
30
+ menuTopOffset
30
31
  } = navbarContext.useNavbarContext();
31
32
  const shouldScrollToTop = (isMenuOpen2) => {
32
33
  if (!isMenuOpen2 || position === "sticky" || typeof window === "undefined") {
33
34
  return;
34
35
  }
35
- window.scrollTo({ top: 0, behavior: "instant" });
36
+ window.scrollTo({ top: menuTopOffset, behavior: "instant" });
36
37
  };
37
38
  const formatMessage = reactAria.useMessageFormatter(i18n.i18nStrings);
38
39
  const toggleStyles = $670gB$react.useMemo(() => {
@@ -3,6 +3,7 @@
3
3
  'use strict';
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
+ var react = require('motion/react');
6
7
  var reactAria = require('react-aria');
7
8
  var children = require('../system/react-utils/children.cjs');
8
9
  var utils = require('../system/utils.cjs');
@@ -10,6 +11,20 @@ var navbarContext = require('./navbar-context.cjs');
10
11
  var menu = require('./navbar-menu/menu.cjs');
11
12
  var useNavbar = require('./use-navbar.cjs');
12
13
 
14
+ const showOnScrollUpVariants = {
15
+ visible: {
16
+ y: 0,
17
+ transition: {
18
+ ease: [0, 0, 0.2, 1]
19
+ }
20
+ },
21
+ hidden: {
22
+ y: "-100%",
23
+ transition: {
24
+ ease: [0, 0, 0.2, 1]
25
+ }
26
+ }
27
+ };
13
28
  const Navbar = utils.forwardRef((props, ref) => {
14
29
  const { children: children$1, ...otherProps } = props;
15
30
  const context = useNavbar.useNavbar({ ...otherProps, ref });
@@ -19,7 +34,16 @@ const Navbar = utils.forwardRef((props, ref) => {
19
34
  /* @__PURE__ */ jsxRuntime.jsx("header", { ...context.getWrapperProps(), children: childrenWithoutMenu }),
20
35
  menu$1
21
36
  ] });
22
- return /* @__PURE__ */ jsxRuntime.jsx(navbarContext.NavbarProvider, { value: context, children: /* @__PURE__ */ jsxRuntime.jsx(reactAria.FocusScope, { contain: context.isMenuOpen, children: /* @__PURE__ */ jsxRuntime.jsx(Component, { ...context.getBaseProps(), children: content }) }) });
37
+ return /* @__PURE__ */ jsxRuntime.jsx(navbarContext.NavbarProvider, { value: context, children: /* @__PURE__ */ jsxRuntime.jsx(reactAria.FocusScope, { contain: context.isMenuOpen, children: context.shouldShowOnScrollUp ? /* @__PURE__ */ jsxRuntime.jsx(react.LazyMotion, { features: react.domAnimation, children: /* @__PURE__ */ jsxRuntime.jsx(
38
+ react.m.nav,
39
+ {
40
+ animate: context.isNavbarHidden ? "hidden" : "visible",
41
+ initial: "visible",
42
+ variants: showOnScrollUpVariants,
43
+ ...reactAria.mergeProps(context.getBaseProps(), context.motionProps),
44
+ children: content
45
+ }
46
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx(Component, { ...context.getBaseProps(), children: content }) }) });
23
47
  });
24
48
  Navbar.displayName = "Navbar";
25
49
 
@@ -6,24 +6,30 @@ var $670gB$react = require('react');
6
6
  var usePreventScroll = require('../node_modules/.pnpm/@react-aria_overlays@3.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@react-aria/overlays/dist/usePreventScroll.cjs');
7
7
  var utils$2 = require('@react-aria/utils');
8
8
  var utils$1 = require('@react-stately/utils');
9
- var useDeepCompare = require('use-deep-compare');
10
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
+ var useScrollPosition = require('../hooks/use-scroll-position.cjs');
11
11
  var utils = require('../system/utils.cjs');
12
12
  var refs = require('../system/react-utils/refs.cjs');
13
13
 
14
+ const NAVBAR_PRESENCE_BUFFER = 10;
14
15
  function useNavbar(originalProps) {
15
16
  const [
16
17
  {
17
18
  ref,
18
19
  as,
20
+ parentRef,
19
21
  height = "4rem",
20
22
  shouldBlockScroll = true,
23
+ shouldShowOnScrollUp = false,
24
+ disableScrollHandler = false,
25
+ onScrollPositionChange,
21
26
  isMenuOpen: isMenuOpenProp,
22
27
  isMenuDefaultOpen,
23
28
  onMenuOpenChange = () => {
24
29
  },
25
30
  className,
26
31
  classNames,
32
+ motionProps,
27
33
  ...otherProps
28
34
  },
29
35
  variantProps
@@ -31,62 +37,62 @@ function useNavbar(originalProps) {
31
37
  const Component = as || "nav";
32
38
  const domRef = refs.useDomRef(ref);
33
39
  const menuRef = $670gB$react.useRef(null);
34
- const prevWidth = $670gB$react.useRef(0);
35
- const navHeight = $670gB$react.useRef(0);
36
40
  const handleMenuOpenChange = $670gB$react.useCallback(
37
41
  (isOpen) => {
38
42
  onMenuOpenChange(isOpen || false);
39
43
  },
40
44
  [onMenuOpenChange]
41
45
  );
46
+ const [menuTopOffset, setMenuOffset] = $670gB$react.useState(0);
47
+ const [isNavbarHidden, setIsNavbarHidden] = $670gB$react.useState(false);
42
48
  const [isMenuOpen, setIsMenuOpen] = utils$1.useControlledState(
43
49
  isMenuOpenProp,
44
50
  isMenuDefaultOpen ?? false,
45
51
  handleMenuOpenChange
46
52
  );
47
- const updateWidth = $670gB$react.useCallback(() => {
48
- if (domRef.current) {
49
- const width = domRef.current.offsetWidth;
50
- if (width !== prevWidth.current) {
51
- prevWidth.current = width;
52
- }
53
- }
54
- }, [domRef]);
55
53
  usePreventScroll.usePreventScroll({
56
54
  isDisabled: !(shouldBlockScroll && isMenuOpen)
57
55
  });
58
56
  utils$2.useResizeObserver({
59
57
  ref: domRef,
60
58
  onResize: () => {
61
- const currentWidth = domRef.current?.offsetWidth;
62
- const scrollWidth = window.innerWidth - document.documentElement.clientWidth;
63
- if (currentWidth && currentWidth + scrollWidth == prevWidth.current) {
64
- return;
65
- }
66
- if (currentWidth !== prevWidth.current) {
67
- updateWidth();
68
- setIsMenuOpen(false);
69
- }
59
+ setMenuOffset(domRef.current?.getBoundingClientRect().top || 0);
70
60
  }
71
61
  });
62
+ const truePosition = variantProps.position ?? "sticky";
63
+ const positionVariantProp = shouldShowOnScrollUp ? "sticky" : truePosition;
64
+ const slots = ouiTheme.navbarStyles({
65
+ ...variantProps,
66
+ position: positionVariantProp
67
+ });
68
+ const baseStyles = ouiTheme.cn(classNames?.base, className);
69
+ const navHeight = $670gB$react.useRef(0);
72
70
  $670gB$react.useEffect(() => {
73
- updateWidth();
74
71
  navHeight.current = domRef.current?.offsetHeight || 0;
75
- }, [domRef, updateWidth]);
76
- const slots = useDeepCompare.useDeepCompareMemo(
77
- () => ouiTheme.navbarStyles({
78
- ...variantProps
79
- }),
80
- [variantProps]
81
- );
82
- const baseStyles = ouiTheme.cn(classNames?.base, className);
72
+ }, [domRef]);
73
+ useScrollPosition.useScrollPosition({
74
+ elementRef: parentRef,
75
+ isEnabled: shouldShowOnScrollUp || !disableScrollHandler,
76
+ callback: ({ prevPos, currPos }) => {
77
+ onScrollPositionChange?.(currPos.y);
78
+ if (shouldShowOnScrollUp) {
79
+ setIsNavbarHidden((prev) => {
80
+ const next = currPos.y > prevPos.y + NAVBAR_PRESENCE_BUFFER && currPos.y > navHeight.current;
81
+ return next !== prev ? next : prev;
82
+ });
83
+ }
84
+ }
85
+ });
86
+ const heightPx = typeof height === "number" ? `${height}px` : height;
87
+ const menuTopOffsetPx = `calc(${heightPx} + ${menuTopOffset}px)`;
83
88
  const getBaseProps = (props = {}) => ({
84
89
  ...utils$2.mergeProps(otherProps, props),
90
+ "data-hidden": ouiTheme.dataAttr(isNavbarHidden),
85
91
  "data-menu-open": ouiTheme.dataAttr(isMenuOpen),
86
92
  ref: domRef,
87
93
  className: slots.base({ class: ouiTheme.cn(baseStyles, props?.className) }),
88
94
  style: {
89
- "--navbar-height": typeof height === "number" ? `${height}px` : height,
95
+ "--navbar-height": heightPx,
90
96
  ...otherProps?.style,
91
97
  ...props?.style
92
98
  }
@@ -102,14 +108,18 @@ function useNavbar(originalProps) {
102
108
  Component,
103
109
  slots,
104
110
  domRef,
105
- height,
111
+ menuTopOffset,
112
+ menuTopOffsetPx,
113
+ isNavbarHidden,
114
+ shouldShowOnScrollUp: shouldShowOnScrollUp && truePosition === "static",
106
115
  isMenuOpen,
107
116
  classNames,
108
117
  setIsMenuOpen,
109
118
  menuRef,
110
119
  getBaseProps,
111
120
  getWrapperProps,
112
- position: variantProps.position ?? "sticky"
121
+ position: positionVariantProp,
122
+ motionProps
113
123
  };
114
124
  }
115
125
 
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var createLucideIcon = require('../createLucideIcon.cjs');
6
+
7
+ /**
8
+ * @license lucide-react v0.475.0 - ISC
9
+ *
10
+ * This source code is licensed under the ISC license.
11
+ * See the LICENSE file in the root directory of this source tree.
12
+ */
13
+
14
+
15
+ const __iconNode = [
16
+ ["path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2", key: "975kel" }],
17
+ ["circle", { cx: "12", cy: "7", r: "4", key: "17ys0d" }]
18
+ ];
19
+ const User = createLucideIcon.default("User", __iconNode);
20
+
21
+ exports.__iconNode = __iconNode;
22
+ exports.default = User;
@@ -5,12 +5,12 @@
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactAriaComponents = require('react-aria-components');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
+ var button = require('../button/button.cjs');
9
+ var field = require('../field/field.cjs');
8
10
  var input = require('../input/input.cjs');
9
11
  var utils = require('../system/utils.cjs');
10
12
  var minus = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/minus.cjs');
11
13
  var plus = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/plus.cjs');
12
- var field = require('../field/field.cjs');
13
- var button = require('../button/button.cjs');
14
14
 
15
15
  function NumberField(originalProps) {
16
16
  const [
@@ -8,12 +8,12 @@ var date = require('@internationalized/date');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var useDeepCompare = require('use-deep-compare');
10
10
  var ouiTheme = require('@opengovsg/oui-theme');
11
+ var calendarStyleContext = require('../calendar/calendar-style-context.cjs');
11
12
  var agnosticCalendarStateContext = require('../calendar/agnostic-calendar-state-context.cjs');
12
13
  var calendarBottomContent = require('../calendar/calendar-bottom-content.cjs');
13
14
  var calendarGridHeader = require('../calendar/calendar-grid-header.cjs');
14
15
  var calendarHeader = require('../calendar/calendar-header.cjs');
15
16
  var utils = require('../system/utils.cjs');
16
- var calendarStyleContext = require('../calendar/calendar-style-context.cjs');
17
17
 
18
18
  const RangeCalendar = utils.forwardRefGeneric(function RangeCalendar2(originalProps, ref) {
19
19
  const [props, variantProps] = utils.mapPropsVariants(
@@ -6,12 +6,12 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var reactAriaComponents = require('react-aria-components');
8
8
  var ouiTheme = require('@opengovsg/oui-theme');
9
+ var button = require('../button/button.cjs');
10
+ var field = require('../field/field.cjs');
9
11
  var popover = require('../popover/popover.cjs');
10
12
  var utils = require('../system/utils.cjs');
11
13
  var selectVariantContext = require('./select-variant-context.cjs');
12
- var field = require('../field/field.cjs');
13
14
  var chevronDown = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs');
14
- var button = require('../button/button.cjs');
15
15
 
16
16
  const calculateEstimatedRowHeight = (size) => {
17
17
  switch (size) {
@@ -6,6 +6,7 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var reactAriaComponents = require('react-aria-components');
8
8
  var ouiTheme = require('@opengovsg/oui-theme');
9
+ var field = require('../field/field.cjs');
9
10
  var input = require('../input/input.cjs');
10
11
  var popover = require('../popover/popover.cjs');
11
12
  var tagFieldItem = require('./tag-field-item.cjs');
@@ -14,7 +15,6 @@ var tagFieldRoot = require('./tag-field-root.cjs');
14
15
  var tagFieldTagList = require('./tag-field-tag-list.cjs');
15
16
  var tagFieldTrigger = require('./tag-field-trigger.cjs');
16
17
  var chevronDown = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs');
17
- var field = require('../field/field.cjs');
18
18
 
19
19
  function TagField({
20
20
  classNames,
@@ -5,8 +5,8 @@
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactAriaComponents = require('react-aria-components');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
- var textArea = require('../text-area/text-area.cjs');
9
8
  var field = require('../field/field.cjs');
9
+ var textArea = require('../text-area/text-area.cjs');
10
10
 
11
11
  function TextAreaField({
12
12
  label,
@@ -5,8 +5,8 @@
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactAriaComponents = require('react-aria-components');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
- var input = require('../input/input.cjs');
9
8
  var field = require('../field/field.cjs');
9
+ var input = require('../input/input.cjs');
10
10
 
11
11
  function TextField({
12
12
  label,
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ import { createContext } from '../system/react-utils/context.js';
3
+
4
+ const [AvatarContext, useAvatarContext] = createContext({
5
+ name: "AvatarContext",
6
+ strict: true
7
+ });
8
+
9
+ export { AvatarContext, useAvatarContext };
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ import { useMemo, cloneElement } from 'react';
3
+ import { avatarGroupStyles, cn } from '@opengovsg/oui-theme';
4
+ import { getValidChildren } from '../system/react-utils/children.js';
5
+ import { createContext } from '../system/react-utils/context.js';
6
+ import { useDomRef } from '../system/react-utils/refs.js';
7
+
8
+ const [AvatarGroupProvider, useAvatarGroupContext] = createContext({
9
+ name: "AvatarGroupContext",
10
+ strict: false
11
+ });
12
+ function useAvatarGroup(props = {}) {
13
+ const {
14
+ as,
15
+ ref,
16
+ max = 5,
17
+ total,
18
+ size,
19
+ color,
20
+ prominence,
21
+ radius,
22
+ children,
23
+ renderCount,
24
+ className,
25
+ classNames,
26
+ countProps,
27
+ ...otherProps
28
+ } = props;
29
+ const domRef = useDomRef(ref);
30
+ const Component = as || "div";
31
+ const context = useMemo(
32
+ () => ({
33
+ size,
34
+ color,
35
+ radius,
36
+ prominence
37
+ }),
38
+ [size, color, radius, prominence]
39
+ );
40
+ const slots = useMemo(
41
+ () => avatarGroupStyles({ className: className ?? classNames?.base }),
42
+ [className, classNames?.base]
43
+ );
44
+ const validChildren = getValidChildren(children);
45
+ const childrenWithinMax = max ? validChildren.slice(0, max) : validChildren;
46
+ const remainingCount = total ? total : max != null ? validChildren.length - max : -1;
47
+ const clones = childrenWithinMax.map((child, index) => {
48
+ return cloneElement(child, {
49
+ // @ts-expect-error: CSS variable is not recognized as a valid style property
50
+ style: {
51
+ "--avatar-zindex": childrenWithinMax.length - index
52
+ }
53
+ });
54
+ });
55
+ const getAvatarGroupProps = () => {
56
+ return {
57
+ ref: domRef,
58
+ className: slots.base({
59
+ class: cn(classNames?.base, className)
60
+ }),
61
+ role: "group",
62
+ ...otherProps
63
+ };
64
+ };
65
+ const getAvatarGroupCountProps = () => {
66
+ return {
67
+ className: slots.counter({
68
+ class: classNames?.counter
69
+ }),
70
+ ...countProps
71
+ };
72
+ };
73
+ return {
74
+ Component,
75
+ context,
76
+ remainingCount,
77
+ clones,
78
+ renderCount,
79
+ getAvatarGroupProps,
80
+ getAvatarGroupCountProps
81
+ };
82
+ }
83
+
84
+ export { AvatarGroupProvider, useAvatarGroup, useAvatarGroupContext };