1mod 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;