Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions packages/dashboard/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/
/coverage/

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
33 changes: 33 additions & 0 deletions packages/dashboard/.metadata
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
revision: "559ffa3f75e7402d65a8def9c28389a9b2e6fe42"
channel: "stable"

project_type: app

# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42
base_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42
- platform: macos
create_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42
base_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42
- platform: web
create_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42
base_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42

# User provided section

# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
22 changes: 22 additions & 0 deletions packages/dashboard/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Remix dashboard

A polished product dashboard demonstrating Remix's Fortal theme and components.

## Preview

### Desktop

![Fortal dashboard overview on desktop](screenshots/overview-desktop.png)

### Compact

![Fortal dashboard overview at the compact breakpoint](screenshots/overview-compact.png)

From the repository root:

```sh
fvm dart run melos bootstrap
cd packages/dashboard
fvm flutter run -d macos
# or: fvm flutter run -d chrome
```
1 change: 1 addition & 0 deletions packages/dashboard/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include: package:flutter_lints/flutter.yaml
40 changes: 40 additions & 0 deletions packages/dashboard/lib/data/activity.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import 'models.dart';

const activityEvents = <ActivityEvent>[
ActivityEvent(
title: 'New customer',
detail: 'Camila joined the Business plan',
relativeTime: '12 min ago',
kind: .customer,
),
ActivityEvent(
title: 'Payment received',
detail: 'ORD-1048 · \$1,249.00',
relativeTime: '38 min ago',
kind: .payment,
),
ActivityEvent(
title: 'Order requires review',
detail: 'ORD-1047 is awaiting confirmation',
relativeTime: '1 hr ago',
kind: .alert,
),
ActivityEvent(
title: 'Order fulfilled',
detail: 'ORD-1046 shipped to Ava Wilson',
relativeTime: '3 hrs ago',
kind: .order,
),
ActivityEvent(
title: 'New customer',
detail: 'Henry accepted his invitation',
relativeTime: '5 hrs ago',
kind: .customer,
),
ActivityEvent(
title: 'Refund processed',
detail: 'ORD-1045 · \$189.00',
relativeTime: 'Yesterday',
kind: .payment,
),
];
196 changes: 196 additions & 0 deletions packages/dashboard/lib/data/customers.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
import 'models.dart';

final customers = <Customer>[
Customer(
id: 'cus_001',
name: 'Olivia Martin',
email: 'olivia@northstar.co',
plan: 'Business',
status: .active,
joinedAt: DateTime(2025, 1, 8),
),
Customer(
id: 'cus_002',
name: 'Jackson Lee',
email: 'jackson@monument.dev',
plan: 'Pro',
status: .active,
joinedAt: DateTime(2025, 1, 21),
),
Customer(
id: 'cus_003',
name: 'Sophia Brown',
email: 'sophia@loomworks.io',
plan: 'Starter',
status: .invited,
joinedAt: DateTime(2025, 2, 4),
),
Customer(
id: 'cus_004',
name: 'Noah Williams',
email: 'noah@horizon.studio',
plan: 'Business',
status: .active,
joinedAt: DateTime(2025, 2, 18),
),
Customer(
id: 'cus_005',
name: 'Emma Davis',
email: 'emma@fieldnote.co',
plan: 'Pro',
status: .suspended,
joinedAt: DateTime(2025, 3, 2),
),
Customer(
id: 'cus_006',
name: 'Liam Garcia',
email: 'liam@kindred.app',
plan: 'Starter',
status: .active,
joinedAt: DateTime(2025, 3, 14),
),
Customer(
id: 'cus_007',
name: 'Ava Wilson',
email: 'ava@brightpath.com',
plan: 'Business',
status: .active,
joinedAt: DateTime(2025, 4, 1),
),
Customer(
id: 'cus_008',
name: 'Ethan Martinez',
email: 'ethan@paperplane.dev',
plan: 'Pro',
status: .invited,
joinedAt: DateTime(2025, 4, 11),
),
Customer(
id: 'cus_009',
name: 'Mia Anderson',
email: 'mia@evergreen.design',
plan: 'Starter',
status: .active,
joinedAt: DateTime(2025, 4, 29),
),
Customer(
id: 'cus_010',
name: 'Lucas Thomas',
email: 'lucas@relaylabs.io',
plan: 'Pro',
status: .active,
joinedAt: DateTime(2025, 5, 7),
),
Customer(
id: 'cus_011',
name: 'Isabella Taylor',
email: 'isabella@assembly.co',
plan: 'Business',
status: .active,
joinedAt: DateTime(2025, 5, 23),
),
Customer(
id: 'cus_012',
name: 'Mason Moore',
email: 'mason@oakline.com',
plan: 'Starter',
status: .suspended,
joinedAt: DateTime(2025, 6, 3),
),
Customer(
id: 'cus_013',
name: 'Amelia Jackson',
email: 'amelia@archway.dev',
plan: 'Pro',
status: .active,
joinedAt: DateTime(2025, 6, 19),
),
Customer(
id: 'cus_014',
name: 'Logan White',
email: 'logan@stillwater.io',
plan: 'Business',
status: .invited,
joinedAt: DateTime(2025, 7, 2),
),
Customer(
id: 'cus_015',
name: 'Harper Harris',
email: 'harper@wildwood.co',
plan: 'Pro',
status: .active,
joinedAt: DateTime(2025, 7, 17),
),
Customer(
id: 'cus_016',
name: 'Elijah Clark',
email: 'elijah@commonthread.app',
plan: 'Starter',
status: .active,
joinedAt: DateTime(2025, 8, 5),
),
Customer(
id: 'cus_017',
name: 'Evelyn Lewis',
email: 'evelyn@sunroom.design',
plan: 'Business',
status: .active,
joinedAt: DateTime(2025, 8, 22),
),
Customer(
id: 'cus_018',
name: 'James Walker',
email: 'james@granite.dev',
plan: 'Pro',
status: .suspended,
joinedAt: DateTime(2025, 9, 9),
),
Customer(
id: 'cus_019',
name: 'Luna Hall',
email: 'luna@afterglow.co',
plan: 'Starter',
status: .active,
joinedAt: DateTime(2025, 9, 25),
),
Customer(
id: 'cus_020',
name: 'Benjamin Allen',
email: 'ben@wayfinder.io',
plan: 'Business',
status: .active,
joinedAt: DateTime(2025, 10, 8),
),
Customer(
id: 'cus_021',
name: 'Sofia Young',
email: 'sofia@roam.studio',
plan: 'Pro',
status: .invited,
joinedAt: DateTime(2025, 10, 24),
),
Customer(
id: 'cus_022',
name: 'Henry King',
email: 'henry@tandem.app',
plan: 'Starter',
status: .active,
joinedAt: DateTime(2025, 11, 6),
),
Customer(
id: 'cus_023',
name: 'Camila Wright',
email: 'camila@workbench.co',
plan: 'Business',
status: .active,
joinedAt: DateTime(2025, 11, 21),
),
Customer(
id: 'cus_024',
name: 'Alexander Scott',
email: 'alex@signalworks.dev',
plan: 'Pro',
status: .active,
joinedAt: DateTime(2025, 12, 4),
),
];
56 changes: 56 additions & 0 deletions packages/dashboard/lib/data/models.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
enum CustomerStatus { active, invited, suspended }

enum OrderStatus { paid, pending, refunded, cancelled }

class Customer {
const Customer({
required this.id,
required this.name,
required this.email,
required this.plan,
required this.status,
required this.joinedAt,
});

final String id;
final String name;
final String email;
final String plan;
final CustomerStatus status;
final DateTime joinedAt;

String get initials =>
name.split(' ').take(2).map((part) => part.substring(0, 1)).join();
}

class Order {
const Order({
required this.id,
required this.customer,
required this.date,
required this.amount,
required this.status,
});

final String id;
final String customer;
final DateTime date;
final double amount;
final OrderStatus status;
}

class ActivityEvent {
const ActivityEvent({
required this.title,
required this.detail,
required this.relativeTime,
required this.kind,
});

final String title;
final String detail;
final String relativeTime;
final ActivityKind kind;
}

enum ActivityKind { customer, order, payment, alert }
Loading
Loading