Rebrand app as RanaZe Step 3 Trainer

This commit is contained in:
hz
2026-07-20 00:04:29 -05:00
parent 743399f647
commit d176640cff
25 changed files with 206 additions and 92 deletions
+1 -1
View File
@@ -163,7 +163,7 @@ func _on_profile_completed(result: int, response_code: int, _headers: PackedStri
func _save_archive(content: String) -> void:
var filename := "medmind-account-export-%s.json" % Time.get_date_string_from_system()
var filename := "ranaze-account-export-%s.json" % Time.get_date_string_from_system()
if OS.has_feature("web"):
var encoded := Marshalls.raw_to_base64(content.to_utf8_buffer())
JavaScriptBridge.eval("(function(){const a=document.createElement('a');a.href='data:application/json;base64,%s';a.download=%s;document.body.appendChild(a);a.click();a.remove();})();" % [encoded, JSON.stringify(filename)], true)
+1 -1
View File
@@ -140,7 +140,7 @@ func _on_status_completed(result: int, response_code: int, _headers: PackedStrin
func _prepare_browser_window() -> void:
if OS.has_feature("web"):
JavaScriptBridge.eval(
"window.localStorage.removeItem('%s'); window.medmindDonationWindow = window.open('about:blank', 'medmind_donation_checkout'); if (window.medmindDonationWindow) { var medmindWaitingWindow = window.medmindDonationWindow; medmindWaitingWindow.document.title = 'MedMind secure checkout'; medmindWaitingWindow.document.body.innerHTML = '<main id=\"medmind-checkout\" style=\"font:16px system-ui;padding:48px;color:#172033\"><strong>Opening secure checkout...</strong><p>This window will continue to Stripe.</p></main>'; medmindWaitingWindow.setInterval(function () { var checkoutUrl = medmindWaitingWindow.localStorage.getItem('%s'); if (checkoutUrl) { var checkout = medmindWaitingWindow.document.getElementById('medmind-checkout'); checkout.innerHTML = '<strong>Secure checkout is ready.</strong><p><a id=\"medmind-checkout-link\" style=\"color:#2563eb;font-weight:600\">Continue to Stripe</a></p>'; medmindWaitingWindow.document.getElementById('medmind-checkout-link').href = checkoutUrl; medmindWaitingWindow.localStorage.removeItem('%s'); medmindWaitingWindow.location.replace(checkoutUrl); } }, 150); }" % [CHECKOUT_STORAGE_KEY, CHECKOUT_STORAGE_KEY, CHECKOUT_STORAGE_KEY],
"window.localStorage.removeItem('%s'); window.medmindDonationWindow = window.open('about:blank', 'medmind_donation_checkout'); if (window.medmindDonationWindow) { var medmindWaitingWindow = window.medmindDonationWindow; medmindWaitingWindow.document.title = 'RanaZe secure checkout'; medmindWaitingWindow.document.body.innerHTML = '<main id=\"medmind-checkout\" style=\"font:16px system-ui;padding:48px;color:#172033\"><strong>Opening secure checkout...</strong><p>This window will continue to Stripe.</p></main>'; medmindWaitingWindow.setInterval(function () { var checkoutUrl = medmindWaitingWindow.localStorage.getItem('%s'); if (checkoutUrl) { var checkout = medmindWaitingWindow.document.getElementById('medmind-checkout'); checkout.innerHTML = '<strong>Secure checkout is ready.</strong><p><a id=\"medmind-checkout-link\" style=\"color:#2563eb;font-weight:600\">Continue to Stripe</a></p>'; medmindWaitingWindow.document.getElementById('medmind-checkout-link').href = checkoutUrl; medmindWaitingWindow.localStorage.removeItem('%s'); medmindWaitingWindow.location.replace(checkoutUrl); } }, 150); }" % [CHECKOUT_STORAGE_KEY, CHECKOUT_STORAGE_KEY, CHECKOUT_STORAGE_KEY],
true)
+3 -3
View File
@@ -51,7 +51,7 @@ func _build_ui() -> void:
scroll.add_child(page)
var title := Label.new()
title.text = "Support MedMind"
title.text = "Support RanaZe"
title.add_theme_font_override("font", Brand.font)
title.add_theme_font_size_override("font_size", 36)
page.add_child(title)
@@ -79,7 +79,7 @@ func _build_ui() -> void:
mission.add_theme_constant_override("separation", 18)
mission_panel.add_child(mission)
mission.add_child(_heading("Our mission", 26))
mission.add_child(_body("MedMind exists to make rigorous, clinically grounded medical education more accessible. We are building an independent Step 3 study experience that helps learners develop clinical judgment through original questions, realistic CCS cases, transparent explanations, and continuous improvement driven by learner feedback."))
mission.add_child(_body("RanaZe exists to make rigorous, clinically grounded medical education more accessible. We are building an independent Step 3 study experience that helps learners develop clinical judgment through original questions, realistic CCS cases, transparent explanations, and continuous improvement driven by learner feedback."))
mission.add_child(HSeparator.new())
mission.add_child(_heading("What your support makes possible", 20))
for item_text in [
@@ -215,7 +215,7 @@ func _on_checkout_started(_donation_id: String, _checkout_url: String) -> void:
func _on_donation_status_changed(status: String, _donation: Dictionary) -> void:
match status:
"paid": _set_validation_state("Thank you for supporting MedMind. Your contribution has been confirmed.", false, Brand.SUCCESS)
"paid": _set_validation_state("Thank you for supporting RanaZe. Your contribution has been confirmed.", false, Brand.SUCCESS)
"failed": _set_validation_state("Stripe could not complete the contribution. No payment was confirmed.", true)
"expired": _set_validation_state("The checkout session expired. Start a new checkout when you are ready.", true)
+36 -25
View File
@@ -126,27 +126,37 @@ func _build_ui() -> void:
brand_row.add_theme_constant_override("separation", 24)
left_brand.add_child(brand_row)
var large_icon := TextureRect.new()
large_icon.texture = preload("res://assets/branding/medmind-icon.png")
large_icon.texture = Brand.ranaze_mark_texture()
large_icon.custom_minimum_size = Vector2(190, 190)
large_icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
large_icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
large_icon.material = Brand.logo_cutout_material()
brand_row.add_child(large_icon)
var wordmark := HBoxContainer.new()
wordmark.add_theme_constant_override("separation", 0)
var wordmark := VBoxContainer.new()
wordmark.add_theme_constant_override("separation", 4)
brand_row.add_child(wordmark)
var med_wordmark := Label.new()
med_wordmark.text = "Med"
med_wordmark.add_theme_font_size_override("font_size", 76)
med_wordmark.add_theme_font_override("font", Brand.font)
wordmark.add_child(med_wordmark)
var mind_wordmark := Label.new()
mind_wordmark.text = "Mind"
mind_wordmark.add_theme_font_size_override("font_size", 76)
mind_wordmark.add_theme_font_override("font", Brand.font)
mind_wordmark.add_theme_color_override("font_color", Brand.PURPLE)
mind_wordmark.set_meta("brand_accent", true)
wordmark.add_child(mind_wordmark)
var name_row := HBoxContainer.new()
name_row.add_theme_constant_override("separation", 0)
wordmark.add_child(name_row)
var rana_wordmark := Label.new()
rana_wordmark.text = "Rana"
rana_wordmark.add_theme_font_size_override("font_size", 76)
rana_wordmark.add_theme_font_override("font", Brand.font)
name_row.add_child(rana_wordmark)
var ze_wordmark := Label.new()
ze_wordmark.text = "Ze"
ze_wordmark.add_theme_font_size_override("font_size", 76)
ze_wordmark.add_theme_font_override("font", Brand.font)
ze_wordmark.add_theme_color_override("font_color", Brand.SKY_BLUE)
ze_wordmark.set_meta("brand_accent", true)
name_row.add_child(ze_wordmark)
var trainer_wordmark := Label.new()
trainer_wordmark.text = "STEP 3 TRAINER"
trainer_wordmark.add_theme_font_size_override("font_size", 22)
trainer_wordmark.add_theme_font_override("font", Brand.font)
trainer_wordmark.add_theme_color_override("font_color", Brand.muted_color(true))
trainer_wordmark.set_meta("brand_subtitle", true)
trainer_wordmark.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
wordmark.add_child(trainer_wordmark)
brand_tagline = RichTextLabel.new()
brand_tagline.bbcode_enabled = true
brand_tagline.fit_content = true
@@ -177,11 +187,10 @@ func _build_ui() -> void:
panel_header.add_theme_constant_override("separation", 18)
panel_content.add_child(panel_header)
var small_icon := TextureRect.new()
small_icon.texture = preload("res://assets/branding/medmind-icon.png")
small_icon.texture = Brand.ranaze_mark_texture()
small_icon.custom_minimum_size = Vector2(72, 72)
small_icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
small_icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
small_icon.material = Brand.logo_cutout_material()
panel_header.add_child(small_icon)
var titles := VBoxContainer.new()
titles.size_flags_horizontal = Control.SIZE_EXPAND_FILL
@@ -231,7 +240,7 @@ func _build_login_view() -> VBoxContainer:
view.add_child(steam)
submit_buttons.append(steam)
var create := Button.new()
create.text = "New to MedMind? Create an account"
create.text = "New to RanaZe? Create an account"
create.flat = true
create.pressed.connect(func(): _set_mode("register"))
view.add_child(create)
@@ -272,12 +281,12 @@ func _build_reset_view() -> VBoxContainer:
func _build_steam_view() -> VBoxContainer:
var view := _new_form()
var help := Label.new()
help.text = "Steam was verified. Create a MedMind account or link an existing one."
help.text = "Steam was verified. Create a RanaZe account or link an existing one."
help.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
view.add_child(help)
steam_action = OptionButton.new()
steam_action.add_item("Create a new MedMind account")
steam_action.add_item("Link an existing MedMind account")
steam_action.add_item("Create a new RanaZe account")
steam_action.add_item("Link an existing RanaZe account")
steam_action.item_selected.connect(_on_steam_action_changed)
view.add_child(steam_action)
steam_username_input = _add_field(view, "Username or email", "Choose a username")
@@ -405,9 +414,9 @@ func _set_mode(next_mode: String) -> void:
reset_view.visible = mode == "reset"
steam_view.visible = mode == "steam"
match mode:
"register": heading.text = "Create your account"; subheading.text = "Start studying with MedMind"
"register": heading.text = "Create your account"; subheading.text = "Start studying with RanaZe"
"reset": heading.text = "Reset your password"; subheading.text = "We will email you a verification code"
"steam": heading.text = "Finish Steam sign in"; subheading.text = "Connect Steam to MedMind"
"steam": heading.text = "Finish Steam sign in"; subheading.text = "Connect Steam to RanaZe"
_: heading.text = "Welcome back"; subheading.text = "Sign in to continue"
_clear_message()
_update_responsive_layout()
@@ -467,7 +476,9 @@ func _apply_theme() -> void:
for node in find_children("*", "Label", true, false):
var label := node as Label
if label.has_meta("brand_accent"):
label.add_theme_color_override("font_color", Brand.PURPLE if dark else Brand.ROYAL_BLUE)
label.add_theme_color_override("font_color", Brand.SKY_BLUE if dark else Brand.ROYAL_BLUE)
elif label.has_meta("brand_subtitle"):
label.add_theme_color_override("font_color", Brand.muted_color(dark))
else:
label.add_theme_color_override("font_color", Brand.text_color(dark))
for input in fields:
+14 -15
View File
@@ -358,8 +358,7 @@ func _populate_navigation(container: VBoxContainer, include_brand: bool) -> void
brand_row.add_theme_constant_override("separation", 10)
container.add_child(brand_row)
var mark := TextureRect.new()
mark.texture = preload("res://assets/branding/medmind-icon.png")
mark.material = Brand.logo_cutout_material()
mark.texture = Brand.ranaze_mark_texture()
mark.custom_minimum_size = Vector2(46, 46)
mark.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
mark.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
@@ -367,17 +366,17 @@ func _populate_navigation(container: VBoxContainer, include_brand: bool) -> void
var wordmark := HBoxContainer.new()
wordmark.add_theme_constant_override("separation", 0)
brand_row.add_child(wordmark)
var med := Label.new()
med.text = "Med"
med.add_theme_font_override("font", Brand.font)
med.add_theme_font_size_override("font_size", 27)
wordmark.add_child(med)
var mind := Label.new()
mind.text = "Mind"
mind.add_theme_font_override("font", Brand.font)
mind.add_theme_font_size_override("font_size", 27)
mind.add_theme_color_override("font_color", Brand.PURPLE)
wordmark.add_child(mind)
var rana := Label.new()
rana.text = "Rana"
rana.add_theme_font_override("font", Brand.font)
rana.add_theme_font_size_override("font_size", 27)
wordmark.add_child(rana)
var ze := Label.new()
ze.text = "Ze"
ze.add_theme_font_override("font", Brand.font)
ze.add_theme_font_size_override("font_size", 27)
ze.add_theme_color_override("font_color", Brand.SKY_BLUE)
wordmark.add_child(ze)
container.add_child(HSeparator.new())
_add_nav_button(container, "home", "Dashboard", "chart-no-axes-column-increasing", true)
@@ -391,7 +390,7 @@ func _populate_navigation(container: VBoxContainer, include_brand: bool) -> void
spacer.size_flags_vertical = Control.SIZE_EXPAND_FILL
container.add_child(spacer)
container.add_child(HSeparator.new())
_add_nav_button(container, "donations", "Support MedMind", "heart-pulse", true)
_add_nav_button(container, "donations", "Support RanaZe", "heart-pulse", true)
_add_nav_button(container, "performance", "Profile", "user-round", true)
_add_nav_button(container, "settings", "Settings", "settings", true)
_add_nav_button(container, "logout", "Log out", "log-out", true)
@@ -448,7 +447,7 @@ func _update_header_title(screen_name: String) -> void:
"settings": "Settings",
"notes": "Notes",
"bookmarks": "Bookmarks",
"donations": "Support MedMind"
"donations": "Support RanaZe"
}
header_title.text = str(titles.get(screen_name, ""))
+13 -6
View File
@@ -3,9 +3,9 @@ extends RefCounted
const DEEP_NAVY := Color("0b1324")
const ROYAL_BLUE := Color("2563eb")
const SKY_BLUE := Color("38bdf8")
const PURPLE := Color("7c3aed")
const MAGENTA := Color("d946ef")
const TEAL := Color("14b8a6")
const PURPLE := Color("1d4ed8")
const MAGENTA := Color("ef4444")
const TEAL := Color("38bdf8")
const SUCCESS := Color("22c55e")
const AMBER := Color("f59e0b")
const SUN_ICON := preload("res://assets/icons/lucide/sun.svg")
@@ -22,6 +22,13 @@ const LIGHT_MUTED := Color("64748b")
static var font: Font = preload("res://assets/fonts/Inter-Variable.ttf")
static func ranaze_mark_texture() -> AtlasTexture:
var texture := AtlasTexture.new()
texture.atlas = preload("res://assets/branding/ranaze-mark.png")
texture.region = Rect2(400, 150, 736, 736)
return texture
static func text_color(dark: bool) -> Color:
return DARK_TEXT if dark else LIGHT_TEXT
@@ -45,8 +52,8 @@ void fragment() {
vec3 base = dark_mode ? vec3(0.018, 0.043, 0.090) : vec3(0.965, 0.975, 0.990);
float left_glow = 1.0 - smoothstep(0.0, 0.58, distance(uv, vec2(-0.02, 0.12)));
float right_glow = 1.0 - smoothstep(0.0, 0.58, distance(uv, vec2(1.02, 0.92)));
vec3 blue = dark_mode ? vec3(0.075, 0.055, 0.35) : vec3(0.70, 0.80, 1.0);
vec3 purple = dark_mode ? vec3(0.18, 0.035, 0.52) : vec3(0.86, 0.78, 1.0);
vec3 blue = dark_mode ? vec3(0.035, 0.16, 0.42) : vec3(0.70, 0.84, 1.0);
vec3 purple = dark_mode ? vec3(0.02, 0.28, 0.55) : vec3(0.76, 0.90, 1.0);
vec3 color = base + blue * left_glow * (dark_mode ? 0.55 : 0.28);
color += purple * right_glow * (dark_mode ? 0.62 : 0.12);
COLOR = vec4(color, 1.0);
@@ -155,7 +162,7 @@ static func badge_box(dark: bool, accent: Color) -> StyleBoxFlat:
static func gradient_button_box() -> StyleBoxTexture:
var gradient := Gradient.new()
gradient.colors = PackedColorArray([Color("1677ff"), Color("8f3ff4")])
gradient.colors = PackedColorArray([ROYAL_BLUE, SKY_BLUE])
var texture := GradientTexture2D.new()
texture.gradient = gradient
texture.width = 512
+3 -3
View File
@@ -90,7 +90,7 @@ func _build() -> void:
func _profile_summary_card() -> PanelContainer:
var body := VBoxContainer.new()
body.add_theme_constant_override("separation", 14)
body.add_child(_section_header("Profile Summary", "Your MedMind account"))
body.add_child(_section_header("Profile Summary", "Your RanaZe account"))
var row := HBoxContainer.new()
row.add_theme_constant_override("separation", 18)
var avatar := PanelContainer.new()
@@ -147,7 +147,7 @@ func _study_identity_card() -> PanelContainer:
func _performance_card() -> PanelContainer:
var body := VBoxContainer.new()
body.add_theme_constant_override("separation", 12)
body.add_child(_section_header("Performance Summary", "Your cumulative MedMind activity"))
body.add_child(_section_header("Performance Summary", "Your cumulative RanaZe activity"))
var grid := GridContainer.new()
grid.columns = 3
grid.add_theme_constant_override("h_separation", 10)
@@ -361,7 +361,7 @@ func _open_password_dialog() -> void:
func _open_delete_dialog() -> void:
var dialog := _dialog("Permanently delete account")
var warning := _label("This permanently removes your account and all MedMind study data. This cannot be undone.", 13, Brand.MAGENTA)
var warning := _label("This permanently removes your account and all RanaZe study data. This cannot be undone.", 13, Brand.MAGENTA)
warning.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
dialog.add_field(warning)
var password := _password_field("Current password")
+1 -1
View File
@@ -25,7 +25,7 @@ func _ready() -> void:
add_child(title)
var subtitle := Label.new()
subtitle.text = "Adjust MedMind's appearance and interface sounds."
subtitle.text = "Adjust RanaZe's appearance and interface sounds."
subtitle.add_theme_font_override("font", Brand.font)
subtitle.add_theme_font_size_override("font_size", 17)
subtitle.add_theme_color_override("font_color", Brand.SLATE)