mirror of
https://github.com/block/buzz.git
synced 2026-11-12 12:22:06 +00:00
Replace the mobile Agents sheet with a full-page directory of verified owned agents. Add dedicated creation and avatar pages with catalog-backed model selection, reuse the profile emoji/photo/camera controls, and expose Builderbot model settings while labeling desktop agents “Manage on desktop.” Share one account-scoped model catalog across editable cards and retries. Choose Bestie from the agent profile using the shared encrypted main-agent record (text-only action, filled star once selected), and move confirmed deletion to a top-left trash control with native iOS glass. Include uploaded avatars in owner registrations so desktop can display them. Validation: mobile analysis and all 3,958 hosted-enabled app tests passed; default-build tests run by the push hook. Earlier iPhone build installed and iterated with the user; the current iOS build succeeds, but final changes still need a device pass. Independent review found no new blockers. Actual camera capture and live Bestie sync remain unconfirmed; the existing shared `main-agent` wire format and Bestie terminology are retained. ### Snapshots Widget-harness captures with test data (not native iOS chrome). | Agents directory | Image avatar editor | | --- | --- | |  |  | --------- Signed-off-by: kenny lopez <klopez4212@gmail.com> Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz>
42 lines
1.3 KiB
Dart
42 lines
1.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import '../../shared/theme/theme.dart';
|
|
|
|
/// Responsive directory grid; larger accessibility text gets wider cards.
|
|
class AgentCardGrid extends StatelessWidget {
|
|
const AgentCardGrid({
|
|
required this.itemCount,
|
|
required this.itemBuilder,
|
|
this.cardHeight = 220,
|
|
super.key,
|
|
});
|
|
final double cardHeight;
|
|
final int itemCount;
|
|
final IndexedWidgetBuilder itemBuilder;
|
|
|
|
@override
|
|
Widget build(BuildContext context) => SliverLayoutBuilder(
|
|
builder: (context, constraints) {
|
|
final scale = MediaQuery.textScalerOf(context).scale(16) / 16;
|
|
final width = constraints.crossAxisExtent - Grid.xs * 2;
|
|
final columns = ((width + Grid.twelve) / (160 * scale + Grid.twelve))
|
|
.floor()
|
|
.clamp(1, 4);
|
|
return SliverPadding(
|
|
padding: const EdgeInsets.fromLTRB(Grid.xs, Grid.xxs, Grid.xs, Grid.sm),
|
|
sliver: SliverGrid.builder(
|
|
itemCount: itemCount,
|
|
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
|
crossAxisCount: columns,
|
|
crossAxisSpacing: Grid.twelve,
|
|
mainAxisSpacing: Grid.twelve,
|
|
mainAxisExtent:
|
|
cardHeight + (scale - 1).clamp(0, double.infinity) * 120,
|
|
),
|
|
itemBuilder: itemBuilder,
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|