@oxyhq/bloom 0.35.7 → 0.36.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 (95) hide show
  1. package/lib/commonjs/content-panel/index.js +37 -9
  2. package/lib/commonjs/content-panel/index.js.map +1 -1
  3. package/lib/commonjs/content-panel/index.web.js +71 -15
  4. package/lib/commonjs/content-panel/index.web.js.map +1 -1
  5. package/lib/commonjs/frosted-icon-button/FrostedIconButton.js +148 -0
  6. package/lib/commonjs/frosted-icon-button/FrostedIconButton.js.map +1 -0
  7. package/lib/commonjs/frosted-icon-button/FrostedIconButton.web.js +166 -0
  8. package/lib/commonjs/frosted-icon-button/FrostedIconButton.web.js.map +1 -0
  9. package/lib/commonjs/frosted-icon-button/index.js +13 -0
  10. package/lib/commonjs/frosted-icon-button/index.js.map +1 -0
  11. package/lib/commonjs/frosted-icon-button/index.web.js +13 -0
  12. package/lib/commonjs/frosted-icon-button/index.web.js.map +1 -0
  13. package/lib/commonjs/frosted-icon-button/shared.js +112 -0
  14. package/lib/commonjs/frosted-icon-button/shared.js.map +1 -0
  15. package/lib/commonjs/frosted-icon-button/types.js +6 -0
  16. package/lib/commonjs/frosted-icon-button/types.js.map +1 -0
  17. package/lib/commonjs/index.js +10 -1
  18. package/lib/commonjs/index.js.map +1 -1
  19. package/lib/commonjs/index.web.js +46 -37
  20. package/lib/commonjs/index.web.js.map +1 -1
  21. package/lib/module/content-panel/index.js +37 -9
  22. package/lib/module/content-panel/index.js.map +1 -1
  23. package/lib/module/content-panel/index.web.js +71 -15
  24. package/lib/module/content-panel/index.web.js.map +1 -1
  25. package/lib/module/frosted-icon-button/FrostedIconButton.js +143 -0
  26. package/lib/module/frosted-icon-button/FrostedIconButton.js.map +1 -0
  27. package/lib/module/frosted-icon-button/FrostedIconButton.web.js +161 -0
  28. package/lib/module/frosted-icon-button/FrostedIconButton.web.js.map +1 -0
  29. package/lib/module/frosted-icon-button/index.js +4 -0
  30. package/lib/module/frosted-icon-button/index.js.map +1 -0
  31. package/lib/module/frosted-icon-button/index.web.js +11 -0
  32. package/lib/module/frosted-icon-button/index.web.js.map +1 -0
  33. package/lib/module/frosted-icon-button/shared.js +107 -0
  34. package/lib/module/frosted-icon-button/shared.js.map +1 -0
  35. package/lib/module/frosted-icon-button/types.js +4 -0
  36. package/lib/module/frosted-icon-button/types.js.map +1 -0
  37. package/lib/module/index.js +1 -0
  38. package/lib/module/index.js.map +1 -1
  39. package/lib/module/index.web.js +1 -0
  40. package/lib/module/index.web.js.map +1 -1
  41. package/lib/typescript/commonjs/content-panel/index.d.ts +24 -6
  42. package/lib/typescript/commonjs/content-panel/index.d.ts.map +1 -1
  43. package/lib/typescript/commonjs/content-panel/index.web.d.ts +33 -10
  44. package/lib/typescript/commonjs/content-panel/index.web.d.ts.map +1 -1
  45. package/lib/typescript/commonjs/frosted-icon-button/FrostedIconButton.d.ts +5 -0
  46. package/lib/typescript/commonjs/frosted-icon-button/FrostedIconButton.d.ts.map +1 -0
  47. package/lib/typescript/commonjs/frosted-icon-button/FrostedIconButton.web.d.ts +5 -0
  48. package/lib/typescript/commonjs/frosted-icon-button/FrostedIconButton.web.d.ts.map +1 -0
  49. package/lib/typescript/commonjs/frosted-icon-button/index.d.ts +3 -0
  50. package/lib/typescript/commonjs/frosted-icon-button/index.d.ts.map +1 -0
  51. package/lib/typescript/commonjs/frosted-icon-button/index.web.d.ts +3 -0
  52. package/lib/typescript/commonjs/frosted-icon-button/index.web.d.ts.map +1 -0
  53. package/lib/typescript/commonjs/frosted-icon-button/shared.d.ts +60 -0
  54. package/lib/typescript/commonjs/frosted-icon-button/shared.d.ts.map +1 -0
  55. package/lib/typescript/commonjs/frosted-icon-button/types.d.ts +69 -0
  56. package/lib/typescript/commonjs/frosted-icon-button/types.d.ts.map +1 -0
  57. package/lib/typescript/commonjs/index.d.ts +2 -0
  58. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  59. package/lib/typescript/commonjs/index.web.d.ts +2 -0
  60. package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
  61. package/lib/typescript/module/content-panel/index.d.ts +24 -6
  62. package/lib/typescript/module/content-panel/index.d.ts.map +1 -1
  63. package/lib/typescript/module/content-panel/index.web.d.ts +33 -10
  64. package/lib/typescript/module/content-panel/index.web.d.ts.map +1 -1
  65. package/lib/typescript/module/frosted-icon-button/FrostedIconButton.d.ts +5 -0
  66. package/lib/typescript/module/frosted-icon-button/FrostedIconButton.d.ts.map +1 -0
  67. package/lib/typescript/module/frosted-icon-button/FrostedIconButton.web.d.ts +5 -0
  68. package/lib/typescript/module/frosted-icon-button/FrostedIconButton.web.d.ts.map +1 -0
  69. package/lib/typescript/module/frosted-icon-button/index.d.ts +3 -0
  70. package/lib/typescript/module/frosted-icon-button/index.d.ts.map +1 -0
  71. package/lib/typescript/module/frosted-icon-button/index.web.d.ts +3 -0
  72. package/lib/typescript/module/frosted-icon-button/index.web.d.ts.map +1 -0
  73. package/lib/typescript/module/frosted-icon-button/shared.d.ts +60 -0
  74. package/lib/typescript/module/frosted-icon-button/shared.d.ts.map +1 -0
  75. package/lib/typescript/module/frosted-icon-button/types.d.ts +69 -0
  76. package/lib/typescript/module/frosted-icon-button/types.d.ts.map +1 -0
  77. package/lib/typescript/module/index.d.ts +2 -0
  78. package/lib/typescript/module/index.d.ts.map +1 -1
  79. package/lib/typescript/module/index.web.d.ts +2 -0
  80. package/lib/typescript/module/index.web.d.ts.map +1 -1
  81. package/package.json +17 -1
  82. package/src/__tests__/ContentPanelNesting.test.tsx +74 -0
  83. package/src/__tests__/FrostedIconButton.test.tsx +137 -0
  84. package/src/__tests__/FrostedIconButton.web.test.tsx +246 -0
  85. package/src/content-panel/index.tsx +47 -11
  86. package/src/content-panel/index.web.tsx +85 -17
  87. package/src/frosted-icon-button/FrostedIconButton.stories.tsx +65 -0
  88. package/src/frosted-icon-button/FrostedIconButton.tsx +156 -0
  89. package/src/frosted-icon-button/FrostedIconButton.web.tsx +207 -0
  90. package/src/frosted-icon-button/index.ts +2 -0
  91. package/src/frosted-icon-button/index.web.ts +9 -0
  92. package/src/frosted-icon-button/shared.ts +118 -0
  93. package/src/frosted-icon-button/types.ts +81 -0
  94. package/src/index.ts +2 -0
  95. package/src/index.web.ts +2 -0
@@ -28,18 +28,22 @@
28
28
  * Framing is tri-state via the `framed` prop:
29
29
  *
30
30
  * - `undefined` (DEFAULT) → RESPONSIVE, driven purely by NativeWind: full-bleed
31
- * below `md`, framed at `md`+. The rounding is `md:`-gated and both overlays
32
- * are always rendered but carry `max-md:hidden` (`display:none` below `md`),
33
- * so the breakpoint is decided in CSS no consumer JS breakpoint hook.
31
+ * below the `framedFrom` breakpoint, framed at/above it. The breakpoint is
32
+ * configurable per consumer (`framedFrom`, default `768` / Tailwind `md`); the
33
+ * rounding is gated by that breakpoint's `min-*:` variant and both overlays
34
+ * are always rendered but carry the matching `max-*:hidden` literal
35
+ * (`display:none` below the breakpoint), so the breakpoint is decided entirely
36
+ * in CSS — no consumer JS breakpoint hook.
34
37
  * - `false` → NEVER framed (full-bleed at every size): a single flat surface,
35
38
  * no rounding, no overlays.
36
39
  * - `true` → ALWAYS framed (rounded + overlays at every size).
37
40
  *
38
- * The overlays are gated by VISIBILITY (a `max-md:hidden` literal) rather than
39
- * by conditional mounting for the responsive case, so crossing the breakpoint
40
- * never remounts them. The content wrapper likewise keeps a stable `key` so
41
- * `{children}` reconciles in place across the breakpoint instead of remounting
42
- * (which would reset feed scroll / the virtualizer + refetch).
41
+ * The overlays are gated by VISIBILITY (a `max-*:hidden` literal for the chosen
42
+ * breakpoint) rather than by conditional mounting for the responsive case, so
43
+ * crossing the breakpoint never remounts them. The content wrapper likewise
44
+ * keeps a stable `key` so `{children}` reconciles in place across the breakpoint
45
+ * instead of remounting (which would reset feed scroll / the virtualizer +
46
+ * refetch).
43
47
  *
44
48
  * Native bundlers use `./index.tsx` (a plain rounded surface); web bundlers
45
49
  * select this file via the `"browser"` export condition in `package.json`.
@@ -61,9 +65,58 @@ export const GUTTER_MASK_SPREAD = 40;
61
65
  export const PANEL_TOP_INSET = 8;
62
66
  /** Bottom sticky inset (px) of the framed panel chrome. */
63
67
  export const PANEL_BOTTOM_INSET = 8;
68
+
69
+ /**
70
+ * Viewport width (px) at which a RESPONSIVE `ContentPanel` (`framed` undefined)
71
+ * switches from full-bleed to framed. Each value maps to a PRE-SHIPPED literal
72
+ * Tailwind class bundle — `768` (default) uses the named `md:`/`max-md:` screens
73
+ * (byte-identical to prior behavior), `640` uses `sm:`/`max-sm:`, `1024` uses
74
+ * `lg:`/`max-lg:`, and `500` uses the arbitrary `min-[500px]:`/`max-[500px]:`
75
+ * variants (there is no named screen at 500px). The breakpoint tokens are never
76
+ * built at runtime, so a consumer's Tailwind content-scan over `lib/**` resolves
77
+ * them verbatim.
78
+ */
79
+
80
+ /**
81
+ * Per-breakpoint literal Tailwind variant tokens for the WEB responsive mode.
82
+ * Each field is a WHOLE literal class string (never assembled from parts at
83
+ * runtime) so the consumer's content-scan over `lib/**` picks up every
84
+ * arbitrary/`min-*`/`max-*`/`web:` token verbatim. Selecting a bundle by
85
+ * `framedFrom` value is the only runtime decision:
86
+ * - `surface` → framing rounding on the surface at/above the breakpoint.
87
+ * - `content` → the same rounding + a web-only horizontal clip on the
88
+ * inner content wrapper (`web:<bp>:overflow-x-clip`, platform-first-then-
89
+ * breakpoint — matching the consumer convention `web:sm:flex` in `@mercaria/ui`).
90
+ * - `overlayHidden` → `display:none` for the sticky overlays BELOW the breakpoint.
91
+ * `min-[500px]:` (≥500) and `max-[500px]:` (<500) are exactly complementary
92
+ * (meet at 500, no overlap/gap), mirroring the named `md:`/`max-md:` pair.
93
+ */
94
+ const RESPONSIVE_WEB = {
95
+ 500: {
96
+ surface: 'min-[500px]:rounded-radius-28',
97
+ content: 'min-[500px]:rounded-radius-28 web:min-[500px]:overflow-x-clip',
98
+ overlayHidden: 'max-[500px]:hidden'
99
+ },
100
+ 640: {
101
+ surface: 'sm:rounded-radius-28',
102
+ content: 'sm:rounded-radius-28 web:sm:overflow-x-clip',
103
+ overlayHidden: 'max-sm:hidden'
104
+ },
105
+ 768: {
106
+ surface: 'md:rounded-radius-28',
107
+ content: 'md:rounded-radius-28 web:md:overflow-x-clip',
108
+ overlayHidden: 'max-md:hidden'
109
+ },
110
+ 1024: {
111
+ surface: 'lg:rounded-radius-28',
112
+ content: 'lg:rounded-radius-28 web:lg:overflow-x-clip',
113
+ overlayHidden: 'max-lg:hidden'
114
+ }
115
+ };
64
116
  const ContentPanelComponent = ({
65
117
  children,
66
118
  framed,
119
+ framedFrom = 768,
67
120
  surfaceClassName,
68
121
  surfaceStyle,
69
122
  contentClassName,
@@ -82,13 +135,16 @@ const ContentPanelComponent = ({
82
135
  // `false` → never framed (full-bleed).
83
136
  const responsive = framed === undefined;
84
137
  const showOverlays = framed !== false;
138
+ // Responsive mode selects a pre-shipped literal breakpoint bundle by value;
139
+ // `framed === true`/`false` ignore `framedFrom` (fixed always/never framing).
140
+ const bp = RESPONSIVE_WEB[framedFrom];
85
141
 
86
142
  // Whole literal class strings selected per mode (the Tailwind content-scan
87
- // over `lib/**` requires each arbitrary/`md:`/`web:` token stay literal).
88
- // `web:md:overflow-x-clip` is platform-first-then-breakpoint, matching the
89
- // consumer convention (`web:sm:flex` in `@mercaria/ui`).
90
- const surfaceBase = responsive ? 'flex-1 md:rounded-radius-28' : framed ? 'flex-1 rounded-radius-28' : 'flex-1';
91
- const contentBase = responsive ? 'flex-1 md:rounded-radius-28 web:md:overflow-x-clip' : framed ? 'flex-1 rounded-radius-28 web:overflow-x-clip' : 'flex-1';
143
+ // over `lib/**` requires each arbitrary/`min-*`/`max-*`/`web:` token stay
144
+ // literal — the breakpoint tokens live whole in `RESPONSIVE_WEB` above and are
145
+ // only spliced in, never assembled from parts).
146
+ const surfaceBase = responsive ? `flex-1 ${bp.surface}` : framed ? 'flex-1 rounded-radius-28' : 'flex-1';
147
+ const contentBase = responsive ? `flex-1 ${bp.content}` : framed ? 'flex-1 rounded-radius-28 web:overflow-x-clip' : 'flex-1';
92
148
  const surfaceClass = [surfaceBase, surfaceClassName ?? 'bg-card'].join(' ');
93
149
  const contentClass = [contentBase, contentClassName].filter(Boolean).join(' ');
94
150
  return /*#__PURE__*/_jsx(ContentPanelNestingContext.Provider, {
@@ -98,13 +154,13 @@ const ContentPanelComponent = ({
98
154
  style: surfaceStyle,
99
155
  children: [showOverlays && /*#__PURE__*/_jsx(View, {
100
156
  pointerEvents: "none",
101
- className: responsive ? 'web:sticky web:top-2 z-30 h-[calc(100dvh-16px)] w-full rounded-radius-28 max-md:hidden web:[margin-bottom:calc(-100dvh+16px)] web:[clip-path:inset(-12px)]' : 'web:sticky web:top-2 z-30 h-[calc(100dvh-16px)] w-full rounded-radius-28 web:[margin-bottom:calc(-100dvh+16px)] web:[clip-path:inset(-12px)]',
157
+ className: responsive ? `web:sticky web:top-2 z-30 h-[calc(100dvh-16px)] w-full rounded-radius-28 ${bp.overlayHidden} web:[margin-bottom:calc(-100dvh+16px)] web:[clip-path:inset(-12px)]` : 'web:sticky web:top-2 z-30 h-[calc(100dvh-16px)] w-full rounded-radius-28 web:[margin-bottom:calc(-100dvh+16px)] web:[clip-path:inset(-12px)]',
102
158
  style: {
103
159
  boxShadow: `0 0 0 ${GUTTER_MASK_SPREAD}px ${maskColor ?? colors.background}`
104
160
  }
105
161
  }, "bleed-mask"), showOverlays && showStickyFrame !== false && /*#__PURE__*/_jsx(View, {
106
162
  pointerEvents: "none",
107
- className: responsive ? 'web:sticky web:top-2 z-[120] h-[calc(100dvh-16px)] w-full rounded-radius-28 border border-border max-md:hidden web:[margin-bottom:calc(-100dvh+16px)]' : 'web:sticky web:top-2 z-[120] h-[calc(100dvh-16px)] w-full rounded-radius-28 border border-border web:[margin-bottom:calc(-100dvh+16px)]'
163
+ className: responsive ? `web:sticky web:top-2 z-[120] h-[calc(100dvh-16px)] w-full rounded-radius-28 border border-border ${bp.overlayHidden} web:[margin-bottom:calc(-100dvh+16px)]` : 'web:sticky web:top-2 z-[120] h-[calc(100dvh-16px)] w-full rounded-radius-28 border border-border web:[margin-bottom:calc(-100dvh+16px)]'
108
164
  }, "border-frame"), /*#__PURE__*/_jsx(View, {
109
165
  className: contentClass,
110
166
  style: contentStyle,
@@ -1 +1 @@
1
- {"version":3,"names":["React","memo","View","useTheme","ContentPanelNestingContext","useContentPanelNestingGuard","jsx","_jsx","jsxs","_jsxs","GUTTER_MASK_SPREAD","PANEL_TOP_INSET","PANEL_BOTTOM_INSET","ContentPanelComponent","children","framed","surfaceClassName","surfaceStyle","contentClassName","contentStyle","showStickyFrame","maskColor","colors","responsive","undefined","showOverlays","surfaceBase","contentBase","surfaceClass","join","contentClass","filter","Boolean","Provider","value","className","style","pointerEvents","boxShadow","background","ContentPanel","displayName"],"sourceRoot":"../../../src","sources":["content-panel/index.web.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,KAAK,IAAIC,IAAI,QAAQ,OAAO;AACnC,SAASC,IAAI,QAAwC,cAAc;AAEnE,SAASC,QAAQ,QAAQ,uBAAoB;AAC7C,SACEC,0BAA0B,EAC1BC,2BAA2B,QACtB,sBAAmB;;AAE1B;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AACA,OAAO,MAAMC,kBAAkB,GAAG,EAAE;AACpC;AACA,OAAO,MAAMC,eAAe,GAAG,CAAC;AAChC;AACA,OAAO,MAAMC,kBAAkB,GAAG,CAAC;AAgCnC,MAAMC,qBAAkD,GAAGA,CAAC;EAC1DC,QAAQ;EACRC,MAAM;EACNC,gBAAgB;EAChBC,YAAY;EACZC,gBAAgB;EAChBC,YAAY;EACZC,eAAe;EACfC;AACF,CAAC,KAAK;EACJ;EACA;EACAhB,2BAA2B,CAAC,CAAC;EAC7B,MAAM;IAAEiB;EAAO,CAAC,GAAGnB,QAAQ,CAAC,CAAC;;EAE7B;EACA;EACA,MAAMoB,UAAU,GAAGR,MAAM,KAAKS,SAAS;EACvC,MAAMC,YAAY,GAAGV,MAAM,KAAK,KAAK;;EAErC;EACA;EACA;EACA;EACA,MAAMW,WAAW,GAAGH,UAAU,GAC1B,6BAA6B,GAC7BR,MAAM,GACJ,0BAA0B,GAC1B,QAAQ;EACd,MAAMY,WAAW,GAAGJ,UAAU,GAC1B,oDAAoD,GACpDR,MAAM,GACJ,8CAA8C,GAC9C,QAAQ;EACd,MAAMa,YAAY,GAAG,CAACF,WAAW,EAAEV,gBAAgB,IAAI,SAAS,CAAC,CAACa,IAAI,CAAC,GAAG,CAAC;EAC3E,MAAMC,YAAY,GAAG,CAACH,WAAW,EAAET,gBAAgB,CAAC,CAACa,MAAM,CAACC,OAAO,CAAC,CAACH,IAAI,CAAC,GAAG,CAAC;EAE9E,oBACEtB,IAAA,CAACH,0BAA0B,CAAC6B,QAAQ;IAACC,KAAK,EAAE,IAAK;IAAApB,QAAA,eAC/CL,KAAA,CAACP,IAAI;MACIiC,SAAS,EAAEP,YAAY;MAC9BQ,KAAK,EAAEnB,YAAa;MAAAH,QAAA,GAKnBW,YAAY,iBACXlB,IAAA,CAACL,IAAI;QAEHmC,aAAa,EAAC,MAAM;QAElBF,SAAS,EAAEZ,UAAU,GACjB,4JAA4J,GAC5J,8IAA8I;QAEpJa,KAAK,EAAE;UAAEE,SAAS,EAAE,SAAS5B,kBAAkB,MAAMW,SAAS,IAAIC,MAAM,CAACiB,UAAU;QAAG;MAAE,GAPpF,YAQL,CACF,EAGAd,YAAY,IAAIL,eAAe,KAAK,KAAK,iBACxCb,IAAA,CAACL,IAAI;QAEHmC,aAAa,EAAC,MAAM;QAElBF,SAAS,EAAEZ,UAAU,GACjB,uJAAuJ,GACvJ;MAAyI,GAL3I,cAOL,CACF,eAKDhB,IAAA,CAACL,IAAI;QAEIiC,SAAS,EAAEL,YAAY;QAC9BM,KAAK,EAAEjB,YAAa;QAAAL,QAAA,EAEnBA;MAAQ,GAJL,SAKA,CAAC;IAAA,CACH;EAAC,CAC4B,CAAC;AAE1C,CAAC;AAED,OAAO,MAAM0B,YAAY,gBAAGvC,IAAI,CAACY,qBAAqB,CAAC;AACvD2B,YAAY,CAACC,WAAW,GAAG,cAAc","ignoreList":[]}
1
+ {"version":3,"names":["React","memo","View","useTheme","ContentPanelNestingContext","useContentPanelNestingGuard","jsx","_jsx","jsxs","_jsxs","GUTTER_MASK_SPREAD","PANEL_TOP_INSET","PANEL_BOTTOM_INSET","RESPONSIVE_WEB","surface","content","overlayHidden","ContentPanelComponent","children","framed","framedFrom","surfaceClassName","surfaceStyle","contentClassName","contentStyle","showStickyFrame","maskColor","colors","responsive","undefined","showOverlays","bp","surfaceBase","contentBase","surfaceClass","join","contentClass","filter","Boolean","Provider","value","className","style","pointerEvents","boxShadow","background","ContentPanel","displayName"],"sourceRoot":"../../../src","sources":["content-panel/index.web.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+
3
+ import React, { memo, useMemo } from 'react';
4
+ import { Animated, Pressable, StyleSheet, View } from 'react-native';
5
+ import { BlurView } from 'expo-blur';
6
+ import { useTheme } from "../theme/use-theme.js";
7
+ import { usePressAnimation } from "../hooks/usePressAnimation.js";
8
+ import { useInteractionState } from "../hooks/useInteractionState.js";
9
+ import { applyIconColor, resolveFrostedPalette, resolveFrostedSize } from "./shared.js";
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ const RADIUS = 999;
12
+ const PRESS_SCALE = 0.94;
13
+ const DEFAULT_HIT_SLOP = {
14
+ top: 8,
15
+ bottom: 8,
16
+ left: 8,
17
+ right: 8
18
+ };
19
+
20
+ // BlurView intensity (0–100). A gentle frost so the chip reads over an image
21
+ // without smearing the content behind it. The `active` (solid) state has none.
22
+ const BLUR_INTENSITY = 24;
23
+ const FrostedIconButtonComponent = ({
24
+ onPress,
25
+ icon,
26
+ children,
27
+ active = false,
28
+ disabled = false,
29
+ size = 'md',
30
+ accessibilityLabel,
31
+ accessibilityHint,
32
+ style,
33
+ className,
34
+ testID,
35
+ hitSlop
36
+ }) => {
37
+ const theme = useTheme();
38
+ const geo = useMemo(() => resolveFrostedSize(size), [size]);
39
+ const palette = useMemo(() => resolveFrostedPalette(theme.colors, theme.isDark), [theme.colors, theme.isDark]);
40
+ const {
41
+ scaleAnim,
42
+ onPressIn: onScalePressIn,
43
+ onPressOut: onScalePressOut
44
+ } = usePressAnimation(disabled ? undefined : PRESS_SCALE);
45
+ const {
46
+ state: pressed,
47
+ onIn: onPressedIn,
48
+ onOut: onPressedOut
49
+ } = useInteractionState();
50
+ const handlePressIn = disabled ? undefined : () => {
51
+ onScalePressIn();
52
+ onPressedIn();
53
+ };
54
+ const handlePressOut = disabled ? undefined : () => {
55
+ onScalePressOut();
56
+ onPressedOut();
57
+ };
58
+ const highlighted = pressed && !disabled;
59
+ const surface = active ? palette.activeSurface : highlighted ? palette.surfaceHover : palette.surface;
60
+ const ring = highlighted ? palette.ringHover : palette.ring;
61
+ const iconColor = active ? palette.activeIcon : palette.icon;
62
+ const containerStyle = useMemo(() => {
63
+ return {
64
+ width: geo.diameter,
65
+ height: geo.diameter,
66
+ borderRadius: RADIUS,
67
+ alignItems: 'center',
68
+ justifyContent: 'center',
69
+ borderWidth: StyleSheet.hairlineWidth * 2,
70
+ borderColor: ring,
71
+ // Soft shadow lives on the (non-clipping) Pressable so it renders on iOS —
72
+ // the blur/tint are clipped by an inner overflow:hidden layer instead.
73
+ shadowColor: palette.shadow,
74
+ shadowOffset: {
75
+ width: 0,
76
+ height: 2
77
+ },
78
+ shadowOpacity: 1,
79
+ shadowRadius: 8,
80
+ elevation: 4
81
+ };
82
+ }, [geo.diameter, ring, palette.shadow]);
83
+ const content = icon ?? children;
84
+ return /*#__PURE__*/_jsx(Animated.View, {
85
+ style: [{
86
+ transform: [{
87
+ scale: scaleAnim
88
+ }]
89
+ }, style],
90
+ children: /*#__PURE__*/_jsxs(Pressable, {
91
+ ...(className ? {
92
+ className
93
+ } : {}),
94
+ style: [containerStyle, disabled && styles.disabled],
95
+ onPress: disabled ? undefined : onPress,
96
+ onPressIn: handlePressIn,
97
+ onPressOut: handlePressOut,
98
+ disabled: disabled,
99
+ hitSlop: hitSlop ?? DEFAULT_HIT_SLOP,
100
+ accessibilityRole: "button",
101
+ accessibilityLabel: accessibilityLabel,
102
+ accessibilityHint: accessibilityHint,
103
+ accessibilityState: {
104
+ disabled,
105
+ selected: active
106
+ },
107
+ testID: testID,
108
+ children: [/*#__PURE__*/_jsxs(View, {
109
+ style: [StyleSheet.absoluteFill, styles.clip],
110
+ children: [!active && /*#__PURE__*/_jsx(BlurView, {
111
+ intensity: BLUR_INTENSITY,
112
+ tint: theme.isDark ? 'dark' : 'light',
113
+ experimentalBlurMethod: "dimezisBlurView",
114
+ style: StyleSheet.absoluteFill
115
+ }), /*#__PURE__*/_jsx(View, {
116
+ style: [StyleSheet.absoluteFill, {
117
+ backgroundColor: surface
118
+ }]
119
+ })]
120
+ }), content != null && /*#__PURE__*/_jsx(View, {
121
+ style: {
122
+ width: geo.iconBox,
123
+ height: geo.iconBox,
124
+ alignItems: 'center',
125
+ justifyContent: 'center'
126
+ },
127
+ children: applyIconColor(content, iconColor)
128
+ })]
129
+ })
130
+ });
131
+ };
132
+ const styles = StyleSheet.create({
133
+ clip: {
134
+ borderRadius: RADIUS,
135
+ overflow: 'hidden'
136
+ },
137
+ disabled: {
138
+ opacity: 0.5
139
+ }
140
+ });
141
+ export const FrostedIconButton = /*#__PURE__*/memo(FrostedIconButtonComponent);
142
+ FrostedIconButton.displayName = 'FrostedIconButton';
143
+ //# sourceMappingURL=FrostedIconButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","memo","useMemo","Animated","Pressable","StyleSheet","View","BlurView","useTheme","usePressAnimation","useInteractionState","applyIconColor","resolveFrostedPalette","resolveFrostedSize","jsx","_jsx","jsxs","_jsxs","RADIUS","PRESS_SCALE","DEFAULT_HIT_SLOP","top","bottom","left","right","BLUR_INTENSITY","FrostedIconButtonComponent","onPress","icon","children","active","disabled","size","accessibilityLabel","accessibilityHint","style","className","testID","hitSlop","theme","geo","palette","colors","isDark","scaleAnim","onPressIn","onScalePressIn","onPressOut","onScalePressOut","undefined","state","pressed","onIn","onPressedIn","onOut","onPressedOut","handlePressIn","handlePressOut","highlighted","surface","activeSurface","surfaceHover","ring","ringHover","iconColor","activeIcon","containerStyle","width","diameter","height","borderRadius","alignItems","justifyContent","borderWidth","hairlineWidth","borderColor","shadowColor","shadow","shadowOffset","shadowOpacity","shadowRadius","elevation","content","transform","scale","styles","accessibilityRole","accessibilityState","selected","absoluteFill","clip","intensity","tint","experimentalBlurMethod","backgroundColor","iconBox","create","overflow","opacity","FrostedIconButton","displayName"],"sourceRoot":"../../../src","sources":["frosted-icon-button/FrostedIconButton.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+
3
+ import React, { memo, useCallback, useEffect, useId, useMemo } from 'react';
4
+ import { useTheme } from "../theme/use-theme.js";
5
+ import { flattenWebStyle } from "../styles/flatten-web-style.js";
6
+ import { applyIconColor, resolveFrostedPalette, resolveFrostedSize } from "./shared.js";
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ const RADIUS = 999;
9
+ const PRESS_SCALE = 0.94;
10
+
11
+ // ---------------------------------------------------------------------------
12
+ // Per-state CSS injection
13
+ //
14
+ // Inline styles cannot express `:hover` / `:focus-visible` / `:active`. We
15
+ // inject one static stylesheet (keyed by id, once) defining the interaction
16
+ // behavior for the base `bloom-frosted-icon-btn` class; per-instance resolved
17
+ // colors are passed in as inline CSS custom properties. Self-injecting the CSS
18
+ // (rather than exporting a string for consumers to paste) is the Bloom web-fork
19
+ // convention — an unresolvable rule would fail silently otherwise.
20
+ // ---------------------------------------------------------------------------
21
+
22
+ const STYLE_ID = 'bloom-frosted-icon-button-web-css';
23
+ const BLOOM_FROSTED_ICON_BUTTON_CSS = `
24
+ .bloom-frosted-icon-btn {
25
+ appearance: none;
26
+ -webkit-appearance: none;
27
+ box-sizing: border-box;
28
+ display: inline-flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ padding: 0;
32
+ margin: 0;
33
+ border-style: solid;
34
+ border-width: 1px;
35
+ font-family: inherit;
36
+ cursor: pointer;
37
+ user-select: none;
38
+ outline: none;
39
+ transition: background-color 140ms ease, border-color 140ms ease,
40
+ box-shadow 160ms ease, transform 120ms ease;
41
+ }
42
+ .bloom-frosted-icon-btn:disabled,
43
+ .bloom-frosted-icon-btn[aria-disabled="true"] {
44
+ cursor: default;
45
+ opacity: 0.5;
46
+ }
47
+ .bloom-frosted-icon-btn:not(:disabled):not([aria-disabled="true"]):not([data-active="true"]):hover {
48
+ background-color: var(--bloom-frosted-hover-bg);
49
+ border-color: var(--bloom-frosted-hover-ring);
50
+ }
51
+ .bloom-frosted-icon-btn:not(:disabled):not([aria-disabled="true"]):active {
52
+ transform: scale(var(--bloom-frosted-press-scale, 1));
53
+ }
54
+ .bloom-frosted-icon-btn:focus-visible {
55
+ outline: 2px solid var(--bloom-frosted-ring-focus, currentColor);
56
+ outline-offset: 2px;
57
+ }
58
+ `;
59
+ function useFrostedIconButtonCss() {
60
+ useEffect(() => {
61
+ if (typeof document === 'undefined') return;
62
+ if (document.getElementById(STYLE_ID)) return;
63
+ const style = document.createElement('style');
64
+ style.id = STYLE_ID;
65
+ style.textContent = BLOOM_FROSTED_ICON_BUTTON_CSS;
66
+ document.head.appendChild(style);
67
+ }, []);
68
+ }
69
+ const FrostedIconButtonWebComponent = ({
70
+ onPress,
71
+ onClick,
72
+ icon,
73
+ children,
74
+ active = false,
75
+ disabled = false,
76
+ size = 'md',
77
+ accessibilityLabel,
78
+ 'aria-label': ariaLabelProp,
79
+ accessibilityHint,
80
+ style,
81
+ className,
82
+ testID,
83
+ id,
84
+ title,
85
+ type = 'button'
86
+ }) => {
87
+ useFrostedIconButtonCss();
88
+ const theme = useTheme();
89
+ const reactId = useId();
90
+ const resolvedId = id ?? `bloom-frosted-icon-btn-${reactId}`;
91
+ const geo = useMemo(() => resolveFrostedSize(size), [size]);
92
+ const palette = useMemo(() => resolveFrostedPalette(theme.colors, theme.isDark), [theme.colors, theme.isDark]);
93
+ const iconColor = active ? palette.activeIcon : palette.icon;
94
+ const blur = `blur(${geo.blur}px)`;
95
+ const containerStyle = useMemo(() => {
96
+ return {
97
+ width: geo.diameter,
98
+ height: geo.diameter,
99
+ borderRadius: RADIUS,
100
+ backgroundColor: active ? palette.activeSurface : palette.surface,
101
+ borderColor: palette.ring,
102
+ color: iconColor,
103
+ // Real CSS backdrop blur so the chip frosts over content behind it. The
104
+ // solid `active` state drops the blur. Both prefixed forms for Safari.
105
+ backdropFilter: active ? 'none' : blur,
106
+ WebkitBackdropFilter: active ? 'none' : blur,
107
+ // Soft shadow kept in BOTH modes so the chip has an edge on a solid bg.
108
+ boxShadow: `0 2px 8px ${palette.shadow}`,
109
+ ['--bloom-frosted-hover-bg']: palette.surfaceHover,
110
+ ['--bloom-frosted-hover-ring']: palette.ringHover,
111
+ ['--bloom-frosted-ring-focus']: palette.focusRing,
112
+ ['--bloom-frosted-press-scale']: PRESS_SCALE
113
+ };
114
+ }, [geo.diameter, active, palette.activeSurface, palette.surface, palette.ring, palette.surfaceHover, palette.ringHover, palette.focusRing, palette.shadow, iconColor, blur]);
115
+ const handleClick = useCallback(event => {
116
+ if (disabled) {
117
+ event.preventDefault();
118
+ return;
119
+ }
120
+ onClick?.(event);
121
+ onPress?.();
122
+ }, [disabled, onClick, onPress]);
123
+ const ariaLabel = ariaLabelProp ?? accessibilityLabel;
124
+ const composedClassName = ['bloom-frosted-icon-btn'].concat(className ? [className] : []).join(' ');
125
+
126
+ // `style` is an RN `StyleProp` (array-capable). Flatten before spreading into
127
+ // the raw DOM `style` object so an array form never leaks numeric keys onto
128
+ // the element's CSSStyleDeclaration. See `flattenWebStyle` for the rationale.
129
+ const resolvedStyle = flattenWebStyle(style);
130
+ const content = icon ?? children;
131
+ return /*#__PURE__*/_jsx("button", {
132
+ id: resolvedId,
133
+ type: type,
134
+ className: composedClassName,
135
+ style: {
136
+ ...containerStyle,
137
+ ...resolvedStyle
138
+ },
139
+ onClick: handleClick,
140
+ disabled: disabled,
141
+ "aria-disabled": disabled || undefined,
142
+ "aria-label": ariaLabel,
143
+ "aria-pressed": active,
144
+ "data-active": active || undefined,
145
+ title: title ?? accessibilityHint,
146
+ "data-testid": testID,
147
+ children: content != null && /*#__PURE__*/_jsx("span", {
148
+ style: {
149
+ display: 'inline-flex',
150
+ alignItems: 'center',
151
+ justifyContent: 'center',
152
+ width: geo.iconBox,
153
+ height: geo.iconBox
154
+ },
155
+ children: applyIconColor(content, iconColor)
156
+ })
157
+ });
158
+ };
159
+ export const FrostedIconButton = /*#__PURE__*/memo(FrostedIconButtonWebComponent);
160
+ FrostedIconButton.displayName = 'FrostedIconButton';
161
+ //# sourceMappingURL=FrostedIconButton.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","memo","useCallback","useEffect","useId","useMemo","useTheme","flattenWebStyle","applyIconColor","resolveFrostedPalette","resolveFrostedSize","jsx","_jsx","RADIUS","PRESS_SCALE","STYLE_ID","BLOOM_FROSTED_ICON_BUTTON_CSS","useFrostedIconButtonCss","document","getElementById","style","createElement","id","textContent","head","appendChild","FrostedIconButtonWebComponent","onPress","onClick","icon","children","active","disabled","size","accessibilityLabel","ariaLabelProp","accessibilityHint","className","testID","title","type","theme","reactId","resolvedId","geo","palette","colors","isDark","iconColor","activeIcon","blur","containerStyle","width","diameter","height","borderRadius","backgroundColor","activeSurface","surface","borderColor","ring","color","backdropFilter","WebkitBackdropFilter","boxShadow","shadow","surfaceHover","ringHover","focusRing","handleClick","event","preventDefault","ariaLabel","composedClassName","concat","join","resolvedStyle","content","undefined","display","alignItems","justifyContent","iconBox","FrostedIconButton","displayName"],"sourceRoot":"../../../src","sources":["frosted-icon-button/FrostedIconButton.web.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export { FrostedIconButton } from './FrostedIconButton';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FrostedIconButton"],"sourceRoot":"../../../src","sources":["frosted-icon-button/index.ts"],"mappings":";;AAAA,SAASA,iBAAiB,QAAQ,qBAAqB","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ // Web variant of the `./frosted-icon-button` barrel.
4
+ //
5
+ // The default barrel (`./index.ts`) re-exports the React Native implementation,
6
+ // which frosts via `expo-blur`'s `BlurView`. The web fork (`./FrostedIconButton.web`)
7
+ // renders a real HTML `<button>` and frosts via a real CSS `backdrop-filter` —
8
+ // no `expo-blur` import ever reaches a web bundler. Web bundlers select this
9
+ // file via the `"browser"` export condition in `package.json`.
10
+ export { FrostedIconButton } from "./FrostedIconButton.web.js";
11
+ //# sourceMappingURL=index.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FrostedIconButton"],"sourceRoot":"../../../src","sources":["frosted-icon-button/index.web.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,iBAAiB,QAAQ,4BAAyB","ignoreList":[]}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ import { cloneElement, isValidElement } from 'react';
4
+ import { withAlpha } from "../theme/color-utils.js";
5
+
6
+ /** Resolved pixel geometry for a given size prop. */
7
+
8
+ const SIZE_CONFIG = {
9
+ // 32px (`h-8`) — dense.
10
+ sm: {
11
+ diameter: 32,
12
+ iconBox: 18,
13
+ blur: 10
14
+ },
15
+ // 36px (`h-9`) — the default comfortable header/overlay action.
16
+ md: {
17
+ diameter: 36,
18
+ iconBox: 20,
19
+ blur: 12
20
+ }
21
+ };
22
+
23
+ /**
24
+ * Resolve a `size` prop (preset name or raw pixel diameter) to concrete pixel
25
+ * geometry. A numeric size sets the diameter directly, derives the icon box as
26
+ * `round(size * 0.56)` (min 16px) and scales the blur radius with the diameter.
27
+ * Mirrored byte-for-byte between the native and web forks via this one module.
28
+ */
29
+ export function resolveFrostedSize(size) {
30
+ if (typeof size === 'number') {
31
+ return {
32
+ diameter: size,
33
+ iconBox: Math.max(16, Math.round(size * 0.56)),
34
+ blur: Math.max(8, Math.round(size * 0.34))
35
+ };
36
+ }
37
+ return SIZE_CONFIG[size];
38
+ }
39
+
40
+ /**
41
+ * Per-mode alpha weights for the translucent surface + hairline ring.
42
+ *
43
+ * These are calibrated so the chip READS on a SOLID background independently of
44
+ * any content behind it: on a dark theme the surface is a LOW-OPACITY LIGHT tint
45
+ * of the foreground token (lighter than the near-black page — NOT a dark `card`
46
+ * fill that sinks into the background), and on a light theme it is a subtle dark
47
+ * tint. E.g. on a `rgb(11 11 15)` page a `rgba(237,237,237,0.14)` surface
48
+ * composites to ≈`rgb(43 43 47)` — a clearly visible frosted circle.
49
+ */
50
+ const SURFACE_ALPHA = {
51
+ light: 0.06,
52
+ dark: 0.14
53
+ };
54
+ const SURFACE_ALPHA_HOVER = {
55
+ light: 0.1,
56
+ dark: 0.22
57
+ };
58
+ const RING_ALPHA = {
59
+ light: 0.12,
60
+ dark: 0.22
61
+ };
62
+ const RING_ALPHA_HOVER = {
63
+ light: 0.18,
64
+ dark: 0.3
65
+ };
66
+
67
+ /** Theme-aware colors for every frosted-button surface state. */
68
+
69
+ /**
70
+ * Build the frosted palette from the resolved theme colors. Everything is
71
+ * derived from Bloom tokens (`text`/foreground, `primary`, `shadow`) so it is
72
+ * fully theme-aware and Oxy-agnostic — no hardcoded colors.
73
+ */
74
+ export function resolveFrostedPalette(colors, isDark) {
75
+ const k = isDark ? 'dark' : 'light';
76
+ return {
77
+ surface: withAlpha(colors.text, SURFACE_ALPHA[k]),
78
+ surfaceHover: withAlpha(colors.text, SURFACE_ALPHA_HOVER[k]),
79
+ ring: withAlpha(colors.text, RING_ALPHA[k]),
80
+ ringHover: withAlpha(colors.text, RING_ALPHA_HOVER[k]),
81
+ icon: colors.text,
82
+ activeSurface: colors.primary,
83
+ activeIcon: colors.primaryForeground,
84
+ focusRing: colors.primary,
85
+ shadow: colors.shadow
86
+ };
87
+ }
88
+
89
+ /** A React element that accepts a `fill` prop (Bloom icons, raw SVG). */
90
+
91
+ /**
92
+ * Inject `color` as the icon's `fill` — but only as a FALLBACK: if the caller
93
+ * already set an explicit `fill` on the icon element, it wins and the node is
94
+ * returned untouched. Bloom icons resolve their paint as `fill ?? style.color`,
95
+ * so a bare `<Icons.X />` gets the theme-aware color for free while an
96
+ * explicitly-colored icon is never overridden. Non-element children (plain
97
+ * text/strings) pass through unchanged.
98
+ */
99
+ export function applyIconColor(node, color) {
100
+ if (! /*#__PURE__*/isValidElement(node)) return node;
101
+ const el = node;
102
+ if (el.props.fill != null) return node;
103
+ return /*#__PURE__*/cloneElement(el, {
104
+ fill: color
105
+ });
106
+ }
107
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["cloneElement","isValidElement","withAlpha","SIZE_CONFIG","sm","diameter","iconBox","blur","md","resolveFrostedSize","size","Math","max","round","SURFACE_ALPHA","light","dark","SURFACE_ALPHA_HOVER","RING_ALPHA","RING_ALPHA_HOVER","resolveFrostedPalette","colors","isDark","k","surface","text","surfaceHover","ring","ringHover","icon","activeSurface","primary","activeIcon","primaryForeground","focusRing","shadow","applyIconColor","node","color","el","props","fill"],"sourceRoot":"../../../src","sources":["frosted-icon-button/shared.ts"],"mappings":";;AAAA,SAASA,YAAY,EAAEC,cAAc,QAA2C,OAAO;AAEvF,SAASC,SAAS,QAAQ,yBAAsB;;AAIhD;;AAUA,MAAMC,WAA2D,GAAG;EAClE;EACAC,EAAE,EAAE;IAAEC,QAAQ,EAAE,EAAE;IAAEC,OAAO,EAAE,EAAE;IAAEC,IAAI,EAAE;EAAG,CAAC;EAC3C;EACAC,EAAE,EAAE;IAAEH,QAAQ,EAAE,EAAE;IAAEC,OAAO,EAAE,EAAE;IAAEC,IAAI,EAAE;EAAG;AAC5C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,kBAAkBA,CAACC,IAAoC,EAAmB;EACxF,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;IAC5B,OAAO;MACLL,QAAQ,EAAEK,IAAI;MACdJ,OAAO,EAAEK,IAAI,CAACC,GAAG,CAAC,EAAE,EAAED,IAAI,CAACE,KAAK,CAACH,IAAI,GAAG,IAAI,CAAC,CAAC;MAC9CH,IAAI,EAAEI,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,KAAK,CAACH,IAAI,GAAG,IAAI,CAAC;IAC3C,CAAC;EACH;EACA,OAAOP,WAAW,CAACO,IAAI,CAAC;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,aAAa,GAAG;EAAEC,KAAK,EAAE,IAAI;EAAEC,IAAI,EAAE;AAAK,CAAU;AAC1D,MAAMC,mBAAmB,GAAG;EAAEF,KAAK,EAAE,GAAG;EAAEC,IAAI,EAAE;AAAK,CAAU;AAC/D,MAAME,UAAU,GAAG;EAAEH,KAAK,EAAE,IAAI;EAAEC,IAAI,EAAE;AAAK,CAAU;AACvD,MAAMG,gBAAgB,GAAG;EAAEJ,KAAK,EAAE,IAAI;EAAEC,IAAI,EAAE;AAAI,CAAU;;AAE5D;;AA0BA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,qBAAqBA,CAACC,MAAmB,EAAEC,MAAe,EAAkB;EAC1F,MAAMC,CAAC,GAAGD,MAAM,GAAG,MAAM,GAAG,OAAO;EACnC,OAAO;IACLE,OAAO,EAAEtB,SAAS,CAACmB,MAAM,CAACI,IAAI,EAAEX,aAAa,CAACS,CAAC,CAAC,CAAC;IACjDG,YAAY,EAAExB,SAAS,CAACmB,MAAM,CAACI,IAAI,EAAER,mBAAmB,CAACM,CAAC,CAAC,CAAC;IAC5DI,IAAI,EAAEzB,SAAS,CAACmB,MAAM,CAACI,IAAI,EAAEP,UAAU,CAACK,CAAC,CAAC,CAAC;IAC3CK,SAAS,EAAE1B,SAAS,CAACmB,MAAM,CAACI,IAAI,EAAEN,gBAAgB,CAACI,CAAC,CAAC,CAAC;IACtDM,IAAI,EAAER,MAAM,CAACI,IAAI;IACjBK,aAAa,EAAET,MAAM,CAACU,OAAO;IAC7BC,UAAU,EAAEX,MAAM,CAACY,iBAAiB;IACpCC,SAAS,EAAEb,MAAM,CAACU,OAAO;IACzBI,MAAM,EAAEd,MAAM,CAACc;EACjB,CAAC;AACH;;AAEA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAACC,IAAe,EAAEC,KAAa,EAAa;EACxE,IAAI,eAACrC,cAAc,CAACoC,IAAI,CAAC,EAAE,OAAOA,IAAI;EACtC,MAAME,EAAE,GAAGF,IAAuB;EAClC,IAAIE,EAAE,CAACC,KAAK,CAACC,IAAI,IAAI,IAAI,EAAE,OAAOJ,IAAI;EACtC,oBAAOrC,YAAY,CAACuC,EAAE,EAAE;IAAEE,IAAI,EAAEH;EAAM,CAAC,CAAC;AAC1C","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["frosted-icon-button/types.ts"],"mappings":"","ignoreList":[]}
@@ -29,6 +29,7 @@ export * from './portal';
29
29
  export { Dialog, DIALOG_SHEET_BACKDROP_TESTID, BloomDialogProvider, alert, useDialogContext, useDialogControl } from './dialog';
30
30
  export * from './button';
31
31
  export { Fab } from './fab';
32
+ export { FrostedIconButton } from './frosted-icon-button';
32
33
  export * from "./grouped-buttons/index.js";
33
34
  export * from "./divider/index.js";
34
35
  export * from "./radio-indicator/index.js";