@fab1o978/react-ui 0.2.1 → 0.2.2

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.
package/dist/index.cjs CHANGED
@@ -4699,7 +4699,9 @@ var PageBreakButton = () => {
4699
4699
  var ColorWheel_module_default = {
4700
4700
  root: "ColorWheel_module_root",
4701
4701
  recents: "ColorWheel_module_recents",
4702
+ recentsEmpty: "ColorWheel_module_recentsEmpty",
4702
4703
  chipWrap: "ColorWheel_module_chipWrap",
4704
+ chipWrapRemoving: "ColorWheel_module_chipWrapRemoving",
4703
4705
  chip: "ColorWheel_module_chip",
4704
4706
  chipRemove: "ColorWheel_module_chipRemove",
4705
4707
  picker: "ColorWheel_module_picker",
@@ -4884,6 +4886,11 @@ var ARC_A1 = 150;
4884
4886
  var ARC_HANDLE_R_FRAC = 152 / 380;
4885
4887
  var PICKER_HEIGHT_WITH_ARC = 265;
4886
4888
  var PICKER_HEIGHT_NO_ARC = 224;
4889
+ var CHIP_SIZE = 26;
4890
+ var CHIP_GAP = 7;
4891
+ function recentsContentWidth(chipCount) {
4892
+ return chipCount > 0 ? chipCount * CHIP_SIZE + (chipCount - 1) * CHIP_GAP : 0;
4893
+ }
4887
4894
  var MODES_HSV = ["h", "s", "v"];
4888
4895
  var MODES_HSVA = ["h", "s", "v", "a"];
4889
4896
  function ringGradient(mode, hsv) {
@@ -4929,6 +4936,15 @@ function ColorWheel({
4929
4936
  const [editing, setEditing] = React.useState(false);
4930
4937
  const [editValue, setEditValue] = React.useState("");
4931
4938
  const [eyedropperSupported, setEyedropperSupported] = React.useState(false);
4939
+ const [removingHexes, setRemovingHexes] = React.useState(/* @__PURE__ */ new Set());
4940
+ const [recentsGrown, setRecentsGrown] = React.useState(false);
4941
+ const recentsGrowRaf = React.useRef(0);
4942
+ React.useEffect(() => {
4943
+ recentsGrowRaf.current = requestAnimationFrame(() => {
4944
+ recentsGrowRaf.current = requestAnimationFrame(() => setRecentsGrown(true));
4945
+ });
4946
+ return () => cancelAnimationFrame(recentsGrowRaf.current);
4947
+ }, []);
4932
4948
  const accentVars = accent ? accentToCssVars(deriveAccent(accent), "colorwheel") : {};
4933
4949
  const lastEmitted = React.useRef(value);
4934
4950
  React.useEffect(() => {
@@ -5124,6 +5140,15 @@ function ColorWheel({
5124
5140
  if (next) commit(next.hsv, next.a);
5125
5141
  }
5126
5142
  function removeFavorite(hex) {
5143
+ setRemovingHexes((prev) => new Set(prev).add(hex));
5144
+ }
5145
+ function handleChipRemoveEnd(hex) {
5146
+ setRemovingHexes((prev) => {
5147
+ if (!prev.has(hex)) return prev;
5148
+ const next = new Set(prev);
5149
+ next.delete(hex);
5150
+ return next;
5151
+ });
5127
5152
  onFavoritesChange?.(favorites.filter((h) => h !== hex));
5128
5153
  }
5129
5154
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -5137,32 +5162,56 @@ function ColorWheel({
5137
5162
  ...size !== 1 ? { transform: `scale(${size})`, transformOrigin: "top center" } : void 0
5138
5163
  },
5139
5164
  children: [
5140
- favorites.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ColorWheel_module_default.recents, children: favorites.map((hex, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ColorWheel_module_default.chipWrap, style: { animationDelay: `${i * 0.02}s` }, children: [
5141
- /* @__PURE__ */ jsxRuntime.jsx(
5142
- "button",
5143
- {
5144
- type: "button",
5145
- className: ColorWheel_module_default.chip,
5146
- style: { background: hex.length > 7 ? hex.slice(0, 7) : hex },
5147
- title: hex,
5148
- "aria-label": `Apply color ${hex}`,
5149
- onClick: () => applyFavorite(hex)
5150
- }
5151
- ),
5152
- /* @__PURE__ */ jsxRuntime.jsx(
5153
- "button",
5154
- {
5155
- type: "button",
5156
- className: ColorWheel_module_default.chipRemove,
5157
- "aria-label": `Remove ${hex} from favorites`,
5158
- onClick: (e) => {
5159
- e.stopPropagation();
5160
- removeFavorite(hex);
5161
- },
5162
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 3, strokeLinecap: "round", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 6l12 12M18 6L6 18" }) })
5163
- }
5164
- )
5165
- ] }, hex + i)) }),
5165
+ (favorites.length > 0 || onFavoritesChange) && /* @__PURE__ */ jsxRuntime.jsx(
5166
+ "div",
5167
+ {
5168
+ className: [ColorWheel_module_default.recents, favorites.length === 0 ? ColorWheel_module_default.recentsEmpty : ""].join(" "),
5169
+ style: { width: recentsGrown ? recentsContentWidth(favorites.length) : 0 },
5170
+ children: favorites.map((hex, i) => (
5171
+ // keyed by hex alone (not index) so an add/remove -- which
5172
+ // shifts every other item's index -- doesn't remount and replay
5173
+ // the entrance animation on chips that were already there; only
5174
+ // a genuinely new hex mounts fresh and animates in
5175
+ /* @__PURE__ */ jsxRuntime.jsxs(
5176
+ "div",
5177
+ {
5178
+ className: [ColorWheel_module_default.chipWrap, removingHexes.has(hex) ? ColorWheel_module_default.chipWrapRemoving : ""].join(" "),
5179
+ style: { animationDelay: removingHexes.has(hex) ? void 0 : `${i * 0.05}s` },
5180
+ onAnimationEnd: (e) => {
5181
+ if (e.target === e.currentTarget && e.animationName.includes("chipOut")) handleChipRemoveEnd(hex);
5182
+ },
5183
+ children: [
5184
+ /* @__PURE__ */ jsxRuntime.jsx(
5185
+ "button",
5186
+ {
5187
+ type: "button",
5188
+ className: ColorWheel_module_default.chip,
5189
+ style: { background: hex.length > 7 ? hex.slice(0, 7) : hex },
5190
+ title: hex,
5191
+ "aria-label": `Apply color ${hex}`,
5192
+ onClick: () => applyFavorite(hex)
5193
+ }
5194
+ ),
5195
+ /* @__PURE__ */ jsxRuntime.jsx(
5196
+ "button",
5197
+ {
5198
+ type: "button",
5199
+ className: ColorWheel_module_default.chipRemove,
5200
+ "aria-label": `Remove ${hex} from favorites`,
5201
+ onClick: (e) => {
5202
+ e.stopPropagation();
5203
+ removeFavorite(hex);
5204
+ },
5205
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 3, strokeLinecap: "round", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 6l12 12M18 6L6 18" }) })
5206
+ }
5207
+ )
5208
+ ]
5209
+ },
5210
+ hex
5211
+ )
5212
+ ))
5213
+ }
5214
+ ),
5166
5215
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ColorWheel_module_default.picker, style: { height: arcVisible ? PICKER_HEIGHT_WITH_ARC : PICKER_HEIGHT_NO_ARC }, children: [
5167
5216
  /* @__PURE__ */ jsxRuntime.jsx(
5168
5217
  "div",