@useclickly/react 1.0.2 → 1.0.3
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 +187 -1
- package/dist/index.js +205 -19
- package/dist/internal/Toolbar.d.ts.map +1 -1
- package/dist/internal/icons.d.ts +2 -0
- package/dist/internal/icons.d.ts.map +1 -1
- package/dist/internal/styles.d.ts +1 -1
- package/dist/internal/styles.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1373,6 +1373,18 @@ function Icon({
|
|
|
1373
1373
|
}
|
|
1374
1374
|
);
|
|
1375
1375
|
}
|
|
1376
|
+
var IconFreeze = () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Icon, { size: 15, children: [
|
|
1377
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", y1: "2", x2: "12", y2: "22" }),
|
|
1378
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "2", y1: "12", x2: "22", y2: "12" }),
|
|
1379
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "5", y1: "5", x2: "19", y2: "19" }),
|
|
1380
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "19", y1: "5", x2: "5", y2: "19" }),
|
|
1381
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "2", fill: "currentColor", stroke: "none" })
|
|
1382
|
+
] });
|
|
1383
|
+
var IconInfo = () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Icon, { size: 14, children: [
|
|
1384
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
|
|
1385
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", y1: "8", x2: "12", y2: "8", strokeWidth: "2.5" }),
|
|
1386
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", y1: "12", x2: "12", y2: "16" })
|
|
1387
|
+
] });
|
|
1376
1388
|
var IconCursor = () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M4 4l6 16 2-7 7-2z" }) });
|
|
1377
1389
|
var IconLayers = () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Icon, { children: [
|
|
1378
1390
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 2l9 5-9 5-9-5 9-5z" }),
|
|
@@ -1591,7 +1603,46 @@ function AnnotationCard({
|
|
|
1591
1603
|
|
|
1592
1604
|
// packages/react/src/internal/Toolbar.tsx
|
|
1593
1605
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
1594
|
-
var TOOLBAR_SIZE = { width:
|
|
1606
|
+
var TOOLBAR_SIZE = { width: 360, height: 44 };
|
|
1607
|
+
var SHORTCUTS = [
|
|
1608
|
+
{ keys: ["\u2318", "\u21E7", "F"], label: "Toggle toolbar" },
|
|
1609
|
+
{ keys: ["1"], label: "Single select mode" },
|
|
1610
|
+
{ keys: ["2"], label: "Multi select mode" },
|
|
1611
|
+
{ keys: ["3"], label: "Area drag mode" },
|
|
1612
|
+
{ keys: ["\u21B5"], label: "Annotate pinned elements" },
|
|
1613
|
+
{ keys: ["Esc"], label: "Cancel / clear / close" },
|
|
1614
|
+
{ keys: ["\u2318", "\u21B5"], label: "Submit annotation" },
|
|
1615
|
+
{ keys: ["C"], label: "Copy all annotations" },
|
|
1616
|
+
{ keys: ["X"], label: "Clear all annotations" }
|
|
1617
|
+
];
|
|
1618
|
+
function ShortcutsPanel() {
|
|
1619
|
+
const [visible, setVisible] = (0, import_react7.useState)(false);
|
|
1620
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1621
|
+
"span",
|
|
1622
|
+
{
|
|
1623
|
+
className: "clickly-tip shortcuts-trigger",
|
|
1624
|
+
onMouseEnter: () => setVisible(true),
|
|
1625
|
+
onMouseLeave: () => setVisible(false),
|
|
1626
|
+
children: [
|
|
1627
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1628
|
+
"button",
|
|
1629
|
+
{
|
|
1630
|
+
className: "clickly-btn icon-only",
|
|
1631
|
+
"aria-label": "Show keyboard shortcuts",
|
|
1632
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(IconInfo, {})
|
|
1633
|
+
}
|
|
1634
|
+
),
|
|
1635
|
+
visible && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "shortcuts-panel", role: "tooltip", children: [
|
|
1636
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "shortcuts-title", children: "Keyboard shortcuts" }),
|
|
1637
|
+
SHORTCUTS.map((s) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "shortcuts-row", children: [
|
|
1638
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "shortcuts-label", children: s.label }),
|
|
1639
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "shortcuts-keys", children: s.keys.map((k) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("kbd", { children: k }, k)) })
|
|
1640
|
+
] }, s.label))
|
|
1641
|
+
] })
|
|
1642
|
+
]
|
|
1643
|
+
}
|
|
1644
|
+
);
|
|
1645
|
+
}
|
|
1595
1646
|
function Tip({
|
|
1596
1647
|
label,
|
|
1597
1648
|
shortcut,
|
|
@@ -1612,7 +1663,38 @@ function Toolbar({ engine, onCollapse }) {
|
|
|
1612
1663
|
const outputDetail = useSettings((s) => s.outputDetail);
|
|
1613
1664
|
const [showSettings, setShowSettings] = (0, import_react7.useState)(false);
|
|
1614
1665
|
const [showList, setShowList] = (0, import_react7.useState)(false);
|
|
1666
|
+
const [frozen, setFrozen] = (0, import_react7.useState)(false);
|
|
1615
1667
|
const anchorRef = (0, import_react7.useRef)(null);
|
|
1668
|
+
(0, import_react7.useEffect)(() => {
|
|
1669
|
+
const STYLE_ID = "clickly-freeze-animations";
|
|
1670
|
+
const gsap = window.gsap;
|
|
1671
|
+
if (frozen) {
|
|
1672
|
+
if (!document.getElementById(STYLE_ID)) {
|
|
1673
|
+
const el = document.createElement("style");
|
|
1674
|
+
el.id = STYLE_ID;
|
|
1675
|
+
el.textContent = `
|
|
1676
|
+
*, *::before, *::after {
|
|
1677
|
+
animation-play-state: paused !important;
|
|
1678
|
+
transition-duration: 0ms !important;
|
|
1679
|
+
transition-delay: 0ms !important;
|
|
1680
|
+
}
|
|
1681
|
+
`;
|
|
1682
|
+
document.head.appendChild(el);
|
|
1683
|
+
}
|
|
1684
|
+
if (gsap?.globalTimeline) {
|
|
1685
|
+
gsap.globalTimeline.pause();
|
|
1686
|
+
}
|
|
1687
|
+
} else {
|
|
1688
|
+
document.getElementById(STYLE_ID)?.remove();
|
|
1689
|
+
if (gsap?.globalTimeline) {
|
|
1690
|
+
gsap.globalTimeline.resume();
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1693
|
+
return () => {
|
|
1694
|
+
document.getElementById(STYLE_ID)?.remove();
|
|
1695
|
+
if (gsap?.globalTimeline) gsap.globalTimeline.resume();
|
|
1696
|
+
};
|
|
1697
|
+
}, [frozen]);
|
|
1616
1698
|
const { position, handleProps } = useDraggable(
|
|
1617
1699
|
{
|
|
1618
1700
|
x: Math.max(8, window.innerWidth - TOOLBAR_SIZE.width - 16),
|
|
@@ -1695,6 +1777,16 @@ function Toolbar({ engine, onCollapse }) {
|
|
|
1695
1777
|
) }),
|
|
1696
1778
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "divider" })
|
|
1697
1779
|
] }),
|
|
1780
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Tip, { label: frozen ? "Unfreeze animations" : "Freeze animations", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1781
|
+
"button",
|
|
1782
|
+
{
|
|
1783
|
+
className: `clickly-btn icon-only${frozen ? " is-freeze" : ""}`,
|
|
1784
|
+
onClick: () => setFrozen((v) => !v),
|
|
1785
|
+
"aria-label": frozen ? "Unfreeze page animations" : "Freeze page animations",
|
|
1786
|
+
"aria-pressed": frozen,
|
|
1787
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(IconFreeze, {})
|
|
1788
|
+
}
|
|
1789
|
+
) }),
|
|
1698
1790
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Tip, { label: "Annotations", shortcut: "L", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1699
1791
|
"button",
|
|
1700
1792
|
{
|
|
@@ -1728,6 +1820,7 @@ function Toolbar({ engine, onCollapse }) {
|
|
|
1728
1820
|
}
|
|
1729
1821
|
) }),
|
|
1730
1822
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "divider" }),
|
|
1823
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ShortcutsPanel, {}),
|
|
1731
1824
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Tip, { label: "Settings", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1732
1825
|
"button",
|
|
1733
1826
|
{
|
|
@@ -2589,6 +2682,14 @@ var REACT_UI_CSS = `
|
|
|
2589
2682
|
.clickly-btn.is-active:hover { background: #0284c7; }
|
|
2590
2683
|
.clickly-btn[disabled] { opacity: 0.28; cursor: not-allowed; pointer-events: none; }
|
|
2591
2684
|
|
|
2685
|
+
/* Freeze-animations active state \u2014 icy blue */
|
|
2686
|
+
.clickly-btn.is-freeze {
|
|
2687
|
+
background: rgba(99, 179, 237, 0.18);
|
|
2688
|
+
color: #63b3ed;
|
|
2689
|
+
box-shadow: 0 0 0 1px rgba(99,179,237,0.35), 0 2px 8px rgba(99,179,237,0.2);
|
|
2690
|
+
}
|
|
2691
|
+
.clickly-btn.is-freeze:hover { background: rgba(99, 179, 237, 0.26); }
|
|
2692
|
+
|
|
2592
2693
|
.clickly-btn.icon-only {
|
|
2593
2694
|
width: 32px;
|
|
2594
2695
|
padding: 0;
|
|
@@ -2666,6 +2767,91 @@ var REACT_UI_CSS = `
|
|
|
2666
2767
|
color: #94a3b8;
|
|
2667
2768
|
}
|
|
2668
2769
|
|
|
2770
|
+
/* \u2500\u2500\u2500 Shortcuts panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
2771
|
+
|
|
2772
|
+
.shortcuts-trigger {
|
|
2773
|
+
position: relative;
|
|
2774
|
+
display: inline-flex;
|
|
2775
|
+
align-items: center;
|
|
2776
|
+
justify-content: center;
|
|
2777
|
+
}
|
|
2778
|
+
|
|
2779
|
+
.shortcuts-panel {
|
|
2780
|
+
position: absolute;
|
|
2781
|
+
bottom: calc(100% + 12px);
|
|
2782
|
+
left: 50%;
|
|
2783
|
+
transform: translateX(-50%);
|
|
2784
|
+
width: 260px;
|
|
2785
|
+
background: rgba(9, 14, 28, 0.97);
|
|
2786
|
+
border: 1px solid rgba(255,255,255,0.08);
|
|
2787
|
+
border-radius: 12px;
|
|
2788
|
+
box-shadow: 0 16px 40px rgba(0,0,0,0.45);
|
|
2789
|
+
padding: 10px;
|
|
2790
|
+
z-index: 10;
|
|
2791
|
+
animation: clickly-fade-in 100ms ease-out;
|
|
2792
|
+
pointer-events: none;
|
|
2793
|
+
}
|
|
2794
|
+
|
|
2795
|
+
/* Arrow pointing down */
|
|
2796
|
+
.shortcuts-panel::after {
|
|
2797
|
+
content: "";
|
|
2798
|
+
position: absolute;
|
|
2799
|
+
top: 100%;
|
|
2800
|
+
left: 50%;
|
|
2801
|
+
transform: translateX(-50%);
|
|
2802
|
+
border: 6px solid transparent;
|
|
2803
|
+
border-top-color: rgba(9, 14, 28, 0.97);
|
|
2804
|
+
}
|
|
2805
|
+
|
|
2806
|
+
.shortcuts-title {
|
|
2807
|
+
font: 600 11px/1 -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
|
|
2808
|
+
color: #64748b;
|
|
2809
|
+
text-transform: uppercase;
|
|
2810
|
+
letter-spacing: 0.06em;
|
|
2811
|
+
padding: 2px 4px 8px;
|
|
2812
|
+
border-bottom: 1px solid rgba(255,255,255,0.06);
|
|
2813
|
+
margin-bottom: 6px;
|
|
2814
|
+
}
|
|
2815
|
+
|
|
2816
|
+
.shortcuts-row {
|
|
2817
|
+
display: flex;
|
|
2818
|
+
align-items: center;
|
|
2819
|
+
justify-content: space-between;
|
|
2820
|
+
padding: 4px 4px;
|
|
2821
|
+
border-radius: 6px;
|
|
2822
|
+
gap: 8px;
|
|
2823
|
+
}
|
|
2824
|
+
.shortcuts-row:hover { background: rgba(255,255,255,0.04); }
|
|
2825
|
+
|
|
2826
|
+
.shortcuts-label {
|
|
2827
|
+
font: 12px/1.4 -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
|
|
2828
|
+
color: #94a3b8;
|
|
2829
|
+
flex: 1;
|
|
2830
|
+
min-width: 0;
|
|
2831
|
+
}
|
|
2832
|
+
|
|
2833
|
+
.shortcuts-keys {
|
|
2834
|
+
display: flex;
|
|
2835
|
+
gap: 3px;
|
|
2836
|
+
align-items: center;
|
|
2837
|
+
flex-shrink: 0;
|
|
2838
|
+
}
|
|
2839
|
+
|
|
2840
|
+
.shortcuts-keys kbd {
|
|
2841
|
+
display: inline-flex;
|
|
2842
|
+
align-items: center;
|
|
2843
|
+
justify-content: center;
|
|
2844
|
+
min-width: 20px;
|
|
2845
|
+
height: 20px;
|
|
2846
|
+
padding: 0 5px;
|
|
2847
|
+
background: rgba(255,255,255,0.08);
|
|
2848
|
+
border: 1px solid rgba(255,255,255,0.10);
|
|
2849
|
+
border-bottom-width: 2px;
|
|
2850
|
+
border-radius: 5px;
|
|
2851
|
+
font: 11px/1 ui-monospace, "SF Mono", Menlo, monospace;
|
|
2852
|
+
color: #e2e8f0;
|
|
2853
|
+
}
|
|
2854
|
+
|
|
2669
2855
|
/* \u2500\u2500\u2500 Popup & popovers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
2670
2856
|
|
|
2671
2857
|
.clickly-popup, .clickly-popover {
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// packages/react/src/Clickly.tsx
|
|
2
|
-
import { useEffect as
|
|
2
|
+
import { useEffect as useEffect8, useState as useState7 } from "react";
|
|
3
3
|
import { createPortal } from "react-dom";
|
|
4
4
|
|
|
5
5
|
// packages/core/dist/index.js
|
|
@@ -1016,10 +1016,10 @@ function hasFixedAncestor(el) {
|
|
|
1016
1016
|
}
|
|
1017
1017
|
|
|
1018
1018
|
// packages/react/src/internal/ClicklyRoot.tsx
|
|
1019
|
-
import { useEffect as
|
|
1019
|
+
import { useEffect as useEffect7, useState as useState6 } from "react";
|
|
1020
1020
|
|
|
1021
1021
|
// packages/react/src/internal/Toolbar.tsx
|
|
1022
|
-
import { useRef as useRef4, useState as useState3 } from "react";
|
|
1022
|
+
import { useEffect as useEffect4, useRef as useRef4, useState as useState3 } from "react";
|
|
1023
1023
|
|
|
1024
1024
|
// packages/react/src/hooks/useDraggable.ts
|
|
1025
1025
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
@@ -1332,6 +1332,18 @@ function Icon({
|
|
|
1332
1332
|
}
|
|
1333
1333
|
);
|
|
1334
1334
|
}
|
|
1335
|
+
var IconFreeze = () => /* @__PURE__ */ jsxs(Icon, { size: 15, children: [
|
|
1336
|
+
/* @__PURE__ */ jsx("line", { x1: "12", y1: "2", x2: "12", y2: "22" }),
|
|
1337
|
+
/* @__PURE__ */ jsx("line", { x1: "2", y1: "12", x2: "22", y2: "12" }),
|
|
1338
|
+
/* @__PURE__ */ jsx("line", { x1: "5", y1: "5", x2: "19", y2: "19" }),
|
|
1339
|
+
/* @__PURE__ */ jsx("line", { x1: "19", y1: "5", x2: "5", y2: "19" }),
|
|
1340
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "2", fill: "currentColor", stroke: "none" })
|
|
1341
|
+
] });
|
|
1342
|
+
var IconInfo = () => /* @__PURE__ */ jsxs(Icon, { size: 14, children: [
|
|
1343
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
|
|
1344
|
+
/* @__PURE__ */ jsx("line", { x1: "12", y1: "8", x2: "12", y2: "8", strokeWidth: "2.5" }),
|
|
1345
|
+
/* @__PURE__ */ jsx("line", { x1: "12", y1: "12", x2: "12", y2: "16" })
|
|
1346
|
+
] });
|
|
1335
1347
|
var IconCursor = () => /* @__PURE__ */ jsx(Icon, { children: /* @__PURE__ */ jsx("path", { d: "M4 4l6 16 2-7 7-2z" }) });
|
|
1336
1348
|
var IconLayers = () => /* @__PURE__ */ jsxs(Icon, { children: [
|
|
1337
1349
|
/* @__PURE__ */ jsx("path", { d: "M12 2l9 5-9 5-9-5 9-5z" }),
|
|
@@ -1550,7 +1562,46 @@ function AnnotationCard({
|
|
|
1550
1562
|
|
|
1551
1563
|
// packages/react/src/internal/Toolbar.tsx
|
|
1552
1564
|
import { Fragment, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1553
|
-
var TOOLBAR_SIZE = { width:
|
|
1565
|
+
var TOOLBAR_SIZE = { width: 360, height: 44 };
|
|
1566
|
+
var SHORTCUTS = [
|
|
1567
|
+
{ keys: ["\u2318", "\u21E7", "F"], label: "Toggle toolbar" },
|
|
1568
|
+
{ keys: ["1"], label: "Single select mode" },
|
|
1569
|
+
{ keys: ["2"], label: "Multi select mode" },
|
|
1570
|
+
{ keys: ["3"], label: "Area drag mode" },
|
|
1571
|
+
{ keys: ["\u21B5"], label: "Annotate pinned elements" },
|
|
1572
|
+
{ keys: ["Esc"], label: "Cancel / clear / close" },
|
|
1573
|
+
{ keys: ["\u2318", "\u21B5"], label: "Submit annotation" },
|
|
1574
|
+
{ keys: ["C"], label: "Copy all annotations" },
|
|
1575
|
+
{ keys: ["X"], label: "Clear all annotations" }
|
|
1576
|
+
];
|
|
1577
|
+
function ShortcutsPanel() {
|
|
1578
|
+
const [visible, setVisible] = useState3(false);
|
|
1579
|
+
return /* @__PURE__ */ jsxs4(
|
|
1580
|
+
"span",
|
|
1581
|
+
{
|
|
1582
|
+
className: "clickly-tip shortcuts-trigger",
|
|
1583
|
+
onMouseEnter: () => setVisible(true),
|
|
1584
|
+
onMouseLeave: () => setVisible(false),
|
|
1585
|
+
children: [
|
|
1586
|
+
/* @__PURE__ */ jsx4(
|
|
1587
|
+
"button",
|
|
1588
|
+
{
|
|
1589
|
+
className: "clickly-btn icon-only",
|
|
1590
|
+
"aria-label": "Show keyboard shortcuts",
|
|
1591
|
+
children: /* @__PURE__ */ jsx4(IconInfo, {})
|
|
1592
|
+
}
|
|
1593
|
+
),
|
|
1594
|
+
visible && /* @__PURE__ */ jsxs4("div", { className: "shortcuts-panel", role: "tooltip", children: [
|
|
1595
|
+
/* @__PURE__ */ jsx4("div", { className: "shortcuts-title", children: "Keyboard shortcuts" }),
|
|
1596
|
+
SHORTCUTS.map((s) => /* @__PURE__ */ jsxs4("div", { className: "shortcuts-row", children: [
|
|
1597
|
+
/* @__PURE__ */ jsx4("span", { className: "shortcuts-label", children: s.label }),
|
|
1598
|
+
/* @__PURE__ */ jsx4("span", { className: "shortcuts-keys", children: s.keys.map((k) => /* @__PURE__ */ jsx4("kbd", { children: k }, k)) })
|
|
1599
|
+
] }, s.label))
|
|
1600
|
+
] })
|
|
1601
|
+
]
|
|
1602
|
+
}
|
|
1603
|
+
);
|
|
1604
|
+
}
|
|
1554
1605
|
function Tip({
|
|
1555
1606
|
label,
|
|
1556
1607
|
shortcut,
|
|
@@ -1571,7 +1622,38 @@ function Toolbar({ engine, onCollapse }) {
|
|
|
1571
1622
|
const outputDetail = useSettings((s) => s.outputDetail);
|
|
1572
1623
|
const [showSettings, setShowSettings] = useState3(false);
|
|
1573
1624
|
const [showList, setShowList] = useState3(false);
|
|
1625
|
+
const [frozen, setFrozen] = useState3(false);
|
|
1574
1626
|
const anchorRef = useRef4(null);
|
|
1627
|
+
useEffect4(() => {
|
|
1628
|
+
const STYLE_ID = "clickly-freeze-animations";
|
|
1629
|
+
const gsap = window.gsap;
|
|
1630
|
+
if (frozen) {
|
|
1631
|
+
if (!document.getElementById(STYLE_ID)) {
|
|
1632
|
+
const el = document.createElement("style");
|
|
1633
|
+
el.id = STYLE_ID;
|
|
1634
|
+
el.textContent = `
|
|
1635
|
+
*, *::before, *::after {
|
|
1636
|
+
animation-play-state: paused !important;
|
|
1637
|
+
transition-duration: 0ms !important;
|
|
1638
|
+
transition-delay: 0ms !important;
|
|
1639
|
+
}
|
|
1640
|
+
`;
|
|
1641
|
+
document.head.appendChild(el);
|
|
1642
|
+
}
|
|
1643
|
+
if (gsap?.globalTimeline) {
|
|
1644
|
+
gsap.globalTimeline.pause();
|
|
1645
|
+
}
|
|
1646
|
+
} else {
|
|
1647
|
+
document.getElementById(STYLE_ID)?.remove();
|
|
1648
|
+
if (gsap?.globalTimeline) {
|
|
1649
|
+
gsap.globalTimeline.resume();
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
return () => {
|
|
1653
|
+
document.getElementById(STYLE_ID)?.remove();
|
|
1654
|
+
if (gsap?.globalTimeline) gsap.globalTimeline.resume();
|
|
1655
|
+
};
|
|
1656
|
+
}, [frozen]);
|
|
1575
1657
|
const { position, handleProps } = useDraggable(
|
|
1576
1658
|
{
|
|
1577
1659
|
x: Math.max(8, window.innerWidth - TOOLBAR_SIZE.width - 16),
|
|
@@ -1654,6 +1736,16 @@ function Toolbar({ engine, onCollapse }) {
|
|
|
1654
1736
|
) }),
|
|
1655
1737
|
/* @__PURE__ */ jsx4("div", { className: "divider" })
|
|
1656
1738
|
] }),
|
|
1739
|
+
/* @__PURE__ */ jsx4(Tip, { label: frozen ? "Unfreeze animations" : "Freeze animations", children: /* @__PURE__ */ jsx4(
|
|
1740
|
+
"button",
|
|
1741
|
+
{
|
|
1742
|
+
className: `clickly-btn icon-only${frozen ? " is-freeze" : ""}`,
|
|
1743
|
+
onClick: () => setFrozen((v) => !v),
|
|
1744
|
+
"aria-label": frozen ? "Unfreeze page animations" : "Freeze page animations",
|
|
1745
|
+
"aria-pressed": frozen,
|
|
1746
|
+
children: /* @__PURE__ */ jsx4(IconFreeze, {})
|
|
1747
|
+
}
|
|
1748
|
+
) }),
|
|
1657
1749
|
/* @__PURE__ */ jsx4(Tip, { label: "Annotations", shortcut: "L", children: /* @__PURE__ */ jsxs4(
|
|
1658
1750
|
"button",
|
|
1659
1751
|
{
|
|
@@ -1687,6 +1779,7 @@ function Toolbar({ engine, onCollapse }) {
|
|
|
1687
1779
|
}
|
|
1688
1780
|
) }),
|
|
1689
1781
|
/* @__PURE__ */ jsx4("div", { className: "divider" }),
|
|
1782
|
+
/* @__PURE__ */ jsx4(ShortcutsPanel, {}),
|
|
1690
1783
|
/* @__PURE__ */ jsx4(Tip, { label: "Settings", children: /* @__PURE__ */ jsx4(
|
|
1691
1784
|
"button",
|
|
1692
1785
|
{
|
|
@@ -1747,7 +1840,7 @@ function CollapsedFAB({ onExpand }) {
|
|
|
1747
1840
|
}
|
|
1748
1841
|
|
|
1749
1842
|
// packages/react/src/internal/AnnotationPopup.tsx
|
|
1750
|
-
import { useCallback as useCallback2, useEffect as
|
|
1843
|
+
import { useCallback as useCallback2, useEffect as useEffect5, useRef as useRef5, useState as useState4 } from "react";
|
|
1751
1844
|
import { nanoid } from "nanoid";
|
|
1752
1845
|
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1753
1846
|
var POPUP_W = 320;
|
|
@@ -1765,7 +1858,7 @@ function AnnotationPopup({ engine }) {
|
|
|
1765
1858
|
const targetElRef = useRef5(null);
|
|
1766
1859
|
const taRef = useRef5(null);
|
|
1767
1860
|
const popupRef = useRef5(null);
|
|
1768
|
-
|
|
1861
|
+
useEffect5(() => {
|
|
1769
1862
|
if (state.kind === "annotating") {
|
|
1770
1863
|
setComment("");
|
|
1771
1864
|
setShowStyles(false);
|
|
@@ -1782,7 +1875,7 @@ function AnnotationPopup({ engine }) {
|
|
|
1782
1875
|
requestAnimationFrame(() => taRef.current?.focus());
|
|
1783
1876
|
}
|
|
1784
1877
|
}, [state.kind, engine]);
|
|
1785
|
-
|
|
1878
|
+
useEffect5(() => {
|
|
1786
1879
|
if (state.kind !== "annotating") return;
|
|
1787
1880
|
const onDown = (e) => {
|
|
1788
1881
|
if (popupRef.current && e.composedPath().includes(popupRef.current)) return;
|
|
@@ -1900,10 +1993,10 @@ function AnnotationPopup({ engine }) {
|
|
|
1900
1993
|
if (left + POPUP_W > vw) left = Math.max(8, vw - POPUP_W - 8);
|
|
1901
1994
|
setPlacement({ top, left, label });
|
|
1902
1995
|
}, [state, engine]);
|
|
1903
|
-
|
|
1996
|
+
useEffect5(() => {
|
|
1904
1997
|
calcPlacement();
|
|
1905
1998
|
}, [calcPlacement]);
|
|
1906
|
-
|
|
1999
|
+
useEffect5(() => {
|
|
1907
2000
|
if (state.kind !== "annotating") return;
|
|
1908
2001
|
const onScroll = () => calcPlacement();
|
|
1909
2002
|
window.addEventListener("scroll", onScroll, { capture: true, passive: true });
|
|
@@ -2087,12 +2180,12 @@ function describeSelection(sel) {
|
|
|
2087
2180
|
}
|
|
2088
2181
|
|
|
2089
2182
|
// packages/react/src/internal/AnnotationPins.tsx
|
|
2090
|
-
import { useEffect as
|
|
2183
|
+
import { useEffect as useEffect6, useRef as useRef6, useState as useState5 } from "react";
|
|
2091
2184
|
import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
2092
2185
|
function AnnotationPins() {
|
|
2093
2186
|
const annotations = useAnnotationsList();
|
|
2094
2187
|
const [, setVersion] = useState5(0);
|
|
2095
|
-
|
|
2188
|
+
useEffect6(() => {
|
|
2096
2189
|
let raf = null;
|
|
2097
2190
|
const update = () => {
|
|
2098
2191
|
if (raf !== null) return;
|
|
@@ -2192,7 +2285,7 @@ function Pin({ number, annotation }) {
|
|
|
2192
2285
|
if (e.key === "Escape") closeEdit();
|
|
2193
2286
|
if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) save();
|
|
2194
2287
|
};
|
|
2195
|
-
|
|
2288
|
+
useEffect6(() => {
|
|
2196
2289
|
if (!editing) return;
|
|
2197
2290
|
const onDown = (e) => {
|
|
2198
2291
|
if (editRef.current && e.composedPath().includes(editRef.current)) return;
|
|
@@ -2201,7 +2294,7 @@ function Pin({ number, annotation }) {
|
|
|
2201
2294
|
window.addEventListener("pointerdown", onDown, true);
|
|
2202
2295
|
return () => window.removeEventListener("pointerdown", onDown, true);
|
|
2203
2296
|
}, [editing]);
|
|
2204
|
-
|
|
2297
|
+
useEffect6(() => {
|
|
2205
2298
|
if (!editing) return;
|
|
2206
2299
|
let el = null;
|
|
2207
2300
|
if (annotation.elementPath) {
|
|
@@ -2340,17 +2433,17 @@ function ClicklyRoot({
|
|
|
2340
2433
|
const outputDetail = useSettings((s) => s.outputDetail);
|
|
2341
2434
|
const markerColor = useSettings((s) => s.markerColor);
|
|
2342
2435
|
const engineState = useEngineState(engine);
|
|
2343
|
-
|
|
2436
|
+
useEffect7(() => {
|
|
2344
2437
|
host.style.setProperty("--clickly-hover", markerColor);
|
|
2345
2438
|
}, [host, markerColor]);
|
|
2346
|
-
|
|
2439
|
+
useEffect7(() => {
|
|
2347
2440
|
if (expanded) {
|
|
2348
2441
|
if (engine.getSnapshot().kind === "idle") engine.activate("single");
|
|
2349
2442
|
} else {
|
|
2350
2443
|
if (engine.getSnapshot().kind !== "idle") engine.deactivate();
|
|
2351
2444
|
}
|
|
2352
2445
|
}, [expanded, engine]);
|
|
2353
|
-
|
|
2446
|
+
useEffect7(() => {
|
|
2354
2447
|
const active = engineState.kind !== "idle";
|
|
2355
2448
|
if (active) document.body.setAttribute("data-clickly-active", "");
|
|
2356
2449
|
else document.body.removeAttribute("data-clickly-active");
|
|
@@ -2368,7 +2461,7 @@ function ClicklyRoot({
|
|
|
2368
2461
|
document.body.removeAttribute("data-clickly-annotating");
|
|
2369
2462
|
};
|
|
2370
2463
|
}, [engineState]);
|
|
2371
|
-
|
|
2464
|
+
useEffect7(() => {
|
|
2372
2465
|
const onKey = (e) => {
|
|
2373
2466
|
const tag = e.target?.tagName;
|
|
2374
2467
|
if (tag === "INPUT" || tag === "TEXTAREA") return;
|
|
@@ -2548,6 +2641,14 @@ var REACT_UI_CSS = `
|
|
|
2548
2641
|
.clickly-btn.is-active:hover { background: #0284c7; }
|
|
2549
2642
|
.clickly-btn[disabled] { opacity: 0.28; cursor: not-allowed; pointer-events: none; }
|
|
2550
2643
|
|
|
2644
|
+
/* Freeze-animations active state \u2014 icy blue */
|
|
2645
|
+
.clickly-btn.is-freeze {
|
|
2646
|
+
background: rgba(99, 179, 237, 0.18);
|
|
2647
|
+
color: #63b3ed;
|
|
2648
|
+
box-shadow: 0 0 0 1px rgba(99,179,237,0.35), 0 2px 8px rgba(99,179,237,0.2);
|
|
2649
|
+
}
|
|
2650
|
+
.clickly-btn.is-freeze:hover { background: rgba(99, 179, 237, 0.26); }
|
|
2651
|
+
|
|
2551
2652
|
.clickly-btn.icon-only {
|
|
2552
2653
|
width: 32px;
|
|
2553
2654
|
padding: 0;
|
|
@@ -2625,6 +2726,91 @@ var REACT_UI_CSS = `
|
|
|
2625
2726
|
color: #94a3b8;
|
|
2626
2727
|
}
|
|
2627
2728
|
|
|
2729
|
+
/* \u2500\u2500\u2500 Shortcuts panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
2730
|
+
|
|
2731
|
+
.shortcuts-trigger {
|
|
2732
|
+
position: relative;
|
|
2733
|
+
display: inline-flex;
|
|
2734
|
+
align-items: center;
|
|
2735
|
+
justify-content: center;
|
|
2736
|
+
}
|
|
2737
|
+
|
|
2738
|
+
.shortcuts-panel {
|
|
2739
|
+
position: absolute;
|
|
2740
|
+
bottom: calc(100% + 12px);
|
|
2741
|
+
left: 50%;
|
|
2742
|
+
transform: translateX(-50%);
|
|
2743
|
+
width: 260px;
|
|
2744
|
+
background: rgba(9, 14, 28, 0.97);
|
|
2745
|
+
border: 1px solid rgba(255,255,255,0.08);
|
|
2746
|
+
border-radius: 12px;
|
|
2747
|
+
box-shadow: 0 16px 40px rgba(0,0,0,0.45);
|
|
2748
|
+
padding: 10px;
|
|
2749
|
+
z-index: 10;
|
|
2750
|
+
animation: clickly-fade-in 100ms ease-out;
|
|
2751
|
+
pointer-events: none;
|
|
2752
|
+
}
|
|
2753
|
+
|
|
2754
|
+
/* Arrow pointing down */
|
|
2755
|
+
.shortcuts-panel::after {
|
|
2756
|
+
content: "";
|
|
2757
|
+
position: absolute;
|
|
2758
|
+
top: 100%;
|
|
2759
|
+
left: 50%;
|
|
2760
|
+
transform: translateX(-50%);
|
|
2761
|
+
border: 6px solid transparent;
|
|
2762
|
+
border-top-color: rgba(9, 14, 28, 0.97);
|
|
2763
|
+
}
|
|
2764
|
+
|
|
2765
|
+
.shortcuts-title {
|
|
2766
|
+
font: 600 11px/1 -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
|
|
2767
|
+
color: #64748b;
|
|
2768
|
+
text-transform: uppercase;
|
|
2769
|
+
letter-spacing: 0.06em;
|
|
2770
|
+
padding: 2px 4px 8px;
|
|
2771
|
+
border-bottom: 1px solid rgba(255,255,255,0.06);
|
|
2772
|
+
margin-bottom: 6px;
|
|
2773
|
+
}
|
|
2774
|
+
|
|
2775
|
+
.shortcuts-row {
|
|
2776
|
+
display: flex;
|
|
2777
|
+
align-items: center;
|
|
2778
|
+
justify-content: space-between;
|
|
2779
|
+
padding: 4px 4px;
|
|
2780
|
+
border-radius: 6px;
|
|
2781
|
+
gap: 8px;
|
|
2782
|
+
}
|
|
2783
|
+
.shortcuts-row:hover { background: rgba(255,255,255,0.04); }
|
|
2784
|
+
|
|
2785
|
+
.shortcuts-label {
|
|
2786
|
+
font: 12px/1.4 -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
|
|
2787
|
+
color: #94a3b8;
|
|
2788
|
+
flex: 1;
|
|
2789
|
+
min-width: 0;
|
|
2790
|
+
}
|
|
2791
|
+
|
|
2792
|
+
.shortcuts-keys {
|
|
2793
|
+
display: flex;
|
|
2794
|
+
gap: 3px;
|
|
2795
|
+
align-items: center;
|
|
2796
|
+
flex-shrink: 0;
|
|
2797
|
+
}
|
|
2798
|
+
|
|
2799
|
+
.shortcuts-keys kbd {
|
|
2800
|
+
display: inline-flex;
|
|
2801
|
+
align-items: center;
|
|
2802
|
+
justify-content: center;
|
|
2803
|
+
min-width: 20px;
|
|
2804
|
+
height: 20px;
|
|
2805
|
+
padding: 0 5px;
|
|
2806
|
+
background: rgba(255,255,255,0.08);
|
|
2807
|
+
border: 1px solid rgba(255,255,255,0.10);
|
|
2808
|
+
border-bottom-width: 2px;
|
|
2809
|
+
border-radius: 5px;
|
|
2810
|
+
font: 11px/1 ui-monospace, "SF Mono", Menlo, monospace;
|
|
2811
|
+
color: #e2e8f0;
|
|
2812
|
+
}
|
|
2813
|
+
|
|
2628
2814
|
/* \u2500\u2500\u2500 Popup & popovers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
2629
2815
|
|
|
2630
2816
|
.clickly-popup, .clickly-popover {
|
|
@@ -3401,7 +3587,7 @@ body[data-clickly-annotating] {
|
|
|
3401
3587
|
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
3402
3588
|
function Clickly({ className } = {}) {
|
|
3403
3589
|
const [mount, setMount] = useState7(null);
|
|
3404
|
-
|
|
3590
|
+
useEffect8(() => {
|
|
3405
3591
|
if (typeof window === "undefined" || typeof document === "undefined") return;
|
|
3406
3592
|
let shadow = null;
|
|
3407
3593
|
let engine = null;
|
|
@@ -3450,7 +3636,7 @@ function Clickly({ className } = {}) {
|
|
|
3450
3636
|
document.body.removeAttribute("data-clickly-mode");
|
|
3451
3637
|
};
|
|
3452
3638
|
}, []);
|
|
3453
|
-
|
|
3639
|
+
useEffect8(() => {
|
|
3454
3640
|
if (!mount || !className) return;
|
|
3455
3641
|
mount.shadow.host.className = className;
|
|
3456
3642
|
return () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../src/internal/Toolbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../src/internal/Toolbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,kBAAkB,CAAC;AAoEvE,UAAU,KAAK;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAuBD,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,KAAK,+BAgPpD"}
|
package/dist/internal/icons.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export declare const IconFreeze: () => import("react").JSX.Element;
|
|
2
|
+
export declare const IconInfo: () => import("react").JSX.Element;
|
|
1
3
|
export declare const IconCursor: () => import("react").JSX.Element;
|
|
2
4
|
export declare const IconLayers: () => import("react").JSX.Element;
|
|
3
5
|
export declare const IconSquare: () => import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/internal/icons.tsx"],"names":[],"mappings":"AA0BA,eAAO,MAAM,UAAU,mCAItB,CAAC;AAEF,eAAO,MAAM,UAAU,mCAMtB,CAAC;AAEF,eAAO,MAAM,UAAU,mCAItB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCAKpB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAIrB,CAAC;AAEF,eAAO,MAAM,YAAY,mCAKxB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCASpB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAIrB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAIrB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCAIpB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAIrB,CAAC"}
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/internal/icons.tsx"],"names":[],"mappings":"AA0BA,eAAO,MAAM,UAAU,mCAStB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCAMpB,CAAC;AAEF,eAAO,MAAM,UAAU,mCAItB,CAAC;AAEF,eAAO,MAAM,UAAU,mCAMtB,CAAC;AAEF,eAAO,MAAM,UAAU,mCAItB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCAKpB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAIrB,CAAC;AAEF,eAAO,MAAM,YAAY,mCAKxB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCASpB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAIrB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAIrB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCAIpB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAIrB,CAAC"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* the overlay-marker CSS in `@useclickly/core/styles` so each package owns
|
|
4
4
|
* its surface.
|
|
5
5
|
*/
|
|
6
|
-
export declare const REACT_UI_CSS = "\n.clickly-ui, .clickly-ui * { box-sizing: border-box; }\n\n/* \u2500\u2500\u2500 Floating action button (collapsed state) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-fab {\n position: fixed;\n right: 16px;\n bottom: 16px;\n width: 48px;\n height: 48px;\n border: none;\n border-radius: 999px;\n background: #0f172a;\n color: #f8fafc;\n display: grid;\n place-items: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow:\n 0 8px 24px rgba(0,0,0,0.30),\n 0 0 0 1px rgba(255,255,255,0.06) inset;\n transition: transform 140ms ease, box-shadow 140ms ease;\n z-index: 1;\n}\n.clickly-fab:hover {\n transform: scale(1.06);\n box-shadow:\n 0 10px 28px rgba(0,0,0,0.36),\n 0 0 0 1px rgba(255,255,255,0.10) inset;\n}\n.clickly-fab:active { transform: scale(0.96); }\n.clickly-fab svg { width: 18px; height: 18px; color: #f8fafc; }\n\n.clickly-fab-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: #f59e0b;\n color: #0f172a;\n font: 600 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n border-radius: 9px;\n display: grid;\n place-items: center;\n pointer-events: none;\n}\n\n/* \u2500\u2500\u2500 Toolbar (expanded state) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-toolbar {\n position: fixed;\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 6px;\n height: 44px;\n background: rgba(9, 14, 28, 0.97);\n color: #f8fafc;\n border-radius: 16px;\n font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n box-shadow:\n 0 16px 40px rgba(0,0,0,0.45),\n 0 0 0 1px rgba(255,255,255,0.08) inset,\n 0 1px 0 rgba(255,255,255,0.06) inset;\n pointer-events: auto;\n user-select: none;\n z-index: 1;\n animation: clickly-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes clickly-fade-in {\n from { opacity: 0; transform: translateY(6px) scale(0.97); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n.clickly-toolbar .grip {\n display: grid;\n place-items: center;\n width: 22px;\n height: 32px;\n color: #475569;\n touch-action: none;\n cursor: grab;\n border-radius: 6px;\n transition: color 120ms ease;\n}\n.clickly-toolbar .grip:hover { color: #94a3b8; }\n.clickly-toolbar .grip:active { cursor: grabbing; }\n\n.clickly-toolbar .divider {\n width: 1px;\n height: 20px;\n background: rgba(255,255,255,0.08);\n margin: 0 3px;\n flex-shrink: 0;\n}\n\n.clickly-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n height: 32px;\n padding: 0 8px;\n background: transparent;\n border: none;\n border-radius: 10px;\n color: #94a3b8;\n cursor: pointer;\n font: inherit;\n transition: background 100ms ease, color 100ms ease;\n position: relative;\n}\n.clickly-btn:hover { background: rgba(255,255,255,0.09); color: #e2e8f0; }\n.clickly-btn:active { background: rgba(255,255,255,0.15); color: #fff; transform: scale(0.96); }\n.clickly-btn.is-active {\n background: #0ea5e9;\n color: #fff;\n box-shadow: 0 0 0 1px rgba(14,165,233,0.4), 0 2px 8px rgba(14,165,233,0.3);\n}\n.clickly-btn.is-active:hover { background: #0284c7; }\n.clickly-btn[disabled] { opacity: 0.28; cursor: not-allowed; pointer-events: none; }\n\n.clickly-btn.icon-only {\n width: 32px;\n padding: 0;\n}\n\n.clickly-btn.primary-pinned {\n background: #10b981;\n color: #fff;\n font-weight: 600;\n font-size: 12px;\n padding: 0 10px;\n gap: 5px;\n box-shadow: 0 0 0 1px rgba(16,185,129,0.4), 0 2px 8px rgba(16,185,129,0.25);\n}\n.clickly-btn.primary-pinned:hover { background: #059669; }\n\n/* \u2500\u2500\u2500 Tooltip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-tip {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n /* Ensures the absolute-positioned counter badge clips correctly */\n isolation: isolate;\n}\n\n.clickly-tip .tip-bubble {\n position: absolute;\n bottom: calc(100% + 10px);\n left: 50%;\n transform: translateX(-50%);\n background: rgba(15, 23, 42, 0.98);\n color: #f1f5f9;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n padding: 5px 10px;\n border-radius: 8px;\n pointer-events: none;\n opacity: 0;\n transition: opacity 80ms ease;\n transition-delay: 200ms;\n box-shadow: 0 4px 16px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.07) inset;\n display: flex;\n align-items: center;\n gap: 6px;\n z-index: 10;\n}\n\n/* Arrow */\n.clickly-tip .tip-bubble::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-top-color: rgba(15, 23, 42, 0.98);\n}\n\n.clickly-tip:hover .tip-bubble { opacity: 1; }\n\n.clickly-tip .tip-bubble kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 4px;\n background: rgba(255,255,255,0.12);\n border: 1px solid rgba(255,255,255,0.10);\n border-radius: 4px;\n font: 11px/1 ui-monospace, \"SF Mono\", Menlo, monospace;\n color: #94a3b8;\n}\n\n/* \u2500\u2500\u2500 Popup & popovers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-popup, .clickly-popover {\n position: fixed;\n background: #fff;\n color: #0f172a;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 120ms ease-out;\n}\n\n.clickly-popup {\n width: 320px;\n padding: 12px;\n max-height: calc(100vh - 80px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n/* \u2500\u2500\u2500 Shared inner styles \u2014 apply to both popup and pin-edit \u2500\u2500\u2500 */\n\n.clickly-popup .popup-header,\n.pin-edit .popup-header {\n display: flex;\n align-items: center;\n gap: 5px;\n margin-bottom: 8px;\n padding: 4px 2px;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n color: #475569;\n font-size: 11px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n transition: background 80ms ease;\n}\n.clickly-popup .popup-header:hover,\n.pin-edit .popup-header:hover { background: #f1f5f9; }\n\n.clickly-popup .popup-chevron,\n.pin-edit .popup-chevron {\n font-size: 12px;\n color: #94a3b8;\n flex-shrink: 0;\n width: 12px;\n text-align: center;\n}\n\n.clickly-popup .popup-label,\n.pin-edit .popup-label {\n flex: 1;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n/* Edit-mode toggle button \u2014 top-right of CSS panel header */\n.clickly-popup .popup-edit-toggle {\n flex-shrink: 0;\n display: grid;\n place-items: center;\n width: 20px;\n height: 20px;\n background: transparent;\n border: 1px solid #e2e8f0;\n border-radius: 5px;\n color: #94a3b8;\n cursor: pointer;\n padding: 0;\n margin-left: auto;\n transition: background 100ms ease, color 100ms ease, border-color 100ms ease;\n}\n.clickly-popup .popup-edit-toggle:hover {\n background: #f1f5f9;\n color: #475569;\n border-color: #cbd5e1;\n}\n.clickly-popup .popup-edit-toggle.is-editing {\n background: #0ea5e9;\n color: #fff;\n border-color: #0ea5e9;\n}\n.clickly-popup .popup-edit-toggle.is-editing:hover {\n background: #0284c7;\n}\n\n/* Computed-styles panel */\n.clickly-popup .popup-styles,\n.pin-edit .popup-styles {\n margin-bottom: 8px;\n padding: 8px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 11px;\n max-height: 160px;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.clickly-popup .style-row,\n.pin-edit .style-row {\n display: flex;\n align-items: center;\n gap: 6px;\n line-height: 1.7;\n border-radius: 4px;\n padding: 0 2px;\n transition: background 80ms ease;\n}\n\n.clickly-popup .style-row--changed,\n.pin-edit .style-row--changed {\n background: rgba(245, 158, 11, 0.10);\n}\n\n.clickly-popup .style-key,\n.pin-edit .style-key {\n color: #7c3aed;\n flex-shrink: 0;\n min-width: 90px;\n font-size: 11px;\n}\n\n.clickly-popup .style-val,\n.pin-edit .style-val {\n color: #0f172a;\n font-size: 11px;\n word-break: break-all;\n flex: 1;\n}\n\n/* Editable value input \u2014 live CSS preview */\n.clickly-popup .style-val-input {\n flex: 1;\n min-width: 0;\n background: transparent;\n border: none;\n border-bottom: 1px solid transparent;\n color: #0f172a;\n font: 11px/1.7 ui-monospace, \"SF Mono\", Menlo, monospace;\n padding: 0;\n outline: none;\n transition: border-color 100ms ease;\n word-break: break-all;\n}\n.clickly-popup .style-val-input:focus {\n border-bottom-color: #0ea5e9;\n background: rgba(14, 165, 233, 0.05);\n border-radius: 2px 2px 0 0;\n}\n\n/* Revert button shown only on changed rows */\n.clickly-popup .style-revert-btn {\n flex-shrink: 0;\n background: transparent;\n border: none;\n color: #94a3b8;\n font-size: 13px;\n cursor: pointer;\n padding: 0 2px;\n line-height: 1;\n border-radius: 3px;\n transition: color 80ms ease, background 80ms ease;\n}\n.clickly-popup .style-revert-btn:hover {\n color: #f59e0b;\n background: rgba(245,158,11,0.12);\n}\n\n/* Hint text at bottom of CSS panel */\n.clickly-popup .style-hint,\n.pin-edit .style-hint {\n margin-top: 6px;\n padding-top: 6px;\n border-top: 1px solid #e2e8f0;\n font-size: 10.5px;\n color: #94a3b8;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n line-height: 1.4;\n}\n\n.clickly-popup textarea,\n.pin-edit textarea {\n width: 100%;\n min-height: 64px;\n max-height: 160px;\n padding: 8px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n resize: vertical;\n font: inherit;\n color: inherit;\n}\n.clickly-popup textarea:focus,\n.pin-edit textarea:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n\n.clickly-popup .row,\n.pin-edit .row {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n margin-top: 10px;\n}\n\n.clickly-popup .row .ghost,\n.pin-edit .row .ghost {\n background: transparent;\n color: #475569;\n border: 1px solid #e2e8f0;\n}\n.clickly-popup .row .ghost:hover,\n.pin-edit .row .ghost:hover { background: #f8fafc; }\n\n.clickly-popup .row .primary,\n.pin-edit .row .primary {\n background: #0ea5e9;\n color: #fff;\n border: none;\n}\n.clickly-popup .row .primary:hover,\n.pin-edit .row .primary:hover { background: #0284c7; }\n.clickly-popup .row button,\n.pin-edit .row button {\n height: 28px;\n padding: 0 12px;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n}\n\n/* Old popover kept for any legacy use */\n.clickly-popover { width: 260px; padding: 12px; }\n\n/* \u2500\u2500\u2500 Settings panel (redesigned) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-settings {\n position: fixed;\n width: 284px;\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 16px 48px rgba(2,6,23,0.20), 0 0 0 1px rgba(15,23,42,0.07);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n color: #0f172a;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1);\n overflow: hidden;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 14px 12px;\n border-bottom: 1px solid #f1f5f9;\n}\n\n.settings-title {\n font-size: 13px;\n font-weight: 600;\n color: #0f172a;\n letter-spacing: -0.01em;\n}\n\n.settings-close {\n display: grid;\n place-items: center;\n width: 24px;\n height: 24px;\n background: #f1f5f9;\n border: none;\n border-radius: 6px;\n color: #64748b;\n cursor: pointer;\n padding: 0;\n transition: background 100ms, color 100ms;\n}\n.settings-close:hover { background: #e2e8f0; color: #0f172a; }\n.settings-close svg { width: 13px; height: 13px; }\n\n.settings-section { padding: 10px 14px; }\n\n.settings-divider {\n height: 1px;\n background: #f1f5f9;\n margin: 0;\n}\n\n.settings-label {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 13px;\n font-weight: 500;\n color: #1e293b;\n margin-bottom: 8px;\n}\n\n.settings-hint {\n font-size: 11.5px;\n font-weight: 400;\n color: #94a3b8;\n}\n\n.settings-select {\n width: 100%;\n padding: 7px 10px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font: inherit;\n font-size: 13px;\n color: #1e293b;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n padding-right: 32px;\n transition: border-color 120ms, box-shadow 120ms;\n}\n.settings-select:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.15);\n background-color: #fff;\n}\n\n.settings-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 6px 0;\n}\n.settings-row + .settings-row {\n border-top: 1px solid #f8fafc;\n}\n\n.settings-row-label {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 13px;\n font-weight: 500;\n color: #1e293b;\n min-width: 0;\n}\n\n/* Toggle switch */\n.clickly-toggle {\n position: relative;\n flex-shrink: 0;\n width: 38px;\n height: 22px;\n cursor: pointer;\n}\n.clickly-toggle input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n.toggle-track {\n position: absolute;\n inset: 0;\n background: #e2e8f0;\n border-radius: 11px;\n transition: background 180ms ease;\n}\n.toggle-track::after {\n content: \"\";\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n background: #fff;\n border-radius: 50%;\n box-shadow: 0 1px 4px rgba(0,0,0,0.2);\n transition: transform 180ms cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n.clickly-toggle input:checked + .toggle-track {\n background: #0ea5e9;\n}\n.clickly-toggle input:checked + .toggle-track::after {\n transform: translateX(16px);\n}\n\n/* Color picker */\n.settings-color-wrap {\n display: flex;\n align-items: center;\n gap: 0;\n cursor: pointer;\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid #e2e8f0;\n flex-shrink: 0;\n}\n.settings-color-wrap input[type=\"color\"] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n}\n.color-swatch {\n display: block;\n width: 32px;\n height: 24px;\n border-radius: 7px;\n border: 1px solid rgba(0,0,0,0.08);\n transition: transform 100ms ease;\n}\n.settings-color-wrap:hover .color-swatch { transform: scale(1.08); }\n\n.clickly-counter {\n /* Float as a badge \u2014 positioned absolutely so it doesn't widen the button */\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: #f59e0b;\n color: #0f172a;\n font-size: 10px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n border: 1.5px solid rgba(9, 14, 28, 0.97);\n}\n\n/* \u2500\u2500\u2500 Annotation pins (persistent numbered markers) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-pin {\n position: fixed;\n width: 24px;\n height: 24px;\n border-radius: 999px;\n background: #10b981;\n color: #fff;\n font: 700 11px/24px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow: 0 2px 8px rgba(16,185,129,0.4), 0 0 0 2px #fff;\n z-index: 10;\n transition: transform 120ms cubic-bezier(0.34,1.56,0.64,1), box-shadow 120ms ease;\n}\n.clickly-pin:hover {\n transform: scale(1.18);\n box-shadow: 0 4px 16px rgba(16,185,129,0.5), 0 0 0 2px #fff;\n}\n.clickly-pin-num { display: block; }\n\n/* \u2500\u2500\u2500 Pin hover preview (dark tooltip) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.pin-preview {\n position: absolute;\n right: calc(100% + 10px);\n top: 50%;\n transform: translateY(-50%);\n width: 220px;\n padding: 8px 10px;\n background: rgba(9, 14, 28, 0.96);\n color: #f1f5f9;\n border-radius: 10px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.07) inset;\n font: 12px/1.45 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: left;\n cursor: default;\n pointer-events: none;\n z-index: 11;\n animation: clickly-fade-in 100ms ease-out;\n white-space: normal;\n}\n\n.pin-preview-meta {\n font-size: 10.5px;\n color: #64748b;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n margin-bottom: 4px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.pin-preview-comment {\n font-size: 12px;\n color: #e2e8f0;\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* \u2500\u2500\u2500 Pin edit popup \u2014 same white card as .clickly-popup \u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.pin-edit {\n /* Positioning: floats to the LEFT of the pin */\n position: absolute;\n right: calc(100% + 12px);\n top: 50%;\n transform: translateY(-50%);\n /* Appearance: identical to .clickly-popup */\n width: 300px;\n padding: 12px;\n background: #fff;\n color: #0f172a;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: left;\n cursor: default;\n z-index: 11;\n animation: clickly-fade-in 120ms cubic-bezier(0.16,1,0.3,1);\n /* Allow inner popup-styles to scroll */\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n/* Reuse .clickly-popup textarea inside pin-edit */\n.pin-edit textarea {\n width: 100%;\n min-height: 64px;\n max-height: 120px;\n padding: 8px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n resize: vertical;\n font: inherit;\n color: inherit;\n background: #fff;\n box-sizing: border-box;\n}\n.pin-edit textarea:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n\n/* Actions row */\n.pin-edit-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 10px;\n}\n\n.pin-edit-delete {\n display: grid;\n place-items: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n background: transparent;\n border: 1px solid #fee2e2;\n border-radius: 6px;\n color: #ef4444;\n cursor: pointer;\n padding: 0;\n transition: background 100ms, border-color 100ms;\n}\n.pin-edit-delete:hover { background: #fef2f2; border-color: #fca5a5; }\n.pin-edit-delete svg { width: 13px; height: 13px; }\n\n/* \u2500\u2500\u2500 Annotation list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-list {\n position: fixed;\n width: 320px;\n max-height: 55vh;\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 16px 48px rgba(2,6,23,0.20), 0 0 0 1px rgba(15,23,42,0.07);\n color: #0f172a;\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.list-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px 10px;\n border-bottom: 1px solid #f1f5f9;\n flex-shrink: 0;\n}\n\n.list-title {\n font-size: 13px;\n font-weight: 600;\n color: #0f172a;\n letter-spacing: -0.01em;\n flex: 1;\n}\n\n.list-count {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: #f1f5f9;\n color: #475569;\n font-size: 11px;\n font-weight: 600;\n border-radius: 10px;\n display: grid;\n place-items: center;\n}\n\n.list-items {\n overflow-y: auto;\n overscroll-behavior: contain;\n flex: 1;\n}\n\n.list-empty {\n padding: 24px;\n text-align: center;\n color: #94a3b8;\n font-size: 12px;\n}\n\n/* \u2500\u2500\u2500 Annotation card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.list-card {\n padding: 10px 12px;\n border-bottom: 1px solid #f8fafc;\n transition: background 80ms ease;\n}\n.list-card:last-child { border-bottom: none; }\n.list-card:hover { background: #fafafa; }\n\n.list-card-header {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 4px;\n}\n\n.list-card-num {\n font-size: 11px;\n font-weight: 700;\n color: #94a3b8;\n flex-shrink: 0;\n min-width: 20px;\n}\n\n.list-card-path {\n flex: 1;\n min-width: 0;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 10.5px;\n color: #475569;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.list-card-actions {\n display: flex;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.list-action-btn {\n display: grid;\n place-items: center;\n width: 24px;\n height: 24px;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: #94a3b8;\n cursor: pointer;\n padding: 0;\n transition: background 80ms ease, color 80ms ease;\n}\n.list-action-btn svg { width: 12px; height: 12px; }\n.list-action-btn:hover { background: #f1f5f9; color: #475569; }\n.list-action-btn.copied { color: #10b981; }\n.list-action-btn.list-action-delete:hover { background: #fef2f2; color: #ef4444; }\n\n.list-card-comment {\n font-size: 12px;\n color: #1e293b;\n line-height: 1.45;\n margin: 0 0 6px;\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* CSS changes badge */\n.list-card-css {\n background: rgba(124, 58, 237, 0.05);\n border: 1px solid rgba(124, 58, 237, 0.12);\n border-radius: 6px;\n padding: 5px 8px;\n margin-top: 4px;\n}\n\n.list-card-css-label {\n display: block;\n font-size: 10px;\n font-weight: 600;\n color: #7c3aed;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 3px;\n}\n\n.list-card-css-code {\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 10px;\n color: #475569;\n line-height: 1.5;\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n max-height: 60px;\n overflow: hidden;\n}\n";
|
|
6
|
+
export declare const REACT_UI_CSS = "\n.clickly-ui, .clickly-ui * { box-sizing: border-box; }\n\n/* \u2500\u2500\u2500 Floating action button (collapsed state) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-fab {\n position: fixed;\n right: 16px;\n bottom: 16px;\n width: 48px;\n height: 48px;\n border: none;\n border-radius: 999px;\n background: #0f172a;\n color: #f8fafc;\n display: grid;\n place-items: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow:\n 0 8px 24px rgba(0,0,0,0.30),\n 0 0 0 1px rgba(255,255,255,0.06) inset;\n transition: transform 140ms ease, box-shadow 140ms ease;\n z-index: 1;\n}\n.clickly-fab:hover {\n transform: scale(1.06);\n box-shadow:\n 0 10px 28px rgba(0,0,0,0.36),\n 0 0 0 1px rgba(255,255,255,0.10) inset;\n}\n.clickly-fab:active { transform: scale(0.96); }\n.clickly-fab svg { width: 18px; height: 18px; color: #f8fafc; }\n\n.clickly-fab-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: #f59e0b;\n color: #0f172a;\n font: 600 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n border-radius: 9px;\n display: grid;\n place-items: center;\n pointer-events: none;\n}\n\n/* \u2500\u2500\u2500 Toolbar (expanded state) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-toolbar {\n position: fixed;\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 6px;\n height: 44px;\n background: rgba(9, 14, 28, 0.97);\n color: #f8fafc;\n border-radius: 16px;\n font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n box-shadow:\n 0 16px 40px rgba(0,0,0,0.45),\n 0 0 0 1px rgba(255,255,255,0.08) inset,\n 0 1px 0 rgba(255,255,255,0.06) inset;\n pointer-events: auto;\n user-select: none;\n z-index: 1;\n animation: clickly-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes clickly-fade-in {\n from { opacity: 0; transform: translateY(6px) scale(0.97); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n.clickly-toolbar .grip {\n display: grid;\n place-items: center;\n width: 22px;\n height: 32px;\n color: #475569;\n touch-action: none;\n cursor: grab;\n border-radius: 6px;\n transition: color 120ms ease;\n}\n.clickly-toolbar .grip:hover { color: #94a3b8; }\n.clickly-toolbar .grip:active { cursor: grabbing; }\n\n.clickly-toolbar .divider {\n width: 1px;\n height: 20px;\n background: rgba(255,255,255,0.08);\n margin: 0 3px;\n flex-shrink: 0;\n}\n\n.clickly-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n height: 32px;\n padding: 0 8px;\n background: transparent;\n border: none;\n border-radius: 10px;\n color: #94a3b8;\n cursor: pointer;\n font: inherit;\n transition: background 100ms ease, color 100ms ease;\n position: relative;\n}\n.clickly-btn:hover { background: rgba(255,255,255,0.09); color: #e2e8f0; }\n.clickly-btn:active { background: rgba(255,255,255,0.15); color: #fff; transform: scale(0.96); }\n.clickly-btn.is-active {\n background: #0ea5e9;\n color: #fff;\n box-shadow: 0 0 0 1px rgba(14,165,233,0.4), 0 2px 8px rgba(14,165,233,0.3);\n}\n.clickly-btn.is-active:hover { background: #0284c7; }\n.clickly-btn[disabled] { opacity: 0.28; cursor: not-allowed; pointer-events: none; }\n\n/* Freeze-animations active state \u2014 icy blue */\n.clickly-btn.is-freeze {\n background: rgba(99, 179, 237, 0.18);\n color: #63b3ed;\n box-shadow: 0 0 0 1px rgba(99,179,237,0.35), 0 2px 8px rgba(99,179,237,0.2);\n}\n.clickly-btn.is-freeze:hover { background: rgba(99, 179, 237, 0.26); }\n\n.clickly-btn.icon-only {\n width: 32px;\n padding: 0;\n}\n\n.clickly-btn.primary-pinned {\n background: #10b981;\n color: #fff;\n font-weight: 600;\n font-size: 12px;\n padding: 0 10px;\n gap: 5px;\n box-shadow: 0 0 0 1px rgba(16,185,129,0.4), 0 2px 8px rgba(16,185,129,0.25);\n}\n.clickly-btn.primary-pinned:hover { background: #059669; }\n\n/* \u2500\u2500\u2500 Tooltip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-tip {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n /* Ensures the absolute-positioned counter badge clips correctly */\n isolation: isolate;\n}\n\n.clickly-tip .tip-bubble {\n position: absolute;\n bottom: calc(100% + 10px);\n left: 50%;\n transform: translateX(-50%);\n background: rgba(15, 23, 42, 0.98);\n color: #f1f5f9;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n padding: 5px 10px;\n border-radius: 8px;\n pointer-events: none;\n opacity: 0;\n transition: opacity 80ms ease;\n transition-delay: 200ms;\n box-shadow: 0 4px 16px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.07) inset;\n display: flex;\n align-items: center;\n gap: 6px;\n z-index: 10;\n}\n\n/* Arrow */\n.clickly-tip .tip-bubble::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-top-color: rgba(15, 23, 42, 0.98);\n}\n\n.clickly-tip:hover .tip-bubble { opacity: 1; }\n\n.clickly-tip .tip-bubble kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 4px;\n background: rgba(255,255,255,0.12);\n border: 1px solid rgba(255,255,255,0.10);\n border-radius: 4px;\n font: 11px/1 ui-monospace, \"SF Mono\", Menlo, monospace;\n color: #94a3b8;\n}\n\n/* \u2500\u2500\u2500 Shortcuts panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.shortcuts-trigger {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.shortcuts-panel {\n position: absolute;\n bottom: calc(100% + 12px);\n left: 50%;\n transform: translateX(-50%);\n width: 260px;\n background: rgba(9, 14, 28, 0.97);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 12px;\n box-shadow: 0 16px 40px rgba(0,0,0,0.45);\n padding: 10px;\n z-index: 10;\n animation: clickly-fade-in 100ms ease-out;\n pointer-events: none;\n}\n\n/* Arrow pointing down */\n.shortcuts-panel::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 6px solid transparent;\n border-top-color: rgba(9, 14, 28, 0.97);\n}\n\n.shortcuts-title {\n font: 600 11px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n padding: 2px 4px 8px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n margin-bottom: 6px;\n}\n\n.shortcuts-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 4px;\n border-radius: 6px;\n gap: 8px;\n}\n.shortcuts-row:hover { background: rgba(255,255,255,0.04); }\n\n.shortcuts-label {\n font: 12px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n color: #94a3b8;\n flex: 1;\n min-width: 0;\n}\n\n.shortcuts-keys {\n display: flex;\n gap: 3px;\n align-items: center;\n flex-shrink: 0;\n}\n\n.shortcuts-keys kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 5px;\n background: rgba(255,255,255,0.08);\n border: 1px solid rgba(255,255,255,0.10);\n border-bottom-width: 2px;\n border-radius: 5px;\n font: 11px/1 ui-monospace, \"SF Mono\", Menlo, monospace;\n color: #e2e8f0;\n}\n\n/* \u2500\u2500\u2500 Popup & popovers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-popup, .clickly-popover {\n position: fixed;\n background: #fff;\n color: #0f172a;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 120ms ease-out;\n}\n\n.clickly-popup {\n width: 320px;\n padding: 12px;\n max-height: calc(100vh - 80px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n/* \u2500\u2500\u2500 Shared inner styles \u2014 apply to both popup and pin-edit \u2500\u2500\u2500 */\n\n.clickly-popup .popup-header,\n.pin-edit .popup-header {\n display: flex;\n align-items: center;\n gap: 5px;\n margin-bottom: 8px;\n padding: 4px 2px;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n color: #475569;\n font-size: 11px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n transition: background 80ms ease;\n}\n.clickly-popup .popup-header:hover,\n.pin-edit .popup-header:hover { background: #f1f5f9; }\n\n.clickly-popup .popup-chevron,\n.pin-edit .popup-chevron {\n font-size: 12px;\n color: #94a3b8;\n flex-shrink: 0;\n width: 12px;\n text-align: center;\n}\n\n.clickly-popup .popup-label,\n.pin-edit .popup-label {\n flex: 1;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n/* Edit-mode toggle button \u2014 top-right of CSS panel header */\n.clickly-popup .popup-edit-toggle {\n flex-shrink: 0;\n display: grid;\n place-items: center;\n width: 20px;\n height: 20px;\n background: transparent;\n border: 1px solid #e2e8f0;\n border-radius: 5px;\n color: #94a3b8;\n cursor: pointer;\n padding: 0;\n margin-left: auto;\n transition: background 100ms ease, color 100ms ease, border-color 100ms ease;\n}\n.clickly-popup .popup-edit-toggle:hover {\n background: #f1f5f9;\n color: #475569;\n border-color: #cbd5e1;\n}\n.clickly-popup .popup-edit-toggle.is-editing {\n background: #0ea5e9;\n color: #fff;\n border-color: #0ea5e9;\n}\n.clickly-popup .popup-edit-toggle.is-editing:hover {\n background: #0284c7;\n}\n\n/* Computed-styles panel */\n.clickly-popup .popup-styles,\n.pin-edit .popup-styles {\n margin-bottom: 8px;\n padding: 8px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 11px;\n max-height: 160px;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.clickly-popup .style-row,\n.pin-edit .style-row {\n display: flex;\n align-items: center;\n gap: 6px;\n line-height: 1.7;\n border-radius: 4px;\n padding: 0 2px;\n transition: background 80ms ease;\n}\n\n.clickly-popup .style-row--changed,\n.pin-edit .style-row--changed {\n background: rgba(245, 158, 11, 0.10);\n}\n\n.clickly-popup .style-key,\n.pin-edit .style-key {\n color: #7c3aed;\n flex-shrink: 0;\n min-width: 90px;\n font-size: 11px;\n}\n\n.clickly-popup .style-val,\n.pin-edit .style-val {\n color: #0f172a;\n font-size: 11px;\n word-break: break-all;\n flex: 1;\n}\n\n/* Editable value input \u2014 live CSS preview */\n.clickly-popup .style-val-input {\n flex: 1;\n min-width: 0;\n background: transparent;\n border: none;\n border-bottom: 1px solid transparent;\n color: #0f172a;\n font: 11px/1.7 ui-monospace, \"SF Mono\", Menlo, monospace;\n padding: 0;\n outline: none;\n transition: border-color 100ms ease;\n word-break: break-all;\n}\n.clickly-popup .style-val-input:focus {\n border-bottom-color: #0ea5e9;\n background: rgba(14, 165, 233, 0.05);\n border-radius: 2px 2px 0 0;\n}\n\n/* Revert button shown only on changed rows */\n.clickly-popup .style-revert-btn {\n flex-shrink: 0;\n background: transparent;\n border: none;\n color: #94a3b8;\n font-size: 13px;\n cursor: pointer;\n padding: 0 2px;\n line-height: 1;\n border-radius: 3px;\n transition: color 80ms ease, background 80ms ease;\n}\n.clickly-popup .style-revert-btn:hover {\n color: #f59e0b;\n background: rgba(245,158,11,0.12);\n}\n\n/* Hint text at bottom of CSS panel */\n.clickly-popup .style-hint,\n.pin-edit .style-hint {\n margin-top: 6px;\n padding-top: 6px;\n border-top: 1px solid #e2e8f0;\n font-size: 10.5px;\n color: #94a3b8;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n line-height: 1.4;\n}\n\n.clickly-popup textarea,\n.pin-edit textarea {\n width: 100%;\n min-height: 64px;\n max-height: 160px;\n padding: 8px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n resize: vertical;\n font: inherit;\n color: inherit;\n}\n.clickly-popup textarea:focus,\n.pin-edit textarea:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n\n.clickly-popup .row,\n.pin-edit .row {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n margin-top: 10px;\n}\n\n.clickly-popup .row .ghost,\n.pin-edit .row .ghost {\n background: transparent;\n color: #475569;\n border: 1px solid #e2e8f0;\n}\n.clickly-popup .row .ghost:hover,\n.pin-edit .row .ghost:hover { background: #f8fafc; }\n\n.clickly-popup .row .primary,\n.pin-edit .row .primary {\n background: #0ea5e9;\n color: #fff;\n border: none;\n}\n.clickly-popup .row .primary:hover,\n.pin-edit .row .primary:hover { background: #0284c7; }\n.clickly-popup .row button,\n.pin-edit .row button {\n height: 28px;\n padding: 0 12px;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n}\n\n/* Old popover kept for any legacy use */\n.clickly-popover { width: 260px; padding: 12px; }\n\n/* \u2500\u2500\u2500 Settings panel (redesigned) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-settings {\n position: fixed;\n width: 284px;\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 16px 48px rgba(2,6,23,0.20), 0 0 0 1px rgba(15,23,42,0.07);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n color: #0f172a;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1);\n overflow: hidden;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 14px 12px;\n border-bottom: 1px solid #f1f5f9;\n}\n\n.settings-title {\n font-size: 13px;\n font-weight: 600;\n color: #0f172a;\n letter-spacing: -0.01em;\n}\n\n.settings-close {\n display: grid;\n place-items: center;\n width: 24px;\n height: 24px;\n background: #f1f5f9;\n border: none;\n border-radius: 6px;\n color: #64748b;\n cursor: pointer;\n padding: 0;\n transition: background 100ms, color 100ms;\n}\n.settings-close:hover { background: #e2e8f0; color: #0f172a; }\n.settings-close svg { width: 13px; height: 13px; }\n\n.settings-section { padding: 10px 14px; }\n\n.settings-divider {\n height: 1px;\n background: #f1f5f9;\n margin: 0;\n}\n\n.settings-label {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 13px;\n font-weight: 500;\n color: #1e293b;\n margin-bottom: 8px;\n}\n\n.settings-hint {\n font-size: 11.5px;\n font-weight: 400;\n color: #94a3b8;\n}\n\n.settings-select {\n width: 100%;\n padding: 7px 10px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font: inherit;\n font-size: 13px;\n color: #1e293b;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n padding-right: 32px;\n transition: border-color 120ms, box-shadow 120ms;\n}\n.settings-select:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.15);\n background-color: #fff;\n}\n\n.settings-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 6px 0;\n}\n.settings-row + .settings-row {\n border-top: 1px solid #f8fafc;\n}\n\n.settings-row-label {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 13px;\n font-weight: 500;\n color: #1e293b;\n min-width: 0;\n}\n\n/* Toggle switch */\n.clickly-toggle {\n position: relative;\n flex-shrink: 0;\n width: 38px;\n height: 22px;\n cursor: pointer;\n}\n.clickly-toggle input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n.toggle-track {\n position: absolute;\n inset: 0;\n background: #e2e8f0;\n border-radius: 11px;\n transition: background 180ms ease;\n}\n.toggle-track::after {\n content: \"\";\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n background: #fff;\n border-radius: 50%;\n box-shadow: 0 1px 4px rgba(0,0,0,0.2);\n transition: transform 180ms cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n.clickly-toggle input:checked + .toggle-track {\n background: #0ea5e9;\n}\n.clickly-toggle input:checked + .toggle-track::after {\n transform: translateX(16px);\n}\n\n/* Color picker */\n.settings-color-wrap {\n display: flex;\n align-items: center;\n gap: 0;\n cursor: pointer;\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid #e2e8f0;\n flex-shrink: 0;\n}\n.settings-color-wrap input[type=\"color\"] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n}\n.color-swatch {\n display: block;\n width: 32px;\n height: 24px;\n border-radius: 7px;\n border: 1px solid rgba(0,0,0,0.08);\n transition: transform 100ms ease;\n}\n.settings-color-wrap:hover .color-swatch { transform: scale(1.08); }\n\n.clickly-counter {\n /* Float as a badge \u2014 positioned absolutely so it doesn't widen the button */\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: #f59e0b;\n color: #0f172a;\n font-size: 10px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n border: 1.5px solid rgba(9, 14, 28, 0.97);\n}\n\n/* \u2500\u2500\u2500 Annotation pins (persistent numbered markers) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-pin {\n position: fixed;\n width: 24px;\n height: 24px;\n border-radius: 999px;\n background: #10b981;\n color: #fff;\n font: 700 11px/24px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow: 0 2px 8px rgba(16,185,129,0.4), 0 0 0 2px #fff;\n z-index: 10;\n transition: transform 120ms cubic-bezier(0.34,1.56,0.64,1), box-shadow 120ms ease;\n}\n.clickly-pin:hover {\n transform: scale(1.18);\n box-shadow: 0 4px 16px rgba(16,185,129,0.5), 0 0 0 2px #fff;\n}\n.clickly-pin-num { display: block; }\n\n/* \u2500\u2500\u2500 Pin hover preview (dark tooltip) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.pin-preview {\n position: absolute;\n right: calc(100% + 10px);\n top: 50%;\n transform: translateY(-50%);\n width: 220px;\n padding: 8px 10px;\n background: rgba(9, 14, 28, 0.96);\n color: #f1f5f9;\n border-radius: 10px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.07) inset;\n font: 12px/1.45 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: left;\n cursor: default;\n pointer-events: none;\n z-index: 11;\n animation: clickly-fade-in 100ms ease-out;\n white-space: normal;\n}\n\n.pin-preview-meta {\n font-size: 10.5px;\n color: #64748b;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n margin-bottom: 4px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.pin-preview-comment {\n font-size: 12px;\n color: #e2e8f0;\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* \u2500\u2500\u2500 Pin edit popup \u2014 same white card as .clickly-popup \u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.pin-edit {\n /* Positioning: floats to the LEFT of the pin */\n position: absolute;\n right: calc(100% + 12px);\n top: 50%;\n transform: translateY(-50%);\n /* Appearance: identical to .clickly-popup */\n width: 300px;\n padding: 12px;\n background: #fff;\n color: #0f172a;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: left;\n cursor: default;\n z-index: 11;\n animation: clickly-fade-in 120ms cubic-bezier(0.16,1,0.3,1);\n /* Allow inner popup-styles to scroll */\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n/* Reuse .clickly-popup textarea inside pin-edit */\n.pin-edit textarea {\n width: 100%;\n min-height: 64px;\n max-height: 120px;\n padding: 8px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n resize: vertical;\n font: inherit;\n color: inherit;\n background: #fff;\n box-sizing: border-box;\n}\n.pin-edit textarea:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n\n/* Actions row */\n.pin-edit-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 10px;\n}\n\n.pin-edit-delete {\n display: grid;\n place-items: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n background: transparent;\n border: 1px solid #fee2e2;\n border-radius: 6px;\n color: #ef4444;\n cursor: pointer;\n padding: 0;\n transition: background 100ms, border-color 100ms;\n}\n.pin-edit-delete:hover { background: #fef2f2; border-color: #fca5a5; }\n.pin-edit-delete svg { width: 13px; height: 13px; }\n\n/* \u2500\u2500\u2500 Annotation list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.clickly-list {\n position: fixed;\n width: 320px;\n max-height: 55vh;\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 16px 48px rgba(2,6,23,0.20), 0 0 0 1px rgba(15,23,42,0.07);\n color: #0f172a;\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.list-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px 10px;\n border-bottom: 1px solid #f1f5f9;\n flex-shrink: 0;\n}\n\n.list-title {\n font-size: 13px;\n font-weight: 600;\n color: #0f172a;\n letter-spacing: -0.01em;\n flex: 1;\n}\n\n.list-count {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: #f1f5f9;\n color: #475569;\n font-size: 11px;\n font-weight: 600;\n border-radius: 10px;\n display: grid;\n place-items: center;\n}\n\n.list-items {\n overflow-y: auto;\n overscroll-behavior: contain;\n flex: 1;\n}\n\n.list-empty {\n padding: 24px;\n text-align: center;\n color: #94a3b8;\n font-size: 12px;\n}\n\n/* \u2500\u2500\u2500 Annotation card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.list-card {\n padding: 10px 12px;\n border-bottom: 1px solid #f8fafc;\n transition: background 80ms ease;\n}\n.list-card:last-child { border-bottom: none; }\n.list-card:hover { background: #fafafa; }\n\n.list-card-header {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 4px;\n}\n\n.list-card-num {\n font-size: 11px;\n font-weight: 700;\n color: #94a3b8;\n flex-shrink: 0;\n min-width: 20px;\n}\n\n.list-card-path {\n flex: 1;\n min-width: 0;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 10.5px;\n color: #475569;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.list-card-actions {\n display: flex;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.list-action-btn {\n display: grid;\n place-items: center;\n width: 24px;\n height: 24px;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: #94a3b8;\n cursor: pointer;\n padding: 0;\n transition: background 80ms ease, color 80ms ease;\n}\n.list-action-btn svg { width: 12px; height: 12px; }\n.list-action-btn:hover { background: #f1f5f9; color: #475569; }\n.list-action-btn.copied { color: #10b981; }\n.list-action-btn.list-action-delete:hover { background: #fef2f2; color: #ef4444; }\n\n.list-card-comment {\n font-size: 12px;\n color: #1e293b;\n line-height: 1.45;\n margin: 0 0 6px;\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* CSS changes badge */\n.list-card-css {\n background: rgba(124, 58, 237, 0.05);\n border: 1px solid rgba(124, 58, 237, 0.12);\n border-radius: 6px;\n padding: 5px 8px;\n margin-top: 4px;\n}\n\n.list-card-css-label {\n display: block;\n font-size: 10px;\n font-weight: 600;\n color: #7c3aed;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 3px;\n}\n\n.list-card-css-code {\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 10px;\n color: #475569;\n line-height: 1.5;\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n max-height: 60px;\n overflow: hidden;\n}\n";
|
|
7
7
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/internal/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/internal/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,YAAY,oo0BAshCxB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@useclickly/react",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Click-to-annotate dev toolbar for React 18+ apps. Generates agent-ready prompts. Drop in one component — no config.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Clickly contributors",
|