panelui-native 0.9.0 → 0.13.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 (106) hide show
  1. package/README.md +5 -3
  2. package/lib/module/components/bottom-sheet/index.js +38 -2
  3. package/lib/module/components/bottom-sheet/index.js.map +1 -1
  4. package/lib/module/components/button/index.js +19 -1
  5. package/lib/module/components/button/index.js.map +1 -1
  6. package/lib/module/components/frame/index.js +128 -15
  7. package/lib/module/components/frame/index.js.map +1 -1
  8. package/lib/module/components/input/index.js +107 -15
  9. package/lib/module/components/input/index.js.map +1 -1
  10. package/lib/module/components/popover/index.js +22 -11
  11. package/lib/module/components/popover/index.js.map +1 -1
  12. package/lib/module/components/progress/index.js +52 -2
  13. package/lib/module/components/progress/index.js.map +1 -1
  14. package/lib/module/components/radio-group/index.js +34 -7
  15. package/lib/module/components/radio-group/index.js.map +1 -1
  16. package/lib/module/components/section-rail/index.js +355 -0
  17. package/lib/module/components/section-rail/index.js.map +1 -0
  18. package/lib/module/components/select/index.js +245 -56
  19. package/lib/module/components/select/index.js.map +1 -1
  20. package/lib/module/components/slider/index.js +355 -0
  21. package/lib/module/components/slider/index.js.map +1 -0
  22. package/lib/module/components/switch/index.js +10 -1
  23. package/lib/module/components/switch/index.js.map +1 -1
  24. package/lib/module/components/tabs/index.js +186 -16
  25. package/lib/module/components/tabs/index.js.map +1 -1
  26. package/lib/module/components/toggle-button/index.js +297 -0
  27. package/lib/module/components/toggle-button/index.js.map +1 -0
  28. package/lib/module/hooks/index.js +1 -0
  29. package/lib/module/hooks/index.js.map +1 -1
  30. package/lib/module/hooks/use-keyboard-avoidance.js +57 -8
  31. package/lib/module/hooks/use-keyboard-avoidance.js.map +1 -1
  32. package/lib/module/hooks/use-scroll-sections.js +89 -0
  33. package/lib/module/hooks/use-scroll-sections.js.map +1 -0
  34. package/lib/module/index.js +4 -1
  35. package/lib/module/index.js.map +1 -1
  36. package/lib/module/native/index.js.map +1 -1
  37. package/lib/module/primitives/keyboard-avoider.js +2 -0
  38. package/lib/module/primitives/keyboard-avoider.js.map +1 -1
  39. package/lib/module/utils/haptics.js +57 -0
  40. package/lib/module/utils/haptics.js.map +1 -0
  41. package/lib/typescript/src/components/bottom-sheet/index.d.ts.map +1 -1
  42. package/lib/typescript/src/components/button/index.d.ts +9 -4
  43. package/lib/typescript/src/components/button/index.d.ts.map +1 -1
  44. package/lib/typescript/src/components/frame/index.d.ts +47 -7
  45. package/lib/typescript/src/components/frame/index.d.ts.map +1 -1
  46. package/lib/typescript/src/components/input/index.d.ts +113 -2
  47. package/lib/typescript/src/components/input/index.d.ts.map +1 -1
  48. package/lib/typescript/src/components/popover/index.d.ts +7 -1
  49. package/lib/typescript/src/components/popover/index.d.ts.map +1 -1
  50. package/lib/typescript/src/components/progress/index.d.ts +33 -0
  51. package/lib/typescript/src/components/progress/index.d.ts.map +1 -1
  52. package/lib/typescript/src/components/radio-group/index.d.ts +7 -0
  53. package/lib/typescript/src/components/radio-group/index.d.ts.map +1 -1
  54. package/lib/typescript/src/components/section-rail/index.d.ts +115 -0
  55. package/lib/typescript/src/components/section-rail/index.d.ts.map +1 -0
  56. package/lib/typescript/src/components/select/index.d.ts +46 -7
  57. package/lib/typescript/src/components/select/index.d.ts.map +1 -1
  58. package/lib/typescript/src/components/slider/index.d.ts +203 -0
  59. package/lib/typescript/src/components/slider/index.d.ts.map +1 -0
  60. package/lib/typescript/src/components/switch/index.d.ts.map +1 -1
  61. package/lib/typescript/src/components/tabs/index.d.ts +46 -4
  62. package/lib/typescript/src/components/tabs/index.d.ts.map +1 -1
  63. package/lib/typescript/src/components/toggle-button/index.d.ts +244 -0
  64. package/lib/typescript/src/components/toggle-button/index.d.ts.map +1 -0
  65. package/lib/typescript/src/hooks/index.d.ts +1 -0
  66. package/lib/typescript/src/hooks/index.d.ts.map +1 -1
  67. package/lib/typescript/src/hooks/use-keyboard-avoidance.d.ts +10 -1
  68. package/lib/typescript/src/hooks/use-keyboard-avoidance.d.ts.map +1 -1
  69. package/lib/typescript/src/hooks/use-scroll-sections.d.ts +31 -0
  70. package/lib/typescript/src/hooks/use-scroll-sections.d.ts.map +1 -0
  71. package/lib/typescript/src/index.d.ts +6 -3
  72. package/lib/typescript/src/index.d.ts.map +1 -1
  73. package/lib/typescript/src/native/index.d.ts +16 -1
  74. package/lib/typescript/src/native/index.d.ts.map +1 -1
  75. package/lib/typescript/src/primitives/keyboard-avoider.d.ts +8 -1
  76. package/lib/typescript/src/primitives/keyboard-avoider.d.ts.map +1 -1
  77. package/lib/typescript/src/utils/haptics.d.ts +12 -0
  78. package/lib/typescript/src/utils/haptics.d.ts.map +1 -0
  79. package/package.json +5 -1
  80. package/src/components/bottom-sheet/index.tsx +38 -2
  81. package/src/components/button/index.tsx +26 -5
  82. package/src/components/chip/index.tsx +333 -0
  83. package/src/components/frame/index.tsx +175 -29
  84. package/src/components/input/index.tsx +122 -16
  85. package/src/components/popover/index.tsx +49 -24
  86. package/src/components/progress/index.tsx +81 -1
  87. package/src/components/radio-group/index.tsx +55 -8
  88. package/src/components/section-rail/index.tsx +459 -0
  89. package/src/components/select/index.tsx +265 -52
  90. package/src/components/slider/index.tsx +371 -0
  91. package/src/components/switch/index.tsx +8 -1
  92. package/src/components/tabs/index.tsx +208 -28
  93. package/src/components/toggle-button/index.tsx +396 -0
  94. package/src/hooks/index.ts +5 -0
  95. package/src/hooks/use-keyboard-avoidance.ts +73 -7
  96. package/src/hooks/use-scroll-sections.ts +127 -0
  97. package/src/index.ts +45 -6
  98. package/src/native/index.ts +13 -1
  99. package/src/primitives/keyboard-avoider.tsx +9 -1
  100. package/src/utils/haptics.ts +63 -0
  101. package/theme.css +6 -2
  102. package/lib/module/components/inline-select/index.js +0 -284
  103. package/lib/module/components/inline-select/index.js.map +0 -1
  104. package/lib/typescript/src/components/inline-select/index.d.ts +0 -48
  105. package/lib/typescript/src/components/inline-select/index.d.ts.map +0 -1
  106. package/src/components/inline-select/index.tsx +0 -332
package/README.md CHANGED
@@ -101,20 +101,22 @@ overlays, and the toast viewport.
101
101
  | `Dialog` | Modal dialog with backdrop, title, description and footer actions |
102
102
  | `EmptyState` | Placeholder for an empty list or screen, with a stacked-icon media slot |
103
103
  | `Frame` | Widget shell — header row with action, inset panel of rows, caption footer |
104
- | `InlineSelect` | Picker that expands its options in place |
105
104
  | `Input` | Text field with label, description and error message |
106
105
  | `InputGroup` | Input with leading and trailing decorators, auto-measured |
107
106
  | `Label` | Form field label with required, invalid and disabled states |
108
- | `Progress` | Determinate and indeterminate progress bar |
107
+ | `Progress` | Determinate and indeterminate progress bar, optionally captioned |
109
108
  | `RadioGroup` | Single-select list of options |
110
109
  | `ScrollFade` | Fades the edges of a scroll container |
111
- | `Select` | Picker that opens in a bottom sheet |
110
+ | `SectionRail` | Floating section navigator — bars that expand into a jump list |
111
+ | `Select` | Picker shown in a bottom sheet, in place, or floating over the page |
112
112
  | `Shimmer` | Animated highlight sweeping across content |
113
113
  | `Skeleton` | Shimmer placeholder for loading content |
114
+ | `Slider` | Pick a value by dragging a thumb along a track |
114
115
  | `Spinner` | Indeterminate loading indicator |
115
116
  | `Steps` | Stepper for multi-step flows, horizontal or vertical |
116
117
  | `Switch` | Animated on/off toggle |
117
118
  | `Tabs` | Segmented navigation with animated indicator |
119
+ | `ToggleButton` | A button that stays down, on its own or in a group |
118
120
  | `Timeline` | Vertical sequence of events — dot, icon, numbered, card or compact, with per-item tones |
119
121
  | `Toast` | Transient notification queue with swipe-to-dismiss |
120
122
  | `Typography` | Semantic text presets — `h1`–`h6`, body sizes, inline code |
@@ -26,6 +26,39 @@ function useBottomSheet(component) {
26
26
  }
27
27
  return context;
28
28
  }
29
+ /**
30
+ * Roughly how tall the platform will make the sheet at a given detent, as a
31
+ * fraction of the screen. Approximate on purpose — it is used as a floor for
32
+ * the content, not as the sheet's real height, which the platform owns.
33
+ */
34
+ const DETENT_FRACTION = {
35
+ half: 0.5,
36
+ full: 0.9
37
+ };
38
+
39
+ /**
40
+ * The height the content should at least fill for a given set of detents.
41
+ *
42
+ * Without this the hosted content sizes to itself and the platform centres
43
+ * that smaller box inside the taller sheet, which is why a short sheet shows
44
+ * its content floating in the middle. Filling the detent leaves nothing to
45
+ * centre, so the content sits where it was written: at the top.
46
+ */
47
+ function detentFloor(snapPoints, screenHeight) {
48
+ if (!snapPoints?.length) return undefined;
49
+
50
+ // The sheet opens at its first detent, so that is the one to fill.
51
+ const first = snapPoints[0];
52
+ if (first === 'half' || first === 'full') {
53
+ return screenHeight * DETENT_FRACTION[first];
54
+ }
55
+ if (typeof first === 'object' && 'fraction' in first) {
56
+ return screenHeight * first.fraction;
57
+ }
58
+ if (typeof first === 'object' && 'height' in first) return first.height;
59
+ return undefined;
60
+ }
61
+
29
62
  /**
30
63
  * Set by the root so Content knows the platform is drawing the sheet, and with
31
64
  * which detents. Null means the styled sheet renders.
@@ -147,14 +180,17 @@ function BottomSheetContent({
147
180
  ...props,
148
181
  className: cn(
149
182
  // The platform draws the container, but it hands us a bare
150
- // box — padding and safe-area are still ours.
151
- 'gap-2 px-5 pb-2 pt-1', className),
183
+ // box — padding and safe-area are still ours. The top
184
+ // padding has to clear the platform's grabber, which sits
185
+ // inside the sheet rather than above the content.
186
+ 'justify-start gap-2 px-5 pb-2 pt-5', className),
152
187
  style: {
153
188
  // An explicit width, not `w-full`. Inside the native host
154
189
  // there is no parent width for a percentage to resolve
155
190
  // against, so `100%` measures against nothing and the
156
191
  // content lays out wider than the sheet it sits in.
157
192
  width: screenWidth,
193
+ minHeight: detentFloor(nativeSheet.snapPoints, screenHeight),
158
194
  paddingBottom: Math.max(insets.bottom, 16)
159
195
  },
160
196
  children: children
@@ -1 +1 @@
1
- {"version":3,"names":["cloneElement","createContext","isValidElement","useCallback","useContext","useMemo","useState","Pressable","useWindowDimensions","View","useCSSVariable","Gesture","GestureDetector","Animated","FadeIn","FadeOut","SlideInDown","SlideOutDown","runOnJS","useAnimatedStyle","useSharedValue","withSpring","withTiming","useSafeAreaInsets","getNativeUI","XIcon","Portal","cn","jsx","_jsx","jsxs","_jsxs","SPRING","damping","stiffness","mass","DISMISS_DISTANCE","DISMISS_VELOCITY","BottomSheetContext","useBottomSheet","component","context","Error","NativeSheetContext","BottomSheetRoot","children","open","onOpenChange","defaultOpen","native","snapPoints","internalOpen","setInternalOpen","isControlled","undefined","resolvedOpen","setOpen","next","nativeUI","nativeSheet","Provider","value","BottomSheetTrigger","onPress","args","props","BottomSheetContent","className","dismissible","showClose","height","screenHeight","width","screenWidth","insets","translateY","closeTint","close","pan","Pan","onChange","event","changeY","onEnd","velocityY","duration","sheetStyle","transform","Host","BottomSheet","NativeBottomSheet","RNHostView","matchContents","style","position","isPresented","onDismiss","paddingBottom","Math","max","bottom","entering","exiting","accessibilityLabel","gesture","springify","accessibilityViewIsModal","accessibilityRole","hitSlop","size","color","Object","assign","Trigger","Content"],"sourceRoot":"../../../../src","sources":["components/bottom-sheet/index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["cloneElement","createContext","isValidElement","useCallback","useContext","useMemo","useState","Pressable","useWindowDimensions","View","useCSSVariable","Gesture","GestureDetector","Animated","FadeIn","FadeOut","SlideInDown","SlideOutDown","runOnJS","useAnimatedStyle","useSharedValue","withSpring","withTiming","useSafeAreaInsets","getNativeUI","XIcon","Portal","cn","jsx","_jsx","jsxs","_jsxs","SPRING","damping","stiffness","mass","DISMISS_DISTANCE","DISMISS_VELOCITY","BottomSheetContext","useBottomSheet","component","context","Error","DETENT_FRACTION","half","full","detentFloor","snapPoints","screenHeight","length","undefined","first","fraction","height","NativeSheetContext","BottomSheetRoot","children","open","onOpenChange","defaultOpen","native","internalOpen","setInternalOpen","isControlled","resolvedOpen","setOpen","next","nativeUI","nativeSheet","Provider","value","BottomSheetTrigger","onPress","args","props","BottomSheetContent","className","dismissible","showClose","width","screenWidth","insets","translateY","closeTint","close","pan","Pan","onChange","event","changeY","onEnd","velocityY","duration","sheetStyle","transform","Host","BottomSheet","NativeBottomSheet","RNHostView","matchContents","style","position","isPresented","onDismiss","minHeight","paddingBottom","Math","max","bottom","entering","exiting","accessibilityLabel","gesture","springify","accessibilityViewIsModal","accessibilityRole","hitSlop","size","color","Object","assign","Trigger","Content"],"sourceRoot":"../../../../src","sources":["components/bottom-sheet/index.tsx"],"mappings":"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","ignoreList":[]}
@@ -103,6 +103,22 @@ const CONTENT_COLOR_VAR = {
103
103
  ghost: '--color-foreground',
104
104
  social: '--color-foreground'
105
105
  };
106
+ /**
107
+ * Height given to the native host, matching the styled scale above.
108
+ *
109
+ * The host is told its size rather than asked to work it out. `matchContents`
110
+ * measures the platform's own content a frame late and again when that content
111
+ * changes — so the button renders at nothing, collapses against whatever sits
112
+ * above it, and jolts into place on the first press. Width comes from ordinary
113
+ * layout instead, which is why a native button fills its container.
114
+ */
115
+ const NATIVE_HEIGHT = {
116
+ sm: 36,
117
+ md: 44,
118
+ lg: 48,
119
+ icon: 44
120
+ };
121
+
106
122
  /** PanelUI variants mapped onto the platform button styles. */
107
123
  const NATIVE_VARIANT = {
108
124
  primary: 'filled',
@@ -152,7 +168,9 @@ export const Button = /*#__PURE__*/forwardRef(({
152
168
  } = nativeUI;
153
169
  const isStringLabel = typeof children === 'string';
154
170
  return /*#__PURE__*/_jsx(Host, {
155
- matchContents: true,
171
+ style: {
172
+ height: NATIVE_HEIGHT[size ?? 'md']
173
+ },
156
174
  children: /*#__PURE__*/_jsx(NativeButton, {
157
175
  label: isStringLabel ? children : undefined,
158
176
  variant: NATIVE_VARIANT[variant ?? 'primary'],
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","tv","useCSSVariable","AnimatedPressable","Text","IconColorProvider","getNativeUI","Spinner","Fragment","_Fragment","jsx","_jsx","jsxs","_jsxs","buttonVariants","slots","root","label","spinner","variants","variant","primary","secondary","outline","ghost","destructive","social","size","sm","md","lg","icon","fullWidth","true","disabled","defaultVariants","SPINNER_SIZE","CONTENT_COLOR_VAR","NATIVE_VARIANT","Button","children","className","labelClassName","loading","startContent","endContent","native","props","ref","isDisabled","nativeUI","themedColor","contentColor","undefined","Host","NativeButton","RNHostView","isStringLabel","matchContents","onPress","color","accessibilityRole","accessibilityState","busy","displayName"],"sourceRoot":"../../../../src","sources":["components/button/index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["forwardRef","tv","useCSSVariable","AnimatedPressable","Text","IconColorProvider","getNativeUI","Spinner","Fragment","_Fragment","jsx","_jsx","jsxs","_jsxs","buttonVariants","slots","root","label","spinner","variants","variant","primary","secondary","outline","ghost","destructive","social","size","sm","md","lg","icon","fullWidth","true","disabled","defaultVariants","SPINNER_SIZE","CONTENT_COLOR_VAR","NATIVE_HEIGHT","NATIVE_VARIANT","Button","children","className","labelClassName","loading","startContent","endContent","native","props","ref","isDisabled","nativeUI","themedColor","contentColor","undefined","Host","NativeButton","RNHostView","isStringLabel","style","height","onPress","matchContents","color","accessibilityRole","accessibilityState","busy","displayName"],"sourceRoot":"../../../../src","sources":["components/button/index.tsx"],"mappings":"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","ignoreList":[]}
@@ -17,23 +17,57 @@
17
17
  * </Frame.Header>
18
18
  * <Frame.Panel>
19
19
  * <Frame.Row>…</Frame.Row>
20
- * <Frame.Row divided>…</Frame.Row>
20
+ * <Frame.Row>…</Frame.Row>
21
21
  * </Frame.Panel>
22
22
  * <Frame.Footer>Updated 2 minutes ago</Frame.Footer>
23
23
  * </Frame>
24
24
  * ```
25
+ *
26
+ * The panel draws the hairlines between its own rows. React Native has no
27
+ * `:first-child`, so the alternative is every caller writing
28
+ * `divided={index > 0}` on every row and getting it wrong once.
25
29
  */
26
- import { forwardRef } from 'react';
27
- import { View } from 'react-native';
30
+ import { Children, cloneElement, forwardRef, isValidElement } from 'react';
31
+ import { Pressable, View } from 'react-native';
32
+ import { tv } from 'tailwind-variants';
33
+ import { ChevronRightIcon } from "../../icons/index.js";
28
34
  import { Text } from "../../primitives/text.js";
29
35
  import { cn } from "../../utils/cn.js";
30
- import { jsx as _jsx } from "react/jsx-runtime";
36
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
37
+ const frameVariants = tv({
38
+ slots: {
39
+ root: '',
40
+ panel: 'overflow-hidden rounded-xl border border-border bg-card'
41
+ },
42
+ variants: {
43
+ variant: {
44
+ default: {
45
+ root: 'rounded-2xl border border-border bg-surface p-1.5'
46
+ },
47
+ // No shell: the panel is the whole widget. For a Frame nested inside a
48
+ // card that already draws a border, where the shell's own edge sitting
49
+ // just inside it reads as a double line.
50
+ plain: {
51
+ root: '',
52
+ panel: 'rounded-2xl'
53
+ }
54
+ }
55
+ },
56
+ defaultVariants: {
57
+ variant: 'default'
58
+ }
59
+ });
31
60
  const FrameRoot = /*#__PURE__*/forwardRef(({
32
61
  className,
62
+ variant,
33
63
  ...props
34
64
  }, ref) => /*#__PURE__*/_jsx(View, {
35
65
  ref: ref,
36
- className: cn('rounded-2xl border border-border bg-surface p-1.5', className),
66
+ className: frameVariants({
67
+ variant
68
+ }).root({
69
+ className
70
+ }),
37
71
  ...props
38
72
  }));
39
73
  FrameRoot.displayName = 'Frame';
@@ -94,35 +128,113 @@ const FrameDescription = /*#__PURE__*/forwardRef(({
94
128
  }));
95
129
  FrameDescription.displayName = 'Frame.Description';
96
130
 
131
+ /**
132
+ * Marks the parts that take part in the panel's own divider bookkeeping —
133
+ * a Row draws a line above itself, a Section draws one above its heading.
134
+ * Anything else the panel is given is left alone.
135
+ */
136
+
137
+ /**
138
+ * Draws the hairline above every child but the first. An explicit `divided`
139
+ * on a child wins, so a row can still opt out or force one.
140
+ */
141
+ function divideChildren(children) {
142
+ let seen = 0;
143
+ return Children.map(children, child => {
144
+ if (! /*#__PURE__*/isValidElement(child)) return child;
145
+ if (!DIVIDABLE.has(child.type)) return child;
146
+ const index = seen++;
147
+ if (child.props.divided !== undefined) return child;
148
+ return /*#__PURE__*/cloneElement(child, {
149
+ divided: index > 0
150
+ });
151
+ });
152
+ }
97
153
  /**
98
154
  * The inset card holding the frame's content — the raised surface sitting in
99
155
  * from the shell's edges, with its own smaller radius.
100
156
  */
101
157
  const FramePanel = /*#__PURE__*/forwardRef(({
102
158
  className,
159
+ dividers = true,
160
+ children,
103
161
  ...props
104
162
  }, ref) => /*#__PURE__*/_jsx(View, {
105
163
  ref: ref,
106
- className: cn('overflow-hidden rounded-xl border border-border bg-card', className),
107
- ...props
164
+ className: frameVariants().panel({
165
+ className
166
+ }),
167
+ ...props,
168
+ children: dividers ? divideChildren(children) : children
108
169
  }));
109
170
  FramePanel.displayName = 'Frame.Panel';
110
-
111
171
  /**
112
- * A row inside a Frame.Panel. Pass `divided` on every row after the first to
113
- * draw a hairline separator above it (React Native has no :first-child).
172
+ * A row inside a Frame.Panel. Give it an `onPress` and it becomes a real
173
+ * pressable — press feedback, a button role — rather than a View with a
174
+ * handler bolted on.
114
175
  */
115
-
116
176
  const FrameRow = /*#__PURE__*/forwardRef(({
117
177
  className,
118
178
  divided,
179
+ chevron,
180
+ children,
181
+ onPress,
119
182
  ...props
120
- }, ref) => /*#__PURE__*/_jsx(View, {
121
- ref: ref,
122
- className: cn('flex-row items-center gap-3 px-4 py-3.5', divided && 'border-t border-border', className),
183
+ }, ref) => {
184
+ const classes = cn('flex-row items-center gap-3 px-4 py-3.5', divided && 'border-t border-border', onPress && 'active:bg-muted', className);
185
+ const body = /*#__PURE__*/_jsxs(_Fragment, {
186
+ children: [children, chevron ? /*#__PURE__*/_jsx(ChevronRightIcon, {
187
+ size: 16
188
+ }) : null]
189
+ });
190
+ if (!onPress) {
191
+ return /*#__PURE__*/_jsx(View, {
192
+ ref: ref,
193
+ className: classes,
194
+ ...props,
195
+ children: body
196
+ });
197
+ }
198
+ return /*#__PURE__*/_jsx(Pressable, {
199
+ ref: ref,
200
+ accessibilityRole: "button",
201
+ onPress: onPress,
202
+ className: classes,
203
+ ...props,
204
+ children: body
205
+ });
206
+ });
207
+ FrameRow.displayName = 'Frame.Row';
208
+ /**
209
+ * A labelled cluster of rows inside a Panel, for a widget holding more than
210
+ * one group. It divides its own rows the way the panel does, so the two nest
211
+ * without either having to know about the other.
212
+ */
213
+ const FrameSection = /*#__PURE__*/forwardRef(({
214
+ className,
215
+ title,
216
+ divided,
217
+ children,
123
218
  ...props
219
+ }, ref) => /*#__PURE__*/_jsxs(View, {
220
+ ref: ref,
221
+ className: cn(divided && 'border-t border-border', className),
222
+ ...props,
223
+ children: [title ? /*#__PURE__*/_jsx(View, {
224
+ className: "bg-muted/40 px-4 pb-1.5 pt-2.5",
225
+ children: typeof title === 'string' ? /*#__PURE__*/_jsx(Text, {
226
+ size: "xs",
227
+ weight: "medium",
228
+ muted: true,
229
+ className: "uppercase tracking-wider",
230
+ children: title
231
+ }) : title
232
+ }) : null, divideChildren(children)]
124
233
  }));
125
- FrameRow.displayName = 'Frame.Row';
234
+ FrameSection.displayName = 'Frame.Section';
235
+
236
+ /** Parts the panel divides. Declared after them, since it holds references. */
237
+ const DIVIDABLE = new Set([FrameRow, FrameSection]);
126
238
  /** Muted caption under the panel. Strings are wrapped for you. */
127
239
  const FrameFooter = /*#__PURE__*/forwardRef(({
128
240
  className,
@@ -145,6 +257,7 @@ export const Frame = Object.assign(FrameRoot, {
145
257
  Action: FrameAction,
146
258
  Description: FrameDescription,
147
259
  Panel: FramePanel,
260
+ Section: FrameSection,
148
261
  Row: FrameRow,
149
262
  Footer: FrameFooter
150
263
  });
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","View","Text","cn","jsx","_jsx","FrameRoot","className","props","ref","displayName","FrameHeader","FrameTitle","size","weight","FrameAction","children","muted","FrameDescription","FramePanel","FrameRow","divided","FrameFooter","Frame","Object","assign","Header","Title","Action","Description","Panel","Row","Footer"],"sourceRoot":"../../../../src","sources":["components/frame/index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Children","cloneElement","forwardRef","isValidElement","Pressable","View","tv","ChevronRightIcon","Text","cn","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","frameVariants","slots","root","panel","variants","variant","default","plain","defaultVariants","FrameRoot","className","props","ref","displayName","FrameHeader","FrameTitle","size","weight","FrameAction","children","muted","FrameDescription","divideChildren","seen","map","child","DIVIDABLE","has","type","index","divided","undefined","FramePanel","dividers","FrameRow","chevron","onPress","classes","body","accessibilityRole","FrameSection","title","Set","FrameFooter","Frame","Object","assign","Header","Title","Action","Description","Panel","Section","Row","Footer"],"sourceRoot":"../../../../src","sources":["components/frame/index.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,29 +1,72 @@
1
1
  "use strict";
2
2
 
3
- import { forwardRef, useCallback, useState } from 'react';
3
+ /**
4
+ * Input — a text field with a label, a description and an error line.
5
+ *
6
+ * The field's focus state is animated rather than switched. A border that
7
+ * snaps between two colours reads as a redraw; one that crosses over in
8
+ * 150ms reads as the field responding to you. The interpolation runs on the
9
+ * UI thread, so it costs nothing and keeps up with a fast tab through a form.
10
+ *
11
+ * Two backgrounds, because a field's job changes with what surrounds it:
12
+ * `outline` sits on the page and draws its own edge; `filled` sits inside a
13
+ * card or a sheet, where a second border next to the container's own reads as
14
+ * a seam.
15
+ *
16
+ * ```tsx
17
+ * <Input label="Email" placeholder="you@example.com" />
18
+ * <Input variant="filled" size="lg" label="Name" isRequired />
19
+ * ```
20
+ *
21
+ * For a field with an icon or a button attached, reach for `InputGroup` — it
22
+ * measures its decorators and pads this field around them.
23
+ */
24
+ import { forwardRef, useCallback, useEffect, useState } from 'react';
4
25
  import { TextInput, View } from 'react-native';
26
+ import Animated, { interpolateColor, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';
5
27
  import { tv } from 'tailwind-variants';
6
28
  import { useCSSVariable } from 'uniwind';
7
29
  import { KeyboardAvoider } from "../../primitives/keyboard-avoider.js";
8
30
  import { Text } from "../../primitives/text.js";
31
+ import { Label } from "../label/index.js";
32
+
33
+ /** Long enough to read as a transition, short enough not to lag a fast tab. */
9
34
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
35
+ const FOCUS_DURATION = 150;
10
36
  const inputVariants = tv({
11
37
  slots: {
12
38
  container: 'w-full gap-1.5',
13
- field: 'h-11 w-full rounded-lg border border-input bg-background px-3 text-base text-foreground',
14
- label: 'text-sm font-medium text-foreground',
39
+ field: 'w-full rounded-lg border text-foreground',
15
40
  description: 'text-sm text-muted-foreground',
16
41
  error: 'text-sm text-destructive'
17
42
  },
18
43
  variants: {
19
- focused: {
20
- true: {
21
- field: 'border-ring'
44
+ variant: {
45
+ // The border colour is animated, so it is deliberately not set here —
46
+ // only the background and the resting border width belong to the class.
47
+ outline: {
48
+ field: 'bg-background'
49
+ },
50
+ filled: {
51
+ field: 'bg-muted'
52
+ }
53
+ },
54
+ size: {
55
+ sm: {
56
+ field: 'h-10 px-3 text-sm'
57
+ },
58
+ md: {
59
+ field: 'h-12 px-3.5 text-base'
60
+ },
61
+ lg: {
62
+ field: 'h-14 px-4 text-base'
22
63
  }
23
64
  },
24
- invalid: {
65
+ multiline: {
66
+ // A multiline field grows, so a fixed height would crop it. Text starts
67
+ // at the top rather than floating in the middle of an empty box.
25
68
  true: {
26
- field: 'border-destructive/40'
69
+ field: 'h-auto min-h-24 py-3'
27
70
  }
28
71
  },
29
72
  disabled: {
@@ -31,28 +74,63 @@ const inputVariants = tv({
31
74
  field: 'opacity-[0.64]'
32
75
  }
33
76
  }
77
+ },
78
+ defaultVariants: {
79
+ variant: 'outline',
80
+ size: 'md'
34
81
  }
35
82
  });
83
+ const AnimatedTextInput = Animated.createAnimatedComponent(TextInput);
36
84
  export const Input = /*#__PURE__*/forwardRef(({
37
85
  className,
38
86
  containerClassName,
39
87
  label,
40
88
  description,
41
89
  errorMessage,
90
+ isRequired,
42
91
  disabled,
92
+ variant,
93
+ size,
43
94
  avoidKeyboard = false,
44
95
  keyboardOffset = 16,
45
96
  onFocus,
46
97
  onBlur,
98
+ style,
47
99
  ...props
48
100
  }, ref) => {
49
101
  const [focused, setFocused] = useState(false);
102
+ const invalid = !!errorMessage;
50
103
  const placeholderColor = useCSSVariable('--color-muted-foreground');
104
+ const restColor = useCSSVariable('--color-input');
105
+ const focusColor = useCSSVariable('--color-ring');
106
+ const errorColor = useCSSVariable('--color-destructive');
51
107
  const slots = inputVariants({
52
- focused,
53
- invalid: !!errorMessage,
108
+ variant,
109
+ size,
110
+ multiline: !!props.multiline,
54
111
  disabled: !!disabled
55
112
  });
113
+
114
+ /*
115
+ * Border colour is driven by one 0..1 value rather than by a class per
116
+ * state. Uniwind can only swap a class wholesale, which is the snap this
117
+ * is here to avoid, and a shared value crosses between the two colours on
118
+ * the UI thread without a re-render.
119
+ */
120
+ const focus = useSharedValue(0);
121
+ useEffect(() => {
122
+ focus.value = withTiming(focused ? 1 : 0, {
123
+ duration: FOCUS_DURATION
124
+ });
125
+ }, [focused, focus]);
126
+ const resting = typeof restColor === 'string' ? restColor : '#e5e5e5';
127
+ const active = invalid ? typeof errorColor === 'string' ? errorColor : '#ef4444' : typeof focusColor === 'string' ? focusColor : '#a3a3a3';
128
+ // An invalid field is tinted even at rest — the error is a fact about the
129
+ // value, not about whether the field happens to be focused.
130
+ const idle = invalid ? active : resting;
131
+ const borderStyle = useAnimatedStyle(() => ({
132
+ borderColor: interpolateColor(focus.value, [0, 1], [idle, active])
133
+ }));
56
134
  const handleFocus = useCallback(event => {
57
135
  setFocused(true);
58
136
  onFocus?.(event);
@@ -62,10 +140,12 @@ export const Input = /*#__PURE__*/forwardRef(({
62
140
  onBlur?.(event);
63
141
  }, [onBlur]);
64
142
  const body = /*#__PURE__*/_jsxs(_Fragment, {
65
- children: [label ? /*#__PURE__*/_jsx(Text, {
66
- className: slots.label(),
143
+ children: [label ? /*#__PURE__*/_jsx(Label, {
144
+ isRequired: isRequired,
145
+ isInvalid: invalid,
146
+ isDisabled: !!disabled,
67
147
  children: label
68
- }) : null, /*#__PURE__*/_jsx(TextInput, {
148
+ }) : null, /*#__PURE__*/_jsx(AnimatedTextInput, {
69
149
  ref: ref,
70
150
  editable: !disabled,
71
151
  onFocus: handleFocus,
@@ -74,9 +154,15 @@ export const Input = /*#__PURE__*/forwardRef(({
74
154
  accessibilityState: {
75
155
  disabled: !!disabled
76
156
  },
157
+ "aria-required": isRequired,
158
+ "aria-invalid": invalid,
77
159
  className: slots.field({
78
160
  className
79
- }),
161
+ })
162
+ // Caller styles come last so InputGroup can pad the field around its
163
+ // decorators, but never last enough to drop the animated border.
164
+ ,
165
+ style: [borderStyle, style],
80
166
  placeholderTextColor: typeof placeholderColor === 'string' ? placeholderColor : undefined,
81
167
  ...props
82
168
  }), errorMessage ? /*#__PURE__*/_jsx(Text, {
@@ -100,7 +186,13 @@ export const Input = /*#__PURE__*/forwardRef(({
100
186
  * that to every other screen.
101
187
  */
102
188
  if (avoidKeyboard) {
103
- return /*#__PURE__*/_jsx(KeyboardAvoider, {
189
+ return /*#__PURE__*/_jsx(KeyboardAvoider
190
+ // Only while *this* field is the one being typed into. Without it
191
+ // every avoiding field on the screen lifts the moment any field
192
+ // anywhere is tapped, and since they all aim at the same gap above
193
+ // the keyboard, they arrive stacked on top of one another.
194
+ , {
195
+ active: focused,
104
196
  offset: keyboardOffset,
105
197
  className: containerClasses,
106
198
  children: body