@oxy.so/bloom 4.22.1 → 4.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/docs/composer-panel.mdx +10 -0
  2. package/docs/sidebar.mdx +2 -2
  3. package/lib/commonjs/chat-composer/ChatComposer.js +10 -12
  4. package/lib/commonjs/chat-composer/ChatComposer.js.map +1 -1
  5. package/lib/commonjs/composer-panel/ComposerPanelBase.js +9 -11
  6. package/lib/commonjs/composer-panel/ComposerPanelBase.js.map +1 -1
  7. package/lib/commonjs/composer-panel/ComposerPillBase.js +24 -2
  8. package/lib/commonjs/composer-panel/ComposerPillBase.js.map +1 -1
  9. package/lib/commonjs/hooks/use-textarea-autosize.js +103 -0
  10. package/lib/commonjs/hooks/use-textarea-autosize.js.map +1 -0
  11. package/lib/commonjs/sidebar/Sidebar.js +17 -6
  12. package/lib/commonjs/sidebar/Sidebar.js.map +1 -1
  13. package/lib/commonjs/sidebar/SidebarItem.js +28 -3
  14. package/lib/commonjs/sidebar/SidebarItem.js.map +1 -1
  15. package/lib/module/chat-composer/ChatComposer.js +11 -13
  16. package/lib/module/chat-composer/ChatComposer.js.map +1 -1
  17. package/lib/module/composer-panel/ComposerPanelBase.js +10 -12
  18. package/lib/module/composer-panel/ComposerPanelBase.js.map +1 -1
  19. package/lib/module/composer-panel/ComposerPillBase.js +24 -2
  20. package/lib/module/composer-panel/ComposerPillBase.js.map +1 -1
  21. package/lib/module/hooks/use-textarea-autosize.js +98 -0
  22. package/lib/module/hooks/use-textarea-autosize.js.map +1 -0
  23. package/lib/module/sidebar/Sidebar.js +17 -6
  24. package/lib/module/sidebar/Sidebar.js.map +1 -1
  25. package/lib/module/sidebar/SidebarItem.js +28 -3
  26. package/lib/module/sidebar/SidebarItem.js.map +1 -1
  27. package/lib/typescript/commonjs/chat-composer/ChatComposer.d.ts.map +1 -1
  28. package/lib/typescript/commonjs/composer-panel/ComposerPanelBase.d.ts.map +1 -1
  29. package/lib/typescript/commonjs/composer-panel/ComposerPillBase.d.ts.map +1 -1
  30. package/lib/typescript/commonjs/hooks/use-textarea-autosize.d.ts +61 -0
  31. package/lib/typescript/commonjs/hooks/use-textarea-autosize.d.ts.map +1 -0
  32. package/lib/typescript/commonjs/sidebar/Sidebar.d.ts.map +1 -1
  33. package/lib/typescript/commonjs/sidebar/SidebarItem.d.ts.map +1 -1
  34. package/lib/typescript/commonjs/sidebar/types.d.ts +7 -0
  35. package/lib/typescript/commonjs/sidebar/types.d.ts.map +1 -1
  36. package/lib/typescript/module/chat-composer/ChatComposer.d.ts.map +1 -1
  37. package/lib/typescript/module/composer-panel/ComposerPanelBase.d.ts.map +1 -1
  38. package/lib/typescript/module/composer-panel/ComposerPillBase.d.ts.map +1 -1
  39. package/lib/typescript/module/hooks/use-textarea-autosize.d.ts +61 -0
  40. package/lib/typescript/module/hooks/use-textarea-autosize.d.ts.map +1 -0
  41. package/lib/typescript/module/sidebar/Sidebar.d.ts.map +1 -1
  42. package/lib/typescript/module/sidebar/SidebarItem.d.ts.map +1 -1
  43. package/lib/typescript/module/sidebar/types.d.ts +7 -0
  44. package/lib/typescript/module/sidebar/types.d.ts.map +1 -1
  45. package/package.json +1 -1
  46. package/src/chat-composer/ChatComposer.tsx +11 -13
  47. package/src/composer-panel/ComposerPanelBase.tsx +10 -12
  48. package/src/composer-panel/ComposerPillBase.tsx +28 -2
  49. package/src/hooks/use-textarea-autosize.ts +106 -0
  50. package/src/sidebar/Sidebar.tsx +9 -5
  51. package/src/sidebar/SidebarItem.tsx +23 -3
  52. package/src/sidebar/types.ts +7 -0
@@ -24,7 +24,9 @@ import type { SidebarItemProps } from './types';
24
24
  * gradient, ring or top highlight
25
25
  *
26
26
  * The label and badge sit in collapse slots, so the icon stays pinned while the
27
- * rail morphs. With `href` the row is a link (a real anchor on web).
27
+ * rail morphs. Collapsed, the badge (or `collapsedBadge`) fades in off the
28
+ * square's top-end corner instead, so the count survives the collapse. With
29
+ * `href` the row is a link (a real anchor on web).
28
30
  */
29
31
  const AnimatedPressable = Animated.createAnimatedComponent(Pressable);
30
32
 
@@ -34,6 +36,7 @@ const SidebarItemComponent: React.FC<SidebarItemProps> = ({
34
36
  size,
35
37
  href,
36
38
  badge,
39
+ collapsedBadge,
37
40
  selected = false,
38
41
  collapsed = false,
39
42
  onPress,
@@ -54,13 +57,16 @@ const SidebarItemComponent: React.FC<SidebarItemProps> = ({
54
57
  }, [progress, lane, metrics.row.square]);
55
58
  const itemGap = metrics.row.gap;
56
59
  const contentStyle = useAnimatedStyle(() => ({ gap: itemGap * (1 - progress.value) }), [progress, itemGap]);
60
+ const collapsedBadgeStyle = useAnimatedStyle(() => ({ opacity: progress.value }), [progress]);
57
61
  const foreground = selected ? palette.selectedForeground : palette.textSecondary;
58
62
 
59
63
  const rowStyle: WebCssStyle = {
60
64
  flexDirection: 'row',
61
65
  alignItems: 'center',
62
66
  justifyContent: 'space-between',
63
- overflow: 'hidden',
67
+ // Not clipped: the collapsed badge hangs off the square's top-end corner.
68
+ // The content clips itself instead, so the label can't spill mid-morph.
69
+ overflow: 'visible',
64
70
  height: metrics.row.square,
65
71
  paddingLeft: metrics.row.padding,
66
72
  paddingRight: metrics.row.padding,
@@ -103,7 +109,7 @@ const SidebarItemComponent: React.FC<SidebarItemProps> = ({
103
109
  style={[rowStyle, horizontalInset, style]}
104
110
  testID={testID}
105
111
  >
106
- <Animated.View style={[{ flexDirection: 'row', alignItems: 'center', minWidth: 0, flexShrink: 1 }, contentStyle]}>
112
+ <Animated.View style={[{ flexDirection: 'row', alignItems: 'center', minWidth: 0, flexShrink: 1, overflow: 'hidden' }, contentStyle]}>
107
113
  <View style={{ flexShrink: 0 }}>
108
114
  <Icon width={metrics.row.icon} height={metrics.row.icon} fill={foreground} />
109
115
  </View>
@@ -114,6 +120,20 @@ const SidebarItemComponent: React.FC<SidebarItemProps> = ({
114
120
  </Collapsible>
115
121
  </Animated.View>
116
122
  {badge != null ? <Collapsible collapsed={collapsed}>{badge}</Collapsible> : null}
123
+ {badge != null || collapsedBadge != null ? (
124
+ // Hangs off the square's top-end corner, over the icon's edge. The
125
+ // expanded slot already carries the count to assistive tech.
126
+ <Animated.View
127
+ pointerEvents="none"
128
+ aria-hidden
129
+ accessibilityElementsHidden
130
+ importantForAccessibility="no-hide-descendants"
131
+ style={[{ position: 'absolute', top: -4, insetInlineEnd: -6 }, collapsedBadgeStyle]}
132
+ testID={testID ? `${testID}-collapsed-badge` : undefined}
133
+ >
134
+ {collapsedBadge ?? badge}
135
+ </Animated.View>
136
+ ) : null}
117
137
  </AnimatedPressable>
118
138
  );
119
139
  };
@@ -70,7 +70,14 @@ export interface SidebarItemProps {
70
70
  */
71
71
  size?: SidebarSize;
72
72
  href?: string;
73
+ /** Sits at the row's end while expanded; over the icon's top-end corner while collapsed. */
73
74
  badge?: ReactNode;
75
+ /**
76
+ * The badge shown over the icon while collapsed, when it should differ from
77
+ * `badge` — e.g. a capped count (`max={99}`) that fits the square. Defaults
78
+ * to `badge`.
79
+ */
80
+ collapsedBadge?: ReactNode;
74
81
  selected?: boolean;
75
82
  /** Icon-only square matching the sidebar size (40px for md). */
76
83
  collapsed?: boolean;