diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a37cc2..75d435b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,11 @@ * Support rendering tooltips. ([#26][#26]) * Add focus outlines around nodes and edges. ([#27][#27]) * Update `stroke_style: dashed` to mean `dasharray:4`. ([#27][#27]) +* Fix duplication of tailwind classes on edges. ([#28][#28]) [#26]: https://github.com/azriel91/disposition/pull/26 [#27]: https://github.com/azriel91/disposition/pull/27 +[#28]: https://github.com/azriel91/disposition/pull/28 ## 0.1.0 (2026-04-11) diff --git a/app/playground/src/components/editor/render_options_page.rs b/app/playground/src/components/editor/render_options_page.rs index d4017dc..a71d8ca 100644 --- a/app/playground/src/components/editor/render_options_page.rs +++ b/app/playground/src/components/editor/render_options_page.rs @@ -29,9 +29,9 @@ const RADIO_LABEL_CLASS: &str = "\ /// /// Allows the user to configure: /// -/// * `edge_curvature` -- whether edges are drawn as smooth curves or orthogonal +/// * `edge_curvature`: whether edges are drawn as smooth curves or orthogonal /// lines. -/// * `rank_dir` -- direction that edges connect nodes. +/// * `rank_dir`: direction that edges connect nodes. #[component] pub fn RenderOptionsPage(input_diagram: Signal>) -> Element { let edge_curvature = input_diagram.read().render_options.edge_curvature; diff --git a/app/playground/src/editor_state.rs b/app/playground/src/editor_state.rs index 8b53335..65cf339 100644 --- a/app/playground/src/editor_state.rs +++ b/app/playground/src/editor_state.rs @@ -47,11 +47,10 @@ pub struct EditorState { /// /// # Examples /// - /// * `Some("proc_app_dev")` -- focus the process card with ID - /// `proc_app_dev`. - /// * `Some("proc_app_dev_step_2")` -- expand the `proc_app_dev` card, then + /// * `Some("proc_app_dev")`: focus the process card with ID `proc_app_dev`. + /// * `Some("proc_app_dev_step_2")`: expand the `proc_app_dev` card, then /// focus the third step row inside it. - /// * `None` -- no field to focus (the default). + /// * `None`: no field to focus (the default). #[serde(default, skip_serializing_if = "Option::is_none")] pub focus_field: Option, @@ -63,8 +62,8 @@ pub struct EditorState { /// /// # Examples /// - /// * `true` -- the SVG preview fills the page on load. - /// * `false` -- normal editor layout (the default). + /// * `true`: the SVG preview fills the page on load. + /// * `false`: normal editor layout (the default). #[serde(default, skip_serializing_if = "is_false")] pub svg_preview_expanded: bool, diff --git a/app/playground/src/undo_history.rs b/app/playground/src/undo_history.rs index caae264..56194b6 100644 --- a/app/playground/src/undo_history.rs +++ b/app/playground/src/undo_history.rs @@ -31,10 +31,10 @@ const MAX_ENTRIES: usize = 200; /// /// # Fields /// -/// * `entries` -- the ordered list of snapshots, oldest first. -/// * `cursor` -- index into `entries` that represents the *current* state. Undo +/// * `entries`: the ordered list of snapshots, oldest first. +/// * `cursor`: index into `entries` that represents the *current* state. Undo /// moves the cursor backwards; redo moves it forwards. -/// * `skip_next_push` -- flag used to prevent the memo that watches the +/// * `skip_next_push`: flag used to prevent the memo that watches the /// `input_diagram` signal from recording a snapshot when the change was /// caused by an undo/redo operation itself. #[derive(Clone, Debug)] diff --git a/crate/input_ir_rt/src/input_diagram_theme_sources.rs b/crate/input_ir_rt/src/input_diagram_theme_sources.rs index 5daf3a4..075386f 100644 --- a/crate/input_ir_rt/src/input_diagram_theme_sources.rs +++ b/crate/input_ir_rt/src/input_diagram_theme_sources.rs @@ -8,8 +8,8 @@ use crate::ThemeValueSource; /// /// For each theme map entry, the source is: /// -/// * `UserInput` -- if the key is present in the overlay diagram. -/// * `BaseDiagram` -- if the key is only present in the base diagram. +/// * `UserInput`: if the key is present in the overlay diagram. +/// * `BaseDiagram`: if the key is only present in the base diagram. /// /// The computation is done on-the-fly by checking the overlay diagram. /// Since the overlay is typically small, this is efficient. @@ -44,8 +44,8 @@ impl<'a> InputDiagramThemeSources<'a> { /// /// # Parameters /// - /// * `base` -- the base diagram, typically from `InputDiagram::base()`. - /// * `overlay` -- the user's overlay diagram before merging. + /// * `base`: the base diagram, typically from `InputDiagram::base()`. + /// * `overlay`: the user's overlay diagram before merging. pub fn new(base: &'a InputDiagram<'static>, overlay: &'a InputDiagram<'static>) -> Self { Self { base, overlay } } diff --git a/crate/input_ir_rt/src/input_to_ir_diagram_mapper/tailwind_class_state.rs b/crate/input_ir_rt/src/input_to_ir_diagram_mapper/tailwind_class_state.rs index 8a14a4c..1720e73 100644 --- a/crate/input_ir_rt/src/input_to_ir_diagram_mapper/tailwind_class_state.rs +++ b/crate/input_ir_rt/src/input_to_ir_diagram_mapper/tailwind_class_state.rs @@ -14,7 +14,7 @@ const CLASSES_BUFFER_WRITE_FAIL: &str = "Failed to write string to buffer"; /// /// This struct holds a map of [`ThemeAttr`] to their resolved string values, /// which are then used to generate the appropriate tailwind CSS classes. -#[derive(Default)] +#[derive(Clone, Default)] pub(crate) struct TailwindClassState<'tw_state> { /// Map of theme attributes to their resolved values. pub(crate) attrs: Map>, diff --git a/crate/input_ir_rt/src/input_to_ir_diagram_mapper/tailwind_classes_builder.rs b/crate/input_ir_rt/src/input_to_ir_diagram_mapper/tailwind_classes_builder.rs index 5cef59f..6e5bd01 100644 --- a/crate/input_ir_rt/src/input_to_ir_diagram_mapper/tailwind_classes_builder.rs +++ b/crate/input_ir_rt/src/input_to_ir_diagram_mapper/tailwind_classes_builder.rs @@ -128,46 +128,50 @@ impl TailwindClassesBuilder { }) .collect(); - // Build classes for edge groups and edges - let mut edge_group_and_edge_classes: Vec<(Id<'id>, String)> = Vec::new(); + // Build classes for edge groups and individual edges. + // + // Edge group classes are resolved first into a `TailwindClassState` + // (not yet stringified). Each individual edge then clones the group + // state, applies any edge-specific overrides, and writes the combined + // classes to a single string. This prevents conflicting tailwind + // classes that would result from naively joining separate group and + // edge class strings. + let mut edge_classes: Vec<(Id<'id>, String)> = Vec::new(); for (edge_group_id, edges) in edge_groups.iter() { - // Get the process steps that interact with this edge group + // Get the process steps that interact with this edge group. let interaction_steps = edge_group_to_steps .get(edge_group_id) .cloned() .unwrap_or_default(); - let edge_group_classes_str = Self::build_edge_group_tailwind_classes( - edge_group_id, - entity_types, - theme_default, - theme_types_styles, - &interaction_steps, - &mut css_theme_vars, - ); - - edge_group_and_edge_classes - .push((edge_group_id.clone().into_inner(), edge_group_classes_str)); + let (edge_group_state, edge_group_peer_classes) = + Self::build_edge_group_tailwind_class_state( + edge_group_id, + entity_types, + theme_default, + theme_types_styles, + &interaction_steps, + &mut css_theme_vars, + ); for (index, _edge) in edges.iter().enumerate() { let edge_id_str = format!("{edge_group_id}__{index}"); let edge_id = Id::try_from(edge_id_str).expect("valid ID string"); let classes = Self::build_edge_tailwind_classes( + &edge_group_state, + &edge_group_peer_classes, &edge_id, entity_types, theme_default, theme_types_styles, &mut css_theme_vars, ); - edge_group_and_edge_classes.push((edge_id, classes)); + edge_classes.push((edge_id, classes)); } } - let tailwind_classes = node_classes - .into_iter() - .chain(edge_group_and_edge_classes) - .collect(); + let tailwind_classes = node_classes.into_iter().chain(edge_classes).collect(); TailwindClassesBuildResult { tailwind_classes, @@ -269,7 +273,7 @@ impl TailwindClassesBuilder { .get(tag_id) .and_then(|types| types.iter().next()) .cloned(); - let mut state = TailwindClassState { + let mut tailwind_class_state = TailwindClassState { entity_type, ..Default::default() }; @@ -280,11 +284,11 @@ impl TailwindClassesBuilder { theme_default, theme_types_styles, IdOrDefaults::NodeDefaults, - &mut state, + &mut tailwind_class_state, ); let mut classes = String::new(); - state.write_classes( + tailwind_class_state.write_classes( &mut classes, css_theme_vars, theme_default.dark_mode_config.shade, @@ -308,7 +312,7 @@ impl TailwindClassesBuilder { .get(process_id) .and_then(|types| types.iter().next()) .cloned(); - let mut state = TailwindClassState { + let mut tailwind_class_state = TailwindClassState { entity_type, ..Default::default() }; @@ -319,11 +323,11 @@ impl TailwindClassesBuilder { theme_default, theme_types_styles, IdOrDefaults::NodeDefaults, - &mut state, + &mut tailwind_class_state, ); let mut classes = String::new(); - state.write_classes( + tailwind_class_state.write_classes( &mut classes, css_theme_vars, theme_default.dark_mode_config.shade, @@ -348,7 +352,7 @@ impl TailwindClassesBuilder { .get(process_step_id) .and_then(|types| types.iter().next()) .cloned(); - let mut state = TailwindClassState { + let mut tailwind_class_state = TailwindClassState { entity_type, ..Default::default() }; @@ -359,11 +363,11 @@ impl TailwindClassesBuilder { theme_default, theme_types_styles, IdOrDefaults::NodeDefaults, - &mut state, + &mut tailwind_class_state, ); let mut classes = String::new(); - state.write_classes( + tailwind_class_state.write_classes( &mut classes, css_theme_vars, theme_default.dark_mode_config.shade, @@ -422,7 +426,7 @@ impl TailwindClassesBuilder { .get(node_id.as_ref()) .and_then(|types| types.iter().next()) .cloned(); - let mut state = TailwindClassState { + let mut tailwind_class_state = TailwindClassState { entity_type, ..Default::default() }; @@ -433,11 +437,11 @@ impl TailwindClassesBuilder { theme_default, theme_types_styles, IdOrDefaults::NodeDefaults, - &mut state, + &mut tailwind_class_state, ); let mut classes = String::new(); - state.write_classes( + tailwind_class_state.write_classes( &mut classes, css_theme_vars, theme_default.dark_mode_config.shade, @@ -445,7 +449,7 @@ impl TailwindClassesBuilder { // Add peer classes for each tag Self::build_thing_tailwind_classes_tags( - &state, + &tailwind_class_state, &mut classes, node_id, theme_default, @@ -458,7 +462,7 @@ impl TailwindClassesBuilder { // Add peer classes for process steps that interact with edges involving this // thing using styles from `theme_default.process_step_selected_styles` Self::build_thing_tailwind_classes_interactions( - &state, + &tailwind_class_state, &mut classes, node_id, theme_default, @@ -472,7 +476,7 @@ impl TailwindClassesBuilder { /// Write tag-related peer classes for a thing node. #[allow(clippy::too_many_arguments)] fn build_thing_tailwind_classes_tags<'id>( - state: &TailwindClassState<'_>, + tailwind_class_state: &TailwindClassState<'_>, classes: &mut String, node_id: &NodeId<'id>, theme_default: &ThemeDefault<'id>, @@ -498,17 +502,17 @@ impl TailwindClassesBuilder { // 2. Applying TagDefaults styles // 3. Applying tag-specific styles (overrides) let mut tag_focus_state = TailwindClassState::default(); - if let Some(shape_color) = state.attrs.get(&ThemeAttr::ShapeColor) { + if let Some(shape_color) = tailwind_class_state.attrs.get(&ThemeAttr::ShapeColor) { tag_focus_state .attrs .insert(ThemeAttr::ShapeColor, shape_color.clone()); }; - if let Some(fill_color) = state.attrs.get(&ThemeAttr::FillColor) { + if let Some(fill_color) = tailwind_class_state.attrs.get(&ThemeAttr::FillColor) { tag_focus_state .attrs .insert(ThemeAttr::FillColor, fill_color.clone()); }; - if let Some(stroke_color) = state.attrs.get(&ThemeAttr::StrokeColor) { + if let Some(stroke_color) = tailwind_class_state.attrs.get(&ThemeAttr::StrokeColor) { tag_focus_state .attrs .insert(ThemeAttr::StrokeColor, stroke_color.clone()); @@ -550,7 +554,7 @@ impl TailwindClassesBuilder { /// Write interaction-related peer classes for a thing node. fn build_thing_tailwind_classes_interactions<'f, 'id>( - state: &TailwindClassState<'_>, + tailwind_class_state: &TailwindClassState<'_>, classes: &mut String, node_id: &NodeId<'id>, theme_default: &ThemeDefault<'id>, @@ -563,17 +567,18 @@ impl TailwindClassesBuilder { let mut step_selected_state = TailwindClassState::default(); // Copy the thing's colors - if let Some(shape_color) = state.attrs.get(&ThemeAttr::ShapeColor) { + if let Some(shape_color) = tailwind_class_state.attrs.get(&ThemeAttr::ShapeColor) { step_selected_state .attrs .insert(ThemeAttr::ShapeColor, shape_color.clone()); }; - if let Some(fill_color) = state.attrs.get(&ThemeAttr::FillColor) { + if let Some(fill_color) = tailwind_class_state.attrs.get(&ThemeAttr::FillColor) { step_selected_state .attrs .insert(ThemeAttr::FillColor, fill_color.clone()); }; - if let Some(stroke_color) = state.attrs.get(&ThemeAttr::StrokeColor) { + if let Some(stroke_color) = tailwind_class_state.attrs.get(&ThemeAttr::StrokeColor) + { step_selected_state .attrs .insert(ThemeAttr::StrokeColor, stroke_color.clone()); @@ -610,7 +615,14 @@ impl TailwindClassesBuilder { } } - /// Build tailwind classes for an edge group. + /// Build the tailwind class state for an edge group, along with a + /// pre-built peer classes string for process step interactions. + /// + /// The returned `TailwindClassState` represents the resolved base styling + /// for the group (EdgeDefaults + group entity-type + group ID overrides) + /// but has not yet been written to a `String`. It should be cloned for + /// each individual edge within the group, allowing edge-specific overrides + /// to be applied before stringification. /// /// # Parameters /// @@ -621,19 +633,22 @@ impl TailwindClassesBuilder { /// * `interaction_process_step_ids`: The process step IDs that interact /// with this edge. /// * `css_theme_vars`: Collector for CSS variable definitions. - fn build_edge_group_tailwind_classes<'id>( + fn build_edge_group_tailwind_class_state<'id, 'tw_state>( edge_group_id: &EdgeGroupId<'id>, - entity_types: &EntityTypes<'id>, - theme_default: &ThemeDefault<'id>, - theme_types_styles: &ThemeTypesStyles<'id>, + entity_types: &'tw_state EntityTypes<'id>, + theme_default: &'tw_state ThemeDefault<'id>, + theme_types_styles: &'tw_state ThemeTypesStyles<'id>, interaction_process_step_ids: &[&ProcessStepId<'id>], css_theme_vars: &mut CssThemeVars, - ) -> String { + ) -> (TailwindClassState<'tw_state>, String) + where + 'id: 'tw_state, + { let entity_type = entity_types .get(edge_group_id.as_ref()) .and_then(|types| types.iter().next()) .cloned(); - let mut state = TailwindClassState { + let mut tailwind_class_state = TailwindClassState { entity_type, ..Default::default() }; @@ -644,18 +659,14 @@ impl TailwindClassesBuilder { theme_default, theme_types_styles, IdOrDefaults::EdgeDefaults, - &mut state, + &mut tailwind_class_state, ); - let mut classes = String::new(); - state.write_classes( - &mut classes, - css_theme_vars, - theme_default.dark_mode_config.shade, - ); - - // Add peer classes for each process step that interacts with this edge - // using styles from `theme_default.process_step_selected_styles.edge_defaults` + // Build peer classes string for process step interactions. + // + // These are the same for all edges in the group and will be appended + // to each individual edge's classes string. + let mut peer_classes = String::new(); interaction_process_step_ids.iter().for_each(|step_id| { // Build a state from the thing's current colors + process_step_selected_styles let mut step_selected_state = TailwindClassState::default(); @@ -682,54 +693,148 @@ impl TailwindClassesBuilder { let peer_prefix = format!("peer-[:focus-within]/{step_id}:"); step_selected_state.write_peer_classes( - &mut classes, + &mut peer_classes, &peer_prefix, css_theme_vars, theme_default.dark_mode_config.shade, ); }); - classes + (tailwind_class_state, peer_classes) } - /// Build tailwind classes for individual symmetric edges within an edge - /// group. - fn build_edge_tailwind_classes<'id>( + /// Build tailwind classes for an individual edge within an edge group. + /// + /// Starts from a clone of the edge group's resolved `TailwindClassState`, + /// applies any edge-specific entity-type and ID-style overrides, then + /// writes the combined attributes to a string. The pre-built peer classes + /// from the edge group are appended at the end. + /// + /// This ensures each edge's final class string already contains the full + /// resolved styling -- group-level attributes overlaid with edge-specific + /// overrides -- so callers do not need to join separate group and edge + /// class strings. + /// + /// # Parameters + /// + /// * `edge_group_state`: The resolved state for the edge group (not yet + /// stringified). + /// * `edge_group_peer_classes`: Pre-built peer classes for process step + /// interactions, shared by all edges in the group. + /// * `edge_id`: The ID of the individual edge (e.g., `edge_group_id__0`). + /// * `entity_types`: Entity types map for resolving type-based styles. + /// * `theme_default`: The default theme configuration. + /// * `theme_types_styles`: Styles defined per entity type. + /// * `css_theme_vars`: Collector for CSS variable definitions. + fn build_edge_tailwind_classes<'id, 'tw_state>( + edge_group_state: &TailwindClassState<'tw_state>, + edge_group_peer_classes: &str, edge_id: &Id<'id>, - entity_types: &EntityTypes<'id>, - theme_default: &ThemeDefault<'id>, - theme_types_styles: &ThemeTypesStyles<'id>, + entity_types: &'tw_state EntityTypes<'id>, + theme_default: &'tw_state ThemeDefault<'id>, + theme_types_styles: &'tw_state ThemeTypesStyles<'id>, css_theme_vars: &mut CssThemeVars, - ) -> String { - let entity_type = entity_types + ) -> String + where + 'id: 'tw_state, + { + // Start from the edge group's resolved state. + let mut tailwind_class_state = edge_group_state.clone(); + + // Update entity_type if the edge has its own entity type defined. + if let Some(entity_type) = entity_types .get(edge_id) .and_then(|types| types.iter().next()) - .cloned(); - let mut state = TailwindClassState { - entity_type, - ..Default::default() - }; + .cloned() + { + tailwind_class_state.entity_type = Some(entity_type); + } - Self::resolve_tailwind_attrs( + // Apply edge-specific type and ID overrides on top of the group state. + Self::resolve_tailwind_attrs_edge_overrides( edge_id, entity_types, theme_default, theme_types_styles, - IdOrDefaults::EdgeDefaults, - &mut state, + &mut tailwind_class_state, ); let mut classes = String::new(); - state.write_classes( + tailwind_class_state.write_classes( &mut classes, css_theme_vars, theme_default.dark_mode_config.shade, ); + + // Append the pre-built peer classes from the edge group. + if !edge_group_peer_classes.is_empty() { + classes.push('\n'); + classes.push_str(edge_group_peer_classes); + } + classes } // === Tailwind Attribute Resolution === // + /// Resolve tailwind attribute overrides specific to an individual edge, + /// without re-applying EdgeDefaults. + /// + /// This is used when building an edge's classes on top of an + /// already-resolved edge group state. Only the entity-type-specific and + /// ID-specific overrides for the individual edge are applied; EdgeDefaults + /// are intentionally skipped because they are already present in the + /// cloned group state. + /// + /// # Parameters + /// + /// * `edge_id`: The individual edge ID (e.g., `edge_group_id__0`). + /// * `entity_types`: The entity types map. + /// * `theme_default`: The theme defaults. + /// * `theme_types_styles`: Styles defined per entity type. + /// * `tailwind_class_state`: The cloned edge group state to apply overrides + /// onto. + fn resolve_tailwind_attrs_edge_overrides<'partials, 'tw_state, 'id>( + edge_id: &Id<'id>, + entity_types: &'partials EntityTypes<'id>, + theme_default: &'partials ThemeDefault<'id>, + theme_types_styles: &'partials ThemeTypesStyles<'id>, + tailwind_class_state: &mut TailwindClassState<'tw_state>, + ) where + 'partials: 'tw_state, + { + // Apply entity type styles for the edge ID. + if let Some(types) = entity_types.get(edge_id) { + types + .iter() + .filter_map(|entity_type| { + let type_id = EntityTypeId::from(entity_type.clone().into_id()); + theme_types_styles + .get(&type_id) + .and_then(|type_styles| type_styles.get(&IdOrDefaults::EdgeDefaults)) + }) + .for_each(|type_partials| { + Self::apply_tailwind_from_partials( + type_partials, + &theme_default.style_aliases, + tailwind_class_state, + ); + }); + } + + // Apply edge ID-specific styles (highest priority). + if let Some(edge_partials) = theme_default + .base_styles + .get(&IdOrDefaults::Id(edge_id.clone())) + { + Self::apply_tailwind_from_partials( + edge_partials, + &theme_default.style_aliases, + tailwind_class_state, + ); + } + } + /// Resolve tailwind attributes for a node. /// /// # Parameters @@ -747,7 +852,7 @@ impl TailwindClassesBuilder { theme_default: &'partials ThemeDefault<'id>, theme_types_styles: &'partials ThemeTypesStyles<'id>, id_or_defaults_key: IdOrDefaults<'id>, - state: &mut TailwindClassState<'tw_state>, + tailwind_class_state: &mut TailwindClassState<'tw_state>, ) where 'partials: 'tw_state, { @@ -756,7 +861,7 @@ impl TailwindClassesBuilder { Self::apply_tailwind_from_partials( defaults_partials, &theme_default.style_aliases, - state, + tailwind_class_state, ); } @@ -774,7 +879,7 @@ impl TailwindClassesBuilder { Self::apply_tailwind_from_partials( type_partials, &theme_default.style_aliases, - state, + tailwind_class_state, ); }); } @@ -784,7 +889,11 @@ impl TailwindClassesBuilder { .base_styles .get(&IdOrDefaults::Id(entity_id.clone())) { - Self::apply_tailwind_from_partials(node_partials, &theme_default.style_aliases, state); + Self::apply_tailwind_from_partials( + node_partials, + &theme_default.style_aliases, + tailwind_class_state, + ); } } @@ -792,7 +901,7 @@ impl TailwindClassesBuilder { fn apply_tailwind_from_partials<'partials, 'tw_state, 'id>( partials: &'partials CssClassPartials<'id>, style_aliases: &'partials StyleAliases<'id>, - state: &mut TailwindClassState<'tw_state>, + tailwind_class_state: &mut TailwindClassState<'tw_state>, ) where 'partials: 'tw_state, { @@ -801,21 +910,25 @@ impl TailwindClassesBuilder { .style_aliases_applied() .iter() .filter_map(|alias| style_aliases.get(alias)) - .for_each(|alias_partials| Self::extract_tailwind_from_map(alias_partials, state)); + .for_each(|alias_partials| { + Self::extract_tailwind_from_map(alias_partials, tailwind_class_state) + }); // Then, check direct attributes (higher priority within this partials) - Self::extract_tailwind_from_map(partials, state); + Self::extract_tailwind_from_map(partials, tailwind_class_state); } /// Extract tailwind attribute values from a CssClassPartials map. fn extract_tailwind_from_map<'partials, 'tw_state, 'id>( partials: &'partials CssClassPartials<'id>, - state: &mut TailwindClassState<'tw_state>, + tailwind_class_state: &mut TailwindClassState<'tw_state>, ) where 'partials: 'tw_state, { partials.iter().for_each(|(theme_attr, value)| { - state.attrs.insert(*theme_attr, Cow::Borrowed(value)); + tailwind_class_state + .attrs + .insert(*theme_attr, Cow::Borrowed(value)); }); } } diff --git a/crate/input_ir_rt/src/svg_elements_to_svg_mapper.rs b/crate/input_ir_rt/src/svg_elements_to_svg_mapper.rs index d6a3d0b..2afd4c2 100644 --- a/crate/input_ir_rt/src/svg_elements_to_svg_mapper.rs +++ b/crate/input_ir_rt/src/svg_elements_to_svg_mapper.rs @@ -308,33 +308,22 @@ impl SvgElementsToSvgMapper { ) { svg_edge_infos.iter().for_each(|svg_edge_info| { let edge_id = &svg_edge_info.edge_id; - let edge_group_id = &svg_edge_info.edge_group_id; let path_d = &svg_edge_info.path_d; let arrow_head_path_d = &svg_edge_info.arrow_head_path_d; let locus_path_d = &svg_edge_info.locus_path_d; - // Build class attribute from tailwind_classes for the edge - // First check for edge-specific classes, then fall back to edge group classes + // Build class attribute from tailwind_classes for the edge. + // + // Each edge's class string already contains the fully merged + // classes (edge group base + edge-specific overrides), so only + // the edge ID needs to be looked up. let class_attr = { let edge_classes = tailwind_classes .get(edge_id.as_ref()) .map(|s| s.as_str()) .unwrap_or(""); - let edge_group_classes = tailwind_classes - .get(edge_group_id.as_ref()) - .map(|s| s.as_str()) - .unwrap_or(""); - - let combined = if edge_classes.is_empty() { - edge_group_classes.to_string() - } else if edge_group_classes.is_empty() { - edge_classes.to_string() - } else { - format!("{edge_group_classes}\n{edge_classes}") - }; - - Self::class_attr_escaped(combined) + Self::class_attr_escaped(edge_classes.to_string()) }; // Build class attribute for the arrowhead element. diff --git a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_builder_pass_2.rs b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_builder_pass_2.rs index e7ba76e..bb18e1f 100644 --- a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_builder_pass_2.rs +++ b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_builder_pass_2.rs @@ -66,13 +66,13 @@ impl EdgePathBuilderPass2 { /// /// # Parameters /// - /// * `edge_curvature` -- `Curved` for smooth bezier segments, `Orthogonal` + /// * `edge_curvature`: `Curved` for smooth bezier segments, `Orthogonal` /// for 90-degree lines with arc corners. - /// * `spacers` -- intermediate spacer coordinates the edge must pass - /// through, e.g. `&[SpacerCoordinates { entry_x: 150.0, entry_y: 200.0, - /// exit_x: 150.0, exit_y: 205.0 }]`. - /// * `ortho_protrusion` -- precomputed protrusion lengths for orthogonal - /// edge endpoints. Ignored when `edge_curvature` is `Curved`. + /// * `spacers`: intermediate spacer coordinates the edge must pass through, + /// e.g. `&[SpacerCoordinates { entry_x: 150.0, entry_y: 200.0, exit_x: + /// 150.0, exit_y: 205.0 }]`. + /// * `ortho_protrusion`: precomputed protrusion lengths for orthogonal edge + /// endpoints. Ignored when `edge_curvature` is `Curved`. #[allow(clippy::too_many_arguments)] pub(super) fn build( edge_curvature: EdgeCurvature, diff --git a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_builder_pass_2/edge_path_builder_pass_2_curve.rs b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_builder_pass_2/edge_path_builder_pass_2_curve.rs index cb2fb7e..dd19531 100644 --- a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_builder_pass_2/edge_path_builder_pass_2_curve.rs +++ b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_builder_pass_2/edge_path_builder_pass_2_curve.rs @@ -138,10 +138,10 @@ impl EdgePathBuilderPass2Curve { /// The segment goes from `(px, py)` to `(qx, qy)`. Control points /// are computed from the endpoint directions: /// - /// * `p_dir` -- the direction the path should leave `(px, py)`. For a - /// `Face`, the outward normal is used. For a `Direction`, the unit vector - /// is used directly. - /// * `q_dir` -- the direction the path should arrive at `(qx, qy)`. For a + /// * `p_dir`: the direction the path should leave `(px, py)`. For a `Face`, + /// the outward normal is used. For a `Direction`, the unit vector is used + /// directly. + /// * `q_dir`: the direction the path should arrive at `(qx, qy)`. For a /// `Face`, the outward normal is used (the control point is placed on the /// outward side so the bezier arrives from that direction). For a /// `Direction`, the unit vector is negated to produce an inward control diff --git a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_locus_calculator.rs b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_locus_calculator.rs index 9886104..1eaf637 100644 --- a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_locus_calculator.rs +++ b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/edge_path_locus_calculator.rs @@ -26,8 +26,8 @@ impl EdgePathLocusCalculator { /// /// # Parameters /// - /// * `edge_path` -- the `BezPath` for the edge body. - /// * `arrow_head_path` -- the `BezPath` for the edge's arrow head. + /// * `edge_path`: the `BezPath` for the edge body. + /// * `arrow_head_path`: the `BezPath` for the edge's arrow head. pub(super) fn calculate(edge_path: &BezPath, arrow_head_path: &BezPath) -> BezPath { let style = Stroke::new(LOCUS_STROKE_WIDTH) .with_join(Join::Round) diff --git a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/ortho_protrusion_calculator.rs b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/ortho_protrusion_calculator.rs index d7b17c1..6443fc7 100644 --- a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/ortho_protrusion_calculator.rs +++ b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/ortho_protrusion_calculator.rs @@ -151,12 +151,12 @@ impl OrthoProtrusionCalculator { /// /// # Parameters /// - /// * `all_pass1_groups` -- all edge groups with pass-1 metadata. - /// * `face_offsets_by_node_face` -- precomputed per-face offset vectors - /// from `face_offsets_compute`. - /// * `svg_node_info_map` -- node layout information. - /// * `taffy_tree` -- the layout tree (for spacer coordinate lookups). - /// * `edge_spacer_taffy_nodes` -- spacer node mappings per edge. + /// * `all_pass1_groups`: all edge groups with pass-1 metadata. + /// * `face_offsets_by_node_face`: precomputed per-face offset vectors from + /// `face_offsets_compute`. + /// * `svg_node_info_map`: node layout information. + /// * `taffy_tree`: the layout tree (for spacer coordinate lookups). + /// * `edge_spacer_taffy_nodes`: spacer node mappings per edge. #[allow(clippy::too_many_arguments)] pub(super) fn calculate<'id>( rank_dir: RankDir, @@ -914,10 +914,10 @@ impl OrthoProtrusionCalculator { /// /// # Parameters /// - /// * `rank_from` -- rank of the from-node. - /// * `rank_to` -- rank of the to-node. - /// * `spacer_idx_low` -- index of the earlier spacer (in forward order). - /// * `spacer_idx_high` -- index of the later spacer. + /// * `rank_from`: rank of the from-node. + /// * `rank_to`: rank of the to-node. + /// * `spacer_idx_low`: index of the earlier spacer (in forward order). + /// * `spacer_idx_high`: index of the later spacer. fn spacer_gap_key( rank_from: NodeRank, rank_to: NodeRank, @@ -1114,14 +1114,14 @@ impl OrthoProtrusionCalculator { /// returns `SpacerCoordinates` with entry and exit points that /// depend on `rank_dir`: /// - /// * `TopToBottom` -- entry at top midpoint (smallest y), exit at bottom - /// midpoint (largest y). - /// * `BottomToTop` -- entry at bottom midpoint (largest y), exit at top - /// midpoint (smallest y). - /// * `LeftToRight` -- entry at left midpoint (smallest x), exit at right - /// midpoint (largest x). - /// * `RightToLeft` -- entry at right midpoint (largest x), exit at left - /// midpoint (smallest x). + /// * `RankDir::TopToBottom`: entry at top midpoint (smallest y), exit at + /// bottom midpoint (largest y). + /// * `RankDir::BottomToTop`: entry at bottom midpoint (largest y), exit at + /// top midpoint (smallest y). + /// * `RankDir::LeftToRight`: entry at left midpoint (smallest x), exit at + /// right midpoint (largest x). + /// * `RankDir::RightToLeft`: entry at right midpoint (largest x), exit at + /// left midpoint (smallest x). fn spacer_absolute_coordinates( rank_dir: RankDir, taffy_tree: &TaffyTree, diff --git a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/svg_edge_infos_builder.rs b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/svg_edge_infos_builder.rs index 367c3e8..3cd72ef 100644 --- a/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/svg_edge_infos_builder.rs +++ b/crate/input_ir_rt/src/taffy_to_svg_elements_mapper/svg_edge_infos_builder.rs @@ -761,14 +761,14 @@ impl SvgEdgeInfosBuilder { /// returns `SpacerCoordinates` with entry and exit points that /// depend on `rank_dir`: /// - /// * `TopToBottom` -- entry at top midpoint (smallest y), exit at bottom - /// midpoint (largest y). - /// * `BottomToTop` -- entry at bottom midpoint (largest y), exit at top - /// midpoint (smallest y). - /// * `LeftToRight` -- entry at left midpoint (smallest x), exit at right - /// midpoint (largest x). - /// * `RightToLeft` -- entry at right midpoint (largest x), exit at left - /// midpoint (smallest x). + /// * `RankDir::TopToBottom`: entry at top midpoint (smallest y), exit at + /// bottom midpoint (largest y). + /// * `RankDir::BottomToTop`: entry at bottom midpoint (largest y), exit at + /// top midpoint (smallest y). + /// * `RankDir::LeftToRight`: entry at left midpoint (smallest x), exit at + /// right midpoint (largest x). + /// * `RankDir::RightToLeft`: entry at right midpoint (largest x), exit at + /// left midpoint (smallest x). fn spacer_absolute_coordinates( rank_dir: RankDir, taffy_tree: &TaffyTree, diff --git a/crate/input_ir_rt/src/theme_value_source.rs b/crate/input_ir_rt/src/theme_value_source.rs index 005a514..1f32764 100644 --- a/crate/input_ir_rt/src/theme_value_source.rs +++ b/crate/input_ir_rt/src/theme_value_source.rs @@ -5,8 +5,8 @@ /// /// # Variants /// -/// * `BaseDiagram` -- the value comes from `InputDiagram::base()`. -/// * `UserInput` -- the value was provided by the user's overlay diagram. +/// * `BaseDiagram`: the value comes from `InputDiagram::base()`. +/// * `UserInput`: the value was provided by the user's overlay diagram. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum ThemeValueSource { /// Value comes from the base diagram defaults. diff --git a/crate/input_model/src/input_diagram.rs b/crate/input_model/src/input_diagram.rs index e8cc371..3b1e035 100644 --- a/crate/input_model/src/input_diagram.rs +++ b/crate/input_model/src/input_diagram.rs @@ -707,13 +707,7 @@ fn base_theme_types_styles() -> ThemeTypesStyles<'static> { .into(), [( IdOrDefaults::EdgeDefaults, - css_class_partials( - vec![], - vec![ - (ThemeAttr::StrokeWidth, "2"), - (ThemeAttr::Visibility, "visible"), - ], - ), + css_class_partials(vec![], vec![]), )] .into_iter() .collect(), @@ -725,13 +719,7 @@ fn base_theme_types_styles() -> ThemeTypesStyles<'static> { .into(), [( IdOrDefaults::EdgeDefaults, - css_class_partials( - vec![], - vec![ - (ThemeAttr::StrokeWidth, "2"), - (ThemeAttr::Visibility, "visible"), - ], - ), + css_class_partials(vec![], vec![]), )] .into_iter() .collect(), @@ -743,13 +731,7 @@ fn base_theme_types_styles() -> ThemeTypesStyles<'static> { .into(), [( IdOrDefaults::EdgeDefaults, - css_class_partials( - vec![], - vec![ - (ThemeAttr::StrokeWidth, "2"), - (ThemeAttr::Visibility, "visible"), - ], - ), + css_class_partials(vec![], vec![]), )] .into_iter() .collect(), @@ -761,13 +743,7 @@ fn base_theme_types_styles() -> ThemeTypesStyles<'static> { .into(), [( IdOrDefaults::EdgeDefaults, - css_class_partials( - vec![], - vec![ - (ThemeAttr::StrokeWidth, "2"), - (ThemeAttr::Visibility, "visible"), - ], - ), + css_class_partials(vec![], vec![]), )] .into_iter() .collect(), diff --git a/crate/input_model/src/theme/dark_mode_css_selector.rs b/crate/input_model/src/theme/dark_mode_css_selector.rs index 2107fde..1b9518a 100644 --- a/crate/input_model/src/theme/dark_mode_css_selector.rs +++ b/crate/input_model/src/theme/dark_mode_css_selector.rs @@ -7,9 +7,9 @@ use serde::{Deserialize, Serialize}; /// /// # Variants /// -/// * `MediaQuery` -- uses `@media (prefers-color-scheme: dark) { svg { .. } }`. -/// * `RootDarkClass` -- uses `:root.dark svg { .. }`, which allows a -/// surrounding page to toggle dark mode via a `dark` class on ``. +/// * `MediaQuery`: uses `@media (prefers-color-scheme: dark) { svg { .. } }`. +/// * `RootDarkClass`: uses `:root.dark svg { .. }`, which allows a surrounding +/// page to toggle dark mode via a `dark` class on ``. /// /// Defaults to `DarkModeCssSelector::RootDarkClass`. /// diff --git a/crate/input_model/src/theme/dark_mode_shade_config.rs b/crate/input_model/src/theme/dark_mode_shade_config.rs index d91298b..b0f1989 100644 --- a/crate/input_model/src/theme/dark_mode_shade_config.rs +++ b/crate/input_model/src/theme/dark_mode_shade_config.rs @@ -8,10 +8,10 @@ use serde::{Deserialize, Serialize}; /// /// # Variants /// -/// * `Disable` -- no dark mode classes are emitted. -/// * `Invert` -- shades are mirrored around 500 (e.g. 100 becomes 900). -/// * `Shift` -- shades are shifted by a number of levels (e.g. 100 shifted -/// darker by 4 levels becomes 500). +/// * `Disable`: no dark mode classes are emitted. +/// * `Invert`: shades are mirrored around 500 (e.g. 100 becomes 900). +/// * `Shift`: shades are shifted by a number of levels (e.g. 100 shifted darker +/// by 4 levels becomes 500). /// /// Defaults to `DarkModeShadeConfig::Invert`. /// diff --git a/crate/input_rt/src/id_parse.rs b/crate/input_rt/src/id_parse.rs index 97c448c..b5b7081 100644 --- a/crate/input_rt/src/id_parse.rs +++ b/crate/input_rt/src/id_parse.rs @@ -80,9 +80,9 @@ pub fn parse_entity_type_id(s: &str) -> Option> { /// /// Recognized built-in keys: /// -/// * `"node_defaults"` -- `IdOrDefaults::NodeDefaults` -/// * `"node_excluded_defaults"` -- `IdOrDefaults::NodeExcludedDefaults` -/// * `"edge_defaults"` -- `IdOrDefaults::EdgeDefaults` +/// * `"node_defaults"`: `IdOrDefaults::NodeDefaults` +/// * `"node_excluded_defaults"`: `IdOrDefaults::NodeExcludedDefaults` +/// * `"edge_defaults"`: `IdOrDefaults::EdgeDefaults` /// /// Valid values: `"node_defaults"`, `"edge_defaults"`, `"t_aws"`. pub fn parse_id_or_defaults(s: &str) -> Option> { diff --git a/crate/model_common/src/layout/flex_direction.rs b/crate/model_common/src/layout/flex_direction.rs index de6df09..a79a501 100644 --- a/crate/model_common/src/layout/flex_direction.rs +++ b/crate/model_common/src/layout/flex_direction.rs @@ -7,10 +7,10 @@ use serde::{Deserialize, Serialize}; /// /// # YAML values /// -/// * `"row"` -- Items are placed left to right. -/// * `"row_reverse"` -- Items are placed right to left. -/// * `"column"` -- Items are placed top to bottom. -/// * `"column_reverse"` -- Items are placed bottom to top. +/// * `"row"`: Items are placed left to right. +/// * `"row_reverse"`: Items are placed right to left. +/// * `"column"`: Items are placed top to bottom. +/// * `"column_reverse"`: Items are placed bottom to top. #[cfg_attr( all(feature = "schemars", not(feature = "test")), derive(schemars::JsonSchema) diff --git a/workspace_tests/src/base_diagram.yaml b/workspace_tests/src/base_diagram.yaml index c549054..1998d77 100644 --- a/workspace_tests/src/base_diagram.yaml +++ b/workspace_tests/src/base_diagram.yaml @@ -224,21 +224,13 @@ theme_types_styles: # thing_dependencies - edges type_dependency_edge_sequence_forward_default: - edge_defaults: - stroke_width: "2" - visibility: "visible" + edge_defaults: {} type_dependency_edge_cyclic_forward_default: - edge_defaults: - stroke_width: "2" - visibility: "visible" + edge_defaults: {} type_dependency_edge_symmetric_forward_default: - edge_defaults: - stroke_width: "2" - visibility: "visible" + edge_defaults: {} type_dependency_edge_symmetric_reverse_default: - edge_defaults: - stroke_width: "2" - visibility: "visible" + edge_defaults: {} # thing_interactions - edge groups type_interaction_edge_sequence_default: diff --git a/workspace_tests/src/example_input_merged.yaml b/workspace_tests/src/example_input_merged.yaml index 4fb7482..4e7654a 100644 --- a/workspace_tests/src/example_input_merged.yaml +++ b/workspace_tests/src/example_input_merged.yaml @@ -681,17 +681,13 @@ theme_types_styles: # thing_dependencies - edges type_dependency_edge_sequence_forward_default: - edge_defaults: - stroke_width: "2" + edge_defaults: {} type_dependency_edge_cyclic_forward_default: - edge_defaults: - stroke_width: "2" + edge_defaults: {} type_dependency_edge_symmetric_forward_default: - edge_defaults: - stroke_width: "2" + edge_defaults: {} type_dependency_edge_symmetric_reverse_default: - edge_defaults: - stroke_width: "2" + edge_defaults: {} # thing_interactions - edge groups type_interaction_edge_sequence_default: diff --git a/workspace_tests/src/example_ir.yaml b/workspace_tests/src/example_ir.yaml index dd4aa0d..71b3b40 100644 --- a/workspace_tests/src/example_ir.yaml +++ b/workspace_tests/src/example_ir.yaml @@ -167,10 +167,21 @@ entity_descs: entity_tooltips: proc_app_dev_step_repository_clone: "```bash\ngit clone https://github.com/azriel91/web_app.git\n```" proc_app_dev_step_project_build: "Develop the app:\n\n* Always link to issue.\n* Open PR." - proc_app_release_step_crate_version_update: "```bash\nsd -s 'version = \"0.3.0\"' 'version = \"0.3.0\"' $(fd -tf -F toml) README.md src/lib.rs\n```" + proc_app_release_step_crate_version_update: |- + ```bash + sd -s 'version = "0.3.0"' 'version = "0.3.0"' $(fd -tf -F toml) README.md src/lib.rs + ``` proc_app_release_step_pull_request_open: Create a pull request as usual. proc_app_release_step_gh_actions_build: Github Actions will build the image. - proc_app_release_step_tag_and_push: "When the PR is merged, tag the commit and push the tag to GitHub.\n\n```bash\ngit tag 0.3.0\ngit push origin 0.3.0\n```\n\nThe build will push the new version to ECR automatically." + proc_app_release_step_tag_and_push: |- + When the PR is merged, tag the commit and push the tag to GitHub. + + ```bash + git tag 0.3.0 + git push origin 0.3.0 + ``` + + The build will push the new version to ECR automatically. proc_app_release_step_gh_actions_publish: Github Actions will publish the image to AWS ECR. proc_i12e_region_tier_app_deploy_step_ecs_cluster_update: Deploy or update the existing ECS cluster with the new image. entity_types: @@ -310,73 +321,998 @@ entity_types: edge_ix_t_aws_ecr_repo__t_aws_ecs_cluster__push__0: - type_interaction_edge_sequence_forward_default tailwind_classes: - t_aws: "visible\n[stroke-dasharray:2]\nhover:[stroke-dasharray:2]\nfocus:[stroke-dasharray:2]\nactive:[stroke-dasharray:2]\nstroke-2\nhover:fill-[var(--tw-yellow-50-950)]\nfill-[var(--tw-yellow-100-900)]\nfocus:fill-[var(--tw-yellow-200-800)]\nactive:fill-[var(--tw-yellow-300-700)]\nhover:stroke-[var(--tw-yellow-100-900)]\nstroke-[var(--tw-yellow-200-800)]\nfocus:stroke-[var(--tw-yellow-300-700)]\nactive:stroke-[var(--tw-yellow-400-600)]\n[&>text]:fill-[var(--tw-neutral-800-200)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_aws_iam: "visible\n[stroke-dasharray:4]\nhover:[stroke-dasharray:4]\nfocus:[stroke-dasharray:4]\nactive:[stroke-dasharray:4]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_aws_iam_ecs_policy: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_aws_ecr: "visible\n[stroke-dasharray:4]\nhover:[stroke-dasharray:4]\nfocus:[stroke-dasharray:4]\nactive:[stroke-dasharray:4]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_aws_ecr_repo: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:[stroke-dasharray:4]\npeer-[:focus-within]/tag_deployment:hover:[stroke-dasharray:4]\npeer-[:focus-within]/tag_deployment:focus:[stroke-dasharray:4]\npeer-[:focus-within]/tag_deployment:active:[stroke-dasharray:4]\npeer-[:focus-within]/tag_deployment:stroke-2\npeer-[:focus-within]/tag_deployment:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/tag_deployment:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/tag_deployment:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/tag_deployment:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/tag_deployment:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:stroke-2\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:[stroke-dasharray:4]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:stroke-2\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:active:fill-[var(--tw-slate-300-700)]\n" - t_aws_ecr_repo_image_1: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-200-800)]\nfill-[var(--tw-sky-300-700)]\nfocus:fill-[var(--tw-sky-400-600)]\nactive:fill-[var(--tw-sky-500-500)]\nhover:stroke-[var(--tw-sky-300-700)]\nstroke-[var(--tw-sky-400-600)]\nfocus:stroke-[var(--tw-sky-500-500)]\nactive:stroke-[var(--tw-sky-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_aws_ecr_repo_image_2: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-200-800)]\nfill-[var(--tw-sky-300-700)]\nfocus:fill-[var(--tw-sky-400-600)]\nactive:fill-[var(--tw-sky-500-500)]\nhover:stroke-[var(--tw-sky-300-700)]\nstroke-[var(--tw-sky-400-600)]\nfocus:stroke-[var(--tw-sky-500-500)]\nactive:stroke-[var(--tw-sky-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_aws_ecs: "visible\n[stroke-dasharray:4]\nhover:[stroke-dasharray:4]\nfocus:[stroke-dasharray:4]\nactive:[stroke-dasharray:4]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_aws_ecs_cluster: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:[stroke-dasharray:4]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:stroke-2\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:active:fill-[var(--tw-slate-300-700)]\n" - t_aws_ecs_cluster_task: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_github: "visible\n[stroke-dasharray:2]\nhover:[stroke-dasharray:2]\nfocus:[stroke-dasharray:2]\nactive:[stroke-dasharray:2]\nstroke-2\nhover:fill-[var(--tw-neutral-50-950)]\nfill-[var(--tw-neutral-100-900)]\nfocus:fill-[var(--tw-neutral-200-800)]\nactive:fill-[var(--tw-neutral-300-700)]\nhover:stroke-[var(--tw-neutral-100-900)]\nstroke-[var(--tw-neutral-200-800)]\nfocus:stroke-[var(--tw-neutral-300-700)]\nactive:stroke-[var(--tw-neutral-400-600)]\n[&>text]:fill-[var(--tw-neutral-800-200)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_github_user_repo: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:[stroke-dasharray:4]\npeer-[:focus-within]/tag_app_development:hover:[stroke-dasharray:4]\npeer-[:focus-within]/tag_app_development:focus:[stroke-dasharray:4]\npeer-[:focus-within]/tag_app_development:active:[stroke-dasharray:4]\npeer-[:focus-within]/tag_app_development:stroke-2\npeer-[:focus-within]/tag_app_development:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/tag_app_development:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/tag_app_development:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/tag_app_development:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/tag_app_development:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/tag_deployment:[stroke-dasharray:4]\npeer-[:focus-within]/tag_deployment:hover:[stroke-dasharray:4]\npeer-[:focus-within]/tag_deployment:focus:[stroke-dasharray:4]\npeer-[:focus-within]/tag_deployment:active:[stroke-dasharray:4]\npeer-[:focus-within]/tag_deployment:stroke-2\npeer-[:focus-within]/tag_deployment:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/tag_deployment:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/tag_deployment:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/tag_deployment:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/tag_deployment:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:stroke-2\npeer-[:focus-within]/proc_app_dev_step_repository_clone:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:stroke-2\npeer-[:focus-within]/proc_app_release_step_pull_request_open:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:stroke-2\npeer-[:focus-within]/proc_app_release_step_tag_and_push:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:stroke-2\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:stroke-2\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:active:fill-[var(--tw-slate-300-700)]\n" - t_localhost: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:[stroke-dasharray:4]\npeer-[:focus-within]/tag_app_development:hover:[stroke-dasharray:4]\npeer-[:focus-within]/tag_app_development:focus:[stroke-dasharray:4]\npeer-[:focus-within]/tag_app_development:active:[stroke-dasharray:4]\npeer-[:focus-within]/tag_app_development:stroke-2\npeer-[:focus-within]/tag_app_development:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/tag_app_development:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/tag_app_development:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/tag_app_development:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/tag_app_development:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/tag_deployment:opacity-75\npeer-[:focus-within]/proc_app_dev_step_repository_clone:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:stroke-2\npeer-[:focus-within]/proc_app_dev_step_repository_clone:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_dev_step_project_build:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_project_build:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_project_build:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_project_build:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_dev_step_project_build:stroke-2\npeer-[:focus-within]/proc_app_dev_step_project_build:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_dev_step_project_build:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_dev_step_project_build:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_dev_step_project_build:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_dev_step_project_build:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_release_step_crate_version_update:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_crate_version_update:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_crate_version_update:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_crate_version_update:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_crate_version_update:stroke-2\npeer-[:focus-within]/proc_app_release_step_crate_version_update:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_release_step_crate_version_update:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_release_step_crate_version_update:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_release_step_crate_version_update:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_release_step_crate_version_update:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:stroke-2\npeer-[:focus-within]/proc_app_release_step_pull_request_open:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_release_step_pull_request_open:active:fill-[var(--tw-slate-300-700)]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:hover:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:focus:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:active:[stroke-dasharray:4]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:stroke-2\npeer-[:focus-within]/proc_app_release_step_tag_and_push:animate-[stroke-dashoffset-move_2s_linear_infinite]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:hover:fill-[var(--tw-slate-50-950)]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:fill-[var(--tw-slate-100-900)]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:focus:fill-[var(--tw-slate-200-800)]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:active:fill-[var(--tw-slate-300-700)]\n" - t_localhost_repo: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_localhost_repo_src: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_localhost_repo_target: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_localhost_repo_target_file_zip: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - t_localhost_repo_target_dist_dir: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-slate-200-800)]\nfill-[var(--tw-slate-300-700)]\nfocus:fill-[var(--tw-slate-400-600)]\nactive:fill-[var(--tw-slate-500-500)]\nhover:stroke-[var(--tw-slate-300-700)]\nstroke-[var(--tw-slate-400-600)]\nfocus:stroke-[var(--tw-slate-500-500)]\nactive:stroke-[var(--tw-slate-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/tag_app_development:opacity-50\npeer-[:focus-within]/tag_deployment:opacity-75\n" - tag_app_development: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-emerald-400-600)]\nfill-[var(--tw-emerald-500-500)]\nfocus:fill-[var(--tw-emerald-600-400)]\nactive:fill-[var(--tw-emerald-700-300)]\nhover:stroke-[var(--tw-emerald-500-500)]\nstroke-[var(--tw-emerald-600-400)]\nfocus:stroke-[var(--tw-emerald-700-300)]\nactive:stroke-[var(--tw-emerald-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer/tag_app_development\n" - tag_deployment: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-emerald-400-600)]\nfill-[var(--tw-emerald-500-500)]\nfocus:fill-[var(--tw-emerald-600-400)]\nactive:fill-[var(--tw-emerald-700-300)]\nhover:stroke-[var(--tw-emerald-500-500)]\nstroke-[var(--tw-emerald-600-400)]\nfocus:stroke-[var(--tw-emerald-700-300)]\nactive:stroke-[var(--tw-emerald-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer/tag_deployment\n" - proc_app_dev: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-blue-400-600)]\nfill-[var(--tw-blue-500-500)]\nfocus:fill-[var(--tw-blue-600-400)]\nactive:fill-[var(--tw-blue-700-300)]\nhover:stroke-[var(--tw-blue-500-500)]\nstroke-[var(--tw-blue-600-400)]\nfocus:stroke-[var(--tw-blue-700-300)]\nactive:stroke-[var(--tw-blue-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer/proc_app_dev\n" - proc_app_dev_step_repository_clone: "invisible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-400-600)]\nfill-[var(--tw-sky-500-500)]\nfocus:fill-[var(--tw-sky-600-400)]\nactive:fill-[var(--tw-sky-700-300)]\nhover:stroke-[var(--tw-sky-500-500)]\nstroke-[var(--tw-sky-600-400)]\nfocus:stroke-[var(--tw-sky-700-300)]\nactive:stroke-[var(--tw-sky-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\ngroup-has-[#proc_app_dev:focus-within]:visible\ngroup-has-[#proc_app_dev_step_repository_clone:focus-within]:visible\ngroup-has-[#proc_app_dev_step_project_build:focus-within]:visible\npeer/proc_app_dev_step_repository_clone\n" - proc_app_dev_step_project_build: "invisible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-400-600)]\nfill-[var(--tw-sky-500-500)]\nfocus:fill-[var(--tw-sky-600-400)]\nactive:fill-[var(--tw-sky-700-300)]\nhover:stroke-[var(--tw-sky-500-500)]\nstroke-[var(--tw-sky-600-400)]\nfocus:stroke-[var(--tw-sky-700-300)]\nactive:stroke-[var(--tw-sky-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\ngroup-has-[#proc_app_dev:focus-within]:visible\ngroup-has-[#proc_app_dev_step_repository_clone:focus-within]:visible\ngroup-has-[#proc_app_dev_step_project_build:focus-within]:visible\npeer/proc_app_dev_step_project_build\n" - proc_app_release: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-blue-400-600)]\nfill-[var(--tw-blue-500-500)]\nfocus:fill-[var(--tw-blue-600-400)]\nactive:fill-[var(--tw-blue-700-300)]\nhover:stroke-[var(--tw-blue-500-500)]\nstroke-[var(--tw-blue-600-400)]\nfocus:stroke-[var(--tw-blue-700-300)]\nactive:stroke-[var(--tw-blue-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer/proc_app_release\n" - proc_app_release_step_crate_version_update: "invisible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-400-600)]\nfill-[var(--tw-sky-500-500)]\nfocus:fill-[var(--tw-sky-600-400)]\nactive:fill-[var(--tw-sky-700-300)]\nhover:stroke-[var(--tw-sky-500-500)]\nstroke-[var(--tw-sky-600-400)]\nfocus:stroke-[var(--tw-sky-700-300)]\nactive:stroke-[var(--tw-sky-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\ngroup-has-[#proc_app_release:focus-within]:visible\ngroup-has-[#proc_app_release_step_crate_version_update:focus-within]:visible\ngroup-has-[#proc_app_release_step_pull_request_open:focus-within]:visible\ngroup-has-[#proc_app_release_step_tag_and_push:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible\npeer/proc_app_release_step_crate_version_update\n" - proc_app_release_step_pull_request_open: "invisible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-400-600)]\nfill-[var(--tw-sky-500-500)]\nfocus:fill-[var(--tw-sky-600-400)]\nactive:fill-[var(--tw-sky-700-300)]\nhover:stroke-[var(--tw-sky-500-500)]\nstroke-[var(--tw-sky-600-400)]\nfocus:stroke-[var(--tw-sky-700-300)]\nactive:stroke-[var(--tw-sky-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\ngroup-has-[#proc_app_release:focus-within]:visible\ngroup-has-[#proc_app_release_step_crate_version_update:focus-within]:visible\ngroup-has-[#proc_app_release_step_pull_request_open:focus-within]:visible\ngroup-has-[#proc_app_release_step_tag_and_push:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible\npeer/proc_app_release_step_pull_request_open\n" - proc_app_release_step_tag_and_push: "invisible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-400-600)]\nfill-[var(--tw-sky-500-500)]\nfocus:fill-[var(--tw-sky-600-400)]\nactive:fill-[var(--tw-sky-700-300)]\nhover:stroke-[var(--tw-sky-500-500)]\nstroke-[var(--tw-sky-600-400)]\nfocus:stroke-[var(--tw-sky-700-300)]\nactive:stroke-[var(--tw-sky-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\ngroup-has-[#proc_app_release:focus-within]:visible\ngroup-has-[#proc_app_release_step_crate_version_update:focus-within]:visible\ngroup-has-[#proc_app_release_step_pull_request_open:focus-within]:visible\ngroup-has-[#proc_app_release_step_tag_and_push:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible\npeer/proc_app_release_step_tag_and_push\n" - proc_app_release_step_gh_actions_build: "invisible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-400-600)]\nfill-[var(--tw-sky-500-500)]\nfocus:fill-[var(--tw-sky-600-400)]\nactive:fill-[var(--tw-sky-700-300)]\nhover:stroke-[var(--tw-sky-500-500)]\nstroke-[var(--tw-sky-600-400)]\nfocus:stroke-[var(--tw-sky-700-300)]\nactive:stroke-[var(--tw-sky-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\ngroup-has-[#proc_app_release:focus-within]:visible\ngroup-has-[#proc_app_release_step_crate_version_update:focus-within]:visible\ngroup-has-[#proc_app_release_step_pull_request_open:focus-within]:visible\ngroup-has-[#proc_app_release_step_tag_and_push:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible\npeer/proc_app_release_step_gh_actions_build\n" - proc_app_release_step_gh_actions_publish: "invisible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-400-600)]\nfill-[var(--tw-sky-500-500)]\nfocus:fill-[var(--tw-sky-600-400)]\nactive:fill-[var(--tw-sky-700-300)]\nhover:stroke-[var(--tw-sky-500-500)]\nstroke-[var(--tw-sky-600-400)]\nfocus:stroke-[var(--tw-sky-700-300)]\nactive:stroke-[var(--tw-sky-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\ngroup-has-[#proc_app_release:focus-within]:visible\ngroup-has-[#proc_app_release_step_crate_version_update:focus-within]:visible\ngroup-has-[#proc_app_release_step_pull_request_open:focus-within]:visible\ngroup-has-[#proc_app_release_step_tag_and_push:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible\ngroup-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible\npeer/proc_app_release_step_gh_actions_publish\n" - proc_i12e_region_tier_app_deploy: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-blue-400-600)]\nfill-[var(--tw-blue-500-500)]\nfocus:fill-[var(--tw-blue-600-400)]\nactive:fill-[var(--tw-blue-700-300)]\nhover:stroke-[var(--tw-blue-500-500)]\nstroke-[var(--tw-blue-600-400)]\nfocus:stroke-[var(--tw-blue-700-300)]\nactive:stroke-[var(--tw-blue-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer/proc_i12e_region_tier_app_deploy\n" - proc_i12e_region_tier_app_deploy_step_ecs_cluster_update: "invisible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-sky-400-600)]\nfill-[var(--tw-sky-500-500)]\nfocus:fill-[var(--tw-sky-600-400)]\nactive:fill-[var(--tw-sky-700-300)]\nhover:stroke-[var(--tw-sky-500-500)]\nstroke-[var(--tw-sky-600-400)]\nfocus:stroke-[var(--tw-sky-700-300)]\nactive:stroke-[var(--tw-sky-800-200)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\ngroup-has-[#proc_i12e_region_tier_app_deploy:focus-within]:visible\ngroup-has-[#proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus-within]:visible\npeer/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update\n" - edge_dep_t_localhost__t_github_user_repo__pull: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-neutral-500-500)]\nfill-[var(--tw-neutral-600-400)]\nfocus:fill-[var(--tw-neutral-700-300)]\nactive:fill-[var(--tw-neutral-800-200)]\nhover:stroke-[var(--tw-neutral-600-400)]\nstroke-[var(--tw-neutral-700-300)]\nfocus:stroke-[var(--tw-neutral-800-200)]\nactive:stroke-[var(--tw-neutral-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\n" + t_aws: | + visible + [stroke-dasharray:2] + hover:[stroke-dasharray:2] + focus:[stroke-dasharray:2] + active:[stroke-dasharray:2] + stroke-2 + hover:fill-[var(--tw-yellow-50-950)] + fill-[var(--tw-yellow-100-900)] + focus:fill-[var(--tw-yellow-200-800)] + active:fill-[var(--tw-yellow-300-700)] + hover:stroke-[var(--tw-yellow-100-900)] + stroke-[var(--tw-yellow-200-800)] + focus:stroke-[var(--tw-yellow-300-700)] + active:stroke-[var(--tw-yellow-400-600)] + [&>text]:fill-[var(--tw-neutral-800-200)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_aws_iam: | + visible + [stroke-dasharray:4] + hover:[stroke-dasharray:4] + focus:[stroke-dasharray:4] + active:[stroke-dasharray:4] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_aws_iam_ecs_policy: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_aws_ecr: | + visible + [stroke-dasharray:4] + hover:[stroke-dasharray:4] + focus:[stroke-dasharray:4] + active:[stroke-dasharray:4] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_aws_ecr_repo: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:[stroke-dasharray:4] + peer-[:focus-within]/tag_deployment:hover:[stroke-dasharray:4] + peer-[:focus-within]/tag_deployment:focus:[stroke-dasharray:4] + peer-[:focus-within]/tag_deployment:active:[stroke-dasharray:4] + peer-[:focus-within]/tag_deployment:stroke-2 + peer-[:focus-within]/tag_deployment:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/tag_deployment:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/tag_deployment:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/tag_deployment:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/tag_deployment:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:stroke-2 + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:[stroke-dasharray:4] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:stroke-2 + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:active:fill-[var(--tw-slate-300-700)] + t_aws_ecr_repo_image_1: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-200-800)] + fill-[var(--tw-sky-300-700)] + focus:fill-[var(--tw-sky-400-600)] + active:fill-[var(--tw-sky-500-500)] + hover:stroke-[var(--tw-sky-300-700)] + stroke-[var(--tw-sky-400-600)] + focus:stroke-[var(--tw-sky-500-500)] + active:stroke-[var(--tw-sky-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_aws_ecr_repo_image_2: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-200-800)] + fill-[var(--tw-sky-300-700)] + focus:fill-[var(--tw-sky-400-600)] + active:fill-[var(--tw-sky-500-500)] + hover:stroke-[var(--tw-sky-300-700)] + stroke-[var(--tw-sky-400-600)] + focus:stroke-[var(--tw-sky-500-500)] + active:stroke-[var(--tw-sky-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_aws_ecs: | + visible + [stroke-dasharray:4] + hover:[stroke-dasharray:4] + focus:[stroke-dasharray:4] + active:[stroke-dasharray:4] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_aws_ecs_cluster: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:[stroke-dasharray:4] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:stroke-2 + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:active:fill-[var(--tw-slate-300-700)] + t_aws_ecs_cluster_task: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_github: | + visible + [stroke-dasharray:2] + hover:[stroke-dasharray:2] + focus:[stroke-dasharray:2] + active:[stroke-dasharray:2] + stroke-2 + hover:fill-[var(--tw-neutral-50-950)] + fill-[var(--tw-neutral-100-900)] + focus:fill-[var(--tw-neutral-200-800)] + active:fill-[var(--tw-neutral-300-700)] + hover:stroke-[var(--tw-neutral-100-900)] + stroke-[var(--tw-neutral-200-800)] + focus:stroke-[var(--tw-neutral-300-700)] + active:stroke-[var(--tw-neutral-400-600)] + [&>text]:fill-[var(--tw-neutral-800-200)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_github_user_repo: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:[stroke-dasharray:4] + peer-[:focus-within]/tag_app_development:hover:[stroke-dasharray:4] + peer-[:focus-within]/tag_app_development:focus:[stroke-dasharray:4] + peer-[:focus-within]/tag_app_development:active:[stroke-dasharray:4] + peer-[:focus-within]/tag_app_development:stroke-2 + peer-[:focus-within]/tag_app_development:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/tag_app_development:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/tag_app_development:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/tag_app_development:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/tag_app_development:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/tag_deployment:[stroke-dasharray:4] + peer-[:focus-within]/tag_deployment:hover:[stroke-dasharray:4] + peer-[:focus-within]/tag_deployment:focus:[stroke-dasharray:4] + peer-[:focus-within]/tag_deployment:active:[stroke-dasharray:4] + peer-[:focus-within]/tag_deployment:stroke-2 + peer-[:focus-within]/tag_deployment:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/tag_deployment:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/tag_deployment:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/tag_deployment:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/tag_deployment:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_dev_step_repository_clone:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_repository_clone:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_repository_clone:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_repository_clone:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_repository_clone:stroke-2 + peer-[:focus-within]/proc_app_dev_step_repository_clone:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_dev_step_repository_clone:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_dev_step_repository_clone:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_dev_step_repository_clone:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_dev_step_repository_clone:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_release_step_pull_request_open:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_pull_request_open:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_pull_request_open:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_pull_request_open:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_pull_request_open:stroke-2 + peer-[:focus-within]/proc_app_release_step_pull_request_open:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_release_step_pull_request_open:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_release_step_pull_request_open:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_release_step_pull_request_open:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_release_step_pull_request_open:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_release_step_tag_and_push:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_tag_and_push:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_tag_and_push:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_tag_and_push:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_tag_and_push:stroke-2 + peer-[:focus-within]/proc_app_release_step_tag_and_push:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_release_step_tag_and_push:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_release_step_tag_and_push:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_release_step_tag_and_push:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_release_step_tag_and_push:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_release_step_gh_actions_build:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_build:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_build:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_build:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_build:stroke-2 + peer-[:focus-within]/proc_app_release_step_gh_actions_build:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_release_step_gh_actions_build:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_release_step_gh_actions_build:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_release_step_gh_actions_build:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_release_step_gh_actions_build:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:stroke-2 + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:active:fill-[var(--tw-slate-300-700)] + t_localhost: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:[stroke-dasharray:4] + peer-[:focus-within]/tag_app_development:hover:[stroke-dasharray:4] + peer-[:focus-within]/tag_app_development:focus:[stroke-dasharray:4] + peer-[:focus-within]/tag_app_development:active:[stroke-dasharray:4] + peer-[:focus-within]/tag_app_development:stroke-2 + peer-[:focus-within]/tag_app_development:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/tag_app_development:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/tag_app_development:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/tag_app_development:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/tag_app_development:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/tag_deployment:opacity-75 + peer-[:focus-within]/proc_app_dev_step_repository_clone:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_repository_clone:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_repository_clone:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_repository_clone:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_repository_clone:stroke-2 + peer-[:focus-within]/proc_app_dev_step_repository_clone:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_dev_step_repository_clone:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_dev_step_repository_clone:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_dev_step_repository_clone:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_dev_step_repository_clone:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_dev_step_project_build:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_project_build:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_project_build:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_project_build:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_dev_step_project_build:stroke-2 + peer-[:focus-within]/proc_app_dev_step_project_build:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_dev_step_project_build:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_dev_step_project_build:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_dev_step_project_build:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_dev_step_project_build:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_release_step_crate_version_update:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_crate_version_update:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_crate_version_update:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_crate_version_update:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_crate_version_update:stroke-2 + peer-[:focus-within]/proc_app_release_step_crate_version_update:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_release_step_crate_version_update:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_release_step_crate_version_update:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_release_step_crate_version_update:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_release_step_crate_version_update:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_release_step_pull_request_open:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_pull_request_open:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_pull_request_open:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_pull_request_open:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_pull_request_open:stroke-2 + peer-[:focus-within]/proc_app_release_step_pull_request_open:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_release_step_pull_request_open:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_release_step_pull_request_open:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_release_step_pull_request_open:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_release_step_pull_request_open:active:fill-[var(--tw-slate-300-700)] + peer-[:focus-within]/proc_app_release_step_tag_and_push:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_tag_and_push:hover:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_tag_and_push:focus:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_tag_and_push:active:[stroke-dasharray:4] + peer-[:focus-within]/proc_app_release_step_tag_and_push:stroke-2 + peer-[:focus-within]/proc_app_release_step_tag_and_push:animate-[stroke-dashoffset-move_2s_linear_infinite] + peer-[:focus-within]/proc_app_release_step_tag_and_push:hover:fill-[var(--tw-slate-50-950)] + peer-[:focus-within]/proc_app_release_step_tag_and_push:fill-[var(--tw-slate-100-900)] + peer-[:focus-within]/proc_app_release_step_tag_and_push:focus:fill-[var(--tw-slate-200-800)] + peer-[:focus-within]/proc_app_release_step_tag_and_push:active:fill-[var(--tw-slate-300-700)] + t_localhost_repo: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_localhost_repo_src: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_localhost_repo_target: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_localhost_repo_target_file_zip: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + t_localhost_repo_target_dist_dir: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-slate-200-800)] + fill-[var(--tw-slate-300-700)] + focus:fill-[var(--tw-slate-400-600)] + active:fill-[var(--tw-slate-500-500)] + hover:stroke-[var(--tw-slate-300-700)] + stroke-[var(--tw-slate-400-600)] + focus:stroke-[var(--tw-slate-500-500)] + active:stroke-[var(--tw-slate-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + peer-[:focus-within]/tag_app_development:opacity-50 + peer-[:focus-within]/tag_deployment:opacity-75 + tag_app_development: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-emerald-400-600)] + fill-[var(--tw-emerald-500-500)] + focus:fill-[var(--tw-emerald-600-400)] + active:fill-[var(--tw-emerald-700-300)] + hover:stroke-[var(--tw-emerald-500-500)] + stroke-[var(--tw-emerald-600-400)] + focus:stroke-[var(--tw-emerald-700-300)] + active:stroke-[var(--tw-emerald-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + peer/tag_app_development + tag_deployment: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-emerald-400-600)] + fill-[var(--tw-emerald-500-500)] + focus:fill-[var(--tw-emerald-600-400)] + active:fill-[var(--tw-emerald-700-300)] + hover:stroke-[var(--tw-emerald-500-500)] + stroke-[var(--tw-emerald-600-400)] + focus:stroke-[var(--tw-emerald-700-300)] + active:stroke-[var(--tw-emerald-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + peer/tag_deployment + proc_app_dev: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-blue-400-600)] + fill-[var(--tw-blue-500-500)] + focus:fill-[var(--tw-blue-600-400)] + active:fill-[var(--tw-blue-700-300)] + hover:stroke-[var(--tw-blue-500-500)] + stroke-[var(--tw-blue-600-400)] + focus:stroke-[var(--tw-blue-700-300)] + active:stroke-[var(--tw-blue-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + peer/proc_app_dev + proc_app_dev_step_repository_clone: | + invisible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-400-600)] + fill-[var(--tw-sky-500-500)] + focus:fill-[var(--tw-sky-600-400)] + active:fill-[var(--tw-sky-700-300)] + hover:stroke-[var(--tw-sky-500-500)] + stroke-[var(--tw-sky-600-400)] + focus:stroke-[var(--tw-sky-700-300)] + active:stroke-[var(--tw-sky-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + group-has-[#proc_app_dev:focus-within]:visible + group-has-[#proc_app_dev_step_repository_clone:focus-within]:visible + group-has-[#proc_app_dev_step_project_build:focus-within]:visible + peer/proc_app_dev_step_repository_clone + proc_app_dev_step_project_build: | + invisible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-400-600)] + fill-[var(--tw-sky-500-500)] + focus:fill-[var(--tw-sky-600-400)] + active:fill-[var(--tw-sky-700-300)] + hover:stroke-[var(--tw-sky-500-500)] + stroke-[var(--tw-sky-600-400)] + focus:stroke-[var(--tw-sky-700-300)] + active:stroke-[var(--tw-sky-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + group-has-[#proc_app_dev:focus-within]:visible + group-has-[#proc_app_dev_step_repository_clone:focus-within]:visible + group-has-[#proc_app_dev_step_project_build:focus-within]:visible + peer/proc_app_dev_step_project_build + proc_app_release: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-blue-400-600)] + fill-[var(--tw-blue-500-500)] + focus:fill-[var(--tw-blue-600-400)] + active:fill-[var(--tw-blue-700-300)] + hover:stroke-[var(--tw-blue-500-500)] + stroke-[var(--tw-blue-600-400)] + focus:stroke-[var(--tw-blue-700-300)] + active:stroke-[var(--tw-blue-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + peer/proc_app_release + proc_app_release_step_crate_version_update: | + invisible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-400-600)] + fill-[var(--tw-sky-500-500)] + focus:fill-[var(--tw-sky-600-400)] + active:fill-[var(--tw-sky-700-300)] + hover:stroke-[var(--tw-sky-500-500)] + stroke-[var(--tw-sky-600-400)] + focus:stroke-[var(--tw-sky-700-300)] + active:stroke-[var(--tw-sky-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + group-has-[#proc_app_release:focus-within]:visible + group-has-[#proc_app_release_step_crate_version_update:focus-within]:visible + group-has-[#proc_app_release_step_pull_request_open:focus-within]:visible + group-has-[#proc_app_release_step_tag_and_push:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible + peer/proc_app_release_step_crate_version_update + proc_app_release_step_pull_request_open: | + invisible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-400-600)] + fill-[var(--tw-sky-500-500)] + focus:fill-[var(--tw-sky-600-400)] + active:fill-[var(--tw-sky-700-300)] + hover:stroke-[var(--tw-sky-500-500)] + stroke-[var(--tw-sky-600-400)] + focus:stroke-[var(--tw-sky-700-300)] + active:stroke-[var(--tw-sky-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + group-has-[#proc_app_release:focus-within]:visible + group-has-[#proc_app_release_step_crate_version_update:focus-within]:visible + group-has-[#proc_app_release_step_pull_request_open:focus-within]:visible + group-has-[#proc_app_release_step_tag_and_push:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible + peer/proc_app_release_step_pull_request_open + proc_app_release_step_tag_and_push: | + invisible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-400-600)] + fill-[var(--tw-sky-500-500)] + focus:fill-[var(--tw-sky-600-400)] + active:fill-[var(--tw-sky-700-300)] + hover:stroke-[var(--tw-sky-500-500)] + stroke-[var(--tw-sky-600-400)] + focus:stroke-[var(--tw-sky-700-300)] + active:stroke-[var(--tw-sky-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + group-has-[#proc_app_release:focus-within]:visible + group-has-[#proc_app_release_step_crate_version_update:focus-within]:visible + group-has-[#proc_app_release_step_pull_request_open:focus-within]:visible + group-has-[#proc_app_release_step_tag_and_push:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible + peer/proc_app_release_step_tag_and_push + proc_app_release_step_gh_actions_build: | + invisible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-400-600)] + fill-[var(--tw-sky-500-500)] + focus:fill-[var(--tw-sky-600-400)] + active:fill-[var(--tw-sky-700-300)] + hover:stroke-[var(--tw-sky-500-500)] + stroke-[var(--tw-sky-600-400)] + focus:stroke-[var(--tw-sky-700-300)] + active:stroke-[var(--tw-sky-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + group-has-[#proc_app_release:focus-within]:visible + group-has-[#proc_app_release_step_crate_version_update:focus-within]:visible + group-has-[#proc_app_release_step_pull_request_open:focus-within]:visible + group-has-[#proc_app_release_step_tag_and_push:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible + peer/proc_app_release_step_gh_actions_build + proc_app_release_step_gh_actions_publish: | + invisible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-400-600)] + fill-[var(--tw-sky-500-500)] + focus:fill-[var(--tw-sky-600-400)] + active:fill-[var(--tw-sky-700-300)] + hover:stroke-[var(--tw-sky-500-500)] + stroke-[var(--tw-sky-600-400)] + focus:stroke-[var(--tw-sky-700-300)] + active:stroke-[var(--tw-sky-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + group-has-[#proc_app_release:focus-within]:visible + group-has-[#proc_app_release_step_crate_version_update:focus-within]:visible + group-has-[#proc_app_release_step_pull_request_open:focus-within]:visible + group-has-[#proc_app_release_step_tag_and_push:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_build:focus-within]:visible + group-has-[#proc_app_release_step_gh_actions_publish:focus-within]:visible + peer/proc_app_release_step_gh_actions_publish + proc_i12e_region_tier_app_deploy: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-blue-400-600)] + fill-[var(--tw-blue-500-500)] + focus:fill-[var(--tw-blue-600-400)] + active:fill-[var(--tw-blue-700-300)] + hover:stroke-[var(--tw-blue-500-500)] + stroke-[var(--tw-blue-600-400)] + focus:stroke-[var(--tw-blue-700-300)] + active:stroke-[var(--tw-blue-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + peer/proc_i12e_region_tier_app_deploy + proc_i12e_region_tier_app_deploy_step_ecs_cluster_update: | + invisible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-sky-400-600)] + fill-[var(--tw-sky-500-500)] + focus:fill-[var(--tw-sky-600-400)] + active:fill-[var(--tw-sky-700-300)] + hover:stroke-[var(--tw-sky-500-500)] + stroke-[var(--tw-sky-600-400)] + focus:stroke-[var(--tw-sky-700-300)] + active:stroke-[var(--tw-sky-800-200)] + [&>text]:fill-[var(--tw-neutral-950-50)] + group-has-[#proc_i12e_region_tier_app_deploy:focus-within]:visible + group-has-[#proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:focus-within]:visible + peer/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update edge_dep_t_localhost__t_github_user_repo__pull__0: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] stroke-2 + hover:fill-[var(--tw-neutral-500-500)] + fill-[var(--tw-neutral-600-400)] + focus:fill-[var(--tw-neutral-700-300)] + active:fill-[var(--tw-neutral-800-200)] + hover:stroke-[var(--tw-neutral-600-400)] + stroke-[var(--tw-neutral-700-300)] + focus:stroke-[var(--tw-neutral-800-200)] + active:stroke-[var(--tw-neutral-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] edge_dep_t_localhost__t_github_user_repo__pull__1: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] stroke-2 - edge_dep_t_localhost__t_github_user_repo__push: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-neutral-500-500)]\nfill-[var(--tw-neutral-600-400)]\nfocus:fill-[var(--tw-neutral-700-300)]\nactive:fill-[var(--tw-neutral-800-200)]\nhover:stroke-[var(--tw-neutral-600-400)]\nstroke-[var(--tw-neutral-700-300)]\nfocus:stroke-[var(--tw-neutral-800-200)]\nactive:stroke-[var(--tw-neutral-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\n" + hover:fill-[var(--tw-neutral-500-500)] + fill-[var(--tw-neutral-600-400)] + focus:fill-[var(--tw-neutral-700-300)] + active:fill-[var(--tw-neutral-800-200)] + hover:stroke-[var(--tw-neutral-600-400)] + stroke-[var(--tw-neutral-700-300)] + focus:stroke-[var(--tw-neutral-800-200)] + active:stroke-[var(--tw-neutral-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] edge_dep_t_localhost__t_github_user_repo__push__0: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] stroke-2 - edge_dep_t_localhost__t_localhost__within: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-neutral-500-500)]\nfill-[var(--tw-neutral-600-400)]\nfocus:fill-[var(--tw-neutral-700-300)]\nactive:fill-[var(--tw-neutral-800-200)]\nhover:stroke-[var(--tw-neutral-600-400)]\nstroke-[var(--tw-neutral-700-300)]\nfocus:stroke-[var(--tw-neutral-800-200)]\nactive:stroke-[var(--tw-neutral-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\n" + hover:fill-[var(--tw-neutral-500-500)] + fill-[var(--tw-neutral-600-400)] + focus:fill-[var(--tw-neutral-700-300)] + active:fill-[var(--tw-neutral-800-200)] + hover:stroke-[var(--tw-neutral-600-400)] + stroke-[var(--tw-neutral-700-300)] + focus:stroke-[var(--tw-neutral-800-200)] + active:stroke-[var(--tw-neutral-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] edge_dep_t_localhost__t_localhost__within__0: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] stroke-2 - edge_dep_t_github_user_repo__t_github_user_repo__within: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-neutral-500-500)]\nfill-[var(--tw-neutral-600-400)]\nfocus:fill-[var(--tw-neutral-700-300)]\nactive:fill-[var(--tw-neutral-800-200)]\nhover:stroke-[var(--tw-neutral-600-400)]\nstroke-[var(--tw-neutral-700-300)]\nfocus:stroke-[var(--tw-neutral-800-200)]\nactive:stroke-[var(--tw-neutral-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\n" + hover:fill-[var(--tw-neutral-500-500)] + fill-[var(--tw-neutral-600-400)] + focus:fill-[var(--tw-neutral-700-300)] + active:fill-[var(--tw-neutral-800-200)] + hover:stroke-[var(--tw-neutral-600-400)] + stroke-[var(--tw-neutral-700-300)] + focus:stroke-[var(--tw-neutral-800-200)] + active:stroke-[var(--tw-neutral-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] edge_dep_t_github_user_repo__t_github_user_repo__within__0: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] stroke-2 + hover:fill-[var(--tw-neutral-500-500)] + fill-[var(--tw-neutral-600-400)] + focus:fill-[var(--tw-neutral-700-300)] + active:fill-[var(--tw-neutral-800-200)] + hover:stroke-[var(--tw-neutral-600-400)] + stroke-[var(--tw-neutral-700-300)] + focus:stroke-[var(--tw-neutral-800-200)] + active:stroke-[var(--tw-neutral-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] edge_dep_t_github_user_repo__t_github_user_repo__within__1: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] stroke-2 - edge_dep_t_github_user_repo__t_aws_ecr_repo__push: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-neutral-500-500)]\nfill-[var(--tw-neutral-600-400)]\nfocus:fill-[var(--tw-neutral-700-300)]\nactive:fill-[var(--tw-neutral-800-200)]\nhover:stroke-[var(--tw-neutral-600-400)]\nstroke-[var(--tw-neutral-700-300)]\nfocus:stroke-[var(--tw-neutral-800-200)]\nactive:stroke-[var(--tw-neutral-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\n" + hover:fill-[var(--tw-neutral-500-500)] + fill-[var(--tw-neutral-600-400)] + focus:fill-[var(--tw-neutral-700-300)] + active:fill-[var(--tw-neutral-800-200)] + hover:stroke-[var(--tw-neutral-600-400)] + stroke-[var(--tw-neutral-700-300)] + focus:stroke-[var(--tw-neutral-800-200)] + active:stroke-[var(--tw-neutral-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] edge_dep_t_github_user_repo__t_aws_ecr_repo__push__0: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] stroke-2 - edge_dep_t_aws_ecr_repo__t_aws_ecs_cluster__push: "visible\n[stroke-dasharray:none]\nhover:[stroke-dasharray:none]\nfocus:[stroke-dasharray:none]\nactive:[stroke-dasharray:none]\nstroke-2\nhover:fill-[var(--tw-neutral-500-500)]\nfill-[var(--tw-neutral-600-400)]\nfocus:fill-[var(--tw-neutral-700-300)]\nactive:fill-[var(--tw-neutral-800-200)]\nhover:stroke-[var(--tw-neutral-600-400)]\nstroke-[var(--tw-neutral-700-300)]\nfocus:stroke-[var(--tw-neutral-800-200)]\nactive:stroke-[var(--tw-neutral-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\n" + hover:fill-[var(--tw-neutral-500-500)] + fill-[var(--tw-neutral-600-400)] + focus:fill-[var(--tw-neutral-700-300)] + active:fill-[var(--tw-neutral-800-200)] + hover:stroke-[var(--tw-neutral-600-400)] + stroke-[var(--tw-neutral-700-300)] + focus:stroke-[var(--tw-neutral-800-200)] + active:stroke-[var(--tw-neutral-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] edge_dep_t_aws_ecr_repo__t_aws_ecs_cluster__push__0: | + visible + [stroke-dasharray:none] + hover:[stroke-dasharray:none] + focus:[stroke-dasharray:none] + active:[stroke-dasharray:none] + stroke-2 + hover:fill-[var(--tw-neutral-500-500)] + fill-[var(--tw-neutral-600-400)] + focus:fill-[var(--tw-neutral-700-300)] + active:fill-[var(--tw-neutral-800-200)] + hover:stroke-[var(--tw-neutral-600-400)] + stroke-[var(--tw-neutral-700-300)] + focus:stroke-[var(--tw-neutral-800-200)] + active:stroke-[var(--tw-neutral-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] + edge_ix_t_localhost__t_github_user_repo__pull__0: | + invisible + stroke-2 + hover:fill-[var(--tw-blue-200-800)] + fill-[var(--tw-blue-300-700)] + focus:fill-[var(--tw-blue-400-600)] + active:fill-[var(--tw-blue-500-500)] + hover:stroke-[var(--tw-blue-300-700)] + stroke-[var(--tw-blue-400-600)] + focus:stroke-[var(--tw-blue-500-500)] + active:stroke-[var(--tw-blue-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + + peer-[:focus-within]/proc_app_dev_step_repository_clone:visible + peer-[:focus-within]/proc_app_release_step_pull_request_open:visible + edge_ix_t_localhost__t_github_user_repo__pull__1: | + invisible + stroke-2 + hover:fill-[var(--tw-blue-200-800)] + fill-[var(--tw-blue-300-700)] + focus:fill-[var(--tw-blue-400-600)] + active:fill-[var(--tw-blue-500-500)] + hover:stroke-[var(--tw-blue-300-700)] + stroke-[var(--tw-blue-400-600)] + focus:stroke-[var(--tw-blue-500-500)] + active:stroke-[var(--tw-blue-600-400)] + [&>text]:fill-[var(--tw-neutral-900-100)] + + peer-[:focus-within]/proc_app_dev_step_repository_clone:visible + peer-[:focus-within]/proc_app_release_step_pull_request_open:visible + edge_ix_t_localhost__t_github_user_repo__push__0: | + invisible + stroke-2 + hover:fill-[var(--tw-violet-500-500)] + fill-[var(--tw-violet-600-400)] + focus:fill-[var(--tw-violet-700-300)] + active:fill-[var(--tw-violet-800-200)] + hover:stroke-[var(--tw-violet-600-400)] + stroke-[var(--tw-violet-700-300)] + focus:stroke-[var(--tw-violet-800-200)] + active:stroke-[var(--tw-violet-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] + + peer-[:focus-within]/proc_app_release_step_tag_and_push:visible + edge_ix_t_localhost__t_localhost__within__0: | + invisible + stroke-2 + hover:fill-[var(--tw-violet-500-500)] + fill-[var(--tw-violet-600-400)] + focus:fill-[var(--tw-violet-700-300)] + active:fill-[var(--tw-violet-800-200)] + hover:stroke-[var(--tw-violet-600-400)] + stroke-[var(--tw-violet-700-300)] + focus:stroke-[var(--tw-violet-800-200)] + active:stroke-[var(--tw-violet-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] + + peer-[:focus-within]/proc_app_dev_step_project_build:visible + peer-[:focus-within]/proc_app_release_step_crate_version_update:visible + edge_ix_t_github_user_repo__t_github_user_repo__within__0: | + invisible + stroke-2 + hover:fill-[var(--tw-violet-500-500)] + fill-[var(--tw-violet-600-400)] + focus:fill-[var(--tw-violet-700-300)] + active:fill-[var(--tw-violet-800-200)] + hover:stroke-[var(--tw-violet-600-400)] + stroke-[var(--tw-violet-700-300)] + focus:stroke-[var(--tw-violet-800-200)] + active:stroke-[var(--tw-violet-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] + + peer-[:focus-within]/proc_app_release_step_gh_actions_build:visible + edge_ix_t_github_user_repo__t_github_user_repo__within__1: | + invisible + stroke-2 + hover:fill-[var(--tw-violet-500-500)] + fill-[var(--tw-violet-600-400)] + focus:fill-[var(--tw-violet-700-300)] + active:fill-[var(--tw-violet-800-200)] + hover:stroke-[var(--tw-violet-600-400)] + stroke-[var(--tw-violet-700-300)] + focus:stroke-[var(--tw-violet-800-200)] + active:stroke-[var(--tw-violet-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] + + peer-[:focus-within]/proc_app_release_step_gh_actions_build:visible + edge_ix_t_github_user_repo__t_aws_ecr_repo__push__0: | + invisible + stroke-2 + hover:fill-[var(--tw-violet-500-500)] + fill-[var(--tw-violet-600-400)] + focus:fill-[var(--tw-violet-700-300)] + active:fill-[var(--tw-violet-800-200)] + hover:stroke-[var(--tw-violet-600-400)] + stroke-[var(--tw-violet-700-300)] + focus:stroke-[var(--tw-violet-800-200)] + active:stroke-[var(--tw-violet-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] + + peer-[:focus-within]/proc_app_release_step_gh_actions_publish:visible + edge_ix_t_aws_ecr_repo__t_aws_ecs_cluster__push__0: | + invisible stroke-2 - edge_ix_t_localhost__t_github_user_repo__pull: "invisible\nstroke-2\nhover:fill-[var(--tw-blue-200-800)]\nfill-[var(--tw-blue-300-700)]\nfocus:fill-[var(--tw-blue-400-600)]\nactive:fill-[var(--tw-blue-500-500)]\nhover:stroke-[var(--tw-blue-300-700)]\nstroke-[var(--tw-blue-400-600)]\nfocus:stroke-[var(--tw-blue-500-500)]\nactive:stroke-[var(--tw-blue-600-400)]\n[&>text]:fill-[var(--tw-neutral-900-100)]\npeer-[:focus-within]/proc_app_dev_step_repository_clone:visible\npeer-[:focus-within]/proc_app_release_step_pull_request_open:visible\n" - edge_ix_t_localhost__t_github_user_repo__pull__0: "" - edge_ix_t_localhost__t_github_user_repo__pull__1: "" - edge_ix_t_localhost__t_github_user_repo__push: "invisible\nstroke-2\nhover:fill-[var(--tw-violet-500-500)]\nfill-[var(--tw-violet-600-400)]\nfocus:fill-[var(--tw-violet-700-300)]\nactive:fill-[var(--tw-violet-800-200)]\nhover:stroke-[var(--tw-violet-600-400)]\nstroke-[var(--tw-violet-700-300)]\nfocus:stroke-[var(--tw-violet-800-200)]\nactive:stroke-[var(--tw-violet-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer-[:focus-within]/proc_app_release_step_tag_and_push:visible\n" - edge_ix_t_localhost__t_github_user_repo__push__0: "" - edge_ix_t_localhost__t_localhost__within: "invisible\nstroke-2\nhover:fill-[var(--tw-violet-500-500)]\nfill-[var(--tw-violet-600-400)]\nfocus:fill-[var(--tw-violet-700-300)]\nactive:fill-[var(--tw-violet-800-200)]\nhover:stroke-[var(--tw-violet-600-400)]\nstroke-[var(--tw-violet-700-300)]\nfocus:stroke-[var(--tw-violet-800-200)]\nactive:stroke-[var(--tw-violet-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer-[:focus-within]/proc_app_dev_step_project_build:visible\npeer-[:focus-within]/proc_app_release_step_crate_version_update:visible\n" - edge_ix_t_localhost__t_localhost__within__0: "" - edge_ix_t_github_user_repo__t_github_user_repo__within: "invisible\nstroke-2\nhover:fill-[var(--tw-violet-500-500)]\nfill-[var(--tw-violet-600-400)]\nfocus:fill-[var(--tw-violet-700-300)]\nactive:fill-[var(--tw-violet-800-200)]\nhover:stroke-[var(--tw-violet-600-400)]\nstroke-[var(--tw-violet-700-300)]\nfocus:stroke-[var(--tw-violet-800-200)]\nactive:stroke-[var(--tw-violet-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_build:visible\n" - edge_ix_t_github_user_repo__t_github_user_repo__within__0: "" - edge_ix_t_github_user_repo__t_github_user_repo__within__1: "" - edge_ix_t_github_user_repo__t_aws_ecr_repo__push: "invisible\nstroke-2\nhover:fill-[var(--tw-violet-500-500)]\nfill-[var(--tw-violet-600-400)]\nfocus:fill-[var(--tw-violet-700-300)]\nactive:fill-[var(--tw-violet-800-200)]\nhover:stroke-[var(--tw-violet-600-400)]\nstroke-[var(--tw-violet-700-300)]\nfocus:stroke-[var(--tw-violet-800-200)]\nactive:stroke-[var(--tw-violet-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer-[:focus-within]/proc_app_release_step_gh_actions_publish:visible\n" - edge_ix_t_github_user_repo__t_aws_ecr_repo__push__0: "" - edge_ix_t_aws_ecr_repo__t_aws_ecs_cluster__push: "invisible\nstroke-2\nhover:fill-[var(--tw-violet-500-500)]\nfill-[var(--tw-violet-600-400)]\nfocus:fill-[var(--tw-violet-700-300)]\nactive:fill-[var(--tw-violet-800-200)]\nhover:stroke-[var(--tw-violet-600-400)]\nstroke-[var(--tw-violet-700-300)]\nfocus:stroke-[var(--tw-violet-800-200)]\nactive:stroke-[var(--tw-violet-900-100)]\n[&>text]:fill-[var(--tw-neutral-950-50)]\npeer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:visible\n" - edge_ix_t_aws_ecr_repo__t_aws_ecs_cluster__push__0: "" + hover:fill-[var(--tw-violet-500-500)] + fill-[var(--tw-violet-600-400)] + focus:fill-[var(--tw-violet-700-300)] + active:fill-[var(--tw-violet-800-200)] + hover:stroke-[var(--tw-violet-600-400)] + stroke-[var(--tw-violet-700-300)] + focus:stroke-[var(--tw-violet-800-200)] + active:stroke-[var(--tw-violet-900-100)] + [&>text]:fill-[var(--tw-neutral-950-50)] + + peer-[:focus-within]/proc_i12e_region_tier_app_deploy_step_ecs_cluster_update:visible node_layouts: _root: flex: @@ -1004,5 +1940,106 @@ process_step_entities: - edge_ix_t_github_user_repo__t_aws_ecr_repo__push proc_i12e_region_tier_app_deploy_step_ecs_cluster_update: - edge_ix_t_aws_ecr_repo__t_aws_ecs_cluster__push -rank_dir: "top_to_bottom" -css: "svg {\n --tw-blue-200-800: oklch(88.2% 0.059 254.128);\n --tw-blue-300-700: oklch(80.9% 0.105 251.813);\n --tw-blue-400-600: oklch(70.7% 0.165 254.624);\n --tw-blue-500-500: oklch(62.3% 0.214 259.815);\n --tw-blue-600-400: oklch(54.6% 0.245 262.881);\n --tw-blue-700-300: oklch(48.8% 0.243 264.376);\n --tw-blue-800-200: oklch(42.4% 0.199 265.638);\n --tw-emerald-400-600: oklch(76.5% 0.177 163.223);\n --tw-emerald-500-500: oklch(69.6% 0.17 162.48);\n --tw-emerald-600-400: oklch(59.6% 0.145 163.225);\n --tw-emerald-700-300: oklch(50.8% 0.118 165.612);\n --tw-emerald-800-200: oklch(43.2% 0.095 166.913);\n --tw-neutral-100-900: oklch(97% 0 0);\n --tw-neutral-200-800: oklch(92.2% 0 0);\n --tw-neutral-300-700: oklch(87% 0 0);\n --tw-neutral-400-600: oklch(70.8% 0 0);\n --tw-neutral-50-950: oklch(98.5% 0 0);\n --tw-neutral-500-500: oklch(55.6% 0 0);\n --tw-neutral-600-400: oklch(43.9% 0 0);\n --tw-neutral-700-300: oklch(37.1% 0 0);\n --tw-neutral-800-200: oklch(26.9% 0 0);\n --tw-neutral-900-100: oklch(20.5% 0 0);\n --tw-neutral-950-50: oklch(14.5% 0 0);\n --tw-sky-200-800: oklch(90.1% 0.058 230.902);\n --tw-sky-300-700: oklch(82.8% 0.111 230.318);\n --tw-sky-400-600: oklch(74.6% 0.16 232.661);\n --tw-sky-500-500: oklch(68.5% 0.169 237.323);\n --tw-sky-600-400: oklch(58.8% 0.158 241.966);\n --tw-sky-700-300: oklch(50% 0.134 242.749);\n --tw-sky-800-200: oklch(44.3% 0.11 240.79);\n --tw-slate-100-900: oklch(96.8% 0.007 247.896);\n --tw-slate-200-800: oklch(92.9% 0.013 255.508);\n --tw-slate-300-700: oklch(86.9% 0.022 252.894);\n --tw-slate-400-600: oklch(70.4% 0.04 256.788);\n --tw-slate-50-950: oklch(98.4% 0.003 247.858);\n --tw-slate-500-500: oklch(55.4% 0.046 257.417);\n --tw-slate-600-400: oklch(44.6% 0.043 257.281);\n --tw-violet-500-500: oklch(60.6% 0.25 292.717);\n --tw-violet-600-400: oklch(54.1% 0.281 293.009);\n --tw-violet-700-300: oklch(49.1% 0.27 292.581);\n --tw-violet-800-200: oklch(43.2% 0.232 292.759);\n --tw-violet-900-100: oklch(38% 0.189 293.745);\n --tw-yellow-100-900: oklch(97.3% 0.071 103.193);\n --tw-yellow-200-800: oklch(94.5% 0.129 101.54);\n --tw-yellow-300-700: oklch(90.5% 0.182 98.111);\n --tw-yellow-400-600: oklch(85.2% 0.199 91.936);\n --tw-yellow-50-950: oklch(98.7% 0.026 102.212);\n}\n:root.dark svg {\n --tw-blue-200-800: oklch(42.4% 0.199 265.638);\n --tw-blue-300-700: oklch(48.8% 0.243 264.376);\n --tw-blue-400-600: oklch(54.6% 0.245 262.881);\n --tw-blue-500-500: oklch(62.3% 0.214 259.815);\n --tw-blue-600-400: oklch(70.7% 0.165 254.624);\n --tw-blue-700-300: oklch(80.9% 0.105 251.813);\n --tw-blue-800-200: oklch(88.2% 0.059 254.128);\n --tw-emerald-400-600: oklch(59.6% 0.145 163.225);\n --tw-emerald-500-500: oklch(69.6% 0.17 162.48);\n --tw-emerald-600-400: oklch(76.5% 0.177 163.223);\n --tw-emerald-700-300: oklch(84.5% 0.143 164.978);\n --tw-emerald-800-200: oklch(90.5% 0.093 164.15);\n --tw-neutral-100-900: oklch(20.5% 0 0);\n --tw-neutral-200-800: oklch(26.9% 0 0);\n --tw-neutral-300-700: oklch(37.1% 0 0);\n --tw-neutral-400-600: oklch(43.9% 0 0);\n --tw-neutral-50-950: oklch(14.5% 0 0);\n --tw-neutral-500-500: oklch(55.6% 0 0);\n --tw-neutral-600-400: oklch(70.8% 0 0);\n --tw-neutral-700-300: oklch(87% 0 0);\n --tw-neutral-800-200: oklch(92.2% 0 0);\n --tw-neutral-900-100: oklch(97% 0 0);\n --tw-neutral-950-50: oklch(98.5% 0 0);\n --tw-sky-200-800: oklch(44.3% 0.11 240.79);\n --tw-sky-300-700: oklch(50% 0.134 242.749);\n --tw-sky-400-600: oklch(58.8% 0.158 241.966);\n --tw-sky-500-500: oklch(68.5% 0.169 237.323);\n --tw-sky-600-400: oklch(74.6% 0.16 232.661);\n --tw-sky-700-300: oklch(82.8% 0.111 230.318);\n --tw-sky-800-200: oklch(90.1% 0.058 230.902);\n --tw-slate-100-900: oklch(20.8% 0.042 265.755);\n --tw-slate-200-800: oklch(27.9% 0.041 260.031);\n --tw-slate-300-700: oklch(37.2% 0.044 257.287);\n --tw-slate-400-600: oklch(44.6% 0.043 257.281);\n --tw-slate-50-950: oklch(12.9% 0.042 264.695);\n --tw-slate-500-500: oklch(55.4% 0.046 257.417);\n --tw-slate-600-400: oklch(70.4% 0.04 256.788);\n --tw-violet-500-500: oklch(60.6% 0.25 292.717);\n --tw-violet-600-400: oklch(70.2% 0.183 293.541);\n --tw-violet-700-300: oklch(81.1% 0.111 293.571);\n --tw-violet-800-200: oklch(89.4% 0.057 293.283);\n --tw-violet-900-100: oklch(94.3% 0.029 294.588);\n --tw-yellow-100-900: oklch(42.1% 0.095 57.708);\n --tw-yellow-200-800: oklch(47.6% 0.114 61.907);\n --tw-yellow-300-700: oklch(55.4% 0.135 66.442);\n --tw-yellow-400-600: oklch(68.1% 0.162 75.834);\n --tw-yellow-50-950: oklch(28.6% 0.066 53.813);\n}\n@keyframes stroke-dashoffset-move {\n 0% { stroke-dasharray: 3; stroke-dashoffset: 30; }\n 100% { stroke-dasharray: 3; stroke-dashoffset: 0; }\n}" +css: |- + svg { + --tw-blue-200-800: oklch(88.2% 0.059 254.128); + --tw-blue-300-700: oklch(80.9% 0.105 251.813); + --tw-blue-400-600: oklch(70.7% 0.165 254.624); + --tw-blue-500-500: oklch(62.3% 0.214 259.815); + --tw-blue-600-400: oklch(54.6% 0.245 262.881); + --tw-blue-700-300: oklch(48.8% 0.243 264.376); + --tw-blue-800-200: oklch(42.4% 0.199 265.638); + --tw-emerald-400-600: oklch(76.5% 0.177 163.223); + --tw-emerald-500-500: oklch(69.6% 0.17 162.48); + --tw-emerald-600-400: oklch(59.6% 0.145 163.225); + --tw-emerald-700-300: oklch(50.8% 0.118 165.612); + --tw-emerald-800-200: oklch(43.2% 0.095 166.913); + --tw-neutral-100-900: oklch(97% 0 0); + --tw-neutral-200-800: oklch(92.2% 0 0); + --tw-neutral-300-700: oklch(87% 0 0); + --tw-neutral-400-600: oklch(70.8% 0 0); + --tw-neutral-50-950: oklch(98.5% 0 0); + --tw-neutral-500-500: oklch(55.6% 0 0); + --tw-neutral-600-400: oklch(43.9% 0 0); + --tw-neutral-700-300: oklch(37.1% 0 0); + --tw-neutral-800-200: oklch(26.9% 0 0); + --tw-neutral-900-100: oklch(20.5% 0 0); + --tw-neutral-950-50: oklch(14.5% 0 0); + --tw-sky-200-800: oklch(90.1% 0.058 230.902); + --tw-sky-300-700: oklch(82.8% 0.111 230.318); + --tw-sky-400-600: oklch(74.6% 0.16 232.661); + --tw-sky-500-500: oklch(68.5% 0.169 237.323); + --tw-sky-600-400: oklch(58.8% 0.158 241.966); + --tw-sky-700-300: oklch(50% 0.134 242.749); + --tw-sky-800-200: oklch(44.3% 0.11 240.79); + --tw-slate-100-900: oklch(96.8% 0.007 247.896); + --tw-slate-200-800: oklch(92.9% 0.013 255.508); + --tw-slate-300-700: oklch(86.9% 0.022 252.894); + --tw-slate-400-600: oklch(70.4% 0.04 256.788); + --tw-slate-50-950: oklch(98.4% 0.003 247.858); + --tw-slate-500-500: oklch(55.4% 0.046 257.417); + --tw-slate-600-400: oklch(44.6% 0.043 257.281); + --tw-violet-500-500: oklch(60.6% 0.25 292.717); + --tw-violet-600-400: oklch(54.1% 0.281 293.009); + --tw-violet-700-300: oklch(49.1% 0.27 292.581); + --tw-violet-800-200: oklch(43.2% 0.232 292.759); + --tw-violet-900-100: oklch(38% 0.189 293.745); + --tw-yellow-100-900: oklch(97.3% 0.071 103.193); + --tw-yellow-200-800: oklch(94.5% 0.129 101.54); + --tw-yellow-300-700: oklch(90.5% 0.182 98.111); + --tw-yellow-400-600: oklch(85.2% 0.199 91.936); + --tw-yellow-50-950: oklch(98.7% 0.026 102.212); + } + :root.dark svg { + --tw-blue-200-800: oklch(42.4% 0.199 265.638); + --tw-blue-300-700: oklch(48.8% 0.243 264.376); + --tw-blue-400-600: oklch(54.6% 0.245 262.881); + --tw-blue-500-500: oklch(62.3% 0.214 259.815); + --tw-blue-600-400: oklch(70.7% 0.165 254.624); + --tw-blue-700-300: oklch(80.9% 0.105 251.813); + --tw-blue-800-200: oklch(88.2% 0.059 254.128); + --tw-emerald-400-600: oklch(59.6% 0.145 163.225); + --tw-emerald-500-500: oklch(69.6% 0.17 162.48); + --tw-emerald-600-400: oklch(76.5% 0.177 163.223); + --tw-emerald-700-300: oklch(84.5% 0.143 164.978); + --tw-emerald-800-200: oklch(90.5% 0.093 164.15); + --tw-neutral-100-900: oklch(20.5% 0 0); + --tw-neutral-200-800: oklch(26.9% 0 0); + --tw-neutral-300-700: oklch(37.1% 0 0); + --tw-neutral-400-600: oklch(43.9% 0 0); + --tw-neutral-50-950: oklch(14.5% 0 0); + --tw-neutral-500-500: oklch(55.6% 0 0); + --tw-neutral-600-400: oklch(70.8% 0 0); + --tw-neutral-700-300: oklch(87% 0 0); + --tw-neutral-800-200: oklch(92.2% 0 0); + --tw-neutral-900-100: oklch(97% 0 0); + --tw-neutral-950-50: oklch(98.5% 0 0); + --tw-sky-200-800: oklch(44.3% 0.11 240.79); + --tw-sky-300-700: oklch(50% 0.134 242.749); + --tw-sky-400-600: oklch(58.8% 0.158 241.966); + --tw-sky-500-500: oklch(68.5% 0.169 237.323); + --tw-sky-600-400: oklch(74.6% 0.16 232.661); + --tw-sky-700-300: oklch(82.8% 0.111 230.318); + --tw-sky-800-200: oklch(90.1% 0.058 230.902); + --tw-slate-100-900: oklch(20.8% 0.042 265.755); + --tw-slate-200-800: oklch(27.9% 0.041 260.031); + --tw-slate-300-700: oklch(37.2% 0.044 257.287); + --tw-slate-400-600: oklch(44.6% 0.043 257.281); + --tw-slate-50-950: oklch(12.9% 0.042 264.695); + --tw-slate-500-500: oklch(55.4% 0.046 257.417); + --tw-slate-600-400: oklch(70.4% 0.04 256.788); + --tw-violet-500-500: oklch(60.6% 0.25 292.717); + --tw-violet-600-400: oklch(70.2% 0.183 293.541); + --tw-violet-700-300: oklch(81.1% 0.111 293.571); + --tw-violet-800-200: oklch(89.4% 0.057 293.283); + --tw-violet-900-100: oklch(94.3% 0.029 294.588); + --tw-yellow-100-900: oklch(42.1% 0.095 57.708); + --tw-yellow-200-800: oklch(47.6% 0.114 61.907); + --tw-yellow-300-700: oklch(55.4% 0.135 66.442); + --tw-yellow-400-600: oklch(68.1% 0.162 75.834); + --tw-yellow-50-950: oklch(28.6% 0.066 53.813); + } + @keyframes stroke-dashoffset-move { + 0% { stroke-dasharray: 3; stroke-dashoffset: 30; } + 100% { stroke-dasharray: 3; stroke-dashoffset: 0; } + } diff --git a/workspace_tests/src/input_ir_rt/input_to_ir_diagram_mapper.rs b/workspace_tests/src/input_ir_rt/input_to_ir_diagram_mapper.rs index c3d6d23..7272a82 100644 --- a/workspace_tests/src/input_ir_rt/input_to_ir_diagram_mapper.rs +++ b/workspace_tests/src/input_ir_rt/input_to_ir_diagram_mapper.rs @@ -671,12 +671,16 @@ fn test_tailwind_classes_generation() { "t_aws should have yellow stroke via CSS variable. Got: {t_aws_classes}" ); - // Test edge group tailwind classes (using interaction edge groups) - let edge_group_id = id!("edge_ix_t_localhost__t_github_user_repo__pull"); - let edge_classes = String::from("\n") + diagram.tailwind_classes.get(&edge_group_id).unwrap(); + // Test edge tailwind classes (using interaction edge groups). + // + // Edge group classes are now merged into each individual edge's classes, + // so we look up the first edge in the group (index `__0`) instead of the + // group ID itself. + let edge_id = id!("edge_ix_t_localhost__t_github_user_repo__pull__0"); + let edge_classes = String::from("\n") + diagram.tailwind_classes.get(&edge_id).unwrap(); assert!( edge_classes.contains("\nstroke-"), - "Edge group should have stroke class. Got: {edge_classes}" + "Edge should have stroke class (merged from edge group). Got: {edge_classes}" ); // Should have peer classes for interacting process steps assert!( diff --git a/workspace_tests/src/ir_model.rs b/workspace_tests/src/ir_model.rs index 0e15d32..aa6f627 100644 --- a/workspace_tests/src/ir_model.rs +++ b/workspace_tests/src/ir_model.rs @@ -64,7 +64,7 @@ fn test_parse_example_ir() { ); assert_eq!(12, diagram.edge_groups.len()); assert_eq!(64, diagram.entity_types.len()); - assert_eq!(59, diagram.tailwind_classes.len()); + assert_eq!(47, diagram.tailwind_classes.len()); assert_eq!(36, diagram.node_layouts.len()); assert!(!diagram.css.is_empty()); }