@@ -307,27 +307,56 @@ class _ContentInput extends StatelessWidget {
307
307
narrow: narrow,
308
308
controller: controller,
309
309
focusNode: focusNode,
310
- fieldViewBuilder: (context) => TextField (
311
- controller: controller,
312
- focusNode: focusNode,
313
- // `contentPadding` causes the text to be clipped by a rect
314
- // shorter than the compose box, because it shrinks the body of
315
- // [TextField]. Overriding this gives us fine control
316
- // over the clipping behavior with [ClipRect].
317
- clipBehavior: Clip .none,
318
- style: TextStyle (
319
- fontSize: 17 ,
320
- height: (contentLineHeight / 17 ),
321
- color: designVariables.textInput),
322
- maxLines: null ,
323
- textCapitalization: TextCapitalization .sentences,
324
- decoration: InputDecoration (
325
- isDense: true ,
326
- border: InputBorder .none,
327
- contentPadding: const EdgeInsets .symmetric (vertical: verticalPadding),
328
- hintText: hintText,
329
- hintStyle: TextStyle (
330
- color: designVariables.textInput.withValues (alpha: 0.5 )))))));
310
+ fieldViewBuilder: (context) => _InsetShadowBox (
311
+ color: designVariables.bgComposeBox,
312
+ child: TextField (
313
+ controller: controller,
314
+ focusNode: focusNode,
315
+ // `contentPadding` causes the text to be clipped by a rect
316
+ // shorter than the compose box, because it shrinks the body of
317
+ // [TextField]. Overriding this gives us fine control
318
+ // over the clipping behavior with [ClipRect].
319
+ clipBehavior: Clip .none,
320
+ style: TextStyle (
321
+ fontSize: 17 ,
322
+ height: (contentLineHeight / 17 ),
323
+ color: designVariables.textInput),
324
+ maxLines: null ,
325
+ textCapitalization: TextCapitalization .sentences,
326
+ decoration: InputDecoration (
327
+ isDense: true ,
328
+ border: InputBorder .none,
329
+ contentPadding: const EdgeInsets .symmetric (vertical: verticalPadding),
330
+ hintText: hintText,
331
+ hintStyle: TextStyle (
332
+ color: designVariables.textInput.withValues (alpha: 0.5 ))))))));
333
+ }
334
+ }
335
+
336
+ /// A widget that overlays inset shadows on a child.
337
+ class _InsetShadowBox extends StatelessWidget {
338
+ const _InsetShadowBox ({required this .color, required this .child});
339
+
340
+ /// The shadow color to fade into transparency from the top and bottom borders.
341
+ final Color color;
342
+ final Widget child;
343
+
344
+ BoxDecoration _shadowFrom (AlignmentGeometry begin) {
345
+ return BoxDecoration (gradient: LinearGradient (
346
+ begin: begin, end: - begin,
347
+ colors: [color, color.withValues (alpha: 0 )]));
348
+ }
349
+
350
+ @override
351
+ Widget build (BuildContext context) {
352
+ return Stack (
353
+ children: [
354
+ child,
355
+ Positioned (top: 0 , left: 0 , right: 0 ,
356
+ child: Container (height: 8 , decoration: _shadowFrom (Alignment .topCenter))),
357
+ Positioned (bottom: 0 , left: 0 , right: 0 ,
358
+ child: Container (height: 8 , decoration: _shadowFrom (Alignment .bottomCenter))),
359
+ ]);
331
360
}
332
361
}
333
362
0 commit comments