Rethinking the Bottom Sheet component
Designers were forced to detach instances, developers rebuilt from scratch, and accessibility was overlooked. This case study shows how I redesigned the bottom sheet to solve these inefficiencies end to end


About Nykaa
Nykaa is India’s go-to destination for beauty and lifestyle shopping. From skincare to fashion, it brings thousands of brands together across app, web, and stores—making it easier for people to discover, learn, and buy what they love
Context
Nykaa’s current design system faced several challenges:
Each brand relied on its own UI kit, creating duplication and inconsistency.
While the system was fairly strong on web, iOS and Android lacked equivalent support, forcing teams to build locally.
It also lagged behind modern Figma capabilities, making it difficult to evolve with new features.
This made it clear we needed a second-generation system built for consistency, cross-platform parity, and scalability.
Every component would be rethought, but I’ll use the Bottom Sheet to illustrate this journey. As a complex and widely used component, it surfaced many of the system’s shortcomings and became the perfect lens to show how the new system solved them at scale.
Challenges: Why the old bottom sheet was holding us back
Designer Pain Points
Broken Component API
Master component API was broken - Certain variant combinations were missing, causing unexpected behaviour when props are applied in Figma. This made it unusable at times, leading to detaching instances
Prop names were not intuitive as well (such has inline meta, action etc.)
No theming support
The bottom sheet existed in three separate UI kits, forcing designers to rebuild it, especially for platform level projects.
Since content was managed through instance swap, additional effort was required to migrate a design to different ui kit
Engineering Limitations
No iOS/Android Support, Only Web
Without engineering support on iOS and Android, teams had to build their own versions of the Bottom Sheet — resulting in duplicate effort, design–dev mismatches, and longer QC cycles. Since certain atom components didnt exist as well, it created a domino effect


Design and Code are not coherent
The component in Storybook often doesn’t match the component in Figma, leading to inconsistencies between design and development. These differences cause misalignment, extra communication overhead, and rework
Accessibility issues
No screen reader or keyboard support
The modal lacks proper accessibility controls — screen readers skip the 'modal-open' state and move directly into content. Focus indicators are missing or broken, making it difficult for users to track their current position within the modal

Foundational a11y issues
Although not entirely related to bottom sheet, certain foundations like icon button, color, heading tags lacked accessibility controls. This further created a domino effect in complex components like Bottom Sheet
Tackling the gaps, one at a time
Challenge #1
Lack of theming forced duplicate components (not just Bottom Sheets) across UI kits, making cross-platform design slow and inconsistent.
Complexity
Low
Effort
High
Utlised variable-based tokens with Primitive and Semantic layers to increase consistentency
Primitives (e.g., pink-600, slate-500) were aliased to semantic tokens (e.g., text.default, icon.disabled) to clearly convey intent and ensure consistency.”
Semantic tokens themed to multiple brands
After creating semantic tokens for Nykaa Beauty, I added multiple modes by mapping them to the appropriate primitive values.
Challenge #2
Rigid, use-case–specific architecture with poor API and restrictive slots reduced reusability and scalability
Complexity
Mid
Effort
High
Improved the component API to accommodate use cases consistently without breaking the component
Redesigned the component API by introducing boolean and text props, reducing the need for multiple variants while covering previously unsupported use cases. This streamlined the component structure, improved usability, and ensured consistent implementation across platforms.
Edit slots directly inside the component without local components or detaching instance
Designers can now edit slot content directly through "Integrated slots"—without creating local components—mirroring how it works in code and greatly improving the component’s usability and flexibility
Baked animation into the components turning a flat bottom sheet into a lively one
By integrating animation and smooth transitions into atomic components, the Bottom Sheet evolved from a static organism into one with depth and dimensionality, creating a more polished and immersive user experience.
Challenge #3
No accessibility support left the Bottom Sheet unusable for differently abled users
Complexity
High
Effort
High
Established a process for designers to clearly convey accessibility tags to engineers, ensuring accurate implementation
With the annotation kit, designers could tag elements (e.g., heading, alt-text, aria-labelledby, role), enabling developers to seamlessly integrate accessibility into code.
Challenge #4
No engineering support on iOS and Android led to duplicate builds, mismatched designs, and extended QC cycles
Complexity
Mid
Effort
Low
Component was built in all platforms and connected to Figma via Code Connect
Every component was unified across Web, iOS, and Android. We went further by mapping component code to Figma props, enabling developers to preview exact code directly in Dev Mode (and even in VS Code). This meant that any differences in props could be mapped accurately without any guesswork. Code connect files were authored and maintained by me
Bringing it all together
Building bottom sheets just got easier…
Adjust style based on use case, edit content directly within the component, inherited transitions - all in one
Theming in action…
not just colors and corner radius, even icons switch seamlessly
Before vs After - A quick snapshot of improvements
Here’s a comparison of the Bottom Sheet component ‘Before’ and ‘After,’ highlighting improvements across performance, accessibility, theming, and slot configuration for better usability.

BEFORE
Total Variants
89
Missing variants?
Yes
WCAG Compliant?
No
Theming available?
No
Slot config
Instance Swap

AFTER
Total Variants
4
Missing variants?
No
WCAG Compliant?
Yes
Theming available?
Yes
Slot config
Integrated slots
How did these changes make an impact?
As part of our initial beta, we decided to migrate our old onboarding flow to the new system. Certain metrics like design time, development time, QC time and visual coverage were tracked throughout the process.
Time to design
from 1 week to 3 hours
92.5%
Time to develop
from 2 weeks to 1 week
50%
Time to QC
from 2 days to 1 day
50%
Visual coverage
from 30% to 100%
3.33x
Next steps
This isn’t over yet—the Bottom Sheet component is still evolving. To prepare it for a GA release, a few key steps were planned:
Conduct crit sessions to gather feedback on future use cases not yet captured in the current component API.
Ensuring the Bottom Sheet and other components cover all relevant use cases from crits, supported with central web-based documentation.
Set up playground files to help designers onboard quickly and provide confidence scores while exploring the new component.
Fin.
🚀
Like what you see?
Let’s build something great together