@particle-academy/react-fancy 3.2.2 → 3.4.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.
package/dist/index.cjs CHANGED
@@ -6408,6 +6408,102 @@ var Callout = react.forwardRef(
6408
6408
  }
6409
6409
  );
6410
6410
  Callout.displayName = "Callout";
6411
+ var colorClasses5 = {
6412
+ yellow: "bg-amber-100 text-amber-950 dark:bg-amber-200 dark:text-amber-950",
6413
+ blue: "bg-sky-100 text-sky-950 dark:bg-sky-200 dark:text-sky-950",
6414
+ green: "bg-emerald-100 text-emerald-950 dark:bg-emerald-200 dark:text-emerald-950",
6415
+ pink: "bg-pink-100 text-pink-950 dark:bg-pink-200 dark:text-pink-950",
6416
+ violet: "bg-violet-100 text-violet-950 dark:bg-violet-200 dark:text-violet-950"
6417
+ };
6418
+ var isPreset = (c) => c in colorClasses5;
6419
+ var StickyNote = react.forwardRef(
6420
+ ({
6421
+ value,
6422
+ defaultValue,
6423
+ onChange,
6424
+ color = "yellow",
6425
+ rotate = 0,
6426
+ width = 180,
6427
+ height = "auto",
6428
+ selected = false,
6429
+ editable = true,
6430
+ autoFocus = false,
6431
+ id,
6432
+ children,
6433
+ className,
6434
+ style
6435
+ }, ref) => {
6436
+ const isControlled = value !== void 0;
6437
+ const [internal, setInternal] = react.useState(defaultValue ?? "");
6438
+ const text = isControlled ? value : internal;
6439
+ const editRef = react.useRef(null);
6440
+ react.useEffect(() => {
6441
+ const el = editRef.current;
6442
+ if (el && document.activeElement !== el && el.textContent !== text) {
6443
+ el.textContent = text ?? "";
6444
+ }
6445
+ }, [text]);
6446
+ react.useEffect(() => {
6447
+ if (!editable || !autoFocus) return;
6448
+ const el = editRef.current;
6449
+ if (!el) return;
6450
+ el.focus();
6451
+ const range2 = document.createRange();
6452
+ range2.selectNodeContents(el);
6453
+ range2.collapse(false);
6454
+ const sel = window.getSelection();
6455
+ sel?.removeAllRanges();
6456
+ sel?.addRange(range2);
6457
+ }, [editable, autoFocus]);
6458
+ const commit = () => {
6459
+ const next = editRef.current?.textContent ?? "";
6460
+ if (next === text) return;
6461
+ if (!isControlled) setInternal(next);
6462
+ onChange?.(next);
6463
+ };
6464
+ const preset = isPreset(color);
6465
+ const content = children != null ? children : editable ? /* @__PURE__ */ jsxRuntime.jsx(
6466
+ "div",
6467
+ {
6468
+ ref: editRef,
6469
+ contentEditable: true,
6470
+ suppressContentEditableWarning: true,
6471
+ spellCheck: false,
6472
+ role: "textbox",
6473
+ "aria-multiline": "true",
6474
+ className: "outline-none whitespace-pre-wrap break-words min-h-[1.4em]",
6475
+ onBlur: commit,
6476
+ onKeyDown: (e) => {
6477
+ if (e.key === "Escape") e.currentTarget.blur();
6478
+ },
6479
+ children: text
6480
+ }
6481
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "whitespace-pre-wrap break-words", children: text });
6482
+ return /* @__PURE__ */ jsxRuntime.jsx(
6483
+ "div",
6484
+ {
6485
+ ref,
6486
+ id,
6487
+ "data-react-fancy-sticky": "",
6488
+ className: cn(
6489
+ "rounded-sm p-3.5 text-sm leading-relaxed shadow-[0_2px_8px_rgba(0,0,0,0.12),0_1px_2px_rgba(0,0,0,0.08)]",
6490
+ preset ? colorClasses5[color] : "text-zinc-900",
6491
+ selected && "ring-2 ring-blue-500 ring-offset-1",
6492
+ className
6493
+ ),
6494
+ style: {
6495
+ width,
6496
+ height,
6497
+ transform: rotate ? `rotate(${rotate}deg)` : void 0,
6498
+ ...preset ? null : { background: color },
6499
+ ...style
6500
+ },
6501
+ children: content
6502
+ }
6503
+ );
6504
+ }
6505
+ );
6506
+ StickyNote.displayName = "StickyNote";
6411
6507
  var TimelineContext = react.createContext({
6412
6508
  variant: "stacked",
6413
6509
  index: 0,
@@ -6673,6 +6769,127 @@ var Timeline = Object.assign(TimelineRoot, {
6673
6769
  Item: TimelineItem,
6674
6770
  Block: TimelineBlock
6675
6771
  });
6772
+ var TONE_CLASSES = {
6773
+ violet: "bg-violet-500 hover:bg-violet-600",
6774
+ emerald: "bg-emerald-500 hover:bg-emerald-600",
6775
+ sky: "bg-sky-500 hover:bg-sky-600",
6776
+ rose: "bg-rose-500 hover:bg-rose-600",
6777
+ amber: "bg-amber-500 hover:bg-amber-600",
6778
+ indigo: "bg-indigo-500 hover:bg-indigo-600",
6779
+ blue: "bg-blue-500 hover:bg-blue-600",
6780
+ zinc: "bg-zinc-500 hover:bg-zinc-600"
6781
+ };
6782
+ var OFF_CLASSES = "bg-zinc-100 hover:bg-zinc-200 dark:bg-zinc-800 dark:hover:bg-zinc-700";
6783
+ var TimeGrid = react.forwardRef(
6784
+ ({
6785
+ rows,
6786
+ cols,
6787
+ value,
6788
+ onChange,
6789
+ toneOn = "violet",
6790
+ cellWidth = 20,
6791
+ cellHeight = 16,
6792
+ sparseColLabels = true,
6793
+ toggleStripsOnHeaderClick = true,
6794
+ ariaCell,
6795
+ cellId,
6796
+ className
6797
+ }, ref) => {
6798
+ const [drag, setDrag] = react.useState(null);
6799
+ const setCell = (r, c, v) => {
6800
+ if (value[r]?.[c] === v) return;
6801
+ const next = value.map((row) => row.slice());
6802
+ next[r][c] = v;
6803
+ onChange(next);
6804
+ };
6805
+ const toggleRow = (r) => {
6806
+ if (!toggleStripsOnHeaderClick) return;
6807
+ const all = value[r].every(Boolean);
6808
+ const next = value.map((row) => row.slice());
6809
+ for (let c = 0; c < cols.length; c++) next[r][c] = !all;
6810
+ onChange(next);
6811
+ };
6812
+ const toggleCol = (c) => {
6813
+ if (!toggleStripsOnHeaderClick) return;
6814
+ const all = value.every((row) => row[c]);
6815
+ const next = value.map((row) => row.slice());
6816
+ for (let r = 0; r < rows.length; r++) next[r][c] = !all;
6817
+ onChange(next);
6818
+ };
6819
+ const colStep = Math.max(1, Math.floor(cols.length / 6));
6820
+ const onTone = TONE_CLASSES[toneOn];
6821
+ return /* @__PURE__ */ jsxRuntime.jsx(
6822
+ "div",
6823
+ {
6824
+ ref,
6825
+ "data-react-fancy-timegrid": "",
6826
+ className: cn(
6827
+ "select-none overflow-x-auto",
6828
+ className
6829
+ ),
6830
+ onMouseLeave: () => setDrag(null),
6831
+ onMouseUp: () => setDrag(null),
6832
+ children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "text-[10px]", children: [
6833
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
6834
+ /* @__PURE__ */ jsxRuntime.jsx("th", {}),
6835
+ cols.map((label, c) => /* @__PURE__ */ jsxRuntime.jsx(
6836
+ "th",
6837
+ {
6838
+ onClick: () => toggleCol(c),
6839
+ style: { width: cellWidth },
6840
+ "data-react-fancy-timegrid-col": c,
6841
+ className: cn(
6842
+ "text-zinc-400",
6843
+ toggleStripsOnHeaderClick && "cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-200"
6844
+ ),
6845
+ children: sparseColLabels ? c % colStep === 0 ? label : "" : label
6846
+ },
6847
+ c
6848
+ ))
6849
+ ] }) }),
6850
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((label, r) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
6851
+ /* @__PURE__ */ jsxRuntime.jsx(
6852
+ "th",
6853
+ {
6854
+ onClick: () => toggleRow(r),
6855
+ "data-react-fancy-timegrid-row": r,
6856
+ className: cn(
6857
+ "pr-1 text-right font-medium text-zinc-500",
6858
+ toggleStripsOnHeaderClick && "cursor-pointer hover:text-zinc-800 dark:hover:text-zinc-200"
6859
+ ),
6860
+ children: label
6861
+ }
6862
+ ),
6863
+ cols.map((_, c) => {
6864
+ const on = value[r]?.[c] ?? false;
6865
+ return /* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-px", children: /* @__PURE__ */ jsxRuntime.jsx(
6866
+ "button",
6867
+ {
6868
+ type: "button",
6869
+ onMouseDown: () => {
6870
+ const v = !on;
6871
+ setDrag(v);
6872
+ setCell(r, c, v);
6873
+ },
6874
+ onMouseEnter: () => drag !== null && setCell(r, c, drag),
6875
+ style: { width: cellWidth, height: cellHeight },
6876
+ "data-react-fancy-timegrid-cell": cellId ? cellId(r, c) : `${r}:${c}`,
6877
+ "aria-pressed": on,
6878
+ "aria-label": ariaCell ? ariaCell(r, c, on) : `${rows[r]} ${cols[c]} ${on ? "on" : "off"}`,
6879
+ className: cn(
6880
+ "block rounded-sm transition",
6881
+ on ? onTone : OFF_CLASSES
6882
+ )
6883
+ }
6884
+ ) }, c);
6885
+ })
6886
+ ] }, r)) })
6887
+ ] })
6888
+ }
6889
+ );
6890
+ }
6891
+ );
6892
+ TimeGrid.displayName = "TimeGrid";
6676
6893
  var Tooltip = react.forwardRef(
6677
6894
  function Tooltip2({ children, content, placement = "top", delay = 200, offset = 8, className }, _ref) {
6678
6895
  const [open, setOpen] = react.useState(false);
@@ -13174,11 +13391,13 @@ exports.Separator = Separator;
13174
13391
  exports.Sidebar = Sidebar;
13175
13392
  exports.Skeleton = Skeleton;
13176
13393
  exports.Slider = Slider;
13394
+ exports.StickyNote = StickyNote;
13177
13395
  exports.Switch = Switch;
13178
13396
  exports.Table = Table;
13179
13397
  exports.Tabs = Tabs;
13180
13398
  exports.Text = Text;
13181
13399
  exports.Textarea = Textarea;
13400
+ exports.TimeGrid = TimeGrid;
13182
13401
  exports.TimePicker = TimePicker;
13183
13402
  exports.Timeline = Timeline;
13184
13403
  exports.Toast = Toast;