소스 검색

Update Settings & Units for Min 5m Carb Impact Setting

tmhastings 1 년 전
부모
커밋
16fc0caef1

+ 1 - 1
FreeAPS/Sources/Models/DecimalPickerSettings.swift

@@ -77,7 +77,7 @@ struct DecimalPickerSettings {
         type: PickerSetting.PickerSettingType.glucose
     )
     var maxCOB = PickerSetting(value: 120, step: 5, min: 0, max: 300, type: PickerSetting.PickerSettingType.gramms)
-    var min5mCarbimpact = PickerSetting(value: 8, step: 1, min: 0, max: 20, type: PickerSetting.PickerSettingType.gramms)
+    var min5mCarbimpact = PickerSetting(value: 8, step: 1, min: 0, max: 20, type: PickerSetting.PickerSettingType.glucose)
     var autotuneISFAdjustmentFraction = PickerSetting(
         value: 1.0,
         step: 0.05,

+ 115 - 114
FreeAPS/Sources/Modules/AlgorithmAdvancedSettings/View/AlgorithmAdvancedSettingsRootView.swift

@@ -60,17 +60,17 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .decimal("maxDailySafetyMultiplier"),
                     label: NSLocalizedString("Max Daily Safety Multiplier", comment: "Max Daily Safety Multiplier"),
-                    miniHint: """
-                    Temporary basal rates cannot be set higher than this percentage of your LARGEST profile basal rate
-                    Default setting: 300%
-                    """,
+                    miniHint: "Limits temp basals to this % of your largest basal rate \nDefault:300%",
                     verboseHint: VStack(spacing: 10) {
                         Text("Default: 300%").bold()
-                        Text(
-                            "This limits the automatic adjustment of the temporary basal rate to this value times the highest scheduled basal rate in your basal profile."
-                        )
-                        Text("Note: If Autotune is enabled, Trio uses Autotune basals instead of scheduled basals.").italic()
-                        Text("Warning: Increasing this setting is not advised.").bold().italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "This setting restricts the maximum temporary basal rate Trio can set. At the default of 300%, it caps it at 3 times your highest programmed basal rate."
+                            )
+                            Text("It serves as a safety limit, ensuring no temporary basal rates exceed safe levels.")
+                            Text("Note: If Autotune is enabled, Trio uses Autotune basals instead of scheduled basals.").italic()
+                            Text("Warning: Increasing this setting is not advised.").bold().italic()
+                        }
                     }
                 )
 
@@ -91,17 +91,19 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .decimal("currentBasalSafetyMultiplier"),
                     label: NSLocalizedString("Current Basal Safety Multiplier", comment: "Current Basal Safety Multiplier"),
-                    miniHint: """
-                    Temporary basal rates cannot be set higher than this percentage of the profile basal rate at the time of the loop cycle
-                    Default: 400%
-                    """,
+                    miniHint: "Limits temp basals to this % of the current basal rate \nDefault: 400%",
                     verboseHint: VStack(spacing: 10) {
                         Text("Default: 400%").bold()
-                        Text(
-                            "This limits the automatic adjustment of the temporary basal rate to this percentage of the current hourly basal rate at the time of the loop cycle."
-                        )
-                        Text("Note: If Autotune is enabled, Trio uses Autotune basals instead of scheduled basals.").italic()
-                        Text("Warning: Increasing this setting is not advised.").bold().italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "This limits the automatic adjustment of the temporary basal rate to this percentage of the current hourly profile basal rate at the time of the loop cycle."
+                            )
+                            Text(
+                                "This prevents excessive dosing, especially during times of variable insulin sensitivity, enhancing safety."
+                            )
+                            Text("Note: If Autotune is enabled, Trio uses Autotune basals instead of scheduled basals.").italic()
+                            Text("Warning: Increasing this setting is not advised.").bold().italic()
+                        }
                     }
                 )
 
@@ -119,16 +121,22 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .decimal("dia"),
                     label: "Duration of Insulin Action",
-                    miniHint: """
-                    Number of hours insulin is active in your body
-                    Default: 6 hours
-                    """,
+                    miniHint: "Number of hours insulin is active in your body \nDefault: 6 hours",
                     verboseHint: VStack(spacing: 10) {
                         Text("Default: 6 hours").bold()
-                        Text("Number of hours insulin will contribute to IOB after dosing.")
-                        Text("Tip: It is better to use Custom Peak Time rather than adjust your Duration of Insulin Action (DIA)")
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "The Duration of Insulin Action (DIA) defines how long your insulin continues to lower blood glucose after a dose."
+                            )
+                            Text(
+                                "This helps the system accurately track Insulin on Board (IOB), avoiding over- or under-corrections by considering the tail end of insulin's effect"
+                            )
+                            Text(
+                                "Tip: It is better to use Custom Peak Time rather than adjust your Duration of Insulin Action (DIA)"
+                            )
                             .italic()
-                        Text("Warning: Decreasing this setting is not advised.").bold().italic()
+                            Text("Warning: Decreasing this setting is not advised.").bold().italic()
+                        }
                     }
                 )
 
@@ -147,17 +155,19 @@ extension AlgorithmAdvancedSettings {
                     type: .conditionalDecimal("insulinPeakTime"),
                     label: NSLocalizedString("Use Custom Peak Time", comment: "Use Custom Peak Time"),
                     conditionalLabel: NSLocalizedString("Insulin Peak Time", comment: "Insulin Peak Time"),
-                    miniHint: """
-                    Time that insulin effect is at it’s highest. Set in minutes since injection.
-                    Default: (Set by Insulin Type)
-                    """,
+                    miniHint: "Sets time of insulin’s peak effect \nDefault: (Set by Insulin Type)",
                     verboseHint: VStack(spacing: 10) {
                         Text("Default: Set by Insulin Type").bold()
-                        Text("Time of maximum glucose lowering effect of insulin. Set in minutes since insulin administration.")
-                        VStack(alignment: .leading) {
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Insulin Peak Time defines when insulin is most effective in lowering blood glucose, set in minutes after dosing."
+                            )
+                            Text(
+                                "This peak informs the system when to expect the most potent glucose-lowering effect, helping it predict glucose trends more accurately."
+                            )
                             Text("System-Determined Defaults:").bold()
-                            Text("𝑼𝒍𝒕𝒓𝒂-𝑹𝒂𝒑𝒊𝒅: 55 minutes (permitted range 35-100 minutes)")
-                            Text("𝑹𝒂𝒑𝒊𝒅-𝑨𝒄𝒕𝒊𝒏𝒈: 75 minutes (permitted range 50-120 minutes)")
+                            Text("Ultra-Rapid: 55 minutes (permitted range 35-100 minutes)")
+                            Text("Rapid-Acting: 75 minutes (permitted range 50-120 minutes)")
                         }
                     }
                 )
@@ -176,18 +186,15 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .boolean,
                     label: NSLocalizedString("Skip Neutral Temps", comment: "Skip Neutral Temps"),
-                    miniHint: """
-                    When on, Trio will not send a temp basal command to the pump if the determined basal rate is the same as the scheduled basal
-                    Default: OFF
-                    """,
+                    miniHint: "Skip neutral temp basals to reduce pump alerts \nDefault: OFF",
                     verboseHint: VStack {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        When enabled, Trio will skip neutral temp basals (those that are the same as your default basal), if no adjustments are needed. 
-
-                        When off, Trio will set temps whenever it can, so it will be easier to see if the system is working.
-                        """)
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "When Skip Neutral Temps is enabled, Trio will not set neutral basal rates, minimizing hourly pump alerts. This can help light sleepers avoid alerts but may delay basal adjustments if the pump loses connection."
+                            )
+                            Text("For most users, leaving this OFF is recommended to ensure consistent basal delivery.")
+                        }
                     }
                 )
 
@@ -205,18 +212,15 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .boolean,
                     label: NSLocalizedString("Unsuspend If No Temp", comment: "Unsuspend If No Temp"),
-                    miniHint: """
-                    Automatically resume your insulin pump if you forget to unsuspend it after a zero temp basal expires
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Automatically resumes pump after suspension \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        Many people occasionally forget to resume / unsuspend their pump after reconnecting it. If you’re one of them, and you are willing to reliably set a zero temp basal whenever suspending and disconnecting your pump, this feature has your back. If enabled, it will automatically resume / unsuspend the pump if you forget to do so before your zero temp expires. As long as the zero temp is still running, it will leave the pump suspended.
-
-                        """)
-                        Text("Applies only to pumps with manual suspend options").italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Enabling Unsuspend If No Temp allows Trio to resume your pump if you forget, as long as a zero temp basal was set first. This feature ensures insulin delivery restarts if you forget to manually unsuspend, adding a safeguard for pump reconnections."
+                            )
+                            Text("Note: Applies only to pumps with on-pump suspend options").italic()
+                        }
                     }
                 )
 
@@ -234,18 +238,18 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .boolean,
                     label: NSLocalizedString("Suspend Zeros IOB", comment: "Suspend Zeros IOB"),
-                    miniHint: """
-                    Replaces any enacted temp basals prior to a pump suspend with a zero temp basal
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Clears temp basals and resets IOB when suspended \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        Any existing temp basals during times the pump was suspended will be deleted and zero temp basals to negate the profile basal rates during times pump is suspended will be added.
-
-                        """)
-                        Text("Applies to only to pumps with manual suspend options").italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "When Suspend Zeros IOB is enabled, any active temp basals during a pump suspension are reset, with new zero temp basals added to counteract the basal rates during suspension."
+                            )
+                            Text(
+                                "This prevents lingering insulin effects when your pump is suspended, ensuring safer management of insulin on board."
+                            )
+                            Text("Note: Applies to only to pumps with on-pump suspend options").italic()
+                        }
                     }
                 )
 
@@ -266,10 +270,7 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .decimal("autotuneISFAdjustmentFraction"),
                     label: NSLocalizedString("Autotune ISF Adjustment Percent", comment: "Autotune ISF Adjustment Percent"),
-                    miniHint: """
-                    Using Autotune is not advised
-                    Default: 50%
-                    """,
+                    miniHint: "Using Autotune is not advised \nDefault: 50%",
                     verboseHint: Text(
                         NSLocalizedString(
                             "The default of 50% for this value keeps autotune ISF closer to pump ISF via a weighted average of fullNewISF and pumpISF. 100% allows full adjustment, 0% is no adjustment from pump ISF.",
@@ -292,20 +293,21 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .decimal("min5mCarbimpact"),
                     label: NSLocalizedString("Min 5m Carb Impact", comment: "Min 5m Carb Impact"),
-                    miniHint: """
-                    Set the default rate of carb absorption when no clear impact on blood glucose is visible
-                    Default: 8 mg/dL/5min
-                    """,
-                    verboseHint: VStack {
-                        Text("Default: 8 mg/dL/5min").bold()
-                        Text("""
-
-                        The Min 5m Carbimpact setting determines the default expected glucose rise (in mg/dL) over a 5-minute period from carbs when the system cannot detect clear absorption from your blood glucose levels. 
-
-                        The default value of 8 mg/dL per 5 minutes corresponds to an absorption rate of 24g of carbs per hour. 
-
-                        This setting helps the system estimate how much glucose your body is absorbing, even when it’s not immediately visible in your glucose data, ensuring more accurate insulin dosing during carb absorption.
-                        """)
+                    miniHint: "Estimates carb absorption rate per 5 minutes \nDefault: 8 mg/dL/5min",
+                    verboseHint: VStack(spacing: 10) {
+                        Text("mg/dL Default: 8 mg/dL/5min").bold()
+                        Text("mmol/L Default: 0.4 mmol/L/5min").bold()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Min 5m Carb Impact sets the expected glucose rise from carbs over 5 minutes when absorption isn’t obvious from glucose data."
+                            )
+                            Text(
+                                "The default value of 8 mg/dL per 5 minutes corresponds to an absorption rate of 24g of carbs per hour."
+                            )
+                            Text(
+                                "This setting helps the system estimate how much glucose your body is absorbing, even when it’s not immediately visible in your glucose data, ensuring more accurate insulin dosing during carb absorption."
+                            )
+                        }
                     }
                 )
 
@@ -323,16 +325,17 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .decimal("remainingCarbsFraction"),
                     label: NSLocalizedString("Remaining Carbs Percentage", comment: "Remaining Carbs Percentage"),
-                    miniHint: """
-                    Set the percentage of unabsorbed carbs that will be assumed to absorb over 4 hours if no absorption is detected
-                    Default: 100%
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "% of carbs still available if no absorption is detected \nDefault: 100%",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: 100%").bold()
-                        Text("""
-
-                        The Remaining Carbs Percentage setting helps estimate how many carbs from a meal will still be absorbed if your glucose readings don’t show clear carb absorption. This percentage, applied to the entered carbs, will be spread over 4 hours. It’s useful when the system can’t detect carb absorption from blood glucose data, providing a fallback estimate to prevent under-dosing.
-                        """)
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Remaining Carbs Percentage estimates carbs still absorbing over 4 hours if glucose data doesn’t show clear absorption."
+                            )
+                            Text(
+                                "This fallback setting prevents under-dosing by spreading a portion of the entered carbs over time, balancing insulin needs with undetected carb impact."
+                            )
+                        }
                     }
                 )
 
@@ -350,18 +353,17 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .decimal("remainingCarbsCap"),
                     label: NSLocalizedString("Remaining Carbs Cap", comment: "Remaining Carbs Cap"),
-                    miniHint: """
-                    Set the maximum amount of carbs assumed to absorb over 4 hours if no absorption is detected
-                    Default: 90g
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Maximum Carbs(g) still available if no absorption is detected \nDefault:  90g",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: 90g").bold()
-                        Text("""
-
-                        The Remaining Carbs Cap defines the upper limit for how many carbs the system will assume are absorbing over 4 hours, even when there’s no clear sign of absorption from your glucose readings.
-
-                        This cap prevents the system from overestimating how much insulin is needed when carb absorption isn’t visible, offering a safeguard for accurate dosing.
-                        """)
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "The Remaining Carbs Cap defines the upper limit for how many carbs the system will assume are absorbing over 4 hours, even when there’s no clear sign of absorption from your glucose readings."
+                            )
+                            Text(
+                                "This cap prevents the system from overestimating how much insulin is needed when carb absorption isn’t visible, offering a safeguard for accurate dosing."
+                            )
+                        }
                     }
                 )
 
@@ -379,18 +381,17 @@ extension AlgorithmAdvancedSettings {
                     units: state.units,
                     type: .decimal("noisyCGMTargetMultiplier"),
                     label: NSLocalizedString("Noisy CGM Target Increase", comment: "Noisy CGM Target Increase"),
-                    miniHint: """
-                    Increase glucose target by this percent when relying on noisy CGM data
-                    Default: 130%
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Increase glucose target when noisy CGM data detected \nDefault: 130%",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: 130%").bold()
-                        Text("""
-
-                        The Noisy CGM Target Multiplier increases your glucose target when the system detects noisy or raw CGM data. By default, the target is increased by 130% to account for the less reliable glucose readings.
-
-                        This helps reduce the risk of incorrect insulin dosing based on inaccurate sensor data, ensuring safer insulin adjustments during periods of poor CGM accuracy.
-                        """)
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "The Noisy CGM Target Multiplier increases your glucose target when the system detects noisy or raw CGM data. By default, the target is increased by 130% to account for the less reliable glucose readings."
+                            )
+                            Text(
+                                "This helps reduce the risk of incorrect insulin dosing based on inaccurate sensor data, ensuring safer insulin adjustments during periods of poor CGM accuracy."
+                            )
+                        }
                     }
                 )
             }

+ 42 - 51
FreeAPS/Sources/Modules/AutosensSettings/View/AutosensSettingsRootView.swift

@@ -48,25 +48,21 @@ extension AutosensSettings {
                     units: state.units,
                     type: .decimal("autosensMax"),
                     label: NSLocalizedString("Autosens Max", comment: "Autosens Max"),
-                    miniHint: """
-                    The higher limit of the Autosens Ratio
-                    Default: 120%
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "The higher limit of the Autosens Ratio \nDefault: 120%",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: 120%").bold()
-                        Text(
-                            """
-
-                            Autosens Max sets the maximum Autosens Ratio used by Autosens, Dynamic ISF, Sigmoid Formula, and/or Autotune.
-
-                            The Autosens Ratio is used to calculate the amount of adjustment needed to basals, ISF, and CR.
-
-                            """
-                        )
-                        Text(
-                            "Increasing this value allows automatic adjustments of basal rates to be higher, ISF to be lower, and CR to be lower."
-                        )
-                        .italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Autosens Max sets the maximum Autosens Ratio used by Autosens, Dynamic ISF, Sigmoid Formula, and/or Autotune."
+                            )
+                            Text(
+                                "The Autosens Ratio is used to calculate the amount of adjustment needed to basals, ISF, and CR."
+                            )
+                            Text(
+                                "Tip: Increasing this value allows automatic adjustments of basal rates to be higher, ISF to be lower, and CR to be lower."
+                            )
+                            .italic()
+                        }
                     },
                     headerText: "Glucose Deviations Algorithm"
                 )
@@ -85,25 +81,21 @@ extension AutosensSettings {
                     units: state.units,
                     type: .decimal("autosensMin"),
                     label: NSLocalizedString("Autosens Min", comment: "Autosens Min"),
-                    miniHint: """
-                    The lower limit of the Autosens Ratio
-                    Default: 80%
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "The lower limit of the Autosens Ratio \nDefault: 80%",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: 80%").bold()
-                        Text(
-                            """
-
-                            Autosens Min sets the minimum Autosens Ratio used by Autosens, Dynamic ISF, Sigmoid Formula, and/or Autotune.
-
-                            The Autosens Ratio is used to calculate the amount of adjustment needed to basals, ISF, and CR.
-
-                            """
-                        )
-                        Text(
-                            "Decreasing this value allows automatic adjustments of basal rates to be lower, ISF to be higher, and CR to be higher."
-                        )
-                        .italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Autosens Min sets the minimum Autosens Ratio used by Autosens, Dynamic ISF, Sigmoid Formula, and/or Autotune."
+                            )
+                            Text(
+                                "The Autosens Ratio is used to calculate the amount of adjustment needed to basals, ISF, and CR."
+                            )
+                            Text(
+                                "Tip: Decreasing this value allows automatic adjustments of basal rates to be lower, ISF to be higher, and CR to be higher."
+                            )
+                            .italic()
+                        }
                     }
                 )
 
@@ -121,23 +113,22 @@ extension AutosensSettings {
                     units: state.units,
                     type: .boolean,
                     label: NSLocalizedString("Rewind Resets Autosens", comment: "Rewind Resets Autosens"),
-                    miniHint: """
-                    Pump rewind initiates a reset in Autosens Ratio
-                    Default: ON
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Pump rewind initiates a reset in Autosens Ratio \nDefault: ON",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: ON").bold()
                         Text("Medtronic Users Only").bold().italic()
-                        Text(
-                            "This feature resets the Autosens Ratio to neutral when you rewind your pump on the assumption that this corresponds to a site change."
-                        )
-                        Text(
-                            "Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours."
-                        )
-                        Text(
-                            "If you usually rewind your pump independently of site changes, you may want to consider disabling this feature."
-                        )
-                        .italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "This feature resets the Autosens Ratio to neutral when you rewind your pump on the assumption that this corresponds to a site change."
+                            )
+                            Text(
+                                "Autosens will begin learning sensitivity anew from the time of the rewind, which may take up to 6 hours."
+                            )
+                            Text(
+                                "Tip: If you usually rewind your pump independently of site changes, you may want to consider disabling this feature."
+                            )
+                            .italic()
+                        }
                     }
                 )
             }

+ 6 - 10
FreeAPS/Sources/Modules/AutotuneConfig/View/AutotuneConfigRootView.swift

@@ -70,14 +70,13 @@ extension AutotuneConfig {
                     units: state.units,
                     type: .boolean,
                     label: "Use Autotune",
-                    miniHint: """
-                    It is not advised to use Autotune with Trio
-                    Default: OFF
-                    """,
+                    miniHint: "It is not advised to use Autotune with Trio \nDefault: OFF",
                     verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("It is not advised to use Autotune with Trio").bold()
-                        Text("Autotune is not designed to work with Trio. It is best to keep Autotune off and do not use it.")
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text("It is not advised to use Autotune with Trio").bold().italic()
+                            Text("Autotune is not designed to work with Trio. It is best to keep Autotune off and do not use it.")
+                        }
                     },
                     headerText: "Data-driven Adjustments"
                 )
@@ -97,10 +96,7 @@ extension AutotuneConfig {
                         units: state.units,
                         type: .boolean,
                         label: "Only Autotune Basal Insulin",
-                        miniHint: """
-                        Restricts Autotune adjustments to only basal settings
-                        Default: OFF
-                        """,
+                        miniHint: "Restricts Autotune adjustments to only basal settings \nDefault: OFF",
                         verboseHint: Text("Restricts Autotune adjustments to only basal settings.")
                     )
                 }

+ 52 - 48
FreeAPS/Sources/Modules/BolusCalculatorConfig/View/BolusCalculatorConfigRootView.swift

@@ -62,16 +62,10 @@ extension BolusCalculatorConfig {
                     units: state.units,
                     type: .boolean,
                     label: "Display Meal Presets",
-                    miniHint: """
-                    Enabling this feature allows you to create and save preset meals
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Allows you to create and save preset meals \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        Enabling this feature allows you to create and save preset meals.
-                        """)
+                        Text("Enabling this feature allows you to create and save preset meals.")
                     }
                 )
 
@@ -89,19 +83,21 @@ extension BolusCalculatorConfig {
                     units: state.units,
                     type: .decimal("overrideFactor"),
                     label: "Recommended Bolus Percentage",
-                    miniHint: """
-                    Percentage of the calculated bolus used as your recommended bolus in the bolus calculator
-                    Default: 70%
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Percent of bolus used in bolus calculator \nDefault: 70%",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: 70%").bold()
-                        Text("""
-
-                        Recommended bolus percentage is a safety feature built into Trio. Trio first calculates an insulin required value, which is the full dosage. That dosage is then multiplied by your Recommended Bolus Percentage to display your suggested insulin dose in the bolus calculator.
-
-                        Because Trio utilizes SMBs and UAM SMBs to help you reach your target glucose, you'll want this setting to be lower than the full calculated amount (<100%).
-                        """)
-                        Text("It is not advised to set this to 100% if you also have SMBs and/or UAM SMBs enabled.").italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Recommended Bolus Percentage is a safety feature built into Trio. Trio first calculates an insulin required value, which is the full dosage. That dosage is then multiplied by your Recommended Bolus Percentage to display your suggested insulin dose in the bolus calculator."
+                            )
+                            Text(
+                                "Because Trio utilizes SMBs and UAM SMBs to help you reach your target glucose, this is initially set to below the full calculated amount (<100%) because other AID systems do not bolus for COB the same way Trio does. When SMBs and UAM SMBs are enabled, you may find your current CR results in lows and needs to be increased before you increase this setting closer to or at 100%."
+                            )
+                            Text(
+                                "Tip: If you are a new Trio user, it is not advised to set this to 100% until you have verified that your core settings (CR, ISF, basals) do not need adjusting."
+                            )
+                            .italic()
+                        }
                     },
                     headerText: "Calculator Configuration"
                 )
@@ -119,22 +115,26 @@ extension BolusCalculatorConfig {
                     ),
                     units: state.units,
                     type: .conditionalDecimal("fattyMealFactor"),
-                    label: "Enable Fatty Meal",
+                    label: "Enable Fatty Meal Option",
                     conditionalLabel: "Fatty Meal Bolus Percentage",
-                    miniHint: """
-                    A "Fatty Meal" option appears in the bolus calculator
-                    Default: OFF
-                    Default %: 70%
-                    """,
+                    miniHint: "\"Fatty Meal\" option appears in the bolus calculator \nDefault: OFF\nDefault Percent: 70%",
                     verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("Default Percentage: 70%").bold()
-                        Text("""
-                        Enabling this setting adds a "Fatty Meal" option to the bolus calculator. Once this feature is enabled, a percentage setting will appear for you to set. When you use a Fatty Meal Bolus, the percentage you select for this setting will replace the Recommended Bolus Percentage setting used in that bolus calculation.
-                        """)
-                        Text(
-                            "Tip: This setting should be LOWER than your Recommended Bolus Percentage setting to enable the bolus calculator to give less than the calculated amount to prevent lows due to carbs absorbing very slowly. This could be useful when eating meals like pizza."
-                        ).italic()
+                        Text("Default Percent: 70%").bold()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text("Do not enable this feature until you have optimized your CR (carb ratio) setting.").bold()
+                                .italic()
+                            Text(
+                                "Enabling this setting adds a \"Fatty Meal\" option to the bolus calculator. Once this feature is enabled, a percentage setting will appear below this for you to select."
+                            )
+                            Text(
+                                "When you use a Fatty Meal Bolus, the percentage you select for this setting will replace the Recommended Bolus Percentage setting used in that bolus calculation."
+                            )
+                            Text(
+                                "Tip: This setting should be ↓LOWER↓ than your Recommended Bolus Percentage setting to enable the bolus calculator the ability to give less than the calculated amount to prevent lows due to carbs absorbing very slowly. This could be useful when eating meals like pizza."
+                            )
+                            .italic()
+                        }
                     }
                 )
 
@@ -151,23 +151,27 @@ extension BolusCalculatorConfig {
                     ),
                     units: state.units,
                     type: .conditionalDecimal("sweetMealFactor"),
-                    label: "Enable Super Bolus",
+                    label: "Enable Super Bolus Option",
                     conditionalLabel: "Super Bolus Percentage",
-                    miniHint: """
-                    A "Super Bolus" option appears in the bolus calculator
-                    Default: OFF
-                    Default %: 200%
-                    """,
+                    miniHint: "\"Super Bolus\" option appears in the bolus calculator \nDefault: OFF\nDefault Percent: 200%",
                     verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("Default Percentage: 200%").bold()
-                        Text("""
-                        Enabling this setting adds a "Super Bolus" option to the bolus calculator. Once this feature is enabled, a percentage setting will appear for you to set. When you use a Super Bolus, the percentage you select for this setting will replace the Recommended Bolus Percentage setting used in that bolus calculation.
-                        """)
-                        Text("The Super Bolus is a useful option for sweet or fast meals.")
-                        Text(
-                            "Tip: This setting should be HIGHER than your Recommended Bolus Percentage setting to enable the bolus calculator to give above the calculated amount to address carbs that absorb very quickly. This could be useful when eating sweets."
-                        ).italic()
+                        Text("Default Percent: 200%").bold()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text("Do not enable this feature until you have optimized your CR (carb ratio) setting.").bold()
+                                .italic()
+                            Text(
+                                "Enabling this setting adds a \"Super Bolus\" option to the bolus calculator. Once this feature is enabled, a percentage setting will appear below this for you to select."
+                            )
+                            Text(
+                                "When you use a Super Bolus, the percentage you select for this setting will replace the Recommended Bolus Percentage setting used in that bolus calculation."
+                            )
+                            Text("The Super Bolus is a useful option for sweet or fast meals.")
+                            Text(
+                                "Tip: This setting should be ↑HIGHER↑ than your Recommended Bolus Percentage setting to enable the bolus calculator the ability to give above the calculated amount to address carbs that absorb very quickly. This could be useful when eating sweets."
+                            )
+                            .italic()
+                        }
                     }
                 )
             }

+ 15 - 18
FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift

@@ -64,7 +64,7 @@ extension CGM {
                                             selectedVerboseHint =
                                                 AnyView(
                                                     Text(
-                                                        "● Dexcom G5 \n● Dexcom G6/ONE \n● Dexcom G7/ONE+ \n● Dexcom Share \n● Freestyle Libre \n● Freestyle Libre Demo \n● Glucose Simulator \n● Medtronic Enlite \n● Nightscout \n● xDrip4iOS."
+                                                        "• Dexcom G5 \n• Dexcom G6/ONE \n• Dexcom G7/ONE+ \n• Dexcom Share \n• Freestyle Libre \n• Freestyle Libre Demo \n• Glucose Simulator \n• Medtronic Enlite \n• Nightscout \n• xDrip4iOS"
                                                     )
                                                 )
                                             shouldDisplayHint.toggle()
@@ -167,10 +167,7 @@ extension CGM {
 
                                 HStack(alignment: .top) {
                                     Text(
-                                        """
-                                        A “heartbeat” is what tells Trio to start a loop cycle. 
-                                        This is required to keep looping.
-                                        """
+                                        "A heartbeat tells Trio to start a loop cycle. \nThis is required to keep looping."
                                     )
                                     .font(.footnote)
                                     .foregroundColor(.secondary)
@@ -182,7 +179,7 @@ extension CGM {
                                             selectedVerboseHint =
                                                 AnyView(
                                                     Text(
-                                                        "The Heartbeat can come from either a CGM or a pump to wake up Trio when phone is locked or in the background. If CGM is on the same phone as Trio and xDrip4iOS is configured to use the same AppGroup as Trio and the heartbeat feature is turned on in xDrip4iOS, then the CGM can provide a heartbeat to wake up Trio when phone is locked or app is in the background."
+                                                        "The CGM Heartbeat can come from either a CGM or a pump to wake up Trio when phone is locked or in the background. If CGM is on the same phone as Trio and xDrip4iOS is configured to use the same AppGroup as Trio and the heartbeat feature is turned on in xDrip4iOS, then the CGM can provide a heartbeat to wake up Trio when phone is locked or app is in the background."
                                                     )
                                                 )
                                             shouldDisplayHint.toggle()
@@ -218,20 +215,20 @@ extension CGM {
                         units: state.units,
                         type: .boolean,
                         label: "Smooth Glucose Value",
-                        miniHint: """
-                        Smooth CGM readings using Savitzky–Golay filtering
-                        Default: OFF
-                        """,
+                        miniHint: "Smooth CGM readings \nDefault: OFF",
                         verboseHint: VStack {
                             Text("Default: OFF").bold()
-                            Text("""
-
-                            This filter looks at small groups of nearby readings and fits them to a simple mathematical curve (a low-degree polynomial). This process doesn’t change the overall pattern of your glucose data but helps smooth out the "noise" or irregular fluctuations that could lead to false highs or lows.
-
-                            Because your glucose readings are taken at regular intervals, the filter can use a set of pre-calculated "weights" to adjust each group of readings, making the calculations fast and efficient. It’s designed to keep the important trends in your data while minimizing those small, misleading variations, giving you a clearer sense of where your blood sugar is really headed.
-
-                            This type of filtering is useful in Trio, as it can help prevent over-corrections based on inaccurate glucose readings. This can help reduce the impact of sudden spikes or dips that might not reflect your true blood glucose levels, helping you get a more accurate picture of your trends.
-                            """)
+                            VStack(alignment: .leading, spacing: 10) {
+                                Text(
+                                    "This filter looks at small groups of nearby readings and fits them to a simple mathematical curve. This process doesn’t change the overall pattern of your glucose data but helps smooth out the \"noise\" or irregular fluctuations that could lead to false highs or lows."
+                                )
+                                Text(
+                                    "Because your glucose readings are taken at regular intervals, the filter can use a set of pre-calculated \"weights\" to adjust each group of readings, making the calculations fast and efficient. It’s designed to keep the important trends in your data while minimizing those small, misleading variations, giving you and Trio a clearer sense of where your blood sugar is really headed."
+                                )
+                                Text(
+                                    "This type of filtering is useful in Trio, as it can help prevent over-corrections based on inaccurate glucose readings. This can help reduce the impact of sudden spikes or dips that might not reflect your true blood glucose levels."
+                                )
+                            }
                         }
                     )
                 }

+ 33 - 28
FreeAPS/Sources/Modules/CalendarEventSettings/View/CalendarEventSettingsRootView.swift

@@ -48,16 +48,21 @@ extension CalendarEventSettings {
                     units: state.units,
                     type: .boolean,
                     label: "Create Events in Calendar",
-                    miniHint: """
-                    When enabled, Trio creates customizable calendar events in an iCloud calendar'
-                    Default: OFF
-                    """,
+                    miniHint: "Uses calendar events to display current data \nDefault: OFF",
                     verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text(
-                            "When enabled, Trio will create a calendar event with every successful loop cycle. The previous calendar event will be deleted."
-                        )
-                        Text("You can customize this with the calendar of your choosing, emojis, and IOB/COB.")
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "When enabled, Trio will create a customizable calendar event to keep you notified of your current glucose reading with every successful loop cycle."
+                            )
+                            Text(
+                                "This is useful if you use CarPlay or a variety of other external services that limit the view of most apps, but allows the calendar app"
+                            )
+                            Text(
+                                "Once enabled, the available customizations will appear. You can customize with the calendar of your choosing, use of emoji labels, and the inclusion of IOB & COB data."
+                            )
+                            Text("Note: Once a new calendar event is created, the previous event will be deleted.").italic()
+                        }
                     },
                     headerText: "Diabetes Data as Calendar Event"
                 )
@@ -87,23 +92,24 @@ extension CalendarEventSettings {
                         units: state.units,
                         type: .boolean,
                         label: "Display Emojis as Labels",
-                        miniHint: """
-                        Enable to use emojis instead of "IOB" or "COB" and to indicate in-range and out-of-range glucose readings
-                        Default: OFF
-                        """,
+                        miniHint: "Emojis used instead of text for data labels \nDefault: OFF",
                         verboseHint: VStack(spacing: 10) {
                             Text("Default: OFF").bold()
-                            Text("""
-                             When enabled, the calendar event created will indicate whether glucose readings are in-range or out-of-range using the following color emojis:
-                            🟢: In-Range
-                            🟠: Above-Range
-                            🔴: Below-Range    
-                            """)
-                            Text("""
-                            If "Display IOB and COB" is also enabled, "IOB" and "COB" will be replaced with the following emojis:
-                            💉: IOB
-                            🥨: COB
-                            """)
+                            VStack(alignment: .leading, spacing: 5) {
+                                Text(
+                                    "When enabled, the calendar event created will indicate whether glucose readings are in-range or out-of-range using the following color emojis:"
+                                )
+                                Text("🟢: In-Range")
+                                Text("🟠: Above-Range")
+                                Text("🔴: Below-Range")
+                            }
+                            VStack(alignment: .leading, spacing: 5) {
+                                Text(
+                                    "If \"Display IOB and COB\" is also enabled, \"IOB\" and \"COB\" will be replaced with the following emojis:"
+                                )
+                                Text("💉: IOB")
+                                Text("🥨: COB")
+                            }
                         }
                     )
 
@@ -121,13 +127,12 @@ extension CalendarEventSettings {
                         units: state.units,
                         type: .boolean,
                         label: "Display IOB and COB",
-                        miniHint: """
-                        Include IOB and COB in the calendar event created by Trio
-                        Default: OFF
-                        """,
+                        miniHint: "Include IOB & COB in the calendar event data \nDefault: OFF",
                         verboseHint: VStack(spacing: 10) {
                             Text("Default: OFF").bold()
-                            Text(" When enabled, Trio will include the current IOB and COB values in the calendar event created.")
+                            Text(
+                                "When enabled, Trio will include the current IOB and COB values, along with the current glucose reading, in each calendar event created."
+                            )
                         }
                     )
                 } else if state.useCalendar {

+ 1 - 4
FreeAPS/Sources/Modules/RemoteControlConfig/View/RemoteControlConfig.swift

@@ -51,10 +51,7 @@ extension RemoteControlConfig {
                     units: state.units,
                     type: .boolean,
                     label: "Enable Remote Control",
-                    miniHint: """
-                    Allow Trio to receive instructions, such as boluses and temp targets, from Loop Follow remotely
-                    Default: OFF
-                    """,
+                    miniHint: "Allow Trio to receive instructions, such as boluses and temp targets, from Loop Follow remotely \n Default: OFF",
                     verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
                         Text(