@snowcone-app/ui 0.1.42 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +18 -4
  3. package/package.json +9 -5
  4. package/src/components/CanvasIsolationBoundary.tsx +202 -0
  5. package/src/components/LoadingOverlayPrism.tsx +251 -0
  6. package/src/composed/AddToCart.tsx +229 -0
  7. package/src/composed/ArtAlignment.tsx +703 -0
  8. package/src/composed/ArtSelector.tsx +290 -0
  9. package/src/composed/ArtworkCustomizer.tsx +212 -0
  10. package/src/composed/CanvasEditor.tsx +79 -0
  11. package/src/composed/ColorPicker.tsx +111 -0
  12. package/src/composed/CurrentSelectionDisplay.tsx +86 -0
  13. package/src/composed/HeroProductImage.tsx +1071 -0
  14. package/src/composed/Lightbox.index.ts +2 -0
  15. package/src/composed/Lightbox.tsx +230 -0
  16. package/src/composed/PlacementClipShapeSelector.tsx +88 -0
  17. package/src/composed/PlacementTabs.tsx +179 -0
  18. package/src/composed/ProductCard.tsx +298 -0
  19. package/src/composed/ProductGallery.tsx +54 -0
  20. package/src/composed/ProductImage.tsx +129 -0
  21. package/src/composed/ProductList.tsx +147 -0
  22. package/src/composed/ProductOptions.tsx +305 -0
  23. package/src/composed/RealtimeMockup.tsx +121 -0
  24. package/src/composed/TileCount.tsx +348 -0
  25. package/src/composed/carousels/HeroCarousel.tsx +240 -0
  26. package/src/composed/carousels/MobileProductCarousel.tsx +1002 -0
  27. package/src/composed/carousels/index.ts +11 -0
  28. package/src/composed/carousels/types.ts +58 -0
  29. package/src/composed/grids/MasonryGrid.tsx +238 -0
  30. package/src/composed/grids/index.ts +9 -0
  31. package/src/composed/search/CurrentRefinements.tsx +80 -0
  32. package/src/composed/search/Filters.tsx +49 -0
  33. package/src/composed/search/FiltersButton.tsx +57 -0
  34. package/src/composed/search/FiltersDrawer.tsx +375 -0
  35. package/src/composed/search/ProductGrid.tsx +118 -0
  36. package/src/composed/search/ProductHit.tsx +56 -0
  37. package/src/composed/search/SearchBox.tsx +109 -0
  38. package/src/composed/search/SearchProvider.tsx +136 -0
  39. package/src/composed/search/facetConfig.ts +16 -0
  40. package/src/composed/search/index.ts +22 -0
  41. package/src/composed/search/meilisearchAdapter.ts +20 -0
  42. package/src/composed/search/types.ts +22 -0
  43. package/src/composed/zoom/EnhancedImageViewer.tsx +505 -0
  44. package/src/composed/zoom/ResponsiveZoom.tsx +134 -0
  45. package/src/composed/zoom/ZoomOverlay.tsx +194 -0
  46. package/src/composed/zoom/index.ts +12 -0
  47. package/src/composed/zoom/types.ts +12 -0
  48. package/src/design-system/ColorPalette.tsx +126 -0
  49. package/src/design-system/ColorSwatch.tsx +49 -0
  50. package/src/design-system/DesignSystemPage.tsx +130 -0
  51. package/src/design-system/ThemeSwitcher.tsx +181 -0
  52. package/src/design-system/TypographyScale.tsx +106 -0
  53. package/src/design-system/index.ts +5 -0
  54. package/src/ecommerce/stories/HeroProductImage.stories.tsx +66 -0
  55. package/src/ecommerce/stories/PDPHeroGallery.stories.tsx +105 -0
  56. package/src/ecommerce/stories/PDPInfoPanel.stories.tsx +472 -0
  57. package/src/ecommerce/stories/PDPLayout.stories.tsx +365 -0
  58. package/src/hooks/useBrand.ts +41 -0
  59. package/src/hooks/useCanvasContext.ts +127 -0
  60. package/src/hooks/useDeviceDetection.ts +64 -0
  61. package/src/hooks/useFocusTrap.ts +70 -0
  62. package/src/hooks/useImagePreloader.ts +268 -0
  63. package/src/hooks/useImageTransition.ts +608 -0
  64. package/src/hooks/usePlacementsProcessor.ts +74 -0
  65. package/src/hooks/useProductGallery.ts +193 -0
  66. package/src/hooks/useProductPage.ts +467 -0
  67. package/src/hooks/useRenderGuard.ts +96 -0
  68. package/src/hooks/useScrollDirection.ts +196 -0
  69. package/src/hooks/viewport/index.ts +25 -0
  70. package/src/hooks/viewport/useContainerWidth.ts +59 -0
  71. package/src/hooks/viewport/useMediaQuery.ts +52 -0
  72. package/src/hooks/viewport/useResponsiveImageCap.ts +149 -0
  73. package/src/hooks/viewport/useViewportDimensions.ts +135 -0
  74. package/src/hooks/viewport/useWideMonitorMode.ts +150 -0
  75. package/src/hooks/visibility/index.ts +15 -0
  76. package/src/hooks/visibility/observerPool.ts +150 -0
  77. package/src/index.ts +240 -0
  78. package/src/layouts/hero-zoom/HeroShrinkLayout.tsx +209 -0
  79. package/src/layouts/hero-zoom/HeroZoomLayout.tsx +351 -0
  80. package/src/layouts/hero-zoom/index.ts +30 -0
  81. package/src/layouts/hero-zoom/stories/HeroZoomLayout.stories.tsx +350 -0
  82. package/src/layouts/hero-zoom/types.ts +113 -0
  83. package/src/layouts/hero-zoom/useHeroZoomScales.ts +156 -0
  84. package/src/layouts/index.ts +9 -0
  85. package/src/layouts/pdp/EdgeBlurBox.tsx +210 -0
  86. package/src/layouts/pdp/ImageBlurExtension.tsx +215 -0
  87. package/src/layouts/pdp/ImageEdgeBlur.tsx +215 -0
  88. package/src/layouts/pdp/PDPLayout.tsx +246 -0
  89. package/src/layouts/pdp/SimpleImageBlur.tsx +140 -0
  90. package/src/layouts/pdp/index.ts +40 -0
  91. package/src/lib/env.ts +15 -0
  92. package/src/lib/locale.ts +167 -0
  93. package/src/lib/router.tsx +46 -0
  94. package/src/lib/utils.ts +6 -0
  95. package/src/lightbox/README.md +77 -0
  96. package/src/next/index.tsx +26 -0
  97. package/src/patterns/MockupPriorityProvider.tsx +1014 -0
  98. package/src/patterns/Product.tsx +850 -0
  99. package/src/patterns/ProductPageProvider.tsx +224 -0
  100. package/src/patterns/RealtimeProvider.tsx +1162 -0
  101. package/src/patterns/ShopProvider.tsx +603 -0
  102. package/src/personalization/PersonalizationBridge.tsx +235 -0
  103. package/src/personalization/PersonalizationContext.ts +29 -0
  104. package/src/personalization/PersonalizationInputs.tsx +110 -0
  105. package/src/personalization/PersonalizationProvider.tsx +407 -0
  106. package/src/personalization/canvas-stub.d.ts +22 -0
  107. package/src/personalization/index.ts +43 -0
  108. package/src/personalization/types.ts +48 -0
  109. package/src/personalization/usePersonalization.ts +32 -0
  110. package/src/personalization/usePersonalizationShimmer.ts +159 -0
  111. package/src/personalization/utils.ts +59 -0
  112. package/src/primitives/BrandLogo.tsx +65 -0
  113. package/src/primitives/BrandName.tsx +51 -0
  114. package/src/primitives/Button.tsx +123 -0
  115. package/src/primitives/ColorSwatch.tsx +221 -0
  116. package/src/primitives/DragHintAnimation.tsx +190 -0
  117. package/src/primitives/EdgeSwipeGuards.tsx +60 -0
  118. package/src/primitives/FloatingActionGroup.tsx +176 -0
  119. package/src/primitives/ProductPrice.tsx +171 -0
  120. package/src/primitives/ProgressiveBlur.tsx +295 -0
  121. package/src/primitives/ThemeToggle.tsx +125 -0
  122. package/src/primitives/__tests__/story-coverage.test.ts +98 -0
  123. package/src/primitives/accordion.tsx +280 -0
  124. package/src/primitives/badge.tsx +137 -0
  125. package/src/primitives/card.tsx +61 -0
  126. package/src/primitives/checkbox.tsx +56 -0
  127. package/src/primitives/collapsible.tsx +51 -0
  128. package/src/primitives/drawer.tsx +828 -0
  129. package/src/primitives/dropdown-menu.tsx +197 -0
  130. package/src/primitives/fieldset.tsx +73 -0
  131. package/src/primitives/index.ts +138 -0
  132. package/src/primitives/input.tsx +91 -0
  133. package/src/primitives/kbd.tsx +130 -0
  134. package/src/primitives/label.tsx +20 -0
  135. package/src/primitives/link.tsx +182 -0
  136. package/src/primitives/popover.tsx +80 -0
  137. package/src/primitives/radio-group.tsx +79 -0
  138. package/src/primitives/scroll-fade.tsx +159 -0
  139. package/src/primitives/select.tsx +170 -0
  140. package/src/primitives/separator.tsx +25 -0
  141. package/src/primitives/slider.tsx +221 -0
  142. package/src/primitives/spinner.tsx +72 -0
  143. package/src/primitives/stories/Accordion.stories.tsx +121 -0
  144. package/src/primitives/stories/Badge.stories.tsx +221 -0
  145. package/src/primitives/stories/Button.stories.tsx +185 -0
  146. package/src/primitives/stories/Card.stories.tsx +171 -0
  147. package/src/primitives/stories/Checkbox.stories.tsx +214 -0
  148. package/src/primitives/stories/Collapsible.stories.tsx +230 -0
  149. package/src/primitives/stories/Drawer.stories.tsx +378 -0
  150. package/src/primitives/stories/DropdownMenu.stories.tsx +182 -0
  151. package/src/primitives/stories/Fieldset.stories.tsx +212 -0
  152. package/src/primitives/stories/Input.stories.tsx +172 -0
  153. package/src/primitives/stories/Kbd.stories.tsx +183 -0
  154. package/src/primitives/stories/Label.stories.tsx +98 -0
  155. package/src/primitives/stories/Link.stories.tsx +260 -0
  156. package/src/primitives/stories/Popover.stories.tsx +178 -0
  157. package/src/primitives/stories/RadioGroup.stories.tsx +205 -0
  158. package/src/primitives/stories/Select.stories.tsx +222 -0
  159. package/src/primitives/stories/Separator.stories.tsx +134 -0
  160. package/src/primitives/stories/Slider.stories.tsx +203 -0
  161. package/src/primitives/stories/Spinner.stories.tsx +142 -0
  162. package/src/primitives/stories/Surface.stories.tsx +257 -0
  163. package/src/primitives/stories/Switch.stories.tsx +131 -0
  164. package/src/primitives/stories/Tabs.stories.tsx +275 -0
  165. package/src/primitives/stories/TextField.stories.tsx +139 -0
  166. package/src/primitives/stories/Textarea.stories.tsx +148 -0
  167. package/src/primitives/stories/Tooltip.stories.tsx +119 -0
  168. package/src/primitives/surface.tsx +86 -0
  169. package/src/primitives/switch.tsx +35 -0
  170. package/src/primitives/tabs.tsx +206 -0
  171. package/src/primitives/text-field.tsx +84 -0
  172. package/src/primitives/textarea.tsx +50 -0
  173. package/src/primitives/tooltip.tsx +58 -0
  174. package/src/services/CanvasExportService.ts +518 -0
  175. package/src/styles/base.css +380 -0
  176. package/src/styles/defaults.css +280 -0
  177. package/src/styles/globals.css +1242 -0
  178. package/src/styles/index.css +17 -0
  179. package/src/styles/ne-themes.css +4740 -0
  180. package/src/styles/tailwind.css +11 -0
  181. package/src/styles/tokens.css +117 -0
  182. package/src/styles/utilities.css +188 -0
  183. package/src/themes/apply-theme.ts +449 -0
  184. package/src/themes/getThemeStyles.ts +454 -0
  185. package/src/themes/index.ts +48 -0
  186. package/src/themes/oklch-theme.ts +283 -0
  187. package/src/themes/presets.ts +989 -0
  188. package/src/themes/types.ts +386 -0
  189. package/src/themes/useTheme.tsx +450 -0
  190. package/src/utils/dev-warnings.ts +161 -0
  191. package/src/utils/devWarnings.ts +153 -0
  192. package/dist/styles.css +0 -1
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tailwind CSS v4 Entry Point
3
+ *
4
+ * With @tailwindcss/vite plugin, just import the main CSS file
5
+ * The plugin will process everything automatically
6
+ */
7
+
8
+ @import "tailwindcss";
9
+
10
+ /* Ensure all component source files are scanned for Tailwind classes */
11
+ @source "../**/*.tsx";
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Design Tokens - Core Variables
3
+ *
4
+ * This file defines the base design tokens that are shared across all themes.
5
+ * Specific theme values are defined in themes/light.css and themes/dark.css
6
+ *
7
+ * Token Naming Convention:
8
+ * --{category}-{variant}-{state}
9
+ *
10
+ * Categories: color, space, shadow, radius, font, transition
11
+ */
12
+
13
+ :root {
14
+ /* ===== Spacing Scale ===== */
15
+ --space-xs: 4px;
16
+ --space-sm: 6px;
17
+ --space-md: 8px;
18
+ --space-lg: 10px;
19
+ --space-xl: 12px;
20
+ --space-2xl: 16px;
21
+ --space-3xl: 20px;
22
+ --space-4xl: 24px;
23
+ --space-5xl: 32px;
24
+ --space-6xl: 48px;
25
+
26
+ /* ===== Border Radius ===== */
27
+ --radius-sm: 2px;
28
+ --radius-md: 4px;
29
+ --radius-lg: 6px;
30
+ --radius-xl: 8px;
31
+ --radius-2xl: 12px;
32
+ --radius-3xl: 20px;
33
+ --radius-4xl: 24px;
34
+ --radius-full: 9999px;
35
+
36
+ /* ===== Font Families ===== */
37
+ --font-sans:
38
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans',
39
+ 'Helvetica Neue', sans-serif;
40
+ --font-mono: 'Courier New', Monaco, monospace;
41
+
42
+ /* ===== Font Sizes ===== */
43
+ --font-size-xs: 9px;
44
+ --font-size-sm: 10px;
45
+ --font-size-md: 11px;
46
+ --font-size-base: 12px;
47
+ --font-size-lg: 13px;
48
+ --font-size-xl: 14px;
49
+ --font-size-2xl: 15px;
50
+ --font-size-3xl: 16px;
51
+
52
+ /* ===== Font Weights ===== */
53
+ --font-weight-normal: 400;
54
+ --font-weight-medium: 500;
55
+ --font-weight-semibold: 600;
56
+ --font-weight-bold: 700;
57
+
58
+ /* ===== Transitions ===== */
59
+ --transition-fast: 0.1s ease;
60
+ --transition-base: 0.15s ease;
61
+ --transition-slow: 0.2s ease;
62
+ --transition-cubic: cubic-bezier(0.4, 0, 0.2, 1);
63
+
64
+ /* ===== Z-Index Scale ===== */
65
+ --z-base: 1;
66
+ --z-dropdown: 1001;
67
+ --z-sticky: 1000;
68
+ --z-overlay: 10001; /* Drawer overlay (above modals at 10000) */
69
+ --z-drawer: 10002; /* Drawers must be highest (above modals at 10000) */
70
+ --z-modal: 10000;
71
+ --z-tooltip: 2147483647;
72
+
73
+ /* ===== Opacity Scale ===== */
74
+ --opacity-disabled: 0.3;
75
+ --opacity-muted: 0.5;
76
+ --opacity-subtle: 0.7;
77
+
78
+ /* ===== Shadows =====
79
+ * Note: Shadow colors use theme-specific rgba values defined in theme files
80
+ */
81
+ --shadow-sm: 0 1px 3px 0 var(--shadow-color-sm), 0 1px 2px -1px var(--shadow-color-sm);
82
+ --shadow-md: 0 4px 6px -1px var(--shadow-color-md), 0 2px 4px -2px var(--shadow-color-md);
83
+ --shadow-lg: 0 -4px 24px var(--shadow-color-lg);
84
+ --shadow-tooltip: 0 4px 6px -1px var(--shadow-color-tooltip), 0 2px 4px -2px var(--shadow-color-tooltip);
85
+ --shadow-hover: 0 8px 16px var(--shadow-color-hover);
86
+
87
+ /* ===== Shorthand Aliases for Embed Components ===== */
88
+ /* These aliases make it easier to use theme colors without the 'color-' prefix */
89
+ --bg-primary: var(--color-bg-primary);
90
+ --bg-secondary: var(--color-bg-secondary);
91
+ --bg-tertiary: var(--color-bg-tertiary);
92
+ --bg-hover: var(--color-bg-hover);
93
+ --bg-active: var(--color-bg-active);
94
+
95
+ --text-primary: var(--color-text-primary);
96
+ --text-secondary: var(--color-text-secondary);
97
+ --text-tertiary: var(--color-text-tertiary);
98
+ --text-muted: var(--color-text-muted);
99
+ --text-subtle: var(--color-text-subtle);
100
+ --text-placeholder: var(--color-text-placeholder);
101
+
102
+ --border-primary: var(--color-border-primary);
103
+ --border-secondary: var(--color-border-secondary);
104
+ --border-focus: var(--color-border-focus);
105
+ --border-hover: var(--color-border-hover);
106
+
107
+ --accent-primary: var(--color-accent-primary);
108
+ --accent-hover: var(--color-accent-hover);
109
+ --accent-light: var(--color-accent-light);
110
+
111
+ --error: var(--color-status-error);
112
+
113
+ /* ===== HeroUI v3 Compatibility Aliases ===== */
114
+ /* These provide shorthand access to HeroUI semantic colors */
115
+ /* Use: var(--primary), var(--danger), var(--success), etc. */
116
+ /* Note: Actual values defined in globals.css, these are just documentation */
117
+ }
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Shared Utility Classes
3
+ *
4
+ * This file contains utility classes that ui-react components depend on.
5
+ * Apps should import this file to ensure components work correctly:
6
+ *
7
+ * @import "@snowcone-app/ui/styles/utilities.css";
8
+ *
9
+ * Utilities included:
10
+ * - .shadow-soft - Soft shadow for form inputs
11
+ * - .scrollbar-hide - Hide scrollbar completely
12
+ * - .auto-hide-scrollbar - Show scrollbar on hover
13
+ * - .custom-scrollbar - Themed scrollbar
14
+ * - Reduced motion support
15
+ * - iOS/mobile viewport utilities
16
+ */
17
+
18
+ /* =============================================================================
19
+ * SHADOW UTILITIES
20
+ * ============================================================================= */
21
+
22
+ /* Default shadow variable - can be overridden by themes */
23
+ :root {
24
+ --shadow-soft: rgba(0, 0, 0, 0.04) 0px 2px 4px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;
25
+ }
26
+
27
+ /* Soft shadow for form inputs - visible on transparent surfaces */
28
+ /* Composes with Tailwind's ring system so focus rings work properly */
29
+ .shadow-soft {
30
+ --tw-shadow: var(--shadow-soft);
31
+ --tw-shadow-colored: var(--shadow-soft);
32
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
33
+ }
34
+
35
+ .dark .shadow-soft {
36
+ --tw-shadow: 0 1px 2px rgb(0 0 0 / 0.2), 0 2px 4px rgb(0 0 0 / 0.15);
37
+ --tw-shadow-colored: 0 1px 2px rgb(0 0 0 / 0.2), 0 2px 4px rgb(0 0 0 / 0.15);
38
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
39
+ }
40
+
41
+ /* =============================================================================
42
+ * SCROLLBAR UTILITIES
43
+ * ============================================================================= */
44
+
45
+ /* Hidden Scrollbar - completely hide scrollbar while maintaining scroll */
46
+ .scrollbar-hide {
47
+ scrollbar-width: none; /* Firefox */
48
+ -ms-overflow-style: none; /* IE and Edge */
49
+ }
50
+
51
+ .scrollbar-hide::-webkit-scrollbar {
52
+ display: none; /* Chrome, Safari, and Opera */
53
+ }
54
+
55
+ /* Auto-hide Scrollbar - show on hover */
56
+ .auto-hide-scrollbar {
57
+ scrollbar-width: thin;
58
+ scrollbar-color: transparent transparent;
59
+ transition: scrollbar-color 0.3s ease;
60
+ }
61
+
62
+ .auto-hide-scrollbar:hover {
63
+ scrollbar-color: var(--color-primary, #000) transparent;
64
+ }
65
+
66
+ .auto-hide-scrollbar::-webkit-scrollbar {
67
+ width: 8px;
68
+ }
69
+
70
+ .auto-hide-scrollbar::-webkit-scrollbar-track {
71
+ background: transparent;
72
+ }
73
+
74
+ .auto-hide-scrollbar::-webkit-scrollbar-thumb {
75
+ background: transparent;
76
+ border-radius: 9999px;
77
+ transition: background 0.3s ease;
78
+ }
79
+
80
+ .auto-hide-scrollbar:hover::-webkit-scrollbar-thumb {
81
+ background: var(--color-primary, #000);
82
+ border: 2px solid transparent;
83
+ background-clip: content-box;
84
+ }
85
+
86
+ .auto-hide-scrollbar::-webkit-scrollbar-thumb:hover {
87
+ background: color-mix(in srgb, var(--color-primary, #000) 80%, black);
88
+ background-clip: content-box;
89
+ }
90
+
91
+ /* Custom Scrollbar - themed scrollbar always visible */
92
+ .custom-scrollbar::-webkit-scrollbar {
93
+ width: 8px;
94
+ }
95
+
96
+ .custom-scrollbar::-webkit-scrollbar-track {
97
+ background: transparent;
98
+ }
99
+
100
+ .custom-scrollbar::-webkit-scrollbar-thumb {
101
+ background: var(--color-primary, #000);
102
+ border-radius: 9999px;
103
+ border: 2px solid transparent;
104
+ background-clip: content-box;
105
+ }
106
+
107
+ .custom-scrollbar::-webkit-scrollbar-thumb:hover {
108
+ background: color-mix(in srgb, var(--color-primary, #000) 80%, black);
109
+ background-clip: content-box;
110
+ }
111
+
112
+ /* =============================================================================
113
+ * ACCESSIBILITY - REDUCED MOTION
114
+ * ============================================================================= */
115
+
116
+ @media (prefers-reduced-motion: reduce) {
117
+ *,
118
+ *::before,
119
+ *::after {
120
+ animation-duration: 0.01ms !important;
121
+ animation-iteration-count: 1 !important;
122
+ transition-duration: 0.01ms !important;
123
+ scroll-behavior: auto !important;
124
+ }
125
+ }
126
+
127
+ /* =============================================================================
128
+ * IOS / MOBILE UTILITIES
129
+ * ============================================================================= */
130
+
131
+ /* Disable overscroll behavior (pull-to-refresh) */
132
+ html,
133
+ body {
134
+ overscroll-behavior: none;
135
+ overscroll-behavior-y: none;
136
+ }
137
+
138
+ /* Prevent zoom on mobile form inputs.
139
+ * iOS Safari auto-zooms when an input with font-size < 16px gets focus.
140
+ * This sets 16px as the default — any component can override it with a
141
+ * normal Tailwind class (e.g. text-lg) without needing !important. */
142
+ input[type="text"],
143
+ input[type="email"],
144
+ input[type="password"],
145
+ input[type="number"],
146
+ input[type="tel"],
147
+ input[type="search"],
148
+ input[type="url"],
149
+ textarea,
150
+ select {
151
+ font-size: 16px;
152
+ }
153
+
154
+ /* Prevent double-tap zoom and improve touch responsiveness */
155
+ * {
156
+ touch-action: manipulation;
157
+ }
158
+
159
+ /* Ensure proper viewport height on mobile Safari */
160
+ .min-h-screen-ios {
161
+ min-height: 100vh;
162
+ min-height: -webkit-fill-available;
163
+ }
164
+
165
+ html {
166
+ height: -webkit-fill-available;
167
+ }
168
+
169
+ /* Support for iOS safe areas and viewport */
170
+ .fullscreen-container {
171
+ height: 100vh;
172
+ height: calc(var(--vh, 1vh) * 100);
173
+ padding-top: env(safe-area-inset-top);
174
+ padding-bottom: env(safe-area-inset-bottom);
175
+ }
176
+
177
+ /* Help Safari recognize scroll containers and minimize address bar */
178
+ .scroll-container {
179
+ -webkit-overflow-scrolling: touch;
180
+ overflow-y: auto;
181
+ }
182
+
183
+ /* Force address bar to minimize on scroll (iOS only) */
184
+ @supports (-webkit-touch-callout: none) {
185
+ body {
186
+ min-height: calc(100vh + 1px);
187
+ }
188
+ }