Home Blog Page 10

Methods to create a liquid glass toolbar button that adapt to background content material

0


I’ve the next code making an attempt to create a two rows toolbar as I’ve seen from iOS Safari 26, however the issue is the ToolbarButton struct would not actually adapt to the background coloration, it stayed darkish when on darkish background.

I attempted to make use of .glassEffect nevertheless it creates a small bubble relying on the form of the image, which does not look good with different buttons on the toolbar. I additionally tried to make use of .buttonStyle(.glass) which additionally creates a capsule bubble round every button as effectively.

I additionally tried to group all of the buttons with the glass container in a namespace, that is shut nevertheless it simply teams all my buttons, once I wished to share the only glass panel with the search area.

All I actually wished was only for the Picture foreground coloration to be adaptive to the background scrollview’s content material.

// MARK: - Toolbar Button, however not adaptive to background content material coloration
struct ToolbarButton: View {
    var icon: String
    var label: String
    var isSelected: Bool
    var motion: () -> Void

    var physique: some View {
        Picture(systemName: icon)
            .font(.system(measurement: 18, weight: .semibold))
            .symbolVariant(isSelected ? .fill : .none)
            .body(maxWidth: .infinity)
            .padding(.vertical, 6)
            .contentShape(Rectangle())
            .onTapGesture {
                motion()
            }
    }
}
import SwiftUI

@essential
struct GlassToolbarDemoApp: App {
    var physique: some Scene {
        WindowGroup {
            DemoView()
        }
    }
}

struct DemoView: View {
    @State personal var selectedTab: Tab = .residence
    @State personal var question: String = ""
    @Atmosphere(.horizontalSizeClass) personal var hSizeClass

    var physique: some View {
        ZStack {
            SampleBackgroundScroll()
                .ignoresSafeArea() // let content material run beneath the glass for a greater impact
        }
        // Pin our two-row glass toolbar to the TOP. Change to .backside to make it a backside toolbar.
        .safeAreaInset(edge: .backside) {
            GlassBar {
                // ACCESSORY ROW (above the buttons)
                HStack(spacing: 10) {
                    // Search area
                    HStack(spacing: 8) {
                        Picture(systemName: "magnifyingglass")
                        TextField("Search…", textual content: $question)
                            .textInputAutocapitalization(.by no means)
                    }
                    .padding(.horizontal, 12)
                    .padding(.vertical, 10)
                    .background(
                        RoundedRectangle(cornerRadius: 14, fashion: .steady)
                            .fill(.thinMaterial)
                    )
                }
                .body(maxWidth: .infinity, alignment: .main)
                .padding(.horizontal, 2)
            } mainRow: {
                // MAIN TOOLBAR BUTTONS ROW
                if hSizeClass == .compact {
                    HStack(spacing: 0) {
                        ToolbarButton(icon: "home.fill", label: "House", isSelected: selectedTab == .residence) { selectedTab = .residence }
                        ToolbarButton(icon: "textual content.magnifyingglass", label: "Uncover", isSelected: selectedTab == .uncover) { selectedTab = .uncover }
                        ToolbarButton(icon: "plus.circle.fill", label: "Add", isSelected: selectedTab == .add) { selectedTab = .add }
                        ToolbarButton(icon: "star.fill", label: "Saved", isSelected: selectedTab == .saved) { selectedTab = .saved }
                        ToolbarButton(icon: "particular person.fill", label: "Me", isSelected: selectedTab == .me) { selectedTab = .me }
                    }
                } else {
                    // On iPad / common width, present accent and buttons in ONE row (no top waste)
                    HStack(spacing: 16) {
                        ToolbarButton(icon: "home.fill", label: "House", isSelected: selectedTab == .residence) { selectedTab = .residence }
                        ToolbarButton(icon: "textual content.magnifyingglass", label: "Uncover", isSelected: selectedTab == .uncover) { selectedTab = .uncover }
                        ToolbarButton(icon: "plus.circle.fill", label: "Add", isSelected: selectedTab == .add) { selectedTab = .add }
                        ToolbarButton(icon: "star.fill", label: "Saved", isSelected: selectedTab == .saved) { selectedTab = .saved }
                        ToolbarButton(icon: "particular person.fill", label: "Me", isSelected: selectedTab == .me) { selectedTab = .me }

                        Spacer(minLength: 16)

                        HStack(spacing: 10) {
                            HStack(spacing: 8) {
                                Picture(systemName: "magnifyingglass")
                                TextField("Search…", textual content: $question)
                                    .textInputAutocapitalization(.by no means)
                            }
                            .padding(.horizontal, 12)
                            .padding(.vertical, 10)
                            .background(
                                RoundedRectangle(cornerRadius: 14, fashion: .steady)
                                    .fill(.thinMaterial)
                            )
                        }
                        .body(maxWidth: 420)
                    }
                }
            }
        }
    }
}

// MARK: - Glass Bar (two-row toolbar)
struct GlassBar<Accent: View, Foremost: View>: View {
    var accessoryRow: Accent
    var mainRow: Foremost

    init(@ViewBuilder accent: () -> Accent, @ViewBuilder mainRow: () -> Foremost) {
        self.accessoryRow = accent()
        self.mainRow = mainRow()
    }

    var physique: some View {
        VStack(spacing: 8) {
            accessoryRow
            Divider().opacity(0.25)
            mainRow
        }
        .padding(.horizontal, 14)
        .padding(.vertical, 10)
        .body(maxWidth: .infinity)
        .background(GlassBackground(cornerRadius: 26))
        .padding(.horizontal)
        .padding(.high, 6)
        .shadow(coloration: .black.opacity(0.12), radius: 20, y: 10)
    }
}

// MARK: - Glass Background helper
struct GlassBackground: View {
    var cornerRadius: CGFloat = 10

    var physique: some View {
        Group {
            if #accessible(iOS 26.0, *) {
                RoundedRectangle(cornerRadius: cornerRadius, fashion: .steady)
                    .fill(.clear)
                    .glassEffect(.clear)
            } else {
                // Fallback for older OSes: use materials to approximate the impact.
                RoundedRectangle(cornerRadius: cornerRadius, fashion: .steady)
                    .fill(.ultraThinMaterial)
                    .overlay(
                        // delicate spotlight to simulate glass rim
                        RoundedRectangle(cornerRadius: cornerRadius, fashion: .steady)
                            .strokeBorder(.white.opacity(0.08), lineWidth: 1)
                    )
            }
        }
    }
}

// MARK: - Toolbar Button
struct ToolbarButton: View {
    var icon: String
    var label: String
    var isSelected: Bool
    var motion: () -> Void

    var physique: some View {
        Picture(systemName: icon)
            .font(.system(measurement: 18, weight: .semibold))
            .symbolVariant(isSelected ? .fill : .none)

            .body(maxWidth: .infinity)
            .padding(.vertical, 6)
            .contentShape(Rectangle())
            .onTapGesture {
                motion()
            }
    }
}

// MARK: - Demo background content material to point out mild/darkish behind glass
struct SampleBackgroundScroll: View {
    var physique: some View {
        ScrollView {
            LazyVStack(spacing: 0) {
                demoBlock(.mild, title: "Sunny Paper")
                demoBlock(.darkish, title: "Evening Slate")
                demoBlock(.colourful, title: "Aurora Cyan")
                demoBlock(.mild, title: "Porcelain")
                demoBlock(.darkish, title: "Graphite")
                demoBlock(.colorfulAlt, title: "Sundown Mix")
                demoBlock(.mild, title: "Foggy White")
                demoBlock(.darkish, title: "Charcoal")
            }
        }
    }

    @ViewBuilder
    func demoBlock(_ fashion: BlockStyle, title: String) -> some View {
        ZStack {
            change fashion {
            case .mild:
                LinearGradient(colours: [Color.white, Color(white: 0.93)], startPoint: .topLeading, endPoint: .bottomTrailing)
            case .darkish:
                LinearGradient(colours: [Color.black, Color(white: 0.15)], startPoint: .high, endPoint: .backside)
            case .colourful:
                LinearGradient(colours: [Color.cyan.opacity(0.7), Color.blue.opacity(0.4)], startPoint: .topLeading, endPoint: .bottomTrailing)
            case .colorfulAlt:
                LinearGradient(colours: [Color.purple, Color.orange], startPoint: .topLeading, endPoint: .bottomTrailing)
            }

            VStack(spacing: 12) {
                Textual content(title)
                    .font(.system(measurement: 28, weight: .daring))
                    .foregroundStyle(fashion == .darkish ? .white : .main)
                Textual content("Scroll to see how the glass adapts to totally different backgrounds.")
                    .font(.system(measurement: 15))
                    .foregroundStyle(fashion == .darkish ? .white.opacity(0.85) : .secondary)
            }
            .padding(.high, 120)
        }
        .body(top: 360)
    }

    enum BlockStyle { case mild, darkish, colourful, colorfulAlt }
}

// MARK: - Tabs
enum Tab { case residence, uncover, add, saved, me }

#Preview {
    DemoView()
}


Methods to create a liquid glass toolbar button that adapt to background content material

Must you opt-in to Swift 6.2’s Major Actor isolation? – Donny Wals

0


Revealed on: September 11, 2025

Swift 6.2 comes with a some attention-grabbing Concurrency enhancements. One of the crucial notable modifications is that there is now a compiler flag that can, by default, isolate all of your (implicitly nonisolated) code to the primary actor. This can be a big change, and on this put up we’ll discover whether or not or not it is a good change. We’ll do that by looking at a number of the complexities that concurrency introduces naturally, and we’ll assess whether or not transferring code to the primary actor is the (right) resolution to those issues.

By the tip of this put up, it is best to hopefully have the ability to determine for your self whether or not or not major actor isolation is smart. I encourage you to learn by way of your entire put up and to fastidiously take into consideration your code and its wants earlier than you leap to conclusions. In programming, the precise reply to most issues will depend on the precise issues at hand. That is no exception.

We’ll begin off by trying on the defaults for major actor isolation in Xcode 26 and Swift 6. Then we’ll transfer on to figuring out whether or not we must always preserve these defaults or not.

Understanding how Major Actor isolation is utilized by default in Xcode 26

While you create a brand new undertaking in Xcode 26, that undertaking may have two new options enabled:

  • World actor isolation is ready to MainActor.self
  • Approachable concurrency is enabled

If you wish to study extra about approachable concurrency in Xcode 26, I like to recommend you examine it in my put up on Approachable Concurrency.

The worldwide actor isolation setting will robotically isolate all of your code to both the Major Actor or no actor in any respect (nil and MainActor.self are the one two legitimate values).

Because of this all code that you simply write in a undertaking created with Xcode 26 might be remoted to the primary actor (except it is remoted to a different actor otherwise you mark the code as nonisolated):

// this class is @MainActor remoted by default
class MyClass {
  // this property is @MainActor remoted by default
  var counter = 0

  func performWork() async {
    // this perform is @MainActor remoted by default
  }

  nonisolated func performOtherWork() async {
    // this perform is nonisolated so it isn't @MainActor remoted
  }
}

// this actor and its members will not be @MainActor remoted
actor Counter {
  var depend = 0
}

The results of your code bein major actor remoted by default is that your app will successfully be single threaded except you explicitly introduce concurrency. All the things you do will begin off on the primary thread and keep there except you determine it’s essential to depart the Major Actor.

Understanding how Major Actor isolation is utilized for brand spanking new SPM Packages

For SPM packages, it is a barely totally different story. A newly created SPM Package deal won’t have its defaultIsolation flag set in any respect. Because of this a brand new SPM Package deal will not isolate your code to the MainActor by default.

You’ll be able to change this by passing defaultIsolation to your goal’s swiftSettings:

swiftSettings: [
    .defaultIsolation(MainActor.self)
]

Notice {that a} newly created SPM Package deal additionally will not have Approachable Concurrency turned on. Extra importantly, it will not have NonIsolatedNonSendingByDefault turned on by default. Because of this there’s an attention-grabbing distinction between code in your SPM Packages and your app goal.

In your app goal, every part will run on the Major Actor by default. Any capabilities that you have outlined in your app goal and are marked as nonisolated and async will run on the caller’s actor by default. So in the event you’re calling your nonisolated async capabilities from the primary actor in your app goal they’ll run on the Major Actor. Name them from elsewhere they usually’ll run there.

In your SPM Packages, the default is to your code to not run on the Major Actor by default, and for nonisolated async capabilities to run on a background thread it doesn’t matter what.

Complicated is not it? I do know…

The rationale for operating code on the Major Actor by default

In a codebase that depends closely on concurrency, you may must cope with a variety of concurrency-related complexity. Extra particularly, a codebase with a variety of concurrency may have a variety of information race potential. Because of this Swift will flag a variety of potential points (whenever you’re utilizing the Swift 6 language mode) even whenever you by no means actually supposed to introduce a ton of concurrency. Swift 6.2 is significantly better at recognizing code that is secure though it is concurrent however as a common rule you wish to handle the concurrency in your code fastidiously and keep away from introducing concurrency by default.

Let’s take a look at a code pattern the place we have now a view that leverages a job view modifier to retrieve information:

struct MoviesList: View {
  @State var movieRepository = MovieRepository()
  @State var motion pictures = [Movie]()

  var physique: some View {
    Group {
      if motion pictures.isEmpty == false {
        Checklist(motion pictures) { film in
          Textual content(film.id.uuidString)
        }
      } else {
        ProgressView()
      }
    }.job {
      do {
        // Sending 'self.movieRepository' dangers inflicting information races
        motion pictures = strive await movieRepository.loadMovies()
      } catch {
        motion pictures = []
      }
    }
  }
}

This code has a difficulty: sending self.movieRepository dangers inflicting information races.

The rationale we’re seeing this error is because of us calling a nonisolated and async methodology on an occasion of MovieRepository that’s remoted to the primary actor. That is an issue as a result of inside loadMovies we have now entry to self from a background thread as a result of that is the place loadMovies would run. We even have entry to our occasion from inside our view at the very same time so we’re certainly making a attainable information race.

There are two methods to repair this:

  1. Be sure that loadMovies runs on the identical actor as its callsite (that is what nonisolated(nonsending) would obtain)
  2. Be sure that loadMovies runs on the Major Actor

Choice 2 makes a variety of sense as a result of, so far as this instance is anxious, we all the time name loadMovies from the Major Actor anyway.

Relying on the contents of loadMovies and the capabilities that it calls, we would merely be transferring our compiler error from the view over to our repository as a result of the newly @MainActor remoted loadMovies is looking a non-Major Actor remoted perform internally on an object that is not Sendable nor remoted to the Major Actor.

Finally, we would find yourself with one thing that appears as follows:

class MovieRepository {
  @MainActor
  func loadMovies() async throws -> [Movie] {
    let req = makeRequest()
    let motion pictures: [Movie] = strive await carry out(req)

    return motion pictures
  }

  func makeRequest() -> URLRequest {
    let url = URL(string: "https://instance.com")!
    return URLRequest(url: url)
  }

  @MainActor
  func carry out(_ request: URLRequest) async throws -> T {
    let (information, _) = strive await URLSession.shared.information(for: request)
    // Sending 'self' dangers inflicting information races
    return strive await decode(information)
  }

  nonisolated func decode(_ information: Information) async throws -> T {
    return strive JSONDecoder().decode(T.self, from: information)
  }
}

We have @MainActor remoted all async capabilities apart from decode. At this level we won’t name decode as a result of we won’t safely ship self into the nonisolated async perform decode.

On this particular case, the issue may very well be fastened by marking MovieRepository as Sendable. However let’s assume that we have now causes that forestall us from doing so. Perhaps the true object holds on to mutable state.

We may repair our downside by really making all of MovieRepository remoted to the Major Actor. That method, we are able to safely move self round even when it has mutable state. And we are able to nonetheless preserve our decode perform as nonisolated and async to forestall it from operating on the Major Actor.

The issue with the above…

Discovering the answer to the problems I describe above is fairly tedious, and it forces us to explicitly opt-out of concurrency for particular strategies and ultimately a complete class. This feels fallacious. It looks like we’re having to lower the standard of our code simply to make the compiler joyful.

In actuality, the default in Swift 6.1 and earlier was to introduce concurrency by default. Run as a lot as attainable in parallel and issues might be nice.

That is nearly by no means true. Concurrency just isn’t the most effective default to have.

In code that you simply wrote pre-Swift Concurrency, most of your capabilities would simply run wherever they had been known as from. In follow, this meant that a variety of your code would run on the primary thread with out you worrying about it. It merely was how issues labored by default and in the event you wanted concurrency you’d introduce it explicitly.

The brand new default in Xcode 26 returns this habits each by operating your code on the primary actor by default and by having nonisolated async capabilities inherit the caller’s actor by default.

Because of this the instance we had above turns into a lot easier with the brand new defaults…

Understanding how default isolation simplifies our code

If we flip set our default isolation to the Major Actor together with Approachable Concurrency, we are able to rewrite the code from earlier as follows:

class MovieRepository {
  func loadMovies() async throws -> [Movie] {
    let req = makeRequest()
    let motion pictures: [Movie] = strive await carry out(req)

    return motion pictures
  }

  func makeRequest() -> URLRequest {
    let url = URL(string: "https://instance.com")!
    return URLRequest(url: url)
  }

  func carry out(_ request: URLRequest) async throws -> T {
    let (information, _) = strive await URLSession.shared.information(for: request)
    return strive await decode(information)
  }

  @concurrent func decode(_ information: Information) async throws -> T {
    return strive JSONDecoder().decode(T.self, from: information)
  }
}

Our code is way easier and safer, and we have inverted one key a part of the code. As a substitute of introducing concurrency by default, I needed to explicitly mark my decode perform as @concurrent. By doing this, I be certain that decode just isn’t major actor remoted and I be certain that it all the time runs on a background thread. In the meantime, each my async and my plain capabilities in MoviesRepository run on the Major Actor. That is completely nice as a result of as soon as I hit an await like I do in carry out, the async perform I am in suspends so the Major Actor can do different work till the perform I am awaiting returns.

Efficiency affect of Major Actor by default

Whereas operating code concurrently can enhance efficiency, concurrency does not all the time enhance efficiency. Moreover, whereas blocking the primary thread is dangerous we should not be afraid to run code on the primary thread.

Each time a program runs code on one thread, then hops to a different, after which again once more, there is a efficiency price to be paid. It is a small price normally, but it surely’s a value both method.

It is usually cheaper for a fast operation that began on the Major Actor to remain there than it’s for that operation to be carried out on a background thread and handing the outcome again to the Major Actor. Being on the Major Actor by default signifies that it is rather more express whenever you’re leaving the Major Actor which makes it simpler so that you can decide whether or not you are able to pay the fee for thread hopping or not. I am unable to determine for you what the cutoff is for it to be price paying a value, I can solely inform you that there’s a price. And for many apps the fee might be sufficiently small for it to by no means matter. By defaulting to the Major Actor you may keep away from paying the fee unintentionally and I believe that is a superb factor.

So, do you have to set your default isolation to the Major Actor?

On your app targets it makes a ton of sense to run on the Major Actor by default. It lets you write easier code, and to introduce concurrency solely whenever you want it. You’ll be able to nonetheless mark objects as nonisolated whenever you discover that they must be used from a number of actors with out awaiting every interplay with these objects (fashions are a superb instance of objects that you’re going to most likely mark nonisolated). You should use @concurrent to make sure sure async capabilities do not run on the Major Actor, and you should use nonisolated on capabilities that ought to inherit the caller’s actor. Discovering the proper key phrase can typically be a little bit of a trial and error however I usually use both @concurrent or nothing (@MainActor by default). Needing nonisolated is extra uncommon in my expertise.

On your SPM Packages the choice is much less apparent. In case you have a Networking package deal, you most likely don’t desire it to make use of the primary actor by default. As a substitute, you may wish to make every part within the Package deal Sendable for instance. Or possibly you wish to design your Networking object as an actor. Its’ solely as much as you.

If you happen to’re constructing UI Packages, you most likely do wish to isolate these to the Major Actor by default since just about every part that you simply do in a UI Package deal must be used from the Major Actor anyway.

The reply is not a easy “sure, it is best to”, however I do suppose that whenever you’re doubtful isolating to the Major Actor is an efficient default selection. While you discover that a few of your code must run on a background thread you should use @concurrent.

Observe makes excellent, and I hope that by understanding the “Major Actor by default” rationale you may make an informed determination on whether or not you want the flag for a selected app or Package deal.

stop iOS 26 WKWebView Liquid Glass toolbar from overlapping a hard and fast backside tab switcher?

0


I’m testing my net app inside in-app WKWebViews (Discord, Telegram, customized apps, and so forth.) on iOS 26.x.

Apple launched a brand new Liquid Glass floating toolbar on the backside of webviews, and it overlaps my fastened backside tab switcher more often than not.

Usually, I exploit:

backside: env(safe-area-inset-bottom);

to maintain UI above the iOS residence indicator / toolbar.
However on iOS 26 the brand new floating toolbar sits on prime of my tab switcher, fully blocking it.

stop iOS 26 WKWebView Liquid Glass toolbar from overlapping a hard and fast backside tab switcher?

I’m on the lookout for:

  1. A strategy to get a sound backside offset, since env(safe-area-inset-bottom) at the moment returns a price that’s not practically giant sufficient to maintain content material above the toolbar.

  2. A dependable strategy to detect when the brand new Liquid Glass toolbar is current (in order that i can change to a floating fashion tab switcher)


What i’ve tried to this point:

  1. (Backside Offset)

I’ve tried counting on env(safe-area-inset-bottom).

On preliminary web page load, the inset returns 0 inside WKWebViews. After scrolling a bit of, the worth updates, however it’s nonetheless not sufficient to clear the brand new toolbar.

Initial safe area inset (before scrolling)

Safe area inset after scrolling a bit

These screenshots are taken from the official WebKit protected space demo

I’m unsure if this helps, however right here’s a minimal reproducible Stack Snippet:

/* --- non-obligatory js only for debugging --- */

operate updateMeter()  '';
  const textual content="safe-area-inset-bottom: " + (v.trim() 

['load', 'resize', 'orientationchange', 'scroll', 'touchend'].forEach(ev =>
  window.addEventListener(ev, updateMeter, {
    passive: true
  })
);

updateMeter();
:root {
  --safe-bottom: env(safe-area-inset-bottom);
}

.tabbar {
  place: fastened;
  left: 0;
  proper: 0;
  backside: env(safe-area-inset-bottom);


  top: 56px;
  background: rgba(255, 255, 255, 0.95);
  show: flex;
  hole: 12px;
  align-items: heart;
  justify-content: heart;
  box-shadow: 0 8px 30px rgba(15, 23, 42, 0.12);
  border: 1px stable rgba(0, 0, 0, 0.06);
  z-index: 999;
  backdrop-filter: blur(8px);
}

html,
physique {
  top: 100%;
  margin: 0;
}

physique {
  min-height: -webkit-fill-available;
  show: flex;
  flex-direction: column;
  background: #f4f6f8;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial;
}



/* --- non-obligatory css only for debugging --- */

.content material {
  flex: 1 1 auto;
  overflow: auto;
  padding: 24px;
}

.field {
  top: 220vh;
  background: linear-gradient(180deg, #fff 0%, #eef3f8 100%);
  border-radius: 12px;
  padding: 20px;
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.06);
}

.tabbar .merchandise {
  flex: 1 0 auto;
  text-align: heart;
  padding: 8px 12px;
  font-size: 14px;
}

.meter {
  place: fastened;
  left: 12px;
  backside: calc(56px + 20px);
  background: rgba(0, 0, 0, 0.6);
  coloration: #fff;
  padding: 6px 8px;
  border-radius: 8px;
  font-size: 12px;
  z-index: 1000;
  pointer-events: none;
}
<principal class="content material">
  <div class="field">
    <h1>Scrollable web page</h1>
    <p>
      Scroll down to breed: fastened tabbar makes use of
      <code>env(safe-area-inset-bottom)</code>.
    </p>
    <p>
      Attempt opening this inside an iOS WKWebView on iOS 26 or above (in-app
      browser -> Telegram, Whatsapp, Discord, ...) to see the toolbar overlap
      habits.
    </p>
    <p fashion="margin-top:110vh">Backside content material for scrolling demonstration.</p>
  </div>
</principal>

<div class="tabbar" function="tablist" aria-label="Pretend tab switcher">
  <div class="merchandise">Tab1</div>
  <div class="merchandise">Tab2</div>
  <div class="merchandise">Tab3</div>
</div>

<div class="meter" id="meter">safe-area-inset-bottom: unknown</div>

Observe: This received’t reproduce the problem on desktop browsers — it solely seems inside sure iOS in-app webviews.

  1. (Detection)

I thought-about utilizing the person agent to detect iOS 26+, however this turned out to be very unreliable — particularly inside some in-app browsers the place person brokers are overwritten.


What I anticipated:

That env(safe-area-inset-bottom) would mirror the right offset and forestall my tab switcher from being overlapped.

What really occurs:

• Inset stories 0 at first.

• Generally updates after scrolling.

• Even then, the worth is just too small, so the Liquid Glass toolbar nonetheless overlaps my tab switcher.


What I didn’t strive but:

Checking the display screen top by way of JavaScript or some other JS options to get the right offset.

Further Notes:

Main Web sites like youtube appear to be affected aswell.

EU Information Act: Streamlined Information Legal guidelines Can Assist Increase Europe’s AI and Digital Management


On Friday 12 September, the EU Information Act comes into power, introducing new necessities for information sharing throughout Europe. Whereas Cisco is prepared for these modifications, we see sensible methods to enhance the foundations. Focused regulatory simplification is crucial if Europe is to totally seize the alternatives of data-driven innovation and AI.

Simplifying advanced and overlapping guidelines is not only about lowering crimson tape. It’s about making a regulatory surroundings the place companies of all sizes can innovate confidently, spend money on new applied sciences, and ship worth to society. We encourage the European Fee to leverage its upcoming Information Union Technique, as an opportunity to handle actual limitations in Europe’s information panorama, notably throughout the Information Act itself and GDPR. Simplifying these laws will assist create a clearer, extra environment friendly surroundings for innovation and progress.

Compliance: Cisco’s Dedication to Clear and Open Information Sharing

Cisco has up to date its authorized phrases and transparency processes (Contract Stack and Transparency Stack) to maintain tempo with Europe’s altering information guidelines. These updates assist make it even clearer how information is shared and managed with our clients and companions, and strengthen authorized protections for everybody concerned.

We’re additionally proud to champion open and standardized methods of sharing information, that are important for the event of accountable AI. This method not solely encourages wider information sharing but additionally helps keep the standard and reliability of knowledge, two foundations for a wholesome digital financial system and reliable AI options.

Take away Obligatory Sharing of Commerce Secrets and techniques

The Information Act’s requirement for obligatory sharing of commerce secrets and techniques (Article 4) dangers undermining innovation and competitiveness. Commerce secrets and techniques are useful as a result of they’re confidential. Forcing disclosure, even with guarantees of confidentiality, can erode their worth and put companies at a drawback.

The present guidelines require homeowners to show critical financial harm earlier than they’ll refuse entry, which weakens safety in comparison with different types of mental property. Commerce secret holders ought to have the ultimate say on whether or not to share delicate data, as as soon as disclosed, the benefit will be misplaced eternally.

Simplify Trusted Information Transfers

The Information Act and Information Governance Act at present introduce overlapping and sophisticated necessities for transferring non-personal information, particularly for corporations dealing with combined information units. Information privateness and safety should all the time come first, however guidelines for transferring information throughout borders needs to be balanced and primarily based on precise dangers. When corporations work with datasets that embody various kinds of information, following GDPR guidelines on cross-border information transfers needs to be sufficient, with no need to satisfy necessities from the Information Act on high. These added layers of regulation impose important administrative burdens with no corresponding improve in safety or danger administration.

By specializing in regulatory simplification and focused reform, the Fee can strengthen Europe’s place in AI and digital innovation. Simplified information guidelines, higher safety for commerce secrets and techniques, and a balanced method to worldwide information flows will assist European corporations compete globally, enhance innovation, and be certain that the advantages of the digital financial system are shared by all.

Share:

Social Media Privateness Dangers: What Appknox Discovered

0


If cell apps have been highschool stereotypes, social media can be the favored child everybody gossips about, however secretly rolls their eyes at. Everybody makes use of them, everybody is aware of the dangers, and but everybody retains exhibiting up at their events.