Browse Source

Settings Update

tmhastings 1 năm trước cách đây
mục cha
commit
b254ccb40e

+ 17 - 15
FreeAPS/Sources/Modules/MealSettings/View/MealSettingsRootView.swift

@@ -175,7 +175,7 @@ extension MealSettings {
                                         hintLabel = "Limits per Entry"
                                         selectedVerboseHint =
                                             AnyView(
-                                                VStack(spacing: 10) {
+                                                VStack(alignment: .leading, spacing: 10) {
                                                     Text("Max Carbs: Enter the largest carbohydrate value allowed per meal entry")
                                                     Text("Max Fat: Enter the largest fat value allowed per meal entry")
                                                     Text("Max Protein: Enter the largest protein value allowed per meal entry")
@@ -221,18 +221,20 @@ extension MealSettings {
                                     "The Warsaw Method helps account for the delayed glucose spikes caused by fat and protein in meals. It uses Fat-Protein Units (FPU) to calculate the carb effect from fat and protein. The system spreads insulin delivery over several hours to mimic natural insulin release, helping to manage post-meal glucose spikes."
                                 )
                             }
-                            VStack(alignment: .center) {
-                                Text("Fat Conversion").bold()
-                                Text("𝑭 = fat(g) × 90%")
-                            }
-                            VStack(alignment: .center) {
-                                Text("Protein Conversion").bold()
-                                Text("𝑷 = protein(g) × 40%")
-                            }
-                            VStack(alignment: .center) {
-                                Text("FPU Conversion").bold()
-                                Text("𝑭 + 𝑷 = g CHO")
-                            }
+                        }
+                        VStack(spacing: 5) {
+                            Text("Fat Conversion").bold()
+                            Text("𝑭 = fat(g) × 90%")
+                        }
+                        VStack(spacing: 5) {
+                            Text("Protein Conversion").bold()
+                            Text("𝑷 = protein(g) × 40%")
+                        }
+                        VStack(spacing: 5) {
+                            Text("FPU Conversion").bold()
+                            Text("𝑭 + 𝑷 = g CHO")
+                        }
+                        VStack(spacing: 5) {
                             Text(
                                 "You can personalize the conversion calculation by adjusting the following settings that will appear when this option is enabled:"
                             ).italic()
@@ -352,9 +354,9 @@ extension MealSettings {
                         miniHint: "Influences the conversion rate used in the Warsaw Method \nDefault: 50%",
                         verboseHint: VStack(spacing: 10) {
                             Text("Default: 50%").bold()
-                            VStack(alignment: .leading, spacing: 10) {
+                            VStack(spacing: 10) {
                                 Text("This setting changes how much effect the fat and protein entry has on FPUs.")
-                                VStack(alignment: .center) {
+                                VStack(alignment: .center, spacing: 5) {
                                     Text("50% is half effect:").bold()
                                     Text("(Fat × 45%) + (Protein × 20%)")
                                     Text("100% is full effect:").bold()

+ 10 - 12
FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutFetchView.swift

@@ -45,13 +45,13 @@ struct NightscoutFetchView: View {
                 units: state.units,
                 type: .boolean,
                 label: "Allow Fetching from Nightscout",
-                miniHint: """
-                Enable fetching of selected data sets from Nightscout
-                See hint for more details.
-                """,
-                verboseHint: Text(
-                    "The Fetch Treatments toggle enables fetching of carbs and temp targets entered in Careportal or by another uploading device than Trio from Nightscout."
-                ),
+                miniHint: "Enable fetching of selected data sets from Nightscout \nDefault: OFF",
+                verboseHint: VStack(spacing: 10) {
+                    Text("Default: OFF").bold()
+                    Text(
+                        "The Fetch Treatments toggle enables fetching of carbs and temp targets entered in Careportal or by another uploading device than Trio from Nightscout."
+                    )
+                },
                 headerText: "Remote & Fetch Capabilities"
             )
 
@@ -70,12 +70,10 @@ struct NightscoutFetchView: View {
                     units: state.units,
                     type: .boolean,
                     label: "Allow Remote Control of Trio",
-                    miniHint: """
-                    Enables selected remote control capabilities via Nightscout
-                    See hint for more details
-                    """,
+                    miniHint: "Enables selected remote control capabilities via Nightscout \nDefault: OFF",
                     verboseHint: VStack(spacing: 10) {
-                        Text("When enabled you allow these remote functions through announcements from Nightscout:")
+                        Text("Default: OFF").bold()
+                        Text("When enabled you allow the following remote functions through announcements from Nightscout:")
                         VStack(alignment: .leading) {
                             Text("• Suspend/Resume Pump")
                             Text("• Opening/Closing Loop")

+ 19 - 16
FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutUploadView.swift

@@ -45,18 +45,20 @@ struct NightscoutUploadView: View {
                 units: state.units,
                 type: .boolean,
                 label: "Allow Uploading to Nightscout",
-                miniHint: """
-                Enables upload of selected data sets to Nightscout
-                See hint for more details
-                """,
-                verboseHint: VStack(spacing: 5) {
-                    Text("The Upload Treatments toggle enables uploading of:")
-                    VStack(alignment: .leading) {
-                        Text("• Carbs")
-                        Text("• Temp Targets")
-                        Text("• Device Status")
-                        Text("• Preferences")
-                        Text("• Settings")
+                miniHint: "Enables upload of selected data sets to Nightscout \nDefault: OFF",
+                verboseHint: VStack(spacing: 10) {
+                    Text("Default: OFF").bold()
+                    VStack(alignment: .leading, spacing: 10) {
+                        Text(
+                            "The Upload Treatments toggle enables uploading of the following data sets to your connected Nightscout URL:"
+                        )
+                        VStack(alignment: .leading, spacing: 5) {
+                            Text("• Carbs")
+                            Text("• Temp Targets")
+                            Text("• Device Status")
+                            Text("• Preferences")
+                            Text("• Settings")
+                        }
                     }
                 }
             )
@@ -77,10 +79,11 @@ struct NightscoutUploadView: View {
                     units: state.units,
                     type: .boolean,
                     label: "Upload Glucose",
-                    miniHint: "Enables uploading of CGM readings to Nightscout",
-                    verboseHint: Text(
-                        "Enabling this setting allows CGM readings from Trio to be used in Nightscout."
-                    )
+                    miniHint: "Enables uploading of CGM readings to Nightscout /nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
+                        Text("Default: OFF").bold()
+                        Text("Enabling this setting allows CGM readings from Trio to be used in Nightscout.")
+                    }
                 )
             }
         }

+ 8 - 11
FreeAPS/Sources/Modules/NightscoutConfig/View/ProfileImport/ReviewInsulinActionView.swift

@@ -49,19 +49,16 @@ struct ReviewInsulinActionView: BaseView {
                 units: state.units,
                 type: .decimal("dia"),
                 label: "Duration of Insulin Action",
-                miniHint: """
-                Number of hours insulin is active in your body
-                Default: 6 hours
-                """,
-                verboseHint: VStack {
+                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("It is better to use Custom Peak Timing rather than adjust your Duration of Insulin Action (DIA)")
+                    VStack(alignment: .leading, spacing: 10) {
+                        Text("Number of hours insulin will contribute to IOB after dosing.")
+                        Text(
+                            "Tip: It is better to use Custom Peak Timing rather than use a Duration of Insulin Action (DIA) other than the default of 6 hours."
+                        )
                         .italic()
+                    }
                 },
                 headerText: "Review imported DIA"
             )

+ 157 - 183
FreeAPS/Sources/Modules/SMBSettings/View/SMBSettingsRootView.swift

@@ -48,16 +48,12 @@ extension SMBSettings {
                     units: state.units,
                     type: .boolean,
                     label: NSLocalizedString("Enable SMB Always", comment: "Enable SMB Always"),
-                    miniHint: """
-                    Allow SMBs at all times except when a high Temp Target is set
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Allow SMBs at all times except when a high Temp Target is set \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        When enabled, Super Micro Boluses (SMBs) will always be allowed if dosing calculations determine insulin is needed via the SMB delivery method, except in instances where a high Temp Target is set.
-                        """)
+                        Text(
+                            "When enabled, Super Micro Boluses (SMBs) will always be allowed if dosing calculations determine insulin is needed via the SMB delivery method, except in instances where a high Temp Target is set."
+                        )
                     },
                     headerText: "Super-Micro-Bolus"
                 )
@@ -77,21 +73,18 @@ extension SMBSettings {
                         units: state.units,
                         type: .boolean,
                         label: NSLocalizedString("Enable SMB With COB", comment: "Enable SMB With COB"),
-                        miniHint: """
-                        Allow SMB when carbs are on board
-                        Default: OFF
-                        """,
-                        verboseHint: VStack {
+                        miniHint: "Allow SMB when carbs are on board \nDefault: OFF",
+                        verboseHint: VStack(spacing: 10) {
                             Text("Default: OFF").bold()
-                            Text("""
-
-                            When the carb on board (COB) forecast line is active, enabling this feature allows Trio to use Super Micro Boluses (SMB) to deliver the insulin required.
-
-                            """)
-                            Text(
-                                "If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not."
-                            )
-                            .italic()
+                            VStack(alignment: .leading, spacing: 10) {
+                                Text(
+                                    "When the carb on board (COB) forecast line is active, enabling this feature allows Trio to use Super Micro Boluses (SMB) to deliver the insulin required."
+                                )
+                                Text(
+                                    "Note: If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not."
+                                )
+                                .italic()
+                            }
                         }
                     )
 
@@ -109,21 +102,18 @@ extension SMBSettings {
                         units: state.units,
                         type: .boolean,
                         label: NSLocalizedString("Enable SMB With Temptarget", comment: "Enable SMB With Temptarget"),
-                        miniHint: """
-                        Allow SMB when a manual Temporary Target is set under 100 mg/dL (5.5 mmol/L)
-                        Default: OFF
-                        """,
-                        verboseHint: VStack {
+                        miniHint: "Allow SMB when a manual Temporary Target is set under 100 mg/dL (5.5 mmol/L) \nDefault: OFF",
+                        verboseHint: VStack(spacing: 10) {
                             Text("Default: OFF").bold()
-                            Text("""
-
-                            Enabling this feature allows Trio to deliver insulin required using Super Micro Boluses (SMB) at times when a manual Temporary Target under 100 mg/dL (5.5 mmol/L) is set.
-
-                            """)
-                            Text(
-                                "If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not."
-                            )
-                            .italic()
+                            VStack(alignment: .leading, spacing: 10) {
+                                Text(
+                                    "Enabling this feature allows Trio to deliver insulin required using Super Micro Boluses (SMB) at times when a manual Temporary Target under 100 mg/dL (5.5 mmol/L) is set."
+                                )
+                                Text(
+                                    "Note: If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not."
+                                )
+                                .italic()
+                            }
                         }
                     )
 
@@ -141,21 +131,18 @@ extension SMBSettings {
                         units: state.units,
                         type: .boolean,
                         label: NSLocalizedString("Enable SMB After Carbs", comment: "Enable SMB After Carbs"),
-                        miniHint: """
-                        Allow SMB for 6 hrs after carbs are logged
-                        Default: OFF
-                        """,
-                        verboseHint: VStack {
+                        miniHint: "Allow SMB for 6 hrs after carbs are logged \nDefault: OFF",
+                        verboseHint: VStack(spacing: 10) {
                             Text("Default: OFF").bold()
-                            Text("""
-
-                            Enabling this feature allows Trio to deliver insulin required using Super Micro Boluses (SMB) for 6 hours after a carb entry, regardless of whether there are active carbs on board (COB).
-
-                            """)
-                            Text(
-                                "If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not."
-                            )
-                            .italic()
+                            VStack(alignment: .leading, spacing: 10) {
+                                Text(
+                                    "Enabling this feature allows Trio to deliver insulin required using Super Micro Boluses (SMB) for 6 hours after a carb entry, regardless of whether there are active carbs on board (COB)."
+                                )
+                                Text(
+                                    "Note: If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not."
+                                )
+                                .italic()
+                            }
                         }
                     )
 
@@ -174,21 +161,18 @@ extension SMBSettings {
                         type: .conditionalDecimal("enableSMB_high_bg_target"),
                         label: NSLocalizedString("Enable SMB With High BG", comment: "Enable SMB With High BG"),
                         conditionalLabel: "High BG Target",
-                        miniHint: """
-                        Allow SMB when glucose is above the High BG Target value
-                        Default: OFF
-                        """,
-                        verboseHint: VStack {
+                        miniHint: "Allow SMB when glucose is above the High BG Target value \nDefault: OFF",
+                        verboseHint: VStack(spacing: 10) {
                             Text("Default: OFF").bold()
-                            Text("""
-
-                            Enabling this feature allows Trio to deliver insulin required using Super Micro Boluses (SMB) when glucose reading is above the value set as High BG Target.
-
-                            """)
-                            Text(
-                                "If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not."
-                            )
-                            .italic()
+                            VStack(alignment: .leading, spacing: 10) {
+                                Text(
+                                    "Enabling this feature allows Trio to deliver insulin required using Super Micro Boluses (SMB) when glucose reading is above the value set as High BG Target."
+                                )
+                                Text(
+                                    "Note: If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not."
+                                )
+                                .italic()
+                            }
                         }
                     )
                 }
@@ -213,22 +197,22 @@ extension SMBSettings {
                         "Allow SMB With High Temptarget",
                         comment: "Allow SMB With High Temptarget"
                     ),
-                    miniHint: """
-                    Allow SMB when a manual Temporary Target is set greater than 100 mg/dL (5.5 mmol/L)
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Allow SMB when a manual Temporary Target is set greater than 100 mg/dL (5.5 mmol/L) \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        Enabling this feature allows Trio to deliver insulin required using Super Micro Boluses (SMB) when a manual Temporary Target above 100 mg/dL (5.5 mmol/L) is set.
-
-                        """)
-                        Text("""
-                        If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not.
-
-                        High Temp Targets are often set when recovering from lows. If you use High Temp Targets for that purpose, this feature should remain disabled. 
-                        """).italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Enabling this feature allows Trio to deliver insulin required using Super Micro Boluses (SMB) when a manual Temporary Target above 100 mg/dL (5.5 mmol/L) is set."
+                            )
+                            Text(
+                                "Note: If this is enabled and the criteria is met, SMBs could be utilized regardless of other SMB settings being enabled or not."
+                            )
+                            .italic()
+                            Text(
+                                "Warning: High Temp Targets are often set when recovering from lows. If you use High Temp Targets for that purpose, this feature should remain disabled."
+                            )
+                            .bold().italic()
+                        }
                     }
                 )
 
@@ -246,21 +230,20 @@ extension SMBSettings {
                     units: state.units,
                     type: .boolean,
                     label: NSLocalizedString("Enable UAM", comment: "Enable UAM"),
-                    miniHint: """
-                    Automatically adjust insulin delivery when carbs are not announced or miscalculated
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Automatically adjust insulin delivery when carbs are not announced or miscalculated \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        Enabling the UAM (Unannounced Meals) feature allows the system to detect and respond to unexpected rises in blood glucose caused by unannounced or miscalculated carbs, meals high in fat or protein, or other factors like adrenaline. 
-
-                        It uses the SMB (Super Micro Bolus) algorithm to deliver insulin in small amounts to correct glucose spikes. UAM also works in reverse, reducing or stopping SMBs if glucose levels drop unexpectedly. 
-
-                        This feature ensures more accurate insulin adjustments even when carb entries are missing or incorrect.
-
-                        """)
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Enabling the UAM (Unannounced Meals) feature allows the system to detect and respond to unexpected rises in blood glucose caused by unannounced or miscalculated carbs, meals high in fat or protein, or other factors like adrenaline."
+                            )
+                            Text(
+                                "It uses the SMB (Super Micro Bolus) algorithm to deliver insulin in small amounts to correct glucose spikes. UAM also works in reverse, reducing or stopping SMBs if glucose levels drop unexpectedly."
+                            )
+                            Text(
+                                "This feature ensures more accurate insulin adjustments even when carb entries are missing or incorrect."
+                            )
+                        }
                     }
                 )
 
@@ -278,33 +261,32 @@ extension SMBSettings {
                     units: state.units,
                     type: .decimal("maxSMBBasalMinutes"),
                     label: NSLocalizedString("Max SMB Basal Minutes", comment: "Max SMB Basal Minutes"),
-                    miniHint: """
-                    Limits the size of a single Super Micro Bolus (SMB) dose
-                    Default: 30 minutes
-                    """,
-                    verboseHint: VStack {
-                        Text("""
-                        Default: 30 minutes 
-                        (50% current basal rate)
-                        """).bold()
-                        Text("""
-
-                        This is a limit on the size of a single SMB. One SMB can only be as large as this many minutes of your current profile basal rate.
-
-                        To calculate the maximum SMB allowed based on this setting, use the following formula, where 𝒳 = Max SMB Basal Minutes:
-                        """)
-                        Text("(𝒳 ÷ 60) × current basal rate").italic()
-                        Text("""
-
-                        A Max SMB Basal Minutes setting of 30 minutes means SMBs are limited to 50% of your current basal rate: 
-                        """)
-                        Text("30min ÷ 60min = 0.5 = 50%").italic()
-                        Text("""
-
-                        Increasing this value above 90 minutes may impact Trio's ability to effectively zero temp and prevent lows.
-
-                        """)
-                        Text("SMBs must be enabled to use this limit").italic()
+                    miniHint: "Limits the size of a single Super Micro Bolus (SMB) dose \nDefault: 30 minutes",
+                    verboseHint: VStack(spacing: 10) {
+                        VStack(alignment: .center, spacing: 1) {
+                            Text("Default: 30 minutes").bold()
+                            Text("(50% current basal rate)").bold()
+                        }
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "This is a limit on the size of a single SMB. One SMB can only be as large as this many minutes of your current profile basal rate."
+                            )
+                            Text(
+                                "To calculate the maximum SMB allowed based on this setting, use the following formula:"
+                            )
+                        }
+                        VStack(alignment: .center, spacing: 5) {
+                            Text(
+                                "(𝒳 = Max SMB Basal Minutes)"
+                            )
+                            Text("(𝒳 ÷ 60) × current basal rate").italic()
+                        }
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Warning: Increasing this value above 90 minutes may impact Trio's ability to effectively zero temp and prevent lows."
+                            ).bold().italic()
+                            Text("Note: SMBs must be enabled to use this limit").italic()
+                        }
                     }
                 )
 
@@ -322,33 +304,32 @@ extension SMBSettings {
                     units: state.units,
                     type: .decimal("maxUAMSMBBasalMinutes"),
                     label: NSLocalizedString("Max UAM Basal Minutes", comment: "Max UAM Basal Minutes"),
-                    miniHint: """
-                    Limits the size of a single Unannounced Meal (UAM) SMB dose
-                    Default: 30 minutes
-                    """,
-                    verboseHint: VStack {
-                        Text("""
-                        Default: 30 minutes 
-                        (50% current basal rate)
-                        """).bold()
-                        Text("""
-
-                        This is a limit on the size of a single UAM SMB. One UAM SMB can only be as large as this many minutes of your current profile basal rate.
-
-                        To calculate the maximum UAM SMB allowed based on this setting, use the following formula, where 𝒳 = Max UAM SMB Basal Minutes:
-                        """)
-                        Text("(𝒳 ÷ 60) × current basal rate").italic()
-                        Text("""
-
-                        A Max UAM SMB Basal Minutes setting of 30 minutes means SMBs are limited to 50% of your current basal rate:
-                        """)
-                        Text("30min ÷ 60min = 0.5 = 50%").italic()
-                        Text("""
-
-                        Increasing this value above 90 may impact Trio's ability to effectively zero temp and prevent lows.
-
-                        """)
-                        Text("UAM SMBs must be enabled to use this limit").italic()
+                    miniHint: "Limits the size of a single Unannounced Meal (UAM) SMB dose \nDefault: 30 minutes",
+                    verboseHint: VStack(spacing: 10) {
+                        VStack(alignment: .center, spacing: 1) {
+                            Text("Default: 30 minutes").bold()
+                            Text("(50% current basal rate)").bold()
+                        }
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "TThis is a limit on the size of a single UAM SMB. One UAM SMB can only be as large as this many minutes of your current profile basal rate."
+                            )
+                            Text(
+                                "To calculate the maximum UAM SMB allowed based on this setting, use the following formula"
+                            )
+                        }
+                        VStack(alignment: .center, spacing: 5) {
+                            Text(
+                                "𝒳 = Max UAM SMB Basal Minutes"
+                            )
+                            Text("(𝒳 ÷ 60) × current basal rate").italic()
+                        }
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Warning: Increasing this value above 90 minutes may impact Trio's ability to effectively zero temp and prevent lows."
+                            ).bold().italic()
+                            Text("Note: UAM SMBs must be enabled to use this limit").italic()
+                        }
                     }
                 )
 
@@ -366,18 +347,15 @@ extension SMBSettings {
                     units: state.units,
                     type: .decimal("maxDeltaBGthreshold"),
                     label: NSLocalizedString("Max Delta-BG Threshold SMB", comment: "Max Delta-BG Threshold"),
-                    miniHint: """
-                    When the difference between the last two glucose values is larger than this, it will disable SMBs
-                    Default: 20%
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Disables SMBs if last two glucose values differ by more than this percent \nDefault: 20%",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: 20% increase").bold()
-                        Text("""
-
-                        Maximum allowed positive percentual change in glucose level to permit SMBs. If the difference in glucose is greater than this, Trio will disable SMBs.
-
-                        """)
-                        Text("This setting has a hard-coded cap of 40%").italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Maximum allowed positive percentual change in glucose level to permit SMBs. If the difference in glucose is greater than this, Trio will disable SMBs."
+                            )
+                            Text("Note: This setting has a hard-coded cap of 40%").italic()
+                        }
                     }
                 )
 
@@ -395,20 +373,18 @@ extension SMBSettings {
                     units: state.units,
                     type: .decimal("smbDeliveryRatio"),
                     label: NSLocalizedString("SMB DeliveryRatio", comment: "SMB DeliveryRatio"),
-                    miniHint: """
-                    Safety limit on what percentage of total calculated insulin required can be administered as an SMB
-                    Default: 50%
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Limits % of total insulin required that can be given as SMB \nDefault: 50%",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: 50%").bold()
-                        Text("""
-
-                        Once the total insulin required is calculated, this safety limit specifies what share of the total insulin required can be delivered as an SMB.
-
-                        Due to SMBs occurring every 5 minutes, it is important to set this value to a reasonable level that allows Trio to safely zero temp should dosing needs suddenly change. Increase this value with caution.
-
-                        """)
-                        Text("Limited to a range of 30 - 70%").italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "Once the total insulin required is calculated, this safety limit specifies what share of the total insulin required can be delivered as an SMB."
+                            )
+                            Text(
+                                "Due to SMBs occurring every 5 minutes, it is important to set this value to a reasonable level that allows Trio to safely zero temp should dosing needs suddenly change. Increase this value with caution."
+                            )
+                            Text("Note: Limited to a range of 30 - 70%").italic()
+                        }
                     }
                 )
 
@@ -426,18 +402,16 @@ extension SMBSettings {
                     units: state.units,
                     type: .decimal("smbInterval"),
                     label: NSLocalizedString("SMB Interval", comment: "SMB Interval"),
-                    miniHint: """
-                    Minimum minutes since the last SMB or manual bolus to allow an automated SMB
-                    Default: 3 min
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Minimum minutes since the last SMB or manual bolus to allow an automated SMB \nDefault: 3 min",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: 3 min").bold()
-                        Text("""
-
-                        This is the minimum number of minutes since the last SMB or manual bolus before Trio will permit an automated SMB.
-
-                        For Omnipod Dash, this value can be as low as 3 min. For Omnipod Eros, the value can be as low as 5 min.
-                        """)
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "This is the minimum number of minutes since the last SMB or manual bolus before Trio will permit an automated SMB."
+                            )
+                            Text("Note: For Omnipod Dash, minimum value is 3 min. For Omnipod Eros, minimum value is 5 min.")
+                                .italic()
+                        }
                     }
                 )
             }

+ 1 - 1
FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift

@@ -98,7 +98,7 @@ extension Settings {
                         units: state.units,
                         type: .boolean,
                         label: "Closed Loop",
-                        miniHint: "Enables automated insulin delivery. Requires active CGM sensor session and connected pump.",
+                        miniHint: "Enables automated insulin delivery /nRequires active CGM sensor session and connected pump",
                         verboseHint: VStack(spacing: 10) {
                             Text(
                                 "Running Trio in closed loop mode requires an active CGM sensor session and a connected pump. This enables automated insulin delivery."

+ 8 - 9
FreeAPS/Sources/Modules/ShortcutsConfig/View/ShortcutsConfigView.swift

@@ -70,16 +70,15 @@ extension ShortcutsConfig {
                     units: state.units,
                     type: .boolean,
                     label: "Allow Bolusing with Shortcuts",
-                    miniHint: """
-                    Automate boluses using the Shortcuts App
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Automate boluses using the Shortcuts App \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("Enabling this setting allows the iOS Shortcuts App to send bolus commands to Trio.")
-                        Text(
-                            "Disabling this setting will still allow other commands, like Temp Targets, Add Carbs, and Start/End Overrides"
-                        )
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text("Enabling this setting allows the iOS Shortcuts App to send bolus commands to Trio.")
+                            Text(
+                                "Disabling this setting will still allow other commands, like Temp Targets, Add Carbs, and Start/End Overrides"
+                            )
+                        }
                     }
                 )
             }

+ 45 - 60
FreeAPS/Sources/Modules/TargetBehavoir/View/TargetBehavoirRootView.swift

@@ -54,21 +54,18 @@ extension TargetBehavoir {
                         "High Temp Target Raises Sensitivity",
                         comment: "High Temp Target Raises Sensitivity"
                     ),
-                    miniHint: """
-                    A Temp Target above 110 mg/dL increases sensitivity when glucose is above target
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
-                        Text("Exercise Mode").bold().italic()
+                    miniHint: "A Temp Target > 110 mg/dL increases sensitivity when glucose is above target \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        When this feature is enabled, setting a temporary target above 110 mg/dL will decrease the Autosens Ratio used for ISF and basal adjustments, resulting in less insulin delivered overall. This scales with the temporary target set; the higher the temp target, the lower the Autosens Ratio used.
-
-                        If Half Basal Exercise Target is set to 160, a temp target of 120 mg/dL uses an Autosens Ratio of 0.75. A temp target of 140 mg/dL uses an Autosens Ratio of 0.6.
-
-                        """)
-                        Text("The effect of this can be adjusted with the Half Basal Exercise Target").italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "When this feature is enabled, setting a temporary target above 110 mg/dL will decrease the Autosens Ratio used for ISF and basal adjustments, resulting in less insulin delivered overall. This scales with the temporary target set; the higher the temp target, the lower the Autosens Ratio used."
+                            )
+                            Text(
+                                "If Half Basal Exercise Target is set to 160, a temp target of 120 mg/dL uses an Autosens Ratio of 0.75. A temp target of 140 mg/dL uses an Autosens Ratio of 0.6."
+                            )
+                            Text("Note: The effect of this can be adjusted with the Half Basal Exercise Target").italic()
+                        }
                     },
                     headerText: "Algorithmic Target Settings"
                 )
@@ -93,21 +90,18 @@ extension TargetBehavoir {
                         "Low Temp Target Lowers Sensitivity",
                         comment: "Low Temp Target Lowers Sensitivity"
                     ),
-                    miniHint: """
-                    A Temp Target below 100 mg/dL decreases sensitivity when glucose is below target
-                    Default setting: OFF
-                    """,
-                    verboseHint: VStack {
-                        Text("Eating Soon Mode").bold().italic()
+                    miniHint: "Temp Target < 100 mg/dL decreases sensitivity when glucose is below target \nDefault setting: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        When this feature is enabled, setting a temporary target below 100 mg/dL will increase the Autosens Ratio used for ISF and basal adjustments, resulting in more insulin delivered overall. This scales with the temporary target set; the lower the Temp Target, the higher the Autosens Ratio used.
-
-                        If Half Basal Exercise Target is 160, a Temp Target of 95 mg/dL uses an Autosens Ratio of 1.09. A Temp Target of 85 mg/dL uses an Autosens Ratio of 1.33.
-
-                        """)
-                        Text("The effect of this can be adjusted with the Half Basal Exercise Target").italic()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "When this feature is enabled, setting a temporary target below 100 mg/dL will increase the Autosens Ratio used for ISF and basal adjustments, resulting in more insulin delivered overall. This scales with the temporary target set; the lower the Temp Target, the higher the Autosens Ratio used."
+                            )
+                            Text(
+                                "If Half Basal Exercise Target is 160, a Temp Target of 95 mg/dL uses an Autosens Ratio of 1.09. A Temp Target of 85 mg/dL uses an Autosens Ratio of 1.33."
+                            )
+                            Text("Note: The effect of this can be adjusted with the Half Basal Exercise Target").italic()
+                        }
                     }
                 )
 
@@ -125,16 +119,10 @@ extension TargetBehavoir {
                     units: state.units,
                     type: .boolean,
                     label: NSLocalizedString("Sensitivity Raises Target", comment: "Sensitivity Raises Target"),
-                    miniHint: """
-                    Trio will automatically raise your target glucose with increased sensitivity
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Automatically raise target glucose if sensitivity is detected \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        Enabling this feature causes Trio to automatically increase the targeted glucose if it detects an increase in sensitivity.
-                        """)
+                        Text("Automatically increase target glucose if it detects an increase in sensitivity.")
                     }
                 )
 
@@ -152,16 +140,12 @@ extension TargetBehavoir {
                     units: state.units,
                     type: .boolean,
                     label: NSLocalizedString("Resistance Lowers Target", comment: "Resistance Lowers Target"),
-                    miniHint: """
-                    Trio will automatically lower your target glucose when it detects resistance
-                    Default: OFF
-                    """,
-                    verboseHint: VStack {
+                    miniHint: "Automatically lower target glucose if resistance is detected \nDefault: OFF",
+                    verboseHint: VStack(spacing: 10) {
                         Text("Default: OFF").bold()
-                        Text("""
-
-                        Enabling this feature causes Trio to automatically reduce the targeted glucose if it detects a decrease in sensitivity (resistance).
-                        """)
+                        Text(
+                            "Enabling this feature causes Trio to automatically reduce the targeted glucose if it detects a decrease in sensitivity (resistance)."
+                        )
                     }
                 )
 
@@ -179,20 +163,21 @@ extension TargetBehavoir {
                     units: state.units,
                     type: .decimal("halfBasalExerciseTarget"),
                     label: NSLocalizedString("Half Basal Exercise Target", comment: "Half Basal Exercise Target"),
-                    miniHint: """
-                    Sets your current basal rate to 50% when a temp target is set to this number (in mg/dL)
-                    Default: 160 mg/dL
-                    """,
-                    verboseHint: VStack {
-                        Text("Default: 160 mg/dL").bold()
-                        Text("""
-
-                        The Half Basal Exercise Target allows you to scale down your basal insulin during exercise or scale up your basal insulin when eating soon when a temporary glucose target is set. For example, at a temp target of 160 mg/dL, your basal is reduced to 50%, but this scales depending on the target (e.g., 75% at 120 mg/dL, 60% at 140 mg/dL).
-
-                        """)
-                        Text("""
-                        This setting is only utilized if the settings "Low Temp Target Lowers Sensitivity" OR "High Temp Target Raises Sensitivity" are enabled.
-                        """).italic()
+                    miniHint: "Scales down your basal rate to 50% at this value \nDefault: 160 mg/dL (8.9 mmol/L)",
+                    verboseHint: VStack(spacing: 10) {
+                        Text("Default: 160 mg/dL (8.9 mmol/L)").bold()
+                        VStack(alignment: .leading, spacing: 10) {
+                            Text(
+                                "The Half Basal Exercise Target allows you to scale down your basal insulin during exercise or scale up your basal insulin when eating soon when a temporary glucose target is set."
+                            )
+                            Text(
+                                "For example, at a temp target of 160 mg/dL, your basal is reduced to 50%, but this scales depending on the target (e.g., 75% at 120 mg/dL, 60% at 140 mg/dL)."
+                            )
+                            Text(
+                                "Note: This setting is only utilized if the settings \"Low Temp Target Lowers Sensitivity\" OR \"High Temp Target Raises Sensitivity\" are enabled."
+                            )
+                            .italic()
+                        }
                     }
                 )
             }

+ 56 - 75
FreeAPS/Sources/Modules/UserInterfaceSettings/View/UserInterfaceSettingsRootView.swift

@@ -80,13 +80,14 @@ extension UserInterfaceSettings {
                                     action: {
                                         hintLabel = "Color Scheme Preference"
                                         selectedVerboseHint =
-                                            AnyView(Text("""
-                                            Set the app color scheme using the following options
-
-                                            System Default: Follows the phone's current color scheme setting at that time
-                                            Light: Always in Light mode
-                                            Dark: Always in Dark mode
-                                            """))
+                                        AnyView(VStack(spacing: 10) {
+                                            Text("Set the app color scheme using the following options")
+                                            VStack(alignment: .leading, spacing: 5) {
+                                                Text("System Default: Follows the phone's current color scheme setting at that time")
+                                                Text("Light: Always in Light mode")
+                                                Text("Dark: Always in Dark mode")
+                                            }
+                                        })
                                         shouldDisplayHint.toggle()
                                     },
                                     label: {
@@ -123,16 +124,11 @@ extension UserInterfaceSettings {
                                 action: {
                                     hintLabel = "Glucose Color Scheme"
                                     selectedVerboseHint =
-                                        AnyView(
-                                            Text(
-                                                """
-                                                Set the color scheme for glucose readings on the main glucose graph, live activities, and bolus calculatorusing the following options:
-
-                                                Static: Below-Range Target readings will be in RED, In-Range will be GREEN, Above-Range will be YELLOW
-                                                Dynamic: Readings on Target will be GREEN. As readings approach and exceed below target, they become more RED. As readings approach and exceed above targer, they become more PURPLE.
-                                                """
-                                            )
-                                        )
+                                    AnyView(VStack(spacing: 10) {
+                                        Text("Set the color scheme for glucose readings on the main glucose graph, live activities, and bolus calculatorusing the following options:")
+                                        Text("Static: Below-Range Target readings will be in RED, In-Range will be GREEN, Above-Range will be YELLOW")
+                                        Text("Dynamic: Readings on Target will be GREEN. As readings approach and exceed below target, they become more RED. As readings approach and exceed above targer, they become more PURPLE.")
+                                    })
                                     shouldDisplayHint.toggle()
                                 },
                                 label: {
@@ -164,9 +160,9 @@ extension UserInterfaceSettings {
                                     action: {
                                         hintLabel = "Show Main Chart X- and Y-Axis Grid Lines"
                                         selectedVerboseHint =
-                                            AnyView(Text("""
-                                            Choose whether or not to display one or both X- and Y-Axis grid lines.
-                                            """))
+                                        AnyView(VStack(spacing: 10) {
+                                            Text("Choose whether or not to display one or both X- and Y-Axis grid lines.")
+                                        })
                                         shouldDisplayHint.toggle()
                                     },
                                     label: {
@@ -195,11 +191,10 @@ extension UserInterfaceSettings {
                     type: .boolean,
                     label: "Show Low and High Thresholds",
                     miniHint: "Display the Low and High glucose Thresholds set below",
-                    verboseHint: Text("""
-                    This setting displays the upper and lower values for your glucose target range.
-
-                    This range is for display and statistical purposes only and does not influence insulin dosing.
-                    """)
+                    verboseHint: VStack(alignment: .leading, spacing: 10) {
+                        Text("This setting displays the upper and lower values for your glucose target range.")
+                        Text("This range is for display and statistical purposes only and does not influence insulin dosing.")
+                    }
                 )
 
                 if state.rulerMarks {
@@ -275,13 +270,7 @@ extension UserInterfaceSettings {
                             }
 
                             HStack(alignment: .top) {
-                                Text(
-                                    """
-                                    Set low and high glucose values for the main screen glucose graph and statistics
-                                    Low Default: 70
-                                    High Default: 180
-                                    """
-                                )
+                                Text("Set low and high glucose values for the main screen glucose graph and statistics /nLow Default: 70 /nHigh Default: 180")
                                 .lineLimit(nil)
                                 .font(.footnote)
                                 .foregroundColor(.secondary)
@@ -291,13 +280,12 @@ extension UserInterfaceSettings {
                                     action: {
                                         hintLabel = "Low and High Thresholds"
                                         selectedVerboseHint =
-                                            AnyView(Text("""
-                                            Default values are based on internationally accepted Time in Range values of 70-180 mg/dL (5.5-10 mmol/L)
-
-                                            Set the values used in the main screen glucose graph and to determine Time in Range for Statistics.
-
-                                            Note: These values are not used to calculate insulin dosing.
-                                            """))
+                                        AnyView(
+                                            VStack(alignment: .leading, spacing: 10) {
+                                                Text("Default values are based on internationally accepted Time in Range values of 70-180 mg/dL (5.5-10 mmol/L)")
+                                                Text("Set the values used in the main screen glucose graph and to determine Time in Range for Statistics.")
+                                                Text("Note: These values are not used to calculate insulin dosing.").italic()
+                                            })
                                         shouldDisplayHint.toggle()
                                     },
                                     label: {
@@ -323,11 +311,7 @@ extension UserInterfaceSettings {
                         }.padding(.top)
 
                         HStack(alignment: .top) {
-                            Text(
-                                """
-                                Choose between the OpenAPS colored "Lines" or the "Cone" of Uncertainty for the Forecast Lines
-                                Default: Cone
-                                """
+                            Text("Choose between the OpenAPS colored "Lines" or the "Cone" of Uncertainty for the Forecast Lines \nDefault: Cone"
                             )
                             .font(.footnote)
                             .foregroundColor(.secondary)
@@ -337,14 +321,14 @@ extension UserInterfaceSettings {
                                 action: {
                                     hintLabel = "Forecast Display Type"
                                     selectedVerboseHint =
-                                        AnyView(Text("""
-                                        Default: Cone
-
-                                        This setting allows you to choose between the following two options for the Forecast lines (previously: Prediction Lines).
-
-                                        Lines: Uses the IOB, COB, UAM, and ZT forecast lines from OpenAPS
-                                        Cone: Uses a combined range of all possible forecasts from the OpenAPS lines and provides you with a range of possible forecasts. This option has shown to reduce confusion and stress around algorithm forecasts by providing a less concerning visual representation.
-                                        """))
+                                    AnyView(VStack(spacing: 10) {
+                                        Text("Default: Cone").bold()
+                                        VStack(alignment: .leading, spacing: 10) {
+                                            Text("This setting allows you to choose between the following two options for the Forecast lines (previously: Prediction Lines).")
+                                            Text("Lines: Uses the IOB, COB, UAM, and ZT forecast lines from OpenAPS")
+                                            Text("Cone: Uses a combined range of all possible forecasts from the OpenAPS lines and provides you with a range of possible forecasts. This option has shown to reduce confusion and stress around algorithm forecasts by providing a less concerning visual representation.")
+                                        }
+                                    })
                                     shouldDisplayHint.toggle()
                                 },
                                 label: {
@@ -372,17 +356,10 @@ extension UserInterfaceSettings {
                     type: .decimal("hours"),
                     label: "X-Axis Interval Step",
                     miniHint: "Determines how many hours are shown in the main graph",
-                    verboseHint: Text("""
-                    Default: 6 hours
-
-                    This setting determines how many hours are shown in each view of the main graph.
-
-                    The default setting of 6 hours uses 2, 4, 6, 12, and 24 hour views.
-
-                    A setting of 4 would use 1.3, 2, 4, 8, and 16 hour views.
-
-                    A setting of 9 would use 3, 4.5, 9, 18, and 36 hour views.
-                    """)
+                    verboseHint: VStack(spacing: 10) {
+                        Text("Default: 6 hours").bold()
+                        Text("This setting determines how many hours are shown in the primary view of the main graph.")
+                    }
                 )
 
                 Section {
@@ -408,13 +385,11 @@ extension UserInterfaceSettings {
                                 action: {
                                     hintLabel = "Total Insulin Display Type"
                                     selectedVerboseHint =
-                                        AnyView(Text("""
-                                        Choose between Total Daily Dose (TDD) or Total Insulin in Scope (TINS) to be displayed above the main glucose graph.
-
-                                        Total Daily Dose: Displays the last 24 hours of total insulin administered, both basal and bolus.
-
-                                        Total Insulin in Scope: Displays the total insulin administered since midnight, both basal and bolus.
-                                        """))
+                                    AnyView(VStack(alignment: .leading, spacing: 10) {
+                                        Text("Choose between Total Daily Dose (TDD) or Total Insulin in Scope (TINS) to be displayed above the main glucose graph.")
+                                        Text("Total Daily Dose: Displays the last 24 hours of total insulin administered, both basal and bolus.")
+                                        Text("Total Insulin in Scope: Displays the total insulin administered since midnight, both basal and bolus.")
+                                    })
                                     shouldDisplayHint.toggle()
                                 },
                                 label: {
@@ -443,9 +418,11 @@ extension UserInterfaceSettings {
                     type: .boolean,
                     label: "Override HbA1c Unit",
                     miniHint: "Display HbA1c in mmol/mol or %",
-                    verboseHint: Text(
-                        "Choose between displaying the HbA1c value in the statistics view as a percentage (Target of <6.5%) or mmol/mol (Target of <48 mmol/mol)"
-                    ),
+                    verboseHint: VStack(spacing: 10) {
+                        Text(
+                            "Choose which format you'd prefer the HbA1c value in the statistics view as a percentage (Example: 6.5%) or mmol/mol (Example: 48 mmol/mol)"
+                        )
+                    },
                     headerText: "Trio Statistics"
                 )
 
@@ -465,7 +442,9 @@ extension UserInterfaceSettings {
                     type: .boolean,
                     label: "Standing / Laying TIR Chart",
                     miniHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr.",
-                    verboseHint: Text("Standing / Laying TIR Chart… bla bla bla")
+                    verboseHint: VStack(spacing: 10) {
+                        Text("Standing / Laying TIR Chart… bla bla bla")
+                    }
                 )
 
                 SettingInputSection(
@@ -484,7 +463,9 @@ extension UserInterfaceSettings {
                     label: "Show Carbs Required Badge",
                     conditionalLabel: "Carbs Required Threshold",
                     miniHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr.",
-                    verboseHint: Text("Show Carbs Required Badge… bla bla bla"),
+                    verboseHint: VStack(spacing: 10) {
+                        Text("Show Carbs Required Badge… bla bla bla")
+                    },
                     headerText: "Carbs Required Badge"
                 )
             }