Skip to main content

omena_cascade/
lib.rs

1//! Cascade-formal substrate for the Omena CSS track.
2//!
3//! The crate starts with the load-bearing algebra from the research plan:
4//! lexicographic cascade keys, specificity, provenance proofs, and a finite
5//! custom-property substitution function with explicit cycle handling.
6
7mod axis_order;
8pub mod class_tokens;
9mod computed_value;
10mod conformance;
11mod custom_property;
12pub mod first_witness;
13mod frame_footprint;
14mod fuzz;
15mod grn;
16mod modal;
17mod model;
18mod origin;
19mod proofs;
20mod property_metadata;
21mod property_metadata_idl_generated;
22mod ranked_set_loss_census;
23mod ranking;
24mod refinement;
25mod robustness_radius;
26mod selector;
27mod shorthand_authority;
28mod statistics;
29
30pub use class_tokens::*;
31pub use computed_value::*;
32pub use conformance::*;
33pub use custom_property::*;
34pub use first_witness::*;
35pub use frame_footprint::*;
36pub use fuzz::*;
37pub use grn::*;
38pub use modal::*;
39pub use model::*;
40pub use omena_syntax::ident::{AuthoredPropertyTextV0, CanonicalPropertyKeyV0, PropertyNameV0};
41pub use origin::*;
42pub use proofs::{evaluate_static_supports_condition, prove_layer_flatten_candidate};
43pub use property_metadata::*;
44pub use property_metadata_idl_generated::{
45    CSS_PROPERTY_METADATA_RECORDS_V1, CSS_PROPERTY_METADATA_V1, CssCustomPropertyPolicyStaticV1,
46    CssCustomPropertyPolicyV1Json, CssPropertyMetadataRecordStaticV1,
47    CssPropertyMetadataRecordV1Json, CssPropertyMetadataSourceStaticV1,
48    CssPropertyMetadataSourceV1Json, CssPropertyMetadataStaticV1, CssPropertyMetadataV1Json,
49};
50pub use ranked_set_loss_census::*;
51pub use ranking::{
52    cascade_margin_for_outcome, rank_cascade_items, select_cascade_winner,
53    select_open_world_cascade_winner, summarize_cascade_margin_schema_v0,
54};
55pub use refinement::*;
56pub use robustness_radius::*;
57pub use selector::*;
58pub use shorthand_authority::*;
59pub use statistics::*;
60
61#[track_caller]
62pub fn cascade_property(
63    declarations: impl IntoIterator<Item = CascadeDeclaration>,
64    property: &str,
65) -> CascadeOutcome {
66    let outcome = ranking::cascade_property(declarations, property);
67    ranked_set_loss_census::observe_cascade_outcome(
68        CascadeRankedSetFunctionV0::CascadeProperty,
69        std::panic::Location::caller(),
70        &outcome,
71    );
72    outcome
73}
74
75#[track_caller]
76pub fn cascade_property_for_key(
77    declarations: impl IntoIterator<Item = CascadeDeclaration>,
78    property_key: &CanonicalPropertyKeyV0,
79) -> CascadeOutcome {
80    let outcome = ranking::cascade_property_for_key(declarations, property_key);
81    ranked_set_loss_census::observe_cascade_outcome(
82        CascadeRankedSetFunctionV0::CascadeProperty,
83        std::panic::Location::caller(),
84        &outcome,
85    );
86    outcome
87}
88
89#[track_caller]
90pub fn cascade_property_open_world(
91    declarations: impl IntoIterator<Item = CascadeDeclaration>,
92    property: &str,
93) -> CascadeOutcome {
94    let outcome = ranking::cascade_property_open_world(declarations, property);
95    ranked_set_loss_census::observe_cascade_outcome(
96        CascadeRankedSetFunctionV0::CascadePropertyOpenWorld,
97        std::panic::Location::caller(),
98        &outcome,
99    );
100    outcome
101}
102
103#[track_caller]
104pub fn cascade_property_open_world_for_key(
105    declarations: impl IntoIterator<Item = CascadeDeclaration>,
106    property_key: &CanonicalPropertyKeyV0,
107) -> CascadeOutcome {
108    let outcome = ranking::cascade_property_open_world_for_key(declarations, property_key);
109    ranked_set_loss_census::observe_cascade_outcome(
110        CascadeRankedSetFunctionV0::CascadePropertyOpenWorld,
111        std::panic::Location::caller(),
112        &outcome,
113    );
114    outcome
115}
116
117pub fn prove_scope_flatten_candidate(mut input: ScopeFlattenInputV0) -> ScopeFlattenProofV0 {
118    if omena_syntax::css_keyword(input.root_selector.trim()).equals(":root") {
119        input.root_selector = ":root".to_string();
120    }
121    proofs::prove_scope_flatten_candidate(input)
122}
123
124pub fn prove_longhand_merge<S>(
125    shorthand_property: &str,
126    expected_longhands: &[S],
127    longhands: &[LonghandMergeInputV0],
128) -> LonghandMergeProofV0
129where
130    S: AsRef<str>,
131{
132    proofs::prove_longhand_merge(shorthand_property, expected_longhands, longhands)
133}
134
135pub fn prove_box_shorthand_combination(
136    shorthand_property: &str,
137    longhands: &[BoxLonghandInputV0],
138) -> ShorthandCombinationProofV0 {
139    proofs::prove_box_shorthand_combination(shorthand_property, longhands)
140}
141
142pub fn summarize_cascade_boundary() -> CascadeBoundarySummary {
143    CascadeBoundarySummary {
144        product: "omena-cascade.boundary",
145        ordering_model: "lexicographicCascadeKey",
146        substitution_model: "dependencyGraphSccCustomPropertyResolution",
147        least_fixed_point_proof_model: "canonical custom-property dependency graph with cyclic-SCC invalidation and dependency-ordered acyclic substitution",
148        ready_surfaces: vec![
149            "cascadeKeyOrdering",
150            "specificityOrdering",
151            "cascadeOutcomeProof",
152            "genericCascadeWinner",
153            "semanticDesignTokenRanking",
154            "queryReadCascadeAtPosition",
155            "selectorContextWitness",
156            "selectorMatchWitness",
157            "cascadeConformanceSeedCorpus",
158            "customPropertySubstitution",
159            "customPropertyLeastFixedPoint",
160            "customPropertyLeastFixedPointProof",
161            "customPropertyLeastFixedPointTrace",
162            "cycleToGuaranteedInvalid",
163            "computedValueResolutionSeed",
164            "inheritanceInitialValueSeed",
165            "shorthandCombinationProof",
166            "supportsStaticEvalWitness",
167            "scopeFlattenProof",
168            "layerFlattenProof",
169            "modalCheckWitnessV0",
170            "cascadeMarginSchemaV0",
171            "cascadeOrderingAxisSelfCheckCorpus",
172            "spinGlassStatisticsV0",
173            "grnAttractorBasinV0",
174            "diagnosticFrameFootprintV0",
175        ],
176        not_ready_surfaces: vec!["fullInitialValueTable", "fullWptCascadeCorpus"],
177    }
178}
179
180#[cfg(test)]
181mod tests;