From 96e65e056b1c7696a7871bfb54e06a135710adcd Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Tue, 18 Aug 2026 00:29:39 +0530 Subject: [PATCH 1/3] feat: code block with built-in syntax highlighting Own regex highlighter rather than a dependency on syntax_highlight: its super_clipboard chain would put a native plugin and an Android minSdk 23 floor into every consumer, and its asset-loaded grammars force an async setup call. One alternated regex per language, colored in a single synchronous pass; languages are host-extensible via FlowCodeLanguage.register. Syntax palette values and block metrics are picked to sit with the shipped themes pending the design file's code-block frame. --- AGENTS.md | 2 +- CHANGELOG.md | 9 + CLAUDE.md | 4 +- README.md | 1 + .../content/docs/components/code-block.mdx | 146 +++++++ docs/src/content/docs/roadmap.md | 2 +- fonts/GeistMono-Medium.ttf | Bin 0 -> 149328 bytes fonts/GeistMono-Regular.ttf | Bin 0 -> 148516 bytes fonts/GeistMono-SemiBold.ttf | Bin 0 -> 149700 bytes fonts/OFL-GeistMono.txt | 93 ++++ lib/flow_ui.dart | 2 + lib/src/models/flow_message_part.dart | 18 +- lib/src/theme/flow_syntax_colors.dart | 110 +++++ lib/src/theme/flow_theme.dart | 32 +- lib/src/theme/flow_typography.dart | 68 ++- lib/src/utils/flow_syntax_highlighter.dart | 397 ++++++++++++++++++ lib/src/widgets/flow_code_block.dart | 297 +++++++++++++ lib/src/widgets/flow_message.dart | 41 +- lib/src/widgets/flow_thread.dart | 18 + playground/lib/src/demo_registry.dart | 9 + playground/lib/src/demos/code_block_demo.dart | 180 ++++++++ playground/lib/src/demos/thread_demo.dart | 66 ++- playground/lib/src/playground_item.dart | 1 + pubspec.yaml | 23 +- 24 files changed, 1491 insertions(+), 28 deletions(-) create mode 100644 docs/src/content/docs/components/code-block.mdx create mode 100644 fonts/GeistMono-Medium.ttf create mode 100644 fonts/GeistMono-Regular.ttf create mode 100644 fonts/GeistMono-SemiBold.ttf create mode 100644 fonts/OFL-GeistMono.txt create mode 100644 lib/src/theme/flow_syntax_colors.dart create mode 100644 lib/src/utils/flow_syntax_highlighter.dart create mode 100644 lib/src/widgets/flow_code_block.dart create mode 100644 playground/lib/src/demos/code_block_demo.dart diff --git a/AGENTS.md b/AGENTS.md index 46a7a48..95812e7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -85,7 +85,7 @@ Status legend: ⬜ Todo · ✅ Done | 18 | Suggestion & Suggestion Group | plain & outlined rows; scroll, wrap, column | ✅ | | 19 | Confirmation | default, approved, rejected | ⬜ | | 20 | Error state | | ⬜ | -| 21 | Code block | | ⬜ | +| 21 | Code block | built-in synchronous highlighter; languages host-extensible | ✅ | | 22 | Thinking indicator | turning, breathing asterisk + shimmer label; active & settled | ✅ | | 23 | Shimmer | text only; sweeping highlight, static when settled | ✅ | diff --git a/CHANGELOG.md b/CHANGELOG.md index 5451eb9..9f18c8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ ## 0.2.0 (unreleased) +- **Code block** — `FlowCodeBlock`, and a `FlowCodePart` message part + rendered by `FlowMessage`/`FlowThread` with copy intent surfaced on + `onCodeCopy`. Highlighting is built in and synchronous (Dart, JSON, + JavaScript/TypeScript, Python and shell; host-extensible via + `FlowCodeLanguage.register`), colored by new `FlowSyntaxColors` theme + tokens. The package now also bundles Geist Mono (three weights, SIL OFL) + behind new `code` / `codeInline` typography roles — `withFontFamily()` + no longer touches the mono roles; swap those with + `withCodeFontFamily()`. - **Breaking**: migrated from `package:flutter/material.dart` to `package:material_ui` (Material's home since Flutter 3.47) — no API changes, but the two Materials are distinct types, so the host app must diff --git a/CLAUDE.md b/CLAUDE.md index 1253858..a04ddff 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,7 +8,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co Two hard constraints shape everything here: -- **No third-party dependencies.** `dependencies:` in `pubspec.yaml` contains only the Flutter SDK and Flutter's own first-party packages — `material_ui` (Material's home since Flutter 3.47) and its transitive set, all published by flutter.dev. Nothing outside that. Dev dependencies (`flutter_test`, `flutter_lints`) are fine. Bundled *assets* are not dependencies: the package ships Figtree (`fonts/`, SIL OFL) because the design system is set in it, declared under `flutter: fonts:` and referenced as `package: 'flow_ui'`. +- **No third-party dependencies.** `dependencies:` in `pubspec.yaml` contains only the Flutter SDK and Flutter's own first-party packages — `material_ui` (Material's home since Flutter 3.47) and its transitive set, all published by flutter.dev. Nothing outside that. Dev dependencies (`flutter_test`, `flutter_lints`) are fine. Bundled *assets* are not dependencies: the package ships Figtree and Geist Mono (`fonts/`, SIL OFL) because the design system is set in them, declared under `flutter: fonts:` and referenced as `package: 'flow_ui'`. - **Nothing model-facing.** Components render state passed in and report intent out through callbacks. No prompts, schemas, provider/network calls, or any LLM awareness — that belongs to the layers built on top. The theme, the conversation components (message, thread, streaming text, actions, loading), the composer and its menus, attachments with their preview, suggestions, and the chat surface are implemented; the roadmap below tracks the rest. Message content is modeled as typed parts (`lib/src/models/`) — sealed `FlowMessagePart` subtypes rendered by `FlowMessage`, with `FlowCustomPart` + `FlowCustomPartBuilder` as the extension seam for host-injected content. @@ -87,7 +87,7 @@ Values come from the Flow UI Figma file. Role names follow Material 3's `ColorSc | 18 | Suggestion & Suggestion Group | plain & outlined rows; scroll, wrap, column | ✅ | | 19 | Confirmation | default, approved, rejected | ⬜ | | 20 | Error state | | ⬜ | -| 21 | Code block | | ⬜ | +| 21 | Code block | built-in synchronous highlighter; languages host-extensible | ✅ | | 22 | Thinking indicator | turning, breathing asterisk + shimmer label; active & settled | ✅ | | 23 | Shimmer | text only; sweeping highlight, static when settled | ✅ | diff --git a/README.md b/README.md index f0aff52..f0852a4 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ | [`FlowStreamingText`](https://flowui.stac.dev/components/streaming-text) | Animated text reveal while a reply arrives | | [`FlowThinkingIndicator`](https://flowui.stac.dev/components/thinking-indicator) | Turning, breathing asterisk with a shimmering label | | [`FlowShimmerText`](https://flowui.stac.dev/components/shimmer-text) | Sweeping text highlight, static once settled | +| [`FlowCodeBlock`](https://flowui.stac.dev/components/code-block) | Fenced code with built-in synchronous highlighting, a header label, and a copy affordance — languages host-extensible | | [`FlowMessageActions`](https://flowui.stac.dev/components/message-actions) | Copy / regenerate / edit / feedback row under a message | | [`FlowComposer`](https://flowui.stac.dev/components/composer) | Multiline input with send/stop, attachments strip, and leading/trailing action slots | | [`FlowMenu`](https://flowui.stac.dev/components/menu) | Icon-triggered menu with groups, submenus, and toggles — anchored card on desktop, bottom sheet on phones | diff --git a/docs/src/content/docs/components/code-block.mdx b/docs/src/content/docs/components/code-block.mdx new file mode 100644 index 0000000..f11f845 --- /dev/null +++ b/docs/src/content/docs/components/code-block.mdx @@ -0,0 +1,146 @@ +--- +title: Code block +description: Fenced code on its own ground — built-in synchronous highlighting, a header label, and a copy affordance that reports intent. +sidebar: + order: 13 +--- + +import FlowDemo from '../../../components/FlowDemo.astro'; + +`FlowCodeBlock` renders a fenced snippet on its own washed ground, under a +header that names the content and offers copy. Highlighting is built in +and synchronous — no setup call, no assets, nothing async. `language` +picks a rule table (Dart, JSON, JavaScript/TypeScript, Python and shell +ship in the box); unknown ids render plain, never an error. Token inks +come from the theme's `FlowSyntaxColors`, so code recolors with the rest +of the palette in both themes. + +In a message, code arrives as a `FlowCodePart` and `FlowMessage` renders +the block for you — copy intent surfaces on `FlowThread.onCodeCopy` with +the part in hand. + +## Dart + + + +```dart title="The block reports intent; the host owns the clipboard" +FlowCodeBlock( + code: source, + language: 'dart', + filename: 'point.dart', + copyTooltip: 'Copy code', + copied: copied, + onCopy: () async { + await Clipboard.setData(ClipboardData(text: source)); + setState(() => copied = true); + // Hold `copied` for a beat, then clear it — the affordance shows a + // primary-tinted check for as long as the host says so. + }, +) +``` + +## JSON + +Keys read apart from string values, and long lines scroll horizontally +inside the block (`wrap: true` wraps them instead): + + + +```dart title="A payload with a long line" +FlowCodeBlock( + code: payload, + language: 'json', + filename: 'screen.json', + copyTooltip: 'Copy code', + onCopy: () => copy(payload), +) +``` + +## Plain + +No `language` — or one the registry doesn't know — renders plain ink; +the header can still carry a filename: + + + +```dart title="Logs, output, anything unhighlightable" +FlowCodeBlock( + code: log, + filename: 'build.log', + copyTooltip: 'Copy', + onCopy: () => copy(log), +) +``` + +## Streaming + +While `isStreaming` is true the copy affordance hides — there is nothing +complete to copy — and each delivery renders whole, with no per-character +reveal (streamed code arrives re-highlighted as often as appended, which +a reveal would restart on). In a thread this is automatic while the +message streams: + + + +```dart title="Code parts in a streaming thread" +FlowThread( + messages: messages, + codeCopyTooltip: 'Copy code', + copiedCodePart: copiedPart, + onCodeCopy: (part) async { + await Clipboard.setData(ClipboardData(text: part.code)); + setState(() => copiedPart = part); + }, +) +``` + +## Languages + +The registry is host-extensible. `FlowCodeLanguage` is an ordered rule +table — earlier rules win, so comments and strings come first — and +`register` makes it resolvable from every block: + +```dart title="Registering a language" +FlowCodeLanguage.register( + const FlowCodeLanguage( + id: 'lisp', + rules: [ + FlowSyntaxRule(FlowSyntaxToken.comment, r';[^\n]*'), + FlowSyntaxRule(FlowSyntaxToken.string, r'"(?:\\.|[^"\\])*"'), + FlowSyntaxRule(FlowSyntaxToken.punctuation, r'[()]+'), + ], + ), +); +``` + +## Theming + +Token inks are theme tokens. Install a `FlowSyntaxColors` on the theme to +recolor them; the code face is Geist Mono, bundled with the package, and +swaps via the typography: + +```dart title="Custom syntax palette and mono face" +FlowTheme( + colors: FlowColors.light, + syntax: FlowSyntaxColors.light.copyWith(keyword: myBrandAccent), + typography: FlowTypography.standard.withCodeFontFamily('JetBrainsMono'), +) +``` + +## Key API + +- `FlowCodeBlock` — `code`, `language` (id or alias, case-insensitive), + `filename` (header label; falls back to `language`), `onCopy` / + `copied` / `copyTooltip` (intent out, host-owned confirmation), + `isStreaming`, `wrap`, plus `padding` and `borderRadius` over the + design's 16/12 inset and 12px corner. +- `FlowCodePart` — `code`, `language`, `filename`; rendered by + `FlowMessage`, skipped in system messages. +- `FlowThread` / `FlowMessage` — `onCodeCopy` (handed the tapped part), + `copiedCodePart` (pass the instance back while the confirmation lasts), + `codeCopyTooltip`. +- `FlowCodeLanguage` — `find`, `register`, and the built-ins (`dart`, + `json`, `javascript`, `python`, `bash`, `plain`); `FlowSyntaxRule` + pairs a regex with a `FlowSyntaxToken`. +- `FlowSyntaxColors` — eight token roles with light and dark presets, on + `FlowTheme.syntax`. diff --git a/docs/src/content/docs/roadmap.md b/docs/src/content/docs/roadmap.md index 024ad9e..355b009 100644 --- a/docs/src/content/docs/roadmap.md +++ b/docs/src/content/docs/roadmap.md @@ -40,7 +40,7 @@ elements and the remaining AI states are on the way. | Suggestions | Shipped | | Confirmation | Planned | | Error state | Planned | -| Code block | Planned | +| Code block | Shipped | | Thinking indicator | Shipped | | Shimmer | Shipped | diff --git a/fonts/GeistMono-Medium.ttf b/fonts/GeistMono-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ff49ece5a3dbc6012320749a398ea6daca096aeb GIT binary patch literal 149328 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�yj3@rDuD5@3s_u9~XZY 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 literal 0 HcmV?d00001 diff --git a/fonts/GeistMono-Regular.ttf b/fonts/GeistMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..50c9d5a667bc397a1495b0bb45a52bef4184661c GIT binary patch literal 148516 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

qKjwHQ!ob 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%0DkIT7^Cr|?j=S6Pw9Kpm~8w?-&>9_ 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 Gk@;Vye(^v6 literal 0 HcmV?d00001 diff --git a/fonts/OFL-GeistMono.txt b/fonts/OFL-GeistMono.txt new file mode 100644 index 0000000..04e95fc --- /dev/null +++ b/fonts/OFL-GeistMono.txt @@ -0,0 +1,93 @@ +Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/lib/flow_ui.dart b/lib/flow_ui.dart index 2d1abab..846b47d 100644 --- a/lib/flow_ui.dart +++ b/lib/flow_ui.dart @@ -10,11 +10,13 @@ export 'src/models/flow_attachment.dart'; export 'src/models/flow_message_data.dart'; export 'src/models/flow_message_part.dart'; export 'src/theme/flow_colors.dart'; +export 'src/theme/flow_syntax_colors.dart'; export 'src/theme/flow_theme.dart'; export 'src/theme/flow_typography.dart'; export 'src/widgets/flow_attachment_group.dart'; export 'src/widgets/flow_attachment_preview.dart'; export 'src/widgets/flow_chat_screen.dart'; +export 'src/widgets/flow_code_block.dart'; export 'src/widgets/flow_composer.dart'; export 'src/widgets/flow_greeting.dart'; export 'src/widgets/flow_menu.dart'; diff --git a/lib/src/models/flow_message_part.dart b/lib/src/models/flow_message_part.dart index 8bfdcd6..1b3cf49 100644 --- a/lib/src/models/flow_message_part.dart +++ b/lib/src/models/flow_message_part.dart @@ -4,7 +4,7 @@ import 'flow_attachment.dart'; /// One piece of content inside a `FlowMessageData`. /// -/// Sealed so renderers can switch exhaustively. More part types (code, tool) +/// Sealed so renderers can switch exhaustively. More part types (tool) /// arrive alongside their components; [FlowCustomPart] is how hosts inject /// arbitrary content today. @immutable @@ -26,6 +26,22 @@ class FlowAttachmentPart extends FlowMessagePart { final List attachments; } +/// Fenced code, rendered by a `FlowCodeBlock`. +class FlowCodePart extends FlowMessagePart { + const FlowCodePart(this.code, {this.language, this.filename}); + + /// The source, verbatim. + final String code; + + /// `FlowCodeLanguage` id or alias — usually the fence info string, e.g. + /// `'dart'`. Null or unknown renders plain. + final String? language; + + /// The block's header label, e.g. a file hint beside the fence. Null + /// falls back to [language]. + final String? filename; +} + /// Host-defined content, rendered through a `FlowCustomPartBuilder`. class FlowCustomPart extends FlowMessagePart { const FlowCustomPart({required this.type, this.data}); diff --git a/lib/src/theme/flow_syntax_colors.dart b/lib/src/theme/flow_syntax_colors.dart new file mode 100644 index 0000000..70c1c40 --- /dev/null +++ b/lib/src/theme/flow_syntax_colors.dart @@ -0,0 +1,110 @@ +import 'package:material_ui/material_ui.dart'; + +/// Syntax token colors for the code block. +/// +/// Eight roles cover what the built-in highlighter distinguishes; plain +/// code takes the ambient ink (`FlowColors.onSurface`), so no role exists +/// for it. Unlike the ink ramp these are resolved, opaque colors — a hue +/// at an alpha would drift on the code block's washed ground. +/// +/// The presets are drawn to sit with the shipped palettes: hues keyed to +/// the warm paper and rose accent of the light theme, the same set lifted +/// for dark. +@immutable +class FlowSyntaxColors { + const FlowSyntaxColors({ + required this.keyword, + required this.type, + required this.function, + required this.string, + required this.number, + required this.comment, + required this.meta, + required this.punctuation, + }); + + /// Reserved words and control flow — `class`, `if`, `return`. + final Color keyword; + + /// Type names: uppercase identifiers and language primitives. + final Color type; + + /// A call or declaration site — an identifier ahead of its `(`. + final Color function; + + /// String literals, quotes included. + final Color string; + + /// Numeric literals. + final Color number; + + /// Comments. + final Color comment; + + /// Annotations, decorators and shell variables — `@override`, `$HOME`. + final Color meta; + + /// Brackets, separators and operators. + final Color punctuation; + + /// Light preset: saturated inks on warm paper, the keyword in the + /// palette's rose family. + static const FlowSyntaxColors light = FlowSyntaxColors( + keyword: Color(0xFFA62457), + type: Color(0xFF96540A), + function: Color(0xFF6E4DBE), + string: Color(0xFF0E7264), + number: Color(0xFF1F63BC), + comment: Color(0xFF8C8579), + meta: Color(0xFF5F6E8C), + punctuation: Color(0xFF6F6A60), + ); + + /// Dark preset: the same hues lifted to read on the dark ground. + static const FlowSyntaxColors dark = FlowSyntaxColors( + keyword: Color(0xFFEF6E9F), + type: Color(0xFFD9A054), + function: Color(0xFFB49AEC), + string: Color(0xFF5BC4AF), + number: Color(0xFF74A9EC), + comment: Color(0xFF8A8177), + meta: Color(0xFF8FA3CE), + punctuation: Color(0xFF938D82), + ); + + FlowSyntaxColors copyWith({ + Color? keyword, + Color? type, + Color? function, + Color? string, + Color? number, + Color? comment, + Color? meta, + Color? punctuation, + }) { + return FlowSyntaxColors( + keyword: keyword ?? this.keyword, + type: type ?? this.type, + function: function ?? this.function, + string: string ?? this.string, + number: number ?? this.number, + comment: comment ?? this.comment, + meta: meta ?? this.meta, + punctuation: punctuation ?? this.punctuation, + ); + } + + FlowSyntaxColors lerp(FlowSyntaxColors? other, double t) { + if (other == null) return this; + return FlowSyntaxColors( + keyword: Color.lerp(keyword, other.keyword, t)!, + type: Color.lerp(type, other.type, t)!, + function: Color.lerp(function, other.function, t)!, + string: Color.lerp(string, other.string, t)!, + number: Color.lerp(number, other.number, t)!, + comment: Color.lerp(comment, other.comment, t)!, + meta: Color.lerp(meta, other.meta, t)!, + punctuation: Color.lerp(punctuation, other.punctuation, t)!, + ); + } +} diff --git a/lib/src/theme/flow_theme.dart b/lib/src/theme/flow_theme.dart index e8848b3..2363ba2 100644 --- a/lib/src/theme/flow_theme.dart +++ b/lib/src/theme/flow_theme.dart @@ -1,6 +1,7 @@ import 'package:material_ui/material_ui.dart'; import 'flow_colors.dart'; +import 'flow_syntax_colors.dart'; import 'flow_typography.dart'; /// The flow_ui design tokens — colors and typography — installed as a @@ -28,22 +29,36 @@ class FlowTheme extends ThemeExtension { const FlowTheme({ required this.colors, this.typography = FlowTypography.standard, + this.syntax, }); /// Light preset. - factory FlowTheme.light() => const FlowTheme(colors: FlowColors.light); + factory FlowTheme.light() => + const FlowTheme(colors: FlowColors.light, syntax: FlowSyntaxColors.light); /// Dark preset. - factory FlowTheme.dark() => const FlowTheme(colors: FlowColors.dark); + factory FlowTheme.dark() => + const FlowTheme(colors: FlowColors.dark, syntax: FlowSyntaxColors.dark); final FlowColors colors; final FlowTypography typography; + /// Syntax token colors for code blocks. Null resolves to the preset + /// matching the ambient brightness — unlike [typography], the right + /// default depends on which way the theme leans, which a constructor + /// default can't see. + final FlowSyntaxColors? syntax; + @override - FlowTheme copyWith({FlowColors? colors, FlowTypography? typography}) { + FlowTheme copyWith({ + FlowColors? colors, + FlowTypography? typography, + FlowSyntaxColors? syntax, + }) { return FlowTheme( colors: colors ?? this.colors, typography: typography ?? this.typography, + syntax: syntax ?? this.syntax, ); } @@ -53,6 +68,7 @@ class FlowTheme extends ThemeExtension { return FlowTheme( colors: colors.lerp(other.colors, t), typography: typography.lerp(other.typography, t), + syntax: syntax == null ? other.syntax : syntax!.lerp(other.syntax, t), ); } } @@ -71,4 +87,14 @@ extension FlowThemeContext on BuildContext { FlowColors get flowColors => flowTheme.colors; FlowTypography get flowTypography => flowTheme.typography; + + /// Syntax colors: the installed set, or the preset matching the ambient + /// brightness when the theme carries none. + FlowSyntaxColors get flowSyntaxColors { + final syntax = flowTheme.syntax; + if (syntax != null) return syntax; + return Theme.of(this).brightness == Brightness.dark + ? FlowSyntaxColors.dark + : FlowSyntaxColors.light; + } } diff --git a/lib/src/theme/flow_typography.dart b/lib/src/theme/flow_typography.dart index 1cd6f3b..6721102 100644 --- a/lib/src/theme/flow_typography.dart +++ b/lib/src/theme/flow_typography.dart @@ -1,13 +1,34 @@ import 'package:material_ui/material_ui.dart'; -/// The typeface the presets are drawn in, bundled with this package under -/// `fonts/` (SIL Open Font License — see `fonts/OFL.txt`). +/// The typefaces the presets are drawn in, bundled with this package under +/// `fonts/` (SIL Open Font License — see `fonts/OFL.txt` and +/// `fonts/OFL-GeistMono.txt`): Figtree for prose, Geist Mono for code. /// -/// Declared with `package:` so the family resolves to `packages/flow_ui/…` -/// and a host gets the design's typeface without adding a font of their own. +/// Declared with `package:` so the families resolve to `packages/flow_ui/…` +/// and a host gets the design's typefaces without adding a font of their +/// own. const String _fontFamily = 'Figtree'; +const String _monoFontFamily = 'GeistMono'; const String _fontPackage = 'flow_ui'; +/// The mono roles' standard cuts — file-level so they can double as the +/// constructor defaults, which keeps [FlowTypography]'s pre-code +/// constructor calls compiling unchanged. +const TextStyle _standardCode = TextStyle( + fontFamily: _monoFontFamily, + package: _fontPackage, + fontSize: 13, + fontWeight: FontWeight.w400, + height: 1.6, +); +const TextStyle _standardCodeInline = TextStyle( + fontFamily: _monoFontFamily, + package: _fontPackage, + fontSize: 14, + fontWeight: FontWeight.w400, + height: 1.5, +); + /// Text style tokens for flow_ui components. /// /// Follows the Material 3 type scale (display / headline / title / body / @@ -44,6 +65,8 @@ class FlowTypography { required this.labelLarge, required this.labelMedium, required this.labelSmall, + this.code = _standardCode, + this.codeInline = _standardCodeInline, }); final TextStyle displayLarge; @@ -74,7 +97,15 @@ class FlowTypography { final TextStyle labelMedium; final TextStyle labelSmall; - /// The Flow type scale, in Figtree. + /// Code, set in the bundled Geist Mono — the code block's body. A step + /// under prose (13) on a taller line (1.6), so a block reads as inset + /// material rather than continuing the paragraph. + final TextStyle code; + + /// The mono face at prose size, for future inline code spans. + final TextStyle codeInline; + + /// The Flow type scale: Figtree, with the code roles in Geist Mono. static const FlowTypography standard = FlowTypography( displayLarge: TextStyle( fontFamily: _fontFamily, @@ -228,6 +259,8 @@ class FlowTypography { ); /// The same scale set in [fontFamily] instead of the bundled Figtree. + /// The mono roles keep their own face — swap those with + /// [withCodeFontFamily]. /// /// Pass [package] when the font ships inside a package rather than the app. /// Each style is rebuilt from the four things the scale carries — size, @@ -265,9 +298,28 @@ class FlowTypography { labelLarge: reface(labelLarge), labelMedium: reface(labelMedium), labelSmall: reface(labelSmall), + code: code, + codeInline: codeInline, ); } + /// The same scale with only [code] and [codeInline] set in [fontFamily] — + /// for hosts swapping the mono face while keeping the prose one. + /// + /// Rebuilt from size, weight and line height, like [withFontFamily]. + FlowTypography withCodeFontFamily(String fontFamily, {String? package}) { + TextStyle reface(TextStyle style) => TextStyle( + fontFamily: fontFamily, + package: package, + fontSize: style.fontSize, + fontWeight: style.fontWeight, + height: style.height, + letterSpacing: style.letterSpacing, + ); + + return copyWith(code: reface(code), codeInline: reface(codeInline)); + } + FlowTypography copyWith({ TextStyle? displayLarge, TextStyle? displayMedium, @@ -290,6 +342,8 @@ class FlowTypography { TextStyle? labelLarge, TextStyle? labelMedium, TextStyle? labelSmall, + TextStyle? code, + TextStyle? codeInline, }) { return FlowTypography( displayLarge: displayLarge ?? this.displayLarge, @@ -313,6 +367,8 @@ class FlowTypography { labelLarge: labelLarge ?? this.labelLarge, labelMedium: labelMedium ?? this.labelMedium, labelSmall: labelSmall ?? this.labelSmall, + code: code ?? this.code, + codeInline: codeInline ?? this.codeInline, ); } @@ -352,6 +408,8 @@ class FlowTypography { labelLarge: TextStyle.lerp(labelLarge, other.labelLarge, t)!, labelMedium: TextStyle.lerp(labelMedium, other.labelMedium, t)!, labelSmall: TextStyle.lerp(labelSmall, other.labelSmall, t)!, + code: TextStyle.lerp(code, other.code, t)!, + codeInline: TextStyle.lerp(codeInline, other.codeInline, t)!, ); } } diff --git a/lib/src/utils/flow_syntax_highlighter.dart b/lib/src/utils/flow_syntax_highlighter.dart new file mode 100644 index 0000000..c8a78a1 --- /dev/null +++ b/lib/src/utils/flow_syntax_highlighter.dart @@ -0,0 +1,397 @@ +import 'package:material_ui/material_ui.dart'; + +import '../theme/flow_syntax_colors.dart'; + +// The highlighting engine behind FlowCodeBlock. The registry types are +// re-exported through flow_code_block.dart so hosts can add languages; the +// engine itself is not part of the public surface. +// +// The string-in / TextSpan-out shape follows serverpod's syntax_highlight, +// but where that package walks TextMate grammars loaded from assets (and so +// needs async setup), this one compiles a language's ordered rule table +// into a single alternated regex and colors matches in one synchronous +// pass. Rule order is precedence: at the same position the earlier rule's +// alternative wins, which is how a keyword inside a comment stays a +// comment. + +/// The token classes the built-in highlighter distinguishes, each colored +/// by the matching [FlowSyntaxColors] role. Anything no rule claims stays +/// plain ink. +enum FlowSyntaxToken { + /// Reserved words and control flow — `class`, `if`, `return`. + keyword, + + /// Type names: uppercase identifiers and language primitives. + type, + + /// A call or declaration site — an identifier ahead of its `(`. + function, + + /// String literals, quotes included. + string, + + /// Numeric literals. + number, + + /// Comments. + comment, + + /// Annotations, decorators and shell variables — `@override`, `$HOME`. + meta, + + /// Brackets, separators and operators. + punctuation, +} + +/// One highlighting rule: every match of [pattern] reads as [token]. +/// +/// [pattern] is regex *source*, not a [RegExp] — the language joins its +/// rules into one alternation, so a pattern must not contain named groups +/// or numbered backreferences (plain `(…)` groups are fine). +@immutable +class FlowSyntaxRule { + const FlowSyntaxRule(this.token, this.pattern); + + final FlowSyntaxToken token; + final String pattern; +} + +/// A language the code block can highlight: an id, lookup aliases, and an +/// ordered rule table. +/// +/// The built-ins cover the fences an assistant most often emits — Dart, +/// JSON, JavaScript/TypeScript, Python and shell. Hosts extend the set: +/// +/// ```dart +/// FlowCodeLanguage.register( +/// const FlowCodeLanguage( +/// id: 'lisp', +/// rules: [FlowSyntaxRule(FlowSyntaxToken.comment, r';[^\n]*')], +/// ), +/// ); +/// ``` +/// +/// Rules earlier in the table take precedence, so comments and strings +/// come first. +@immutable +class FlowCodeLanguage { + const FlowCodeLanguage({ + required this.id, + this.aliases = const [], + required this.rules, + }); + + /// Canonical name, lowercase by convention — what a fence info string + /// usually carries. + final String id; + + /// Other names [find] resolves, e.g. `'py'` for `'python'`. + final List aliases; + + /// Ordered by precedence. + final List rules; + + static final Map _registry = () { + final map = {}; + for (final language in [dart, json, javascript, python, bash, plain]) { + _add(map, language); + } + return map; + }(); + + static void _add( + Map map, + FlowCodeLanguage language, + ) { + map[language.id.toLowerCase()] = language; + for (final alias in language.aliases) { + map[alias.toLowerCase()] = language; + } + } + + /// Makes [language] resolvable through [find], replacing any earlier + /// registration of the same id or alias. + static void register(FlowCodeLanguage language) { + _add(_registry, language); + FlowSyntaxHighlighter._invalidate(language.id); + } + + /// The language for [id] — or an alias, case-insensitively — and null + /// when unknown: the caller renders plain, never an error. + static FlowCodeLanguage? find(String? id) { + if (id == null) return null; + return _registry[id.trim().toLowerCase()]; + } + + /// No rules: source renders in plain ink. The explicit registration lets + /// `'text'` fences resolve rather than fall through as unknown (the + /// rendering is the same either way). + static const FlowCodeLanguage plain = FlowCodeLanguage( + id: 'plain', + aliases: ['text', 'txt'], + rules: [], + ); + + static const FlowCodeLanguage dart = FlowCodeLanguage( + id: 'dart', + rules: [ + FlowSyntaxRule(FlowSyntaxToken.comment, r'//[^\n]*'), + FlowSyntaxRule(FlowSyntaxToken.comment, r'/\*[\s\S]*?\*/'), + FlowSyntaxRule(FlowSyntaxToken.string, r"r?'''[\s\S]*?'''"), + FlowSyntaxRule(FlowSyntaxToken.string, r'r?"""[\s\S]*?"""'), + FlowSyntaxRule(FlowSyntaxToken.string, r"r?'(?:\\.|[^'\\\n])*'"), + FlowSyntaxRule(FlowSyntaxToken.string, r'r?"(?:\\.|[^"\\\n])*"'), + FlowSyntaxRule(FlowSyntaxToken.meta, r'@[A-Za-z_][A-Za-z0-9_]*'), + FlowSyntaxRule(FlowSyntaxToken.number, r'\b0[xX][0-9a-fA-F_]+\b'), + FlowSyntaxRule( + FlowSyntaxToken.number, + r'\b\d[\d_]*(?:\.\d[\d_]*)?(?:[eE][+-]?\d+)?\b', + ), + FlowSyntaxRule( + FlowSyntaxToken.keyword, + r'\b(?:abstract|as|assert|async|await|base|break|case|catch|class|' + r'const|continue|covariant|default|deferred|do|dynamic|else|enum|' + r'export|extends|extension|external|factory|false|final|finally|for|' + r'get|hide|if|implements|import|in|interface|is|late|library|mixin|' + r'new|null|on|operator|part|required|rethrow|return|sealed|set|show|' + r'static|super|switch|sync|this|throw|true|try|typedef|var|void|when|' + r'while|with|yield)\b', + ), + FlowSyntaxRule(FlowSyntaxToken.type, r'\b(?:int|double|num|bool)\b'), + FlowSyntaxRule(FlowSyntaxToken.type, r'\b[A-Z][A-Za-z0-9_]*\b'), + FlowSyntaxRule( + FlowSyntaxToken.function, + r'\b[a-z_][A-Za-z0-9_]*(?=\s*\()', + ), + FlowSyntaxRule( + FlowSyntaxToken.punctuation, + r'[{}\[\]().,;:]+|[-+*/%=<>!&|^~?]+', + ), + ], + ); + + static const FlowCodeLanguage json = FlowCodeLanguage( + id: 'json', + aliases: ['jsonc'], + rules: [ + // Line comments aren't JSON, but assistants emit them anyway (and + // jsonc makes them official). + FlowSyntaxRule(FlowSyntaxToken.comment, r'//[^\n]*'), + // A key: a string ahead of its colon — must outrank the value rule. + FlowSyntaxRule(FlowSyntaxToken.type, r'"(?:\\.|[^"\\])*"(?=\s*:)'), + FlowSyntaxRule(FlowSyntaxToken.string, r'"(?:\\.|[^"\\])*"'), + FlowSyntaxRule(FlowSyntaxToken.keyword, r'\b(?:true|false|null)\b'), + FlowSyntaxRule( + FlowSyntaxToken.number, + r'-?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b', + ), + FlowSyntaxRule(FlowSyntaxToken.punctuation, r'[{}\[\],:]+'), + ], + ); + + /// One C-family table serves both: TypeScript is close enough to + /// JavaScript at highlighting depth that separate tables would only + /// drift. + static const FlowCodeLanguage javascript = FlowCodeLanguage( + id: 'javascript', + aliases: ['js', 'jsx', 'typescript', 'ts', 'tsx'], + rules: [ + FlowSyntaxRule(FlowSyntaxToken.comment, r'//[^\n]*'), + FlowSyntaxRule(FlowSyntaxToken.comment, r'/\*[\s\S]*?\*/'), + FlowSyntaxRule(FlowSyntaxToken.string, r'`[\s\S]*?`'), + FlowSyntaxRule(FlowSyntaxToken.string, r"'(?:\\.|[^'\\\n])*'"), + FlowSyntaxRule(FlowSyntaxToken.string, r'"(?:\\.|[^"\\\n])*"'), + FlowSyntaxRule(FlowSyntaxToken.meta, r'@[A-Za-z_$][A-Za-z0-9_$]*'), + FlowSyntaxRule(FlowSyntaxToken.number, r'\b0[xX][0-9a-fA-F_]+n?\b'), + FlowSyntaxRule( + FlowSyntaxToken.number, + r'\b\d[\d_]*(?:\.\d[\d_]*)?(?:[eE][+-]?\d+)?n?\b', + ), + FlowSyntaxRule( + FlowSyntaxToken.keyword, + r'\b(?:abstract|as|async|await|break|case|catch|class|const|continue|' + r'debugger|declare|default|delete|do|else|enum|export|extends|false|' + r'finally|for|from|function|get|if|implements|import|in|infer|' + r'instanceof|interface|is|keyof|let|namespace|new|null|of|override|' + r'private|protected|public|readonly|return|satisfies|set|static|' + r'super|switch|this|throw|true|try|type|typeof|undefined|var|void|' + r'while|with|yield)\b', + ), + FlowSyntaxRule( + FlowSyntaxToken.type, + r'\b(?:any|bigint|boolean|never|number|object|string|symbol|' + r'unknown)\b', + ), + FlowSyntaxRule(FlowSyntaxToken.type, r'\b[A-Z][A-Za-z0-9_$]*\b'), + FlowSyntaxRule( + FlowSyntaxToken.function, + r'\b[A-Za-z_$][A-Za-z0-9_$]*(?=\s*\()', + ), + FlowSyntaxRule( + FlowSyntaxToken.punctuation, + r'[{}\[\]().,;:]+|[-+*/%=<>!&|^~?]+', + ), + ], + ); + + static const FlowCodeLanguage python = FlowCodeLanguage( + id: 'python', + aliases: ['py'], + rules: [ + FlowSyntaxRule(FlowSyntaxToken.comment, r'#[^\n]*'), + FlowSyntaxRule( + FlowSyntaxToken.string, + r"(?:[rbfuRBFU]{1,2})?'''[\s\S]*?'''", + ), + FlowSyntaxRule( + FlowSyntaxToken.string, + r'(?:[rbfuRBFU]{1,2})?"""[\s\S]*?"""', + ), + FlowSyntaxRule( + FlowSyntaxToken.string, + r"(?:[rbfuRBFU]{1,2})?'(?:\\.|[^'\\\n])*'", + ), + FlowSyntaxRule( + FlowSyntaxToken.string, + r'(?:[rbfuRBFU]{1,2})?"(?:\\.|[^"\\\n])*"', + ), + FlowSyntaxRule(FlowSyntaxToken.meta, r'@[A-Za-z_][A-Za-z0-9_.]*'), + FlowSyntaxRule(FlowSyntaxToken.number, r'\b0[xXoObB][0-9a-fA-F_]+\b'), + FlowSyntaxRule( + FlowSyntaxToken.number, + r'\b\d[\d_]*(?:\.\d[\d_]*)?(?:[eE][+-]?\d+)?\b', + ), + FlowSyntaxRule( + FlowSyntaxToken.keyword, + r'\b(?:and|as|assert|async|await|break|case|class|continue|def|del|' + r'elif|else|except|False|finally|for|from|global|if|import|in|is|' + r'lambda|match|None|nonlocal|not|or|pass|raise|return|self|True|try|' + r'while|with|yield)\b', + ), + FlowSyntaxRule( + FlowSyntaxToken.type, + r'\b(?:bool|bytes|dict|float|frozenset|int|list|object|set|str|' + r'tuple)\b', + ), + FlowSyntaxRule(FlowSyntaxToken.type, r'\b[A-Z][A-Za-z0-9_]*\b'), + FlowSyntaxRule( + FlowSyntaxToken.function, + r'\b[a-z_][A-Za-z0-9_]*(?=\s*\()', + ), + FlowSyntaxRule( + FlowSyntaxToken.punctuation, + r'[{}\[\]().,;:]+|[-+*/%=<>!&|@^~]+', + ), + ], + ); + + static const FlowCodeLanguage bash = FlowCodeLanguage( + id: 'bash', + aliases: ['sh', 'shell', 'zsh'], + rules: [ + FlowSyntaxRule(FlowSyntaxToken.comment, r'#[^\n]*'), + FlowSyntaxRule(FlowSyntaxToken.string, r"'[^']*'"), + FlowSyntaxRule(FlowSyntaxToken.string, r'"(?:\\.|[^"\\])*"'), + // Variables and expansions get the meta ink — the shell's one real + // syntax. + FlowSyntaxRule( + FlowSyntaxToken.meta, + r'\$\{[^}\n]*\}|\$[A-Za-z_][A-Za-z0-9_]*|\$[?$!#@*0-9-]', + ), + FlowSyntaxRule( + FlowSyntaxToken.keyword, + r'\b(?:alias|break|case|cd|continue|declare|do|done|echo|elif|else|' + r'esac|exit|export|fi|for|function|if|in|local|read|return|select|' + r'set|shift|source|then|unset|until|while)\b', + ), + FlowSyntaxRule(FlowSyntaxToken.number, r'\b\d+\b'), + FlowSyntaxRule(FlowSyntaxToken.punctuation, r'[|&;<>(){}\[\]=]+'), + ], + ); +} + +/// Colors source through a language's rule table — synchronously: no +/// assets, no setup call, safe to run in `build`. +abstract final class FlowSyntaxHighlighter { + /// Compiled alternations, keyed by language id. [FlowCodeLanguage.register] + /// invalidates its id here so a replacement table takes effect. + static final Map _compiled = {}; + + static void _invalidate(String id) => _compiled.remove(id); + + static RegExp _patternFor(FlowCodeLanguage language) { + return _compiled.putIfAbsent(language.id, () { + // Each rule in its own named group: whichever group a match filled + // names the rule that won, without counting the rule's internal + // groups. + final source = [ + for (var i = 0; i < language.rules.length; i++) + '(?${language.rules[i].pattern})', + ].join('|'); + return RegExp(source, multiLine: true); + }); + } + + /// [code] as a single [TextSpan]: plain stretches in [style], each rule + /// match in the [colors] role of its token. Null or empty [language] + /// renders the whole string plain. + static TextSpan highlight( + String code, { + FlowCodeLanguage? language, + required TextStyle style, + required FlowSyntaxColors colors, + }) { + if (language == null || language.rules.isEmpty || code.isEmpty) { + return TextSpan(text: code, style: style); + } + + final rules = language.rules; + final pattern = _patternFor(language); + final children = []; + var position = 0; + + for (final match in pattern.allMatches(code)) { + if (match.end == match.start) continue; + if (match.start > position) { + children.add(TextSpan(text: code.substring(position, match.start))); + } + + FlowSyntaxToken? token; + for (var i = 0; i < rules.length; i++) { + if (match.namedGroup('g$i') != null) { + token = rules[i].token; + break; + } + } + + children.add( + TextSpan( + text: code.substring(match.start, match.end), + style: token == null + ? null + : TextStyle(color: _colorFor(token, colors)), + ), + ); + position = match.end; + } + + if (position < code.length) { + children.add(TextSpan(text: code.substring(position))); + } + + return TextSpan(style: style, children: children); + } + + static Color _colorFor(FlowSyntaxToken token, FlowSyntaxColors colors) { + return switch (token) { + FlowSyntaxToken.keyword => colors.keyword, + FlowSyntaxToken.type => colors.type, + FlowSyntaxToken.function => colors.function, + FlowSyntaxToken.string => colors.string, + FlowSyntaxToken.number => colors.number, + FlowSyntaxToken.comment => colors.comment, + FlowSyntaxToken.meta => colors.meta, + FlowSyntaxToken.punctuation => colors.punctuation, + }; + } +} diff --git a/lib/src/widgets/flow_code_block.dart b/lib/src/widgets/flow_code_block.dart new file mode 100644 index 0000000..fa2e1b9 --- /dev/null +++ b/lib/src/widgets/flow_code_block.dart @@ -0,0 +1,297 @@ +import 'package:material_ui/material_ui.dart'; + +import '../theme/flow_syntax_colors.dart'; +import '../theme/flow_theme.dart'; +import '../utils/flow_syntax_highlighter.dart'; + +export '../utils/flow_syntax_highlighter.dart' + show FlowCodeLanguage, FlowSyntaxRule, FlowSyntaxToken; + +/// A code block: a fenced snippet on its own washed ground, under a header +/// that names the content and offers copy. +/// +/// ```dart +/// FlowCodeBlock( +/// code: source, +/// language: 'dart', +/// copyTooltip: 'Copy code', +/// copied: copied, +/// onCopy: () => copy(source), +/// ) +/// ``` +/// +/// Highlighting is built in and synchronous — no setup call, nothing +/// async. [language] picks a rule table via [FlowCodeLanguage.find]; +/// unknown ids render plain, never an error, and hosts add languages with +/// [FlowCodeLanguage.register]. Token inks come from the theme's +/// [FlowSyntaxColors]. +/// +/// Copying reports intent, per the package's contract: [onCopy] fires, the +/// host writes the clipboard, then holds [copied] true while its +/// confirmation lasts — the affordance swaps to a check, tinted primary +/// like a selected message action. The package touches no clipboard and +/// ships no strings; [copyTooltip] is the affordance's accessible name. +/// +/// Fills the width it's given, so it needs a bounded width — any column, +/// list or message slot provides one. +class FlowCodeBlock extends StatefulWidget { + const FlowCodeBlock({ + super.key, + required this.code, + this.language, + this.filename, + this.onCopy, + this.copyTooltip, + this.copied = false, + this.isStreaming = false, + this.wrap = false, + this.padding, + this.borderRadius, + }); + + /// The source, rendered verbatim. + final String code; + + /// [FlowCodeLanguage] id or alias, case-insensitive — usually the fence + /// info string. Null or unknown renders plain. + final String? language; + + /// Header label; null falls back to [language], and with neither the + /// header keeps only the copy affordance. + final String? filename; + + /// Copy intent. Null hides the affordance. + final VoidCallback? onCopy; + + /// Host-localized; also the affordance's accessible name. + final String? copyTooltip; + + /// Swaps the affordance to a check while true. The host owns the + /// confirmation and its timing, as with `FlowMessageAction.thumbUp`. + final bool copied; + + /// While true the copy affordance hides — there is nothing complete to + /// copy — and each delivery renders whole, with no per-character reveal: + /// streamed code arrives re-highlighted as often as appended, which a + /// reveal would restart on. + final bool isStreaming; + + /// False scrolls long lines horizontally inside the block, keeping the + /// author's line breaks; true wraps them instead. + final bool wrap; + + /// Around the code. Defaults to the design's 16/12. + final EdgeInsetsGeometry? padding; + + /// The block's corner. Defaults to the design's 12. + final BorderRadius? borderRadius; + + @override + State createState() => _FlowCodeBlockState(); +} + +class _FlowCodeBlockState extends State { + /// The design's block: the message bubble's 12px corner, code inset + /// 16/12, and a 36 header — 6px around the copy affordance's 24 frame, + /// with the label a full 16 from the edge so it aligns with the code. + static const BorderRadius _radius = BorderRadius.all(Radius.circular(12)); + static const EdgeInsetsGeometry _bodyPadding = EdgeInsets.symmetric( + horizontal: 16, + vertical: 12, + ); + static const double _headerHeight = 36; + static const EdgeInsetsGeometry _headerPadding = EdgeInsets.only( + left: 16, + right: 6, + ); + + /// The block's ground: the same 4% ink wash as the user bubble and the + /// attachment tiles, edged with the tiles' outline hairline. + static const double _groundOpacity = 0.04; + + /// The last highlight and the inputs it was computed from. Tokenizing + /// re-scans the whole source, so a rebuild that changes none of the + /// inputs — an ancestor animating, a hover elsewhere — must not pay for + /// one. + TextSpan? _span; + String? _spanCode; + FlowCodeLanguage? _spanLanguage; + TextStyle? _spanStyle; + FlowSyntaxColors? _spanColors; + + TextSpan _highlight( + FlowCodeLanguage? language, + TextStyle style, + FlowSyntaxColors colors, + ) { + final cached = _span; + if (cached != null && + _spanCode == widget.code && + identical(_spanLanguage, language) && + _spanStyle == style && + identical(_spanColors, colors)) { + return cached; + } + final span = FlowSyntaxHighlighter.highlight( + widget.code, + language: language, + style: style, + colors: colors, + ); + _span = span; + _spanCode = widget.code; + _spanLanguage = language; + _spanStyle = style; + _spanColors = colors; + return span; + } + + @override + Widget build(BuildContext context) { + final colors = context.flowColors; + final typography = context.flowTypography; + final syntaxColors = context.flowSyntaxColors; + + final language = FlowCodeLanguage.find(widget.language); + final span = _highlight( + language, + typography.code.copyWith(color: colors.onSurface), + syntaxColors, + ); + + final label = widget.filename ?? widget.language; + final showCopy = widget.onCopy != null && !widget.isStreaming; + final hasHeader = label != null || widget.onCopy != null; + + final padding = widget.padding ?? _bodyPadding; + final code = SelectableText.rich(span); + final body = widget.wrap + ? Padding(padding: padding, child: code) + // Padding inside the scroll view, so the last column of a long + // line clears the edge instead of sitting against the clip. + : SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: padding, + child: code, + ); + + return Container( + width: double.infinity, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: colors.onSurface.withValues(alpha: _groundOpacity), + borderRadius: widget.borderRadius ?? _radius, + border: Border.all(color: colors.outline), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + if (hasHeader) + Container( + height: _headerHeight, + padding: _headerPadding, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide(color: colors.outlineVariant), + ), + ), + child: Row( + children: [ + Expanded( + child: label == null + ? const SizedBox.shrink() + : Text( + label, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: typography.labelMedium.copyWith( + color: colors.onSurfaceVariant, + ), + ), + ), + if (showCopy) + _CopyButton( + copied: widget.copied, + tooltip: widget.copyTooltip, + onTap: widget.onCopy!, + ), + ], + ), + ), + body, + ], + ), + ); + } +} + +/// The header's copy affordance: a glyph on a 24 frame, resting at the +/// muted ink and lifting to full on hover, with the copied check tinted +/// primary — the message-action dress on a rounder corner. +class _CopyButton extends StatefulWidget { + const _CopyButton({ + required this.copied, + required this.tooltip, + required this.onTap, + }); + + final bool copied; + final String? tooltip; + final VoidCallback onTap; + + @override + State<_CopyButton> createState() => _CopyButtonState(); +} + +class _CopyButtonState extends State<_CopyButton> { + /// Breathing room around the 16 glyph inside its 24 frame. + static const double _framePadding = 4; + static const double _iconSize = 16; + + /// The frame's corner — a step under the block's 12, per the ratio the + /// menu rows keep to their card. + static const BorderRadius _frameRadius = BorderRadius.all(Radius.circular(6)); + + bool _hovered = false; + + @override + Widget build(BuildContext context) { + final colors = context.flowColors; + + final Color foreground; + if (widget.copied) { + foreground = colors.primary; + } else if (_hovered) { + foreground = colors.onSurface; + } else { + foreground = colors.onSurfaceMuted; + } + + // Transparent Material so ink and hover fills render inside the + // block's decorated container. + Widget button = Material( + type: MaterialType.transparency, + child: InkWell( + onTap: widget.onTap, + onHover: (value) => setState(() => _hovered = value), + borderRadius: _frameRadius, + hoverColor: colors.surfaceContainerHigh, + child: Padding( + padding: const EdgeInsets.all(_framePadding), + child: Icon( + widget.copied ? Icons.check : Icons.copy_outlined, + size: _iconSize, + color: foreground, + ), + ), + ), + ); + + final tooltip = widget.tooltip; + if (tooltip != null) { + button = Tooltip(message: tooltip, child: button); + } + return button; + } +} diff --git a/lib/src/widgets/flow_message.dart b/lib/src/widgets/flow_message.dart index 6e44899..a50f3f7 100644 --- a/lib/src/widgets/flow_message.dart +++ b/lib/src/widgets/flow_message.dart @@ -4,6 +4,7 @@ import '../models/flow_message_data.dart'; import '../models/flow_message_part.dart'; import '../theme/flow_theme.dart'; import 'flow_attachment_group.dart'; +import 'flow_code_block.dart'; import 'flow_thinking_indicator.dart'; import 'flow_streaming_text.dart'; @@ -35,6 +36,9 @@ class FlowMessage extends StatelessWidget { this.customPartBuilder, this.onAttachmentTap, this.previewCloseTooltip, + this.onCodeCopy, + this.copiedCodePart, + this.codeCopyTooltip, this.leading, this.footer, this.maxBubbleWidthFraction = 0.75, @@ -64,6 +68,19 @@ class FlowMessage extends StatelessWidget { /// Host-localized label for the built-in preview's close button. final String? previewCloseTooltip; + /// Copy intent from a [FlowCodePart]'s block, handed the part so the + /// host knows which code to write to the clipboard. Null hides every + /// block's copy affordance. + final ValueChanged? onCodeCopy; + + /// The part whose block shows the copied check — pass back the instance + /// received from [onCodeCopy] for as long as the confirmation should + /// last; the host owns the timing. + final FlowCodePart? copiedCodePart; + + /// Host-localized label for each code block's copy affordance. + final String? codeCopyTooltip; + /// Slot beside the content, e.g. an avatar. final Widget? leading; @@ -257,9 +274,9 @@ class FlowMessage extends StatelessWidget { style: style, textAlign: TextAlign.center, ), - // System messages are centered notices; attachments belong to - // user and assistant turns. - FlowAttachmentPart() => const SizedBox.shrink(), + // System messages are centered notices; attachments and code + // belong to user and assistant turns. + FlowAttachmentPart() || FlowCodePart() => const SizedBox.shrink(), FlowCustomPart() => customPartBuilder?.call(context, message, part) ?? const SizedBox.shrink(), @@ -276,7 +293,11 @@ class FlowMessage extends StatelessWidget { final style = typography.bodyLarge .copyWith(color: foreground, height: height) .merge(textStyle); + final onCodeCopy = this.onCodeCopy; + // Only text parts get the streaming reveal; a message that ends in a + // code part streams its code without one (FlowCodeBlock renders each + // delivery whole). final lastTextIndex = message.parts.lastIndexWhere( (part) => part is FlowTextPart, ); @@ -306,6 +327,20 @@ class FlowMessage extends StatelessWidget { onTap: onAttachmentTap, previewCloseTooltip: previewCloseTooltip, ), + FlowCodePart(:final code, :final language, :final filename) => + FlowCodeBlock( + code: code, + language: language, + filename: filename, + onCopy: onCodeCopy == null ? null : () => onCodeCopy(part), + copyTooltip: codeCopyTooltip, + copied: identical(part, copiedCodePart), + // Streaming only while it's the growing tail — a part with + // content after it is already complete. + isStreaming: + message.status == FlowMessageStatus.streaming && + i == message.parts.length - 1, + ), FlowCustomPart() => customPartBuilder?.call(context, message, part), }; if (child == null) continue; diff --git a/lib/src/widgets/flow_thread.dart b/lib/src/widgets/flow_thread.dart index 473f549..c386bea 100644 --- a/lib/src/widgets/flow_thread.dart +++ b/lib/src/widgets/flow_thread.dart @@ -1,6 +1,7 @@ import 'package:material_ui/material_ui.dart'; import '../models/flow_message_data.dart'; +import '../models/flow_message_part.dart'; import 'flow_message.dart'; /// The scrollable conversation: a bottom-anchored list of [FlowMessageData]s. @@ -16,6 +17,9 @@ class FlowThread extends StatelessWidget { this.customPartBuilder, this.onAttachmentTap, this.previewCloseTooltip, + this.onCodeCopy, + this.copiedCodePart, + this.codeCopyTooltip, this.controller, this.padding, this.itemSpacing, @@ -42,6 +46,17 @@ class FlowThread extends StatelessWidget { /// Host-localized label for the built-in preview's close button. final String? previewCloseTooltip; + /// Copy intent from any code block in the thread, handed the tapped + /// [FlowCodePart]. Forwarded to each [FlowMessage]. + final ValueChanged? onCodeCopy; + + /// The part whose block shows the copied check — the instance received + /// from [onCodeCopy], passed back while the host's confirmation lasts. + final FlowCodePart? copiedCodePart; + + /// Host-localized label for the code blocks' copy affordance. + final String? codeCopyTooltip; + /// Optional external scroll controller. final ScrollController? controller; @@ -94,6 +109,9 @@ class FlowThread extends StatelessWidget { ? null : (attachmentId) => onAttachmentTap(message, attachmentId), previewCloseTooltip: previewCloseTooltip, + onCodeCopy: onCodeCopy, + copiedCodePart: copiedCodePart, + codeCopyTooltip: codeCopyTooltip, charactersPerSecond: charactersPerSecond, thinkingLabel: thinkingLabel, ), diff --git a/playground/lib/src/demo_registry.dart b/playground/lib/src/demo_registry.dart index e4b13c8..4eb8a17 100644 --- a/playground/lib/src/demo_registry.dart +++ b/playground/lib/src/demo_registry.dart @@ -2,6 +2,7 @@ import 'package:material_ui/material_ui.dart'; import 'demos/add_to_chat_demo.dart'; import 'demos/attachments_demo.dart'; +import 'demos/code_block_demo.dart'; import 'demos/composer_demo.dart'; import 'demos/full_chat_demo.dart'; import 'demos/greeting_demo.dart'; @@ -30,6 +31,7 @@ Widget demoFor(PlaygroundItem item, {String? variant}) { key: key, variant: variant, ), + PlaygroundItem.codeBlock => CodeBlockDemo(key: key, variant: variant), PlaygroundItem.addToChat => AddToChatDemo(key: key), PlaygroundItem.attachments => AttachmentsDemo(key: key, variant: variant), PlaygroundItem.thread => ThreadDemo(key: key, variant: variant), @@ -65,6 +67,12 @@ List<(String, String)> variantsFor(PlaygroundItem item) { ('animated', 'Animated'), ('static', 'Static'), ], + PlaygroundItem.codeBlock => const [ + ('dart', 'Dart'), + ('json', 'JSON'), + ('plain', 'Plain'), + ('streaming', 'Streaming'), + ], PlaygroundItem.attachments => const [ ('composer', 'In composer'), ('tiles', 'Tiles only'), @@ -111,6 +119,7 @@ String snippetFor(PlaygroundItem item) { PlaygroundItem.modalSelector => modelSelectorSnippet, PlaygroundItem.message => messageSnippet, PlaygroundItem.streamingMessage => streamingMessageSnippet, + PlaygroundItem.codeBlock => codeBlockSnippet, PlaygroundItem.addToChat => addToChatSnippet, PlaygroundItem.attachments => attachmentsSnippet, PlaygroundItem.thread => threadSnippet, diff --git a/playground/lib/src/demos/code_block_demo.dart b/playground/lib/src/demos/code_block_demo.dart new file mode 100644 index 0000000..1b3ae2c --- /dev/null +++ b/playground/lib/src/demos/code_block_demo.dart @@ -0,0 +1,180 @@ +import 'dart:async'; + +import 'package:flow_ui/flow_ui.dart'; +import 'package:flutter/services.dart'; +import 'package:material_ui/material_ui.dart'; + +const String codeBlockSnippet = r''' +// The block reports intent; the host owns the clipboard and the +// confirmation's timing. +FlowCodeBlock( + code: source, + language: 'dart', + filename: 'point.dart', + copyTooltip: 'Copy code', + copied: copied, + onCopy: () async { + await Clipboard.setData(ClipboardData(text: source)); + setState(() => copied = true); + }, +) + +// In a thread, FlowCodePart renders blocks and copy hands back the part: +FlowThread( + messages: messages, + codeCopyTooltip: 'Copy code', + copiedCodePart: copiedPart, + onCodeCopy: (part) => copy(part), +) + +// Unknown languages render plain; hosts can register their own: +FlowCodeLanguage.register( + const FlowCodeLanguage( + id: 'lisp', + rules: [FlowSyntaxRule(FlowSyntaxToken.comment, r';[^\n]*')], + ), +);'''; + +/// Dart with some of everything the highlighter distinguishes: comments, +/// strings, numbers, keywords, types, calls and an annotation. +const String _dartSample = r''' +import 'dart:math'; + +/// A point on the unit circle. +class Point { + const Point(this.x, this.y); + + final double x; + final double y; + + @override + String toString() => 'Point($x, $y)'; +} + +Point pointAt(num turns) { + final angle = turns * 2 * pi; + return Point(cos(angle), sin(angle)); +} + +void main() { + for (var i = 0; i < 4; i++) { + // Quarter turns land on the axes. + print(pointAt(i / 4)); + } +}'''; + +/// A Stac screen payload — keys read apart from string values, and the +/// long line exercises the block's horizontal scroll. +const String _jsonSample = r''' +{ + "type": "scaffold", + "appBar": {"type": "appBar", "title": {"type": "text", "data": "Home"}}, + "body": { + "type": "column", + "children": [ + {"type": "text", "data": "Hello, Stac!", "maxLines": 1}, + {"type": "sizedBox", "height": 12.5}, + {"type": "button", "enabled": true, "onTap": null} + ] + } +}'''; + +/// No language: plain ink, header from the filename alone. +const String _plainSample = r''' +$ flutter build web --release +Compiling lib/main.dart for the web... 12.4s +Font asset "MaterialIcons-Regular.otf" was tree-shaken. +Built build/web in release mode.'''; + +/// Stage demo for `FlowCodeBlock` — highlighted Dart and JSON, a plain +/// fallback, and a streaming feed. The demo owns the clipboard write and +/// the copied confirmation, the way a host would. +class CodeBlockDemo extends StatefulWidget { + const CodeBlockDemo({super.key, this.variant}); + + final String? variant; + + @override + State createState() => _CodeBlockDemoState(); +} + +class _CodeBlockDemoState extends State { + static const Duration _feedTick = Duration(milliseconds: 45); + static const int _feedStep = 6; + static const Duration _feedRestart = Duration(milliseconds: 1400); + + bool _copied = false; + Timer? _reset; + + /// Streaming variant: how much of the sample has "arrived". + int _fed = 0; + Timer? _feed; + + bool get _streaming => widget.variant == 'streaming'; + + @override + void initState() { + super.initState(); + if (_streaming) _startFeed(); + } + + @override + void dispose() { + _reset?.cancel(); + _feed?.cancel(); + super.dispose(); + } + + void _startFeed() { + _fed = 0; + _feed = Timer.periodic(_feedTick, (timer) { + setState(() { + _fed = (_fed + _feedStep).clamp(0, _dartSample.length); + }); + if (_fed == _dartSample.length) { + timer.cancel(); + _feed = Timer(_feedRestart, () { + if (mounted) setState(_startFeed); + }); + } + }); + } + + Future _copy(String code) async { + await Clipboard.setData(ClipboardData(text: code)); + if (!mounted) return; + setState(() => _copied = true); + _reset?.cancel(); + _reset = Timer(const Duration(milliseconds: 1500), () { + if (mounted) setState(() => _copied = false); + }); + } + + @override + Widget build(BuildContext context) { + final (code, language, filename) = switch (widget.variant) { + 'json' => (_jsonSample, 'json', 'screen.json'), + 'plain' => (_plainSample, null, 'build.log'), + 'streaming' => (_dartSample.substring(0, _fed), 'dart', 'point.dart'), + _ => (_dartSample, 'dart', 'point.dart'), + }; + + return Center( + child: SingleChildScrollView( + padding: const EdgeInsets.all(24), + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 560), + child: FlowCodeBlock( + code: code, + language: language, + filename: filename, + copyTooltip: 'Copy code', + copied: _copied, + isStreaming: _streaming && _fed < _dartSample.length, + onCopy: () => _copy(code), + ), + ), + ), + ); + } +} diff --git a/playground/lib/src/demos/thread_demo.dart b/playground/lib/src/demos/thread_demo.dart index 0c6f80f..6d77f25 100644 --- a/playground/lib/src/demos/thread_demo.dart +++ b/playground/lib/src/demos/thread_demo.dart @@ -1,4 +1,7 @@ +import 'dart:async'; + import 'package:flow_ui/flow_ui.dart'; +import 'package:flutter/services.dart'; import 'package:material_ui/material_ui.dart'; const String threadSnippet = ''' @@ -10,6 +13,11 @@ SizedBox( messages: messages, controller: scroll, thinkingLabel: 'thinking..', + // Code parts render FlowCodeBlocks; copy hands the part back, and + // the host passes it along while its confirmation lasts. + codeCopyTooltip: 'Copy code', + copiedCodePart: copiedPart, + onCodeCopy: copyPart, ), )'''; @@ -17,7 +25,16 @@ const String _reply = 'FlowThread lays the conversation out as a reversed list, so the ' 'newest message sits at the bottom and history loads upward. Messages ' 'keep their identity by id, which is what makes streaming updates ' - 'cheap.'; + 'cheap. Give it bounded height and it does the rest:'; + +const String _replyCode = ''' +SizedBox( + height: 480, + child: FlowThread( + messages: messages, + controller: scroll, + ), +)'''; List _seed(bool streaming) => [ FlowMessageData.text( @@ -40,20 +57,52 @@ List _seed(bool streaming) => [ FlowMessageData( id: 'a2', role: FlowMessageRole.assistant, - parts: const [FlowTextPart(_reply)], + // Prose then code: the reveal plays on the text part, while the code + // part renders whole — and hides its copy affordance mid-stream. + parts: const [ + FlowTextPart(_reply), + FlowCodePart(_replyCode, language: 'dart'), + ], status: streaming ? FlowMessageStatus.streaming : FlowMessageStatus.complete, ), ]; -/// The conversation list on its own, at a bounded height. The Streaming -/// variant mounts the last reply mid-stream, so the reveal plays. -class ThreadDemo extends StatelessWidget { +/// The conversation list on its own, at a bounded height, closing on a +/// reply that carries a code part. The Streaming variant mounts that +/// reply mid-stream, so the text reveal plays above the code block. The +/// demo owns the clipboard write and the copied confirmation, the way a +/// host would. +class ThreadDemo extends StatefulWidget { const ThreadDemo({super.key, this.variant}); final String? variant; + @override + State createState() => _ThreadDemoState(); +} + +class _ThreadDemoState extends State { + FlowCodePart? _copiedPart; + Timer? _reset; + + @override + void dispose() { + _reset?.cancel(); + super.dispose(); + } + + Future _copy(FlowCodePart part) async { + await Clipboard.setData(ClipboardData(text: part.code)); + if (!mounted) return; + setState(() => _copiedPart = part); + _reset?.cancel(); + _reset = Timer(const Duration(milliseconds: 1500), () { + if (mounted) setState(() => _copiedPart = null); + }); + } + @override Widget build(BuildContext context) { return Center( @@ -61,7 +110,12 @@ class ThreadDemo extends StatelessWidget { constraints: const BoxConstraints(maxWidth: 640), child: SizedBox( height: 480, - child: FlowThread(messages: _seed(variant == 'streaming')), + child: FlowThread( + messages: _seed(widget.variant == 'streaming'), + codeCopyTooltip: 'Copy code', + copiedCodePart: _copiedPart, + onCodeCopy: _copy, + ), ), ), ); diff --git a/playground/lib/src/playground_item.dart b/playground/lib/src/playground_item.dart index b63dd47..ca25016 100644 --- a/playground/lib/src/playground_item.dart +++ b/playground/lib/src/playground_item.dart @@ -28,6 +28,7 @@ enum PlaygroundItem { PhosphorIconsRegular.chatCircleDots, 'flow_streaming_message.dart', ), + codeBlock('Code Block', PhosphorIconsRegular.code, 'flow_code_block.dart'), addToChat( 'Add to Chat', PhosphorIconsRegular.plus, diff --git a/pubspec.yaml b/pubspec.yaml index ceef0bd..fd47331 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,13 +27,16 @@ dev_dependencies: flutter_lints: ^6.0.0 flutter: - # Figtree is the typeface of the Flow UI design file. It ships with the - # package (SIL Open Font License, see fonts/OFL.txt) so the default theme - # renders as designed without the host bundling a font — and without a - # font dependency. + # Figtree is the typeface of the Flow UI design file, and Geist Mono its + # code face. Both ship with the package (SIL Open Font License, see + # fonts/OFL.txt and fonts/OFL-GeistMono.txt) so the default theme renders + # as designed without the host bundling a font — and without a font + # dependency. # - # Static instances rather than the variable TTF: Flutter maps FontWeight to - # the nearest declared weight, so a weight axis would not be interpolated. + # Static instances rather than the variable TTFs: Flutter maps FontWeight + # to the nearest declared weight, so a weight axis would not be + # interpolated. Geist Mono carries only the three weights the mono roles + # reach for, to keep what every host app inherits small. fonts: - family: Figtree fonts: @@ -51,3 +54,11 @@ flutter: weight: 800 - asset: fonts/Figtree-Black.ttf weight: 900 + - family: GeistMono + fonts: + - asset: fonts/GeistMono-Regular.ttf + weight: 400 + - asset: fonts/GeistMono-Medium.ttf + weight: 500 + - asset: fonts/GeistMono-SemiBold.ttf + weight: 600 From 34b69ce8c54772b40a71ef8a048ade709eee2d0e Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Tue, 18 Aug 2026 10:58:09 +0530 Subject: [PATCH 2/3] feat: yaml, html, css and sql highlighting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FlowCodeLanguage gains caseSensitive (default true), compiled into the table's regex — SQL keywords come in either case, and Dart regexes have no inline (?i). --- CHANGELOG.md | 6 +- .../content/docs/components/code-block.mdx | 38 ++++- lib/src/utils/flow_syntax_highlighter.dart | 145 +++++++++++++++++- playground/lib/src/demo_registry.dart | 4 + playground/lib/src/demos/code_block_demo.dart | 81 ++++++++++ 5 files changed, 260 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f18c8e..376da86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,9 @@ - **Code block** — `FlowCodeBlock`, and a `FlowCodePart` message part rendered by `FlowMessage`/`FlowThread` with copy intent surfaced on `onCodeCopy`. Highlighting is built in and synchronous (Dart, JSON, - JavaScript/TypeScript, Python and shell; host-extensible via - `FlowCodeLanguage.register`), colored by new `FlowSyntaxColors` theme - tokens. The package now also bundles Geist Mono (three weights, SIL OFL) + JavaScript/TypeScript, Python, shell, YAML, HTML, CSS and SQL; + host-extensible via `FlowCodeLanguage.register`), colored by new + `FlowSyntaxColors` theme tokens. The package now also bundles Geist Mono (three weights, SIL OFL) behind new `code` / `codeInline` typography roles — `withFontFamily()` no longer touches the mono roles; swap those with `withCodeFontFamily()`. diff --git a/docs/src/content/docs/components/code-block.mdx b/docs/src/content/docs/components/code-block.mdx index f11f845..d6eb5d6 100644 --- a/docs/src/content/docs/components/code-block.mdx +++ b/docs/src/content/docs/components/code-block.mdx @@ -10,10 +10,10 @@ import FlowDemo from '../../../components/FlowDemo.astro'; `FlowCodeBlock` renders a fenced snippet on its own washed ground, under a header that names the content and offers copy. Highlighting is built in and synchronous — no setup call, no assets, nothing async. `language` -picks a rule table (Dart, JSON, JavaScript/TypeScript, Python and shell -ship in the box); unknown ids render plain, never an error. Token inks -come from the theme's `FlowSyntaxColors`, so code recolors with the rest -of the palette in both themes. +picks a rule table (Dart, JSON, JavaScript/TypeScript, Python, shell, +YAML, HTML, CSS and SQL ship in the box); unknown ids render plain, +never an error. Token inks come from the theme's `FlowSyntaxColors`, so +code recolors with the rest of the palette in both themes. In a message, code arrives as a `FlowCodePart` and `FlowMessage` renders the block for you — copy intent surfaces on `FlowThread.onCodeCopy` with @@ -96,9 +96,30 @@ FlowThread( ## Languages +Resolution is by id or alias, case-insensitive, and anything unknown +renders plain — a `rust` fence degrades gracefully rather than erroring: + +| Language | id | Aliases | +|---|---|---| +| Dart | `dart` | — | +| JSON | `json` | `jsonc` | +| JavaScript / TypeScript | `javascript` | `js`, `jsx`, `typescript`, `ts`, `tsx` | +| Python | `python` | `py` | +| Shell | `bash` | `sh`, `shell`, `zsh` | +| YAML | `yaml` | `yml` | +| HTML | `html` | `xml` | +| CSS | `css` | `scss`, `less` | +| SQL | `sql` | `mysql`, `postgres`, `postgresql`, `sqlite` | +| Plain | `plain` | `text`, `txt` | + +YAML, for one, knows that `on:` is a key before it is a boolean: + + + The registry is host-extensible. `FlowCodeLanguage` is an ordered rule table — earlier rules win, so comments and strings come first — and -`register` makes it resolvable from every block: +`register` makes it resolvable from every block. A table like SQL's, +whose keywords come in either case, sets `caseSensitive: false`: ```dart title="Registering a language" FlowCodeLanguage.register( @@ -139,8 +160,9 @@ FlowTheme( - `FlowThread` / `FlowMessage` — `onCodeCopy` (handed the tapped part), `copiedCodePart` (pass the instance back while the confirmation lasts), `codeCopyTooltip`. -- `FlowCodeLanguage` — `find`, `register`, and the built-ins (`dart`, - `json`, `javascript`, `python`, `bash`, `plain`); `FlowSyntaxRule` - pairs a regex with a `FlowSyntaxToken`. +- `FlowCodeLanguage` — `find`, `register`, `caseSensitive`, and the + built-ins (`dart`, `json`, `javascript`, `python`, `bash`, `yaml`, + `html`, `css`, `sql`, `plain`); `FlowSyntaxRule` pairs a regex with a + `FlowSyntaxToken`. - `FlowSyntaxColors` — eight token roles with light and dark presets, on `FlowTheme.syntax`. diff --git a/lib/src/utils/flow_syntax_highlighter.dart b/lib/src/utils/flow_syntax_highlighter.dart index c8a78a1..e5dad4c 100644 --- a/lib/src/utils/flow_syntax_highlighter.dart +++ b/lib/src/utils/flow_syntax_highlighter.dart @@ -60,7 +60,8 @@ class FlowSyntaxRule { /// ordered rule table. /// /// The built-ins cover the fences an assistant most often emits — Dart, -/// JSON, JavaScript/TypeScript, Python and shell. Hosts extend the set: +/// JSON, JavaScript/TypeScript, Python, shell, YAML, HTML, CSS and SQL. +/// Hosts extend the set: /// /// ```dart /// FlowCodeLanguage.register( @@ -79,6 +80,7 @@ class FlowCodeLanguage { required this.id, this.aliases = const [], required this.rules, + this.caseSensitive = true, }); /// Canonical name, lowercase by convention — what a fence info string @@ -91,9 +93,25 @@ class FlowCodeLanguage { /// Ordered by precedence. final List rules; + /// False compiles the whole table case-insensitively — for languages + /// like SQL whose keywords come in either case (Dart regexes have no + /// inline `(?i)`). + final bool caseSensitive; + static final Map _registry = () { final map = {}; - for (final language in [dart, json, javascript, python, bash, plain]) { + for (final language in [ + dart, + json, + javascript, + python, + bash, + yaml, + html, + css, + sql, + plain, + ]) { _add(map, language); } return map; @@ -308,6 +326,123 @@ class FlowCodeLanguage { FlowSyntaxRule(FlowSyntaxToken.punctuation, r'[|&;<>(){}\[\]=]+'), ], ); + + static const FlowCodeLanguage yaml = FlowCodeLanguage( + id: 'yaml', + aliases: ['yml'], + rules: [ + // Line-start or whitespace before the #, so a fragment mid-word + // (an URL) doesn't comment the rest of the line. The consumed + // space is invisible in the comment ink. + FlowSyntaxRule(FlowSyntaxToken.comment, r'(?:^|[ \t])#[^\n]*'), + FlowSyntaxRule(FlowSyntaxToken.meta, r'^(?:---|\.\.\.)'), + // Quoted and plain keys, ahead of the string and keyword rules so + // `on:` (GitHub Actions) reads as a key, not a boolean. + FlowSyntaxRule(FlowSyntaxToken.type, r'"(?:\\.|[^"\\\n])*"(?=\s*:)'), + FlowSyntaxRule(FlowSyntaxToken.type, r"'[^'\n]*'(?=\s*:)"), + FlowSyntaxRule( + FlowSyntaxToken.type, + r'[A-Za-z_][\w./$-]*(?=:(?:[ \t]|$))', + ), + FlowSyntaxRule(FlowSyntaxToken.string, r'"(?:\\.|[^"\\\n])*"'), + FlowSyntaxRule(FlowSyntaxToken.string, r"'[^'\n]*'"), + // Anchors, aliases and tags. + FlowSyntaxRule(FlowSyntaxToken.meta, r'[&*][\w-]+|!!?[\w/-]+'), + FlowSyntaxRule( + FlowSyntaxToken.keyword, + r'\b(?:true|True|TRUE|false|False|FALSE|null|Null|NULL|yes|Yes|YES|' + r'no|No|NO|on|On|ON|off|Off|OFF)\b|~', + ), + FlowSyntaxRule( + FlowSyntaxToken.number, + r'\b\d[\d_]*(?:\.\d[\d_]*)?(?:[eE][+-]?\d+)?\b', + ), + FlowSyntaxRule(FlowSyntaxToken.punctuation, r'[\[\]{}:,>|-]+'), + ], + ); + + static const FlowCodeLanguage html = FlowCodeLanguage( + id: 'html', + aliases: ['xml'], + rules: [ + FlowSyntaxRule(FlowSyntaxToken.comment, r''), + // Doctype, CDATA and processing instructions. + FlowSyntaxRule(FlowSyntaxToken.meta, r']*>|<\?[\s\S]*?\?>'), + // Attribute values only — anchored on the =, so quoted prose in + // text content stays plain. + FlowSyntaxRule(FlowSyntaxToken.string, r'=\s*"[^"]*"'), + FlowSyntaxRule(FlowSyntaxToken.string, r"=\s*'[^']*'"), + FlowSyntaxRule(FlowSyntaxToken.keyword, r'/=]+'), + ], + ); + + static const FlowCodeLanguage css = FlowCodeLanguage( + id: 'css', + aliases: ['scss', 'less'], + rules: [ + FlowSyntaxRule(FlowSyntaxToken.comment, r'/\*[\s\S]*?\*/'), + FlowSyntaxRule(FlowSyntaxToken.comment, r'//[^\n]*'), + FlowSyntaxRule(FlowSyntaxToken.string, r'"(?:\\.|[^"\\\n])*"'), + FlowSyntaxRule(FlowSyntaxToken.string, r"'(?:\\.|[^'\\\n])*'"), + FlowSyntaxRule(FlowSyntaxToken.keyword, r'@[\w-]+'), + FlowSyntaxRule(FlowSyntaxToken.keyword, r'!important\b'), + // Hex colors before the class/id selector rule — at the same `#` + // they win, and `#bada55` is a color even when it spells a word. + FlowSyntaxRule(FlowSyntaxToken.number, r'#[0-9a-fA-F]{3,8}\b'), + FlowSyntaxRule(FlowSyntaxToken.function, r'[.#][A-Za-z_][\w-]*'), + FlowSyntaxRule( + FlowSyntaxToken.number, + r'\b\d+(?:\.\d+)?(?:px|em|rem|vh|vw|vmin|vmax|ms|s|fr|deg|ch|pt|%)?', + ), + // Property names — also custom properties (`--ink`). + FlowSyntaxRule(FlowSyntaxToken.type, r'[-a-zA-Z][-\w]*(?=\s*:)'), + // Value functions: rgb(), var(), calc(). + FlowSyntaxRule(FlowSyntaxToken.function, r'[a-zA-Z-]+(?=\()'), + FlowSyntaxRule(FlowSyntaxToken.punctuation, r'[{}();:,>+~*]+'), + ], + ); + + static const FlowCodeLanguage sql = FlowCodeLanguage( + id: 'sql', + aliases: ['mysql', 'postgres', 'postgresql', 'sqlite'], + // SQL keywords come uppercase and lowercase; one flag beats listing + // both cases through the whole table. + caseSensitive: false, + rules: [ + FlowSyntaxRule(FlowSyntaxToken.comment, r'--[^\n]*'), + FlowSyntaxRule(FlowSyntaxToken.comment, r'/\*[\s\S]*?\*/'), + FlowSyntaxRule(FlowSyntaxToken.comment, r'#[^\n]*'), + // Doubled '' is the escape; " and ` quote identifiers. + FlowSyntaxRule(FlowSyntaxToken.string, r"'(?:''|[^'\n])*'"), + FlowSyntaxRule(FlowSyntaxToken.type, r'"[^"\n]*"|`[^`\n]*`'), + // Bind parameters and session variables. + FlowSyntaxRule(FlowSyntaxToken.meta, r'@\w+|:\w+|\$\d+'), + FlowSyntaxRule( + FlowSyntaxToken.keyword, + r'\b(?:select|from|where|insert|into|values|update|set|delete|create|' + r'table|view|index|drop|alter|add|column|primary|key|foreign|' + r'references|constraint|unique|not|null|default|and|or|in|is|like|' + r'between|exists|case|when|then|else|end|join|inner|left|right|full|' + r'outer|cross|on|as|group|by|having|order|asc|desc|limit|offset|' + r'union|all|distinct|with|returning|begin|commit|rollback|' + r'transaction|if|replace|temporary|cascade|check|database|schema|' + r'grant|revoke|true|false)\b', + ), + FlowSyntaxRule( + FlowSyntaxToken.type, + r'\b(?:int|integer|bigint|smallint|serial|decimal|numeric|real|float|' + r'double|precision|boolean|bool|char|varchar|text|date|time|' + r'timestamp|timestamptz|interval|blob|bytea|json|jsonb|uuid)\b', + ), + FlowSyntaxRule(FlowSyntaxToken.number, r'\b\d+(?:\.\d+)?\b'), + FlowSyntaxRule(FlowSyntaxToken.function, r'[a-z_]\w*(?=\s*\()'), + FlowSyntaxRule(FlowSyntaxToken.punctuation, r'[();,.=<>!:+*/-]+'), + ], + ); } /// Colors source through a language's rule table — synchronously: no @@ -328,7 +463,11 @@ abstract final class FlowSyntaxHighlighter { for (var i = 0; i < language.rules.length; i++) '(?${language.rules[i].pattern})', ].join('|'); - return RegExp(source, multiLine: true); + return RegExp( + source, + multiLine: true, + caseSensitive: language.caseSensitive, + ); }); } diff --git a/playground/lib/src/demo_registry.dart b/playground/lib/src/demo_registry.dart index 4eb8a17..6213699 100644 --- a/playground/lib/src/demo_registry.dart +++ b/playground/lib/src/demo_registry.dart @@ -70,6 +70,10 @@ List<(String, String)> variantsFor(PlaygroundItem item) { PlaygroundItem.codeBlock => const [ ('dart', 'Dart'), ('json', 'JSON'), + ('yaml', 'YAML'), + ('html', 'HTML'), + ('css', 'CSS'), + ('sql', 'SQL'), ('plain', 'Plain'), ('streaming', 'Streaming'), ], diff --git a/playground/lib/src/demos/code_block_demo.dart b/playground/lib/src/demos/code_block_demo.dart index 1b3ae2c..a8a083a 100644 --- a/playground/lib/src/demos/code_block_demo.dart +++ b/playground/lib/src/demos/code_block_demo.dart @@ -79,6 +79,83 @@ const String _jsonSample = r''' } }'''; +/// Keys against strings and booleans — and `on:` reading as a key, not +/// a boolean. +const String _yamlSample = r''' +# Deploy the playground on push. +name: deploy +on: + push: + branches: [main] + +env: + FLUTTER_VERSION: "3.44" + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: flutter build web --release + - run: firebase deploy --only hosting + if: startsWith(github.ref, 'refs/heads/main')'''; + +/// Tags, attributes and entities; quoted prose in text content stays +/// plain. +const String _htmlSample = r''' + + + + + + Flow UI + + +

+

Rendering & ready.

+
+ + +'''; + +/// Selectors, custom properties, units and value functions. +const String _cssSample = r''' +/* The stage's ground. */ +:root { + --stage-ink: #1e1e1e; + --stage-gap: 1.5rem; +} + +.stage { + display: grid; + gap: var(--stage-gap); + padding: 24px 16px; + color: var(--stage-ink); +} + +.stage:hover > .pill { + opacity: 0.75; + transition: opacity 200ms ease; +} + +@media (max-width: 760px) { + .stage { padding: 12px; } +}'''; + +/// Keywords in either case, quoted strings, bind-style aliases. +const String _sqlSample = r''' +-- Threads with their newest message. +SELECT t.id, t.title, m.body AS latest +FROM threads AS t +JOIN messages AS m ON m.thread_id = t.id +WHERE m.created_at = ( + SELECT MAX(created_at) FROM messages + WHERE thread_id = t.id +) + AND t.visibility = 'public' +ORDER BY m.created_at DESC +LIMIT 20;'''; + /// No language: plain ink, header from the filename alone. const String _plainSample = r''' $ flutter build web --release @@ -154,6 +231,10 @@ class _CodeBlockDemoState extends State { Widget build(BuildContext context) { final (code, language, filename) = switch (widget.variant) { 'json' => (_jsonSample, 'json', 'screen.json'), + 'yaml' => (_yamlSample, 'yaml', 'deploy.yml'), + 'html' => (_htmlSample, 'html', 'index.html'), + 'css' => (_cssSample, 'css', 'stage.css'), + 'sql' => (_sqlSample, 'sql', 'threads.sql'), 'plain' => (_plainSample, null, 'build.log'), 'streaming' => (_dartSample.substring(0, _fed), 'dart', 'point.dart'), _ => (_dartSample, 'dart', 'point.dart'), From d25b7e8c8be0a51d5da563081545733e8914a16b Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Thu, 20 Aug 2026 20:19:36 +0530 Subject: [PATCH 3/3] fix: stale alias registrations, unquoted css urls and cdata spans --- lib/src/utils/flow_syntax_highlighter.dart | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/src/utils/flow_syntax_highlighter.dart b/lib/src/utils/flow_syntax_highlighter.dart index e5dad4c..c51b908 100644 --- a/lib/src/utils/flow_syntax_highlighter.dart +++ b/lib/src/utils/flow_syntax_highlighter.dart @@ -130,6 +130,11 @@ class FlowCodeLanguage { /// Makes [language] resolvable through [find], replacing any earlier /// registration of the same id or alias. static void register(FlowCodeLanguage language) { + // Drop every key still resolving to the replaced language: an alias + // the replacement doesn't relist must not keep serving the old + // instance, which shares the new one's compiled-pattern slot. + final id = language.id.toLowerCase(); + _registry.removeWhere((_, earlier) => earlier.id.toLowerCase() == id); _add(_registry, language); FlowSyntaxHighlighter._invalidate(language.id); } @@ -366,8 +371,12 @@ class FlowCodeLanguage { aliases: ['xml'], rules: [ FlowSyntaxRule(FlowSyntaxToken.comment, r''), - // Doctype, CDATA and processing instructions. - FlowSyntaxRule(FlowSyntaxToken.meta, r']*>|<\?[\s\S]*?\?>'), + // Doctype, CDATA and processing instructions — CDATA spelled out + // first, since its body may hold the > that ends the generic . + FlowSyntaxRule( + FlowSyntaxToken.meta, + r'|]*>|<\?[\s\S]*?\?>', + ), // Attribute values only — anchored on the =, so quoted prose in // text content stays plain. FlowSyntaxRule(FlowSyntaxToken.string, r'=\s*"[^"]*"'), @@ -376,7 +385,9 @@ class FlowCodeLanguage { FlowSyntaxRule(FlowSyntaxToken.meta, r'[A-Za-z-]+(?==)'), // Entities. FlowSyntaxRule(FlowSyntaxToken.meta, r'&[a-zA-Z]+;|&#\d+;'), - FlowSyntaxRule(FlowSyntaxToken.punctuation, r'[<>/=]+'), + // One angle at a time: a + run would swallow the < opening a + // comment or CDATA section straight after a closing >. + FlowSyntaxRule(FlowSyntaxToken.punctuation, r'[<>/=]'), ], ); @@ -385,7 +396,9 @@ class FlowCodeLanguage { aliases: ['scss', 'less'], rules: [ FlowSyntaxRule(FlowSyntaxToken.comment, r'/\*[\s\S]*?\*/'), - FlowSyntaxRule(FlowSyntaxToken.comment, r'//[^\n]*'), + // Line-start or whitespace before the // — as with YAML's # — so an + // unquoted url(http://…) doesn't comment out the rest of the line. + FlowSyntaxRule(FlowSyntaxToken.comment, r'(?:^|[ \t])//[^\n]*'), FlowSyntaxRule(FlowSyntaxToken.string, r'"(?:\\.|[^"\\\n])*"'), FlowSyntaxRule(FlowSyntaxToken.string, r"'(?:\\.|[^'\\\n])*'"), FlowSyntaxRule(FlowSyntaxToken.keyword, r'@[\w-]+'),