@bspk/ui 1.3.9 → 1.3.10

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 (129) hide show
  1. package/dist/components/BannerAlert/BannerAlert.d.ts +5 -5
  2. package/dist/components/BannerAlert/BannerAlert.js +5 -5
  3. package/dist/components/Breadcrumb/BreadcrumbDropdown.d.ts +6 -0
  4. package/dist/components/Breadcrumb/BreadcrumbDropdown.js +6 -0
  5. package/dist/components/Breadcrumb/BreadcrumbDropdown.js.map +1 -1
  6. package/dist/components/CheckboxGroup/CheckboxGroupExample.js +1 -0
  7. package/dist/components/CheckboxGroup/CheckboxGroupExample.js.map +1 -1
  8. package/dist/components/Drawer/Drawer.js.map +1 -1
  9. package/dist/components/Field/FieldDescription.d.ts +7 -5
  10. package/dist/components/Field/FieldDescription.js +7 -3
  11. package/dist/components/Field/FieldDescription.js.map +1 -1
  12. package/dist/components/Field/FieldError.d.ts +6 -0
  13. package/dist/components/Field/FieldError.js +6 -0
  14. package/dist/components/Field/FieldError.js.map +1 -1
  15. package/dist/components/Field/FieldLabel.d.ts +6 -0
  16. package/dist/components/Field/FieldLabel.js +6 -0
  17. package/dist/components/Field/FieldLabel.js.map +1 -1
  18. package/dist/components/Field/utils.d.ts +5 -0
  19. package/dist/components/Field/utils.js +5 -0
  20. package/dist/components/Field/utils.js.map +1 -1
  21. package/dist/components/InlineAlert/SvgWarningTwoTone.d.ts +6 -0
  22. package/dist/components/InlineAlert/SvgWarningTwoTone.js +6 -0
  23. package/dist/components/InlineAlert/SvgWarningTwoTone.js.map +1 -1
  24. package/dist/components/InputNumber/IncrementButton.d.ts +13 -3
  25. package/dist/components/InputNumber/IncrementButton.js +11 -4
  26. package/dist/components/InputNumber/IncrementButton.js.map +1 -1
  27. package/dist/components/InputNumber/InputNumber.js +26 -10
  28. package/dist/components/InputNumber/InputNumber.js.map +1 -1
  29. package/dist/components/InputNumber/InputNumberExample.js +1 -0
  30. package/dist/components/InputNumber/InputNumberExample.js.map +1 -1
  31. package/dist/components/InputNumber/input-number.css +6 -0
  32. package/dist/components/InputNumber/input-number.css.js +6 -0
  33. package/dist/components/Link/Link.d.ts +1 -1
  34. package/dist/components/Link/Link.js +1 -1
  35. package/dist/components/OTPInput/OTPInput.d.ts +5 -1
  36. package/dist/components/OTPInput/OTPInput.js +5 -1
  37. package/dist/components/OTPInput/OTPInput.js.map +1 -1
  38. package/dist/components/Pagination/PageList.d.ts +6 -0
  39. package/dist/components/Pagination/PageList.js +6 -0
  40. package/dist/components/Pagination/PageList.js.map +1 -1
  41. package/dist/components/Scrim/Scrim.d.ts +0 -1
  42. package/dist/components/Scrim/Scrim.js +0 -1
  43. package/dist/components/Scrim/Scrim.js.map +1 -1
  44. package/dist/components/Select/Select.d.ts +11 -11
  45. package/dist/components/Select/Select.js +11 -11
  46. package/dist/components/Skeleton/Circular.d.ts +6 -0
  47. package/dist/components/Skeleton/Circular.js +6 -0
  48. package/dist/components/Skeleton/Circular.js.map +1 -1
  49. package/dist/components/Skeleton/Photo.d.ts +6 -0
  50. package/dist/components/Skeleton/Photo.js +6 -0
  51. package/dist/components/Skeleton/Photo.js.map +1 -1
  52. package/dist/components/Skeleton/Profile.d.ts +6 -0
  53. package/dist/components/Skeleton/Profile.js +6 -0
  54. package/dist/components/Skeleton/Profile.js.map +1 -1
  55. package/dist/components/Skeleton/Rectangular.d.ts +6 -0
  56. package/dist/components/Skeleton/Rectangular.js +6 -0
  57. package/dist/components/Skeleton/Rectangular.js.map +1 -1
  58. package/dist/components/Skeleton/Thumbnail.d.ts +6 -0
  59. package/dist/components/Skeleton/Thumbnail.js +6 -0
  60. package/dist/components/Skeleton/Thumbnail.js.map +1 -1
  61. package/dist/components/Slider/SliderIntervalDots.d.ts +6 -0
  62. package/dist/components/Slider/SliderIntervalDots.js +6 -0
  63. package/dist/components/Slider/SliderIntervalDots.js.map +1 -1
  64. package/dist/components/Snackbar/Manager.d.ts +0 -1
  65. package/dist/components/Snackbar/Manager.js +0 -1
  66. package/dist/components/Snackbar/Manager.js.map +1 -1
  67. package/dist/components/Snackbar/Snackbar.d.ts +0 -1
  68. package/dist/components/Snackbar/Snackbar.js +0 -1
  69. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  70. package/dist/components/TabList/TabList.js +1 -2
  71. package/dist/components/TabList/TabList.js.map +1 -1
  72. package/dist/components/Table/Footer.d.ts +6 -0
  73. package/dist/components/Table/Footer.js +6 -0
  74. package/dist/components/Table/Footer.js.map +1 -1
  75. package/dist/components/TimePicker/Listbox.d.ts +6 -0
  76. package/dist/components/TimePicker/Listbox.js +6 -0
  77. package/dist/components/TimePicker/Listbox.js.map +1 -1
  78. package/dist/components/TimePicker/Segment.d.ts +6 -0
  79. package/dist/components/TimePicker/Segment.js +6 -0
  80. package/dist/components/TimePicker/Segment.js.map +1 -1
  81. package/dist/components/Truncated/Truncated.d.ts +0 -1
  82. package/dist/components/Truncated/Truncated.js +1 -2
  83. package/dist/components/Truncated/Truncated.js.map +1 -1
  84. package/dist/components/UIProvider/UIProvider.d.ts +0 -1
  85. package/dist/components/UIProvider/UIProvider.js +0 -1
  86. package/dist/components/UIProvider/UIProvider.js.map +1 -1
  87. package/dist/hooks/useLongPress.d.ts +30 -15
  88. package/dist/hooks/useLongPress.js +26 -42
  89. package/dist/hooks/useLongPress.js.map +1 -1
  90. package/dist/styles/base.css +9 -0
  91. package/dist/styles/base.css.js +9 -0
  92. package/package.json +1 -1
  93. package/src/components/BannerAlert/BannerAlert.tsx +5 -5
  94. package/src/components/Breadcrumb/BreadcrumbDropdown.tsx +6 -0
  95. package/src/components/CheckboxGroup/CheckboxGroupExample.tsx +1 -0
  96. package/src/components/Drawer/Drawer.tsx +0 -1
  97. package/src/components/Field/FieldDescription.tsx +7 -5
  98. package/src/components/Field/FieldError.tsx +6 -0
  99. package/src/components/Field/FieldLabel.tsx +6 -0
  100. package/src/components/Field/utils.ts +5 -0
  101. package/src/components/InlineAlert/SvgWarningTwoTone.tsx +6 -0
  102. package/src/components/InputNumber/IncrementButton.tsx +21 -11
  103. package/src/components/InputNumber/InputNumber.tsx +33 -31
  104. package/src/components/InputNumber/InputNumberExample.tsx +1 -0
  105. package/src/components/InputNumber/input-number.scss +10 -0
  106. package/src/components/Link/Link.tsx +1 -1
  107. package/src/components/OTPInput/OTPInput.tsx +5 -1
  108. package/src/components/Pagination/PageList.tsx +6 -0
  109. package/src/components/Scrim/Scrim.tsx +0 -1
  110. package/src/components/Select/Select.tsx +11 -11
  111. package/src/components/Skeleton/Circular.tsx +6 -0
  112. package/src/components/Skeleton/Photo.tsx +6 -0
  113. package/src/components/Skeleton/Profile.tsx +6 -0
  114. package/src/components/Skeleton/Rectangular.tsx +6 -0
  115. package/src/components/Skeleton/Thumbnail.tsx +6 -0
  116. package/src/components/Slider/SliderIntervalDots.tsx +6 -0
  117. package/src/components/Snackbar/Manager.tsx +0 -1
  118. package/src/components/Snackbar/Snackbar.tsx +0 -1
  119. package/src/components/TabList/TabList.tsx +1 -2
  120. package/src/components/Table/Footer.tsx +6 -0
  121. package/src/components/TimePicker/Listbox.tsx +6 -0
  122. package/src/components/TimePicker/Segment.tsx +6 -0
  123. package/src/components/Truncated/Truncated.tsx +1 -2
  124. package/src/components/UIProvider/UIProvider.tsx +0 -1
  125. package/src/hooks/useLongPress.ts +58 -48
  126. package/src/styles/base.scss +9 -0
  127. package/dist/components/Truncated/truncated.css +0 -8
  128. package/dist/components/Truncated/truncated.css.js +0 -13
  129. package/src/components/Truncated/truncated.scss +0 -8
@@ -2,7 +2,6 @@ import './tab-list.scss';
2
2
  import { Fragment, ReactNode, useMemo } from 'react';
3
3
  import { Badge, BadgeProps } from '-/components/Badge';
4
4
  import { Tooltip } from '-/components/Tooltip';
5
- import { Truncated } from '-/components/Truncated';
6
5
  import { useArrowNavigation } from '-/hooks/useArrowNavigation';
7
6
  import { useId } from '-/hooks/useId';
8
7
  import { ElementProps } from '-/types/common';
@@ -238,7 +237,7 @@ export function TabList({
238
237
  tabIndex={focusableOption.id === item.id ? 0 : -1}
239
238
  >
240
239
  {icon && <span aria-hidden="true">{icon}</span>}
241
- {!iconsOnly && <Truncated data-label>{item.label}</Truncated>}
240
+ {!iconsOnly && <span data-label>{item.label}</span>}
242
241
  {item.badge && !item.disabled && (
243
242
  <Badge count={item.badge} size={TAB_BADGE_SIZES[size]} />
244
243
  )}
@@ -1,5 +1,11 @@
1
1
  import { Pagination } from '-/components/Pagination';
2
2
 
3
+ /**
4
+ * TableFooter component displays pagination controls and information for a table.
5
+ *
6
+ * @name TableFooter
7
+ * @parent Table
8
+ */
3
9
  export function TableFooter({
4
10
  pageIndex,
5
11
  pageSize,
@@ -17,6 +17,12 @@ export type TimePickerListboxProps = {
17
17
  onTab?: (e: React.KeyboardEvent) => void;
18
18
  };
19
19
 
20
+ /**
21
+ * TimePickerListbox component displays a listbox for selecting time values.
22
+ *
23
+ * @name TimePickerListbox
24
+ * @parent TimePicker
25
+ */
20
26
  export function TimePickerListbox({ options, selectedValue, type: kind, onSelect, onTab }: TimePickerListboxProps) {
21
27
  const { activeElementId, arrowKeyCallbacks } = useArrowNavigation({
22
28
  ids: options.map((option) => option.id),
@@ -19,6 +19,12 @@ export type TimePickerSegmentProps<T extends string> = {
19
19
  setRef?: (element: HTMLElement | null) => void;
20
20
  };
21
21
 
22
+ /**
23
+ * TimePickerSegment component displays an individual segment of a time picker (hours, minutes, or meridiem).
24
+ *
25
+ * @name TimePickerSegment
26
+ * @parent TimePicker
27
+ */
22
28
  export function TimePickerSegment<T extends string>({
23
29
  disabled,
24
30
  name,
@@ -1,4 +1,3 @@
1
- import './truncated.scss';
2
1
  import { ElementType } from 'react';
3
2
  import { Tooltip, TooltipTriggerProps } from '-/components/Tooltip';
4
3
  import { useTruncatedText } from '-/hooks/useTruncatedText';
@@ -45,7 +44,7 @@ export function Truncated<As extends ElementType = ElementType>({
45
44
  const span = (triggerProps: TooltipTriggerProps) => (
46
45
  <span
47
46
  {...props}
48
- data-bspk-utility="truncated"
47
+ data-truncated
49
48
  ref={(node) => setElement(node)}
50
49
  {...triggerProps}
51
50
  role={isTruncated ? 'note' : props.role}
@@ -22,7 +22,6 @@ export type UIProviderProps = {
22
22
  * This provider should wrap the root of your application to ensure that all components have access to the UI context.
23
23
  *
24
24
  * @name UIProvider
25
- *
26
25
  * @phase Utility
27
26
  */
28
27
  export function UIProvider({ children }: UIProviderProps) {
@@ -1,57 +1,67 @@
1
- import { useRef, useState, MouseEvent } from 'react';
2
-
1
+ import { useRef } from 'react';
3
2
  import { useTimeout } from './useTimeout';
4
3
 
5
- export const MIN_INTERVAL = 250; // Minimum interval in milliseconds
6
- export const INTERVAL_DECREASE_FACTOR = 0.75; // Percent by which the interval decreases each time
7
- export const INITIAL_INTERVAL = 1000; // Initial interval in milliseconds
8
-
9
- const isTriggerElementDisabled = (element: HTMLElement | null) =>
10
- !element ||
11
- (element as HTMLButtonElement).disabled ||
12
- element.getAttribute('disabled') === 'true' ||
13
- element.getAttribute('aria-disabled') === 'true' ||
14
- element.getAttribute('data-disabled') === 'true' ||
15
- !element.isConnected ||
16
- !element.offsetParent;
4
+ export type LongPressProps = {
5
+ /** The callback to be invoked on long press. If false is returned, the repeating will stop. */
6
+ callback: () => boolean;
7
+ /**
8
+ * The initial delay (in ms) before repeating starts. Default is 750ms.
9
+ *
10
+ * @default 750
11
+ */
12
+ delay?: number;
13
+ /**
14
+ * The amount (in percent) to decrement the delay after each repeat. Default is 15%.
15
+ *
16
+ * @default 15
17
+ */
18
+ delayDecrement?: number;
19
+ /**
20
+ * The minimum delay (in ms) between repeats. Default is 100ms.
21
+ *
22
+ * @default 100
23
+ */
24
+ delayMin?: number;
25
+ };
17
26
 
18
- export function useLongPress(callback: () => void, disabled: boolean) {
27
+ /**
28
+ * A hook that provides long press functionality. The provided callback will be invoked once immediately on press, and
29
+ * then repeatedly after a delay, with the delay decreasing by a specified amount after each repeat.
30
+ */
31
+ export function useLongPress({
32
+ callback,
33
+ delay: initialDelay = 750,
34
+ delayDecrement = 15,
35
+ delayMin = 100,
36
+ }: LongPressProps) {
19
37
  const timeout = useTimeout();
20
- const intervalRef = useRef(INITIAL_INTERVAL);
21
-
22
- const [triggerElement, setTriggerElement] = useState<HTMLButtonElement | null>(null);
23
-
24
- if (disabled)
25
- return {
26
- onMouseDown: () => {},
27
- onMouseUp: () => {},
28
- setTriggerElement: () => {},
29
- };
30
-
31
- const run = () => {
32
- // If the element is not connected or disabled, clear the timeout, and prevent the callback
33
- if (isTriggerElementDisabled(triggerElement)) return;
34
- callback();
35
- // Decrease the interval for the next call, but not below MIN_INTERVAL
36
- if (intervalRef.current > MIN_INTERVAL) intervalRef.current = intervalRef.current * INTERVAL_DECREASE_FACTOR;
37
- timeout.set(run, intervalRef.current);
38
+ const isPressing = useRef(false);
39
+ const delay = useRef(initialDelay);
40
+
41
+ const setPressing = (pressing: boolean) => {
42
+ isPressing.current = pressing;
43
+
44
+ if (pressing) {
45
+ if (!callback()) return setPressing(false);
46
+
47
+ timeout.set(() => {
48
+ if (!isPressing.current) return setPressing(false);
49
+
50
+ const decrementMs = (delay.current * delayDecrement) / 100;
51
+ delay.current = delay.current <= delayMin ? delayMin : delay.current - decrementMs;
52
+
53
+ setPressing(true);
54
+ }, delay.current);
55
+ return;
56
+ }
57
+
58
+ delay.current = initialDelay;
59
+ timeout.clear();
38
60
  };
39
61
 
40
62
  return {
41
- onMouseDown: (event: MouseEvent) => {
42
- event.preventDefault();
43
- intervalRef.current = INITIAL_INTERVAL;
44
- callback();
45
- timeout.set(run, intervalRef.current);
46
- },
47
- onMouseUp: () => {
48
- timeout.clear();
49
- },
50
- onMouseLeave: () => {
51
- timeout.clear();
52
- },
53
- setTriggerElement,
63
+ onPointerDown: () => setPressing(true),
64
+ onPointerLeave: () => setPressing(false),
65
+ onPointerUp: () => setPressing(false),
54
66
  };
55
67
  }
56
-
57
- /** Copyright 2025 Anywhere Real Estate - CC BY 4.0 */
@@ -179,6 +179,15 @@ body[data-bspk] {
179
179
  left: auto;
180
180
  }
181
181
 
182
+ [data-truncated] {
183
+ max-width: 100%;
184
+ display: inline-block;
185
+ overflow: hidden;
186
+ text-overflow: ellipsis;
187
+ white-space: nowrap;
188
+ background-color: transparent;
189
+ }
190
+
182
191
  [data-sr-only] {
183
192
  height: 1px;
184
193
  overflow: hidden;
@@ -1,8 +0,0 @@
1
- [data-bspk-utility=truncated] {
2
- max-width: 100%;
3
- display: inline-block;
4
- overflow: hidden;
5
- text-overflow: ellipsis;
6
- white-space: nowrap;
7
- background-color: transparent;
8
- }
@@ -1,13 +0,0 @@
1
- /** * This file is generated by the build script.
2
- * Do not edit this file directly. */
3
- const style = document.createElement('style');
4
- style.appendChild(document.createTextNode(`[data-bspk-utility=truncated] {
5
- max-width: 100%;
6
- display: inline-block;
7
- overflow: hidden;
8
- text-overflow: ellipsis;
9
- white-space: nowrap;
10
- background-color: transparent;
11
- }
12
- `));
13
- document.head.appendChild(style);
@@ -1,8 +0,0 @@
1
- [data-bspk-utility='truncated'] {
2
- max-width: 100%;
3
- display: inline-block;
4
- overflow: hidden;
5
- text-overflow: ellipsis;
6
- white-space: nowrap;
7
- background-color: transparent;
8
- }