Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
ea6c9e7
ci: gate formatting and close inert verification guards
leoafarias Sep 11, 2026
698e990
fix(remix_agent): stop nesting a transcript and disposing attached ob…
leoafarias Sep 11, 2026
0ebb3ac
test(remix_cli): check the default preset's templates are formatter-c…
leoafarias Sep 12, 2026
4dee7f3
test(playground): cover the default preset that consumers actually get
leoafarias Sep 12, 2026
2d365c9
refactor(remix_cli): name the target prefix and split add into two ph…
leoafarias Sep 12, 2026
a22347a
refactor(remix_agent): adopt Remix's style builder and share the indi…
leoafarias Sep 12, 2026
39976ce
docs: correct three comments that described the code wrongly
leoafarias Sep 12, 2026
d5f59d8
docs: reattach a moved dartdoc and retire two stale references
leoafarias Sep 12, 2026
a7fb728
fix(remix_cli): state the theme vocabulary's real size, and pin it
leoafarias Sep 12, 2026
ce7f009
test(remix_agent): pin the followThreshold default the worksheet names
leoafarias Sep 12, 2026
024469a
fix(tool): let the dogfood check report an output contract change as …
leoafarias Sep 13, 2026
2f964bc
refactor(tool): make the preset builder take a spec instead of knowin…
leoafarias Sep 13, 2026
836fc14
refactor(remix_agent): replace lucide with remix_ui_icons for the fun…
leoafarias Sep 13, 2026
e9d065e
docs(remix_agent): keep the word agent out of prose the derivation re…
leoafarias Sep 14, 2026
8fac7be
feat(agent): ship styled chat recipes and interactive examples
leoafarias Sep 14, 2026
c2606f0
refactor(tool): one registry builder with a configurable source root
leoafarias Sep 14, 2026
368916e
refactor(registry): move remix_fortal to registry_source/fortal
leoafarias Sep 14, 2026
fe0d46b
refactor(registry): move remix_agent to registry_source/agent
leoafarias Sep 14, 2026
61237c2
feat(registry): author every template, agent recipes included, from r…
leoafarias Sep 15, 2026
9a9d8ae
refactor(apps): consume installed source only
leoafarias Sep 15, 2026
598e191
docs(registry): record the registry_source decision
leoafarias Sep 15, 2026
22bbd99
refactor(registry_source): one private source package, no remix_agent
leoafarias Sep 15, 2026
2ca9308
docs: finish retiring the remix_fortal and remix_agent package names
leoafarias Sep 15, 2026
a2ea82d
Merge origin/main into chore/registry-agent-review-followups
leoafarias Sep 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 2 additions & 3 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,8 @@ name: Publish to pub.dev
# remix_cli, remix_ui_icons, and naked_ui are versioned independently from
# Remix.
# The CLI consumer check requires its bundled Remix version to exist before
# the CLI can publish. remix_fortal is not publishable; its
# source remains in the repository as the Fortal preset's analyzed authoring
# and parity surface.
# the CLI can publish. Nothing under `registry_source/` is publishable; it is
# the private authored catalog the bundled presets derive from.
on:
push:
tags:
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ name: Prepare Version Bump
# Pushes a branch that sets Remix to one explicit version and writes its
# changelog from conventional commits. It never tags and never publishes:
# `publish.yml` fires on a tag push, so the tag is pushed by hand after this PR
# is reviewed and merged. remix_fortal is an unpublished authoring package and
# is deliberately outside this workflow.
# is reviewed and merged. registry_source is the unpublished authoring source
# and is deliberately outside this workflow.
#
# It pushes a branch and prints its compare link rather than opening the pull
# request itself. Opening one from a workflow needs "Allow GitHub Actions to
Expand Down Expand Up @@ -89,7 +89,7 @@ jobs:
# Disable dependent constraint and version propagation too: melos
# otherwise rewrites and can version workspace dependents even when
# the initial package filter selects only Remix, which would pull the
# unpublished remix_fortal authoring package back into releases.
# unpublished registry_source authoring package back into releases.
dart run melos version \
--scope=remix \
--no-dependent-constraints \
Expand All @@ -108,7 +108,7 @@ jobs:
# The Fortal preset copies its dependency floors from the default
# registry. Rebuild it immediately after the default floor moves so
# the two committed registry trees cannot disagree.
dart run tool/build_fortal_preset.dart
dart run tool/build_registry.dart

# Verify the released Remix version and registry floor agree. This
# also fails when the sync step above did not run.
Expand Down
3 changes: 0 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,6 @@ align_ui_flutter/
**/example/windows/
**/example/macos/
**/example/linux/
# remix_agent catalog is a web host; keep its index/manifest in tree.
!/packages/remix_agent/example/web/
!/packages/remix_agent/example/web/**

# 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
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ Live examples:
- [Component catalog](https://conceptadev.github.io/remix/catalog/) — the Widgetbook catalog for reviewing Remix and Fortal components, variants, and states.

Check out `apps/dashboard`, `apps/demo`, and the per-package examples in
`packages/remix/example` and `packages/remix_fortal/example` for complete working examples demonstrating:
`packages/remix/example` and `registry_source/example` for complete working examples demonstrating:
- Component usage patterns
- Style composition techniques
- Design system implementation
Expand Down
4 changes: 4 additions & 0 deletions apps/dashboard/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
include: package:flutter_lints/flutter.yaml

analyzer:
exclude:
- lib/ui/**/*.g.dart
14 changes: 14 additions & 0 deletions apps/dashboard/build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
targets:
$default:
builders:
mix_generator:spec_styler_generator:
enabled: true
generate_for:
- lib/ui/components/activity.dart
- lib/ui/components/answer.dart
- lib/ui/components/composer.dart
- lib/ui/components/execution.dart
- lib/ui/components/message.dart
- lib/ui/components/permission.dart
- lib/ui/components/plan.dart
- lib/ui/components/transcript.dart
10 changes: 5 additions & 5 deletions apps/dashboard/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:remix/remix.dart';
import 'package:remix_fortal/remix_fortal.dart';
import 'ui/ui.dart';

import 'shell/dashboard_shell.dart';
import 'theme/scroll_behavior.dart';
Expand Down Expand Up @@ -65,14 +65,14 @@ class _DashboardAppState extends State<DashboardApp>
theme: ThemeData(brightness: .light, useMaterial3: true),
darkTheme: ThemeData(brightness: .dark, useMaterial3: true),
themeAnimationDuration: Duration.zero,
// FortalScope goes *below* MaterialApp and *above* the Navigator.
// UiScope goes *below* MaterialApp and *above* the Navigator.
//
// MaterialApp installs its fallback DefaultTextStyle below its widget
// tree, so a scope placed above it would be overridden. `builder` wraps
// the whole Navigator, so this placement reaches pushed routes and
// dialogs. A nearer DefaultTextStyle retains its normal priority
// through Flutter's inheritance.
builder: (context, child) => FortalScope(
builder: (context, child) => UiScope(
key: const ValueKey('dashboard-fortal-scope'),
accent: _settings.accentColor,
gray: _settings.grayColor,
Expand All @@ -83,9 +83,9 @@ class _DashboardAppState extends State<DashboardApp>
// RemixToastScope sits above the Navigator, in its own Overlay, so
// showRemixToast() works from every route, including dialogs and
// the compact navigation sheet. It inherits the live Fortal tokens
// FortalScope publishes above.
// UiScope publishes above.
child: Overlay.wrap(
child: RemixToastScope(style: fortalToastStyle(), child: child!),
child: RemixToastScope(style: uiToastStyle(), child: child!),
),
),
home: const DashboardShell(),
Expand Down
52 changes: 26 additions & 26 deletions apps/dashboard/lib/pages/charts_page.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:mix_chart/mix_chart.dart';
import 'package:remix/remix.dart';
import 'package:remix_fortal/remix_fortal.dart';
import '../ui/ui.dart';

import '../widgets/chart_legend.dart';
import '../widgets/dashboard_chart_card.dart';
Expand All @@ -13,10 +13,10 @@ class ChartsPage extends StatelessWidget {

@override
Widget build(BuildContext context) {
final palette = resolveFortalChartPalette(context);
final pageGap = MixScope.tokenOf(FortalTokens.space6, context);
final palette = resolveUiChartPalette(context);
final pageGap = MixScope.tokenOf(UiTokens.space6, context);
final pagePadding = MediaQuery.sizeOf(context).width < 720
? MixScope.tokenOf(FortalTokens.space5, context)
? MixScope.tokenOf(UiTokens.space5, context)
: pageGap;

return KeyedSubtree(
Expand Down Expand Up @@ -85,8 +85,8 @@ class _ChartSection extends StatelessWidget {

@override
Widget build(BuildContext context) {
final gap = MixScope.tokenOf(FortalTokens.space4, context);
final titleGap = MixScope.tokenOf(FortalTokens.space2, context);
final gap = MixScope.tokenOf(UiTokens.space4, context);
final titleGap = MixScope.tokenOf(UiTokens.space2, context);
// Omit autoRows: Mix 1031 defaults implicit rows to content height.
final GridBoxStyler gridStyle = .equalColumns(
2,
Expand Down Expand Up @@ -115,7 +115,7 @@ Widget _revenueMomentum(List<Color> palette) {
return DashboardChartCard(
title: 'Revenue momentum',
description: 'Area fill and markers preserve exact point values.',
chart: FortalLineChart(
chart: UiLineChart(
palette: palette,
showMarkers: true,
semanticsLabel: 'Weekly revenue momentum',
Expand Down Expand Up @@ -153,7 +153,7 @@ Widget _revenueMomentum(List<Color> palette) {
Widget _linePatterns(List<Color> palette) => DashboardChartCard(
title: 'Per-series patterns',
description: 'Solid circles and dashed squares reinforce color differences.',
chart: FortalLineChart(
chart: UiLineChart(
key: const ValueKey('charts-line-patterns'),
palette: palette,
showMarkers: true,
Expand Down Expand Up @@ -193,7 +193,7 @@ Widget _linePatterns(List<Color> palette) => DashboardChartCard(
Widget _stepGaps(List<Color> palette) => DashboardChartCard(
title: 'Steps and gaps',
description: 'Missing values remain honest gaps instead of invented data.',
chart: FortalLineChart(
chart: UiLineChart(
palette: palette,
showMarkers: true,
semanticsLabel: 'Inventory levels with missing observations',
Expand Down Expand Up @@ -231,7 +231,7 @@ Widget _viewportLabels(List<Color> palette) => DashboardChartCard(
description:
'Tokenized widget labels stay readable while panning and zooming.',
chart: LayoutBuilder(
builder: (context, constraints) => FortalLineChart(
builder: (context, constraints) => UiLineChart(
palette: palette,
showMarkers: true,
semanticsLabel: 'Revenue chart with scalable horizontal viewport',
Expand All @@ -248,7 +248,7 @@ Widget _viewportLabels(List<Color> palette) => DashboardChartCard(
max: 6,
interval: constraints.maxWidth < 360 ? 3 : 1,
labelFormatter: _weekdayLabel,
labelBuilder: (_, label) => FortalBadge.soft(
labelBuilder: (_, label) => UiBadge.soft(
size: .size1,
highContrast: true,
label: label.formattedValue,
Expand All @@ -272,7 +272,7 @@ Widget _viewportLabels(List<Color> palette) => DashboardChartCard(
Widget _groupedBars(List<Color> palette) => DashboardChartCard(
title: 'Actual versus plan',
description: 'Solid and outlined bars remain distinct without color.',
chart: FortalBarChart(
chart: UiBarChart(
key: const ValueKey('charts-bar-grouped'),
palette: palette,
semanticsLabel: 'Monthly actual and planned revenue',
Expand All @@ -296,7 +296,7 @@ Widget _groupedBars(List<Color> palette) => DashboardChartCard(
Widget _stackedBars(List<Color> palette) => DashboardChartCard(
title: 'Revenue mix',
description: 'Stacked segments expose composition and totals together.',
chart: FortalBarChart(
chart: UiBarChart(
palette: palette,
semanticsLabel: 'Monthly product and services revenue',
groups: _stackedRevenue(palette),
Expand All @@ -314,7 +314,7 @@ Widget _stackedBars(List<Color> palette) => DashboardChartCard(
Widget _floatingBars(List<Color> palette) => DashboardChartCard(
title: 'Floating changes',
description: 'Range bars encode gains and declines from a real baseline.',
chart: FortalBarChart(
chart: UiBarChart(
palette: palette,
semanticsLabel: 'Monthly floating inventory changes',
groups: _floatingChanges(palette),
Expand All @@ -331,7 +331,7 @@ Widget _floatingBars(List<Color> palette) => DashboardChartCard(
Widget _trackedBars(List<Color> palette) => DashboardChartCard(
title: 'Tracks and labels',
description: 'Visible tracks provide scale context before interaction.',
chart: FortalBarChart(
chart: UiBarChart(
palette: palette,
semanticsLabel: 'Monthly revenue against full-scale tracks',
groups: _trackedRevenue(palette),
Expand All @@ -352,7 +352,7 @@ Widget _trafficPie(List<Color> palette) {
description: 'Legend-first labels keep the plot clean and easy to scan.',
chartPadding: const EdgeInsets.symmetric(horizontal: 18, vertical: 12),
chart: PieChart(
style: fortalPieChartStyle(
style: uiPieChartStyle(
palette: palette,
).slice(PieSliceStyler().radius(72)),
semanticsLabel: 'Traffic share by device',
Expand Down Expand Up @@ -386,7 +386,7 @@ class _InteractiveProductMixState extends State<_InteractiveProductMix> {
description: 'Selection expands one stable slice and preserves its ID.',
chartPadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
chart: PieChart(
style: fortalPieChartStyle(
style: uiPieChartStyle(
palette: widget.palette,
centerRadius: 40,
).slice(PieSliceStyler().radius(36)),
Expand All @@ -409,9 +409,9 @@ class _InteractiveProductMixState extends State<_InteractiveProductMix> {

Widget _badgePie(BuildContext context, List<Color> palette) {
const icons = [Icons.phone_iphone, Icons.laptop_mac, Icons.tablet, Icons.tv];
final panel = MixScope.tokenOf(FortalTokens.colorPanel, context);
final border = MixScope.tokenOf(FortalTokens.grayStroke6, context);
final iconColor = MixScope.tokenOf(FortalTokens.gray12, context);
final panel = MixScope.tokenOf(UiTokens.colorPanel, context);
final border = MixScope.tokenOf(UiTokens.grayStroke6, context);
final iconColor = MixScope.tokenOf(UiTokens.gray12, context);
final base = _channelSlices();
final slices = [
for (var index = 0; index < base.length; index++)
Expand Down Expand Up @@ -439,7 +439,7 @@ Widget _badgePie(BuildContext context, List<Color> palette) {
description: 'Ordinary tokenized widgets can annotate individual slices.',
chartPadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
chart: PieChart(
style: fortalPieChartStyle(
style: uiPieChartStyle(
palette: palette,
centerRadius: 34,
).slice(PieSliceStyler().radius(48).badgePosition(0.72)),
Expand All @@ -461,7 +461,7 @@ Widget _emptyPie(List<Color> palette) => DashboardChartCard(
chart: Stack(
alignment: .center,
children: [
FortalPieChart(
UiPieChart(
palette: palette,
centerRadius: 52,
semanticsLabel: 'No channel data',
Expand All @@ -473,7 +473,7 @@ Widget _emptyPie(List<Color> palette) => DashboardChartCard(
children: [
StyledIcon(
icon: Icons.inbox_outlined,
style: IconStyler().size(20).color(FortalTokens.gray11()),
style: IconStyler().size(20).color(UiTokens.gray11()),
),
StyledText('No data yet', style: dashboardText(.size1, tone: .muted)),
],
Expand Down Expand Up @@ -620,16 +620,16 @@ List<BarGroup> _trackedRevenue(List<Color> palette) {
.color(palette[0])
.label(
TextStyler()
.style(FortalTokens.text1.mix())
.style(UiTokens.text1.mix())
.fontWeight(.w700)
.color(FortalTokens.gray12()),
.color(UiTokens.gray12()),
)
.background(
BarBackgroundStyler()
.show(true)
.fromY(0)
.toY(70)
.color(FortalTokens.grayA3()),
.color(UiTokens.grayA3()),
),
),
],
Expand Down
Loading
Loading