crepuscularity_flutter 0.1.0
crepuscularity_flutter: ^0.1.0 copied to clipboard
Flutter runtime renderer for Crepuscularity View IR and .crepus source — the Flutter counterpart to the SwiftUI and Jetpack Compose native shells.
crepuscularity-flutter #
Naming: the package directory, the
crepus flutterCLI, and all docs use the hyphenatedcrepuscularity-flutter, matching the sibling crates (crepuscularity-native,crepuscularity-gpui, …). The one exception is the Dartpubspec.yamlname:field, which must becrepuscularity_flutterbecause pub.flutter-io.cn names cannot contain hyphens (^[a-z][a-z0-9_]*$). Theimportand the dependency key in a consumer'spubspec.yamltherefore also use the underscore form — that is the pub package name, not an inconsistency.
Flutter runtime renderer for Crepuscularity — the Flutter counterpart to the
SwiftUI and Jetpack Compose native shells in
examples/native-shells. It turns Crepuscularity
UI into Flutter widgets, from either the View IR wire format or .crepus
source parsed in pure Dart (no Rust round-trip).
Usage #
import 'package:crepuscularity_flutter/crepuscularity_flutter.dart';
// From decoded View IR JSON ({ version, root: [...] }).
CrepusView.fromIr(irMap, onAction: (action) => handle(action));
// From .crepus source, rendered directly.
CrepusView.fromSource('''
stack col gap-2
text font-semibold "Reminder"
text text-sm "Pay rent tomorrow"
button "Do it now" onclick=prompt:Draft a rent reminder
''', onAction: (action) => handle(action));
Both entry points produce the same widget tree; fromSource(x) and
fromIr(lower(x)) agree on the shared fixtures (see test/conformance_test.dart).
Vocabulary #
Constrained, non-executing subset of the View IR ViewNode kinds
(crates/crepuscularity-native/src/ir.rs):
text, stack (row/column, Tailwind-ish spacing/alignment), scroll,
button, toggle, checkbox, progress, meter, badge, divider,
spacer, image, if, forEach, list, listItem.
Anything outside the allowlist (webView, filePicker, dropzone, free
input/picker/slider, tabs, slot, …) renders nothing — it never throws.
Action model #
The package is generic and action-agnostic. on_click / on_change /
on_long_press strings are surfaced verbatim to the host via onAction; the
package never interprets, maps, or evaluates an action. The host owns action
policy (whitelisting, URL safety, etc.). There is no eval anywhere.
Caps #
CrepusLimits bounds node count (default 60), depth (8), and source length
(8000). Oversized input yields an empty document, gracefully.
Distribution #
This package is designed to be consumed as a published dependency, fetched and
pinned via the crepus flutter CLI affordance (see
crates/crepuscularity-cli). Until it is published, host apps pin it with a git
dependency on this repo (git: { url, ref, path: plugins/flutter }).