@knocklabs/react 0.11.5 → 0.11.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideAnnotatedStatusDot.js +2 -0
  4. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideAnnotatedStatusDot.js.map +1 -0
  5. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideContextDetails.js +1 -1
  6. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideContextDetails.js.map +1 -1
  7. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideRow.js +1 -1
  8. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideRow.js.map +1 -1
  9. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideRowDetails.js +2 -0
  10. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideRowDetails.js.map +1 -0
  11. package/dist/cjs/modules/guide/components/Toolbar/V2/V2.js +1 -1
  12. package/dist/cjs/modules/guide/components/Toolbar/V2/V2.js.map +1 -1
  13. package/dist/cjs/modules/guide/components/Toolbar/V2/helpers.js +1 -1
  14. package/dist/cjs/modules/guide/components/Toolbar/V2/helpers.js.map +1 -1
  15. package/dist/cjs/modules/guide/components/Toolbar/V2/useDraggable.js +1 -1
  16. package/dist/cjs/modules/guide/components/Toolbar/V2/useDraggable.js.map +1 -1
  17. package/dist/cjs/modules/guide/components/Toolbar/V2/useInspectGuideClientStore.js +1 -1
  18. package/dist/cjs/modules/guide/components/Toolbar/V2/useInspectGuideClientStore.js.map +1 -1
  19. package/dist/esm/index.mjs +98 -99
  20. package/dist/esm/index.mjs.map +1 -1
  21. package/dist/esm/modules/guide/components/Toolbar/V2/GuideAnnotatedStatusDot.mjs +18 -0
  22. package/dist/esm/modules/guide/components/Toolbar/V2/GuideAnnotatedStatusDot.mjs.map +1 -0
  23. package/dist/esm/modules/guide/components/Toolbar/V2/GuideContextDetails.mjs +15 -29
  24. package/dist/esm/modules/guide/components/Toolbar/V2/GuideContextDetails.mjs.map +1 -1
  25. package/dist/esm/modules/guide/components/Toolbar/V2/GuideRow.mjs +167 -49
  26. package/dist/esm/modules/guide/components/Toolbar/V2/GuideRow.mjs.map +1 -1
  27. package/dist/esm/modules/guide/components/Toolbar/V2/GuideRowDetails.mjs +51 -0
  28. package/dist/esm/modules/guide/components/Toolbar/V2/GuideRowDetails.mjs.map +1 -0
  29. package/dist/esm/modules/guide/components/Toolbar/V2/V2.mjs +132 -59
  30. package/dist/esm/modules/guide/components/Toolbar/V2/V2.mjs.map +1 -1
  31. package/dist/esm/modules/guide/components/Toolbar/V2/helpers.mjs +42 -5
  32. package/dist/esm/modules/guide/components/Toolbar/V2/helpers.mjs.map +1 -1
  33. package/dist/esm/modules/guide/components/Toolbar/V2/useDraggable.mjs +35 -32
  34. package/dist/esm/modules/guide/components/Toolbar/V2/useDraggable.mjs.map +1 -1
  35. package/dist/esm/modules/guide/components/Toolbar/V2/useInspectGuideClientStore.mjs +89 -75
  36. package/dist/esm/modules/guide/components/Toolbar/V2/useInspectGuideClientStore.mjs.map +1 -1
  37. package/dist/types/modules/guide/components/Toolbar/V2/GuideAnnotatedStatusDot.d.ts +6 -0
  38. package/dist/types/modules/guide/components/Toolbar/V2/GuideAnnotatedStatusDot.d.ts.map +1 -0
  39. package/dist/types/modules/guide/components/Toolbar/V2/GuideContextDetails.d.ts.map +1 -1
  40. package/dist/types/modules/guide/components/Toolbar/V2/GuideRow.d.ts +3 -1
  41. package/dist/types/modules/guide/components/Toolbar/V2/GuideRow.d.ts.map +1 -1
  42. package/dist/types/modules/guide/components/Toolbar/V2/GuideRowDetails.d.ts +5 -0
  43. package/dist/types/modules/guide/components/Toolbar/V2/GuideRowDetails.d.ts.map +1 -0
  44. package/dist/types/modules/guide/components/Toolbar/V2/V2.d.ts.map +1 -1
  45. package/dist/types/modules/guide/components/Toolbar/V2/helpers.d.ts +7 -1
  46. package/dist/types/modules/guide/components/Toolbar/V2/helpers.d.ts.map +1 -1
  47. package/dist/types/modules/guide/components/Toolbar/V2/useDraggable.d.ts +2 -0
  48. package/dist/types/modules/guide/components/Toolbar/V2/useDraggable.d.ts.map +1 -1
  49. package/dist/types/modules/guide/components/Toolbar/V2/useInspectGuideClientStore.d.ts +11 -4
  50. package/dist/types/modules/guide/components/Toolbar/V2/useInspectGuideClientStore.d.ts.map +1 -1
  51. package/package.json +5 -3
  52. package/dist/cjs/modules/guide/components/Toolbar/V2/DragHandle.js +0 -2
  53. package/dist/cjs/modules/guide/components/Toolbar/V2/DragHandle.js.map +0 -1
  54. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideHoverCard.js +0 -2
  55. package/dist/cjs/modules/guide/components/Toolbar/V2/GuideHoverCard.js.map +0 -1
  56. package/dist/cjs/modules/guide/components/Toolbar/V2/GuidesListDisplaySelect.js +0 -2
  57. package/dist/cjs/modules/guide/components/Toolbar/V2/GuidesListDisplaySelect.js.map +0 -1
  58. package/dist/esm/modules/guide/components/Toolbar/V2/DragHandle.mjs +0 -20
  59. package/dist/esm/modules/guide/components/Toolbar/V2/DragHandle.mjs.map +0 -1
  60. package/dist/esm/modules/guide/components/Toolbar/V2/GuideHoverCard.mjs +0 -57
  61. package/dist/esm/modules/guide/components/Toolbar/V2/GuideHoverCard.mjs.map +0 -1
  62. package/dist/esm/modules/guide/components/Toolbar/V2/GuidesListDisplaySelect.mjs +0 -17
  63. package/dist/esm/modules/guide/components/Toolbar/V2/GuidesListDisplaySelect.mjs.map +0 -1
  64. package/dist/types/modules/guide/components/Toolbar/V2/DragHandle.d.ts +0 -9
  65. package/dist/types/modules/guide/components/Toolbar/V2/DragHandle.d.ts.map +0 -1
  66. package/dist/types/modules/guide/components/Toolbar/V2/GuidesListDisplaySelect.d.ts +0 -8
  67. package/dist/types/modules/guide/components/Toolbar/V2/GuidesListDisplaySelect.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"V2.mjs","sources":["../../../../../../../src/modules/guide/components/Toolbar/V2/V2.tsx"],"sourcesContent":["import { useGuideContext } from \"@knocklabs/react-core\";\nimport { Button } from \"@telegraph/button\";\nimport { Box, Stack } from \"@telegraph/layout\";\nimport { Text } from \"@telegraph/typography\";\nimport { Minimize2, Undo2 } from \"lucide-react\";\nimport React from \"react\";\n\nimport { KnockButton } from \"../KnockButton\";\nimport { TOOLBAR_Z_INDEX } from \"../shared\";\nimport \"../styles.css\";\n\nimport { DRAG_HANDLE_OVERHANG, DragHandle } from \"./DragHandle\";\nimport { GuideContextDetails } from \"./GuideContextDetails\";\nimport { GuideRow } from \"./GuideRow\";\nimport {\n DisplayOption,\n GuidesListDisplaySelect,\n} from \"./GuidesListDisplaySelect\";\nimport { detectToolbarParam } from \"./helpers\";\nimport { useDraggable } from \"./useDraggable\";\nimport {\n InspectionResult,\n useInspectGuideClientStore,\n} from \"./useInspectGuideClientStore\";\n\nconst GuidesList = ({\n guides,\n displayOption,\n}: {\n guides: InspectionResult[\"guides\"];\n displayOption: DisplayOption;\n}) => {\n return guides.map((guide, idx) => {\n const { isEligible, isQualified, selectable } = guide.annotation;\n const isDisplayable = isEligible && isQualified;\n const isDisplaying = isDisplayable && selectable.status === \"returned\";\n\n if (displayOption === \"only-displaying\" && !isDisplaying) {\n return null;\n }\n if (displayOption === \"only-displayable\" && !isDisplayable) {\n return null;\n }\n if (displayOption === \"all-eligible\" && !isEligible) {\n return null;\n }\n\n return <GuideRow key={guide.key} guide={guide} orderIndex={idx} />;\n });\n};\n\nexport const V2 = () => {\n const { client } = useGuideContext();\n\n const [guidesListDisplayOption, setGuidesListDisplayOption] =\n React.useState<DisplayOption>(\"only-displayable\");\n\n const [isVisible, setIsVisible] = React.useState(detectToolbarParam());\n const [isCollapsed, setIsCollapsed] = React.useState(true);\n\n React.useEffect(() => {\n if (!isVisible) {\n return;\n }\n\n client.setDebug();\n\n return () => {\n client.unsetDebug();\n };\n }, [isVisible, client]);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const { position, isDragging, handlePointerDown } = useDraggable({\n elementRef: containerRef,\n reclampDeps: [isCollapsed],\n rightPadding: DRAG_HANDLE_OVERHANG,\n initialPosition: { top: 16, right: 16 },\n });\n\n const result = useInspectGuideClientStore();\n if (!result) {\n return null;\n }\n\n return (\n <Box\n tgphRef={containerRef}\n position=\"fixed\"\n style={{\n top: position.top + \"px\",\n right: position.right + \"px\",\n zIndex: TOOLBAR_Z_INDEX,\n }}\n >\n <DragHandle onPointerDown={handlePointerDown} isDragging={isDragging} />\n {isCollapsed ? (\n <KnockButton onClick={() => setIsCollapsed(false)} positioned={false} />\n ) : (\n <Stack\n direction=\"column\"\n backgroundColor=\"surface-2\"\n shadow=\"2\"\n rounded=\"3\"\n border=\"px\"\n overflow=\"hidden\"\n style={{ width: \"400px\" }}\n >\n <Stack\n w=\"full\"\n p=\"2\"\n justify=\"space-between\"\n direction=\"row\"\n style={{ boxSizing: \"border-box\" }}\n >\n <Box style={{ width: \"220px\" }}>\n <GuidesListDisplaySelect\n value={guidesListDisplayOption}\n onChange={(opt) => setGuidesListDisplayOption(opt)}\n />\n </Box>\n\n <Stack gap=\"2\">\n <Button\n onClick={() => setIsVisible(false)}\n size=\"1\"\n variant=\"soft\"\n trailingIcon={{ icon: Undo2, \"aria-hidden\": true }}\n >\n Exit\n </Button>\n <Button\n onClick={() => setIsCollapsed(true)}\n size=\"1\"\n variant=\"soft\"\n leadingIcon={{ icon: Minimize2, alt: \"Collapse guide toolbar\" }}\n />\n </Stack>\n </Stack>\n\n <Box w=\"full\">\n <GuideContextDetails />\n {result.error && (\n <Box px=\"2\" pb=\"1\">\n <Text as=\"span\" size=\"0\" weight=\"medium\" color=\"red\">\n {result.error}\n </Text>\n </Box>\n )}\n <GuidesList\n guides={result.guides}\n displayOption={guidesListDisplayOption}\n />\n </Box>\n </Stack>\n )}\n </Box>\n );\n};\n"],"names":["GuidesList","guides","displayOption","map","guide","idx","isEligible","isQualified","selectable","annotation","isDisplayable","isDisplaying","status","GuideRow","key","V2","client","useGuideContext","guidesListDisplayOption","setGuidesListDisplayOption","React","useState","isVisible","setIsVisible","detectToolbarParam","isCollapsed","setIsCollapsed","useEffect","setDebug","unsetDebug","containerRef","useRef","position","isDragging","handlePointerDown","useDraggable","elementRef","reclampDeps","rightPadding","DRAG_HANDLE_OVERHANG","initialPosition","top","right","result","useInspectGuideClientStore","Box","zIndex","TOOLBAR_Z_INDEX","DragHandle","KnockButton","Stack","width","boxSizing","GuidesListDisplaySelect","opt","Button","icon","Undo2","Minimize2","alt","GuideContextDetails","error","Text"],"mappings":"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"}
1
+ {"version":3,"file":"V2.mjs","sources":["../../../../../../../src/modules/guide/components/Toolbar/V2/V2.tsx"],"sourcesContent":["import { useGuideContext, useStore } from \"@knocklabs/react-core\";\nimport { Button } from \"@telegraph/button\";\nimport { Icon } from \"@telegraph/icon\";\nimport { Box, Stack } from \"@telegraph/layout\";\nimport { SegmentedControl } from \"@telegraph/segmented-control\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { Text } from \"@telegraph/typography\";\nimport {\n Box as BoxIcon,\n ChevronDown,\n ChevronRight,\n Gauge,\n GripVertical,\n LogOut,\n Minimize2,\n SlidersHorizontal,\n} from \"lucide-react\";\nimport React from \"react\";\n\nimport { KnockButton } from \"../KnockButton\";\nimport { TOOLBAR_Z_INDEX } from \"../shared\";\nimport \"../styles.css\";\n\nimport { GuideContextDetails } from \"./GuideContextDetails\";\nimport { GuideRow } from \"./GuideRow\";\nimport { clearRunConfigLS, getRunConfig } from \"./helpers\";\nimport { useDraggable } from \"./useDraggable\";\nimport {\n InspectionResultOk,\n useInspectGuideClientStore,\n} from \"./useInspectGuideClientStore\";\n\nconst TOOLBAR_WIDTH = \"540px\";\n\ntype DisplayOption = \"all-guides\" | \"only-eligible\" | \"only-displayable\";\n\nconst GuidesList = ({\n guides,\n displayOption,\n}: {\n guides: InspectionResultOk[\"guides\"];\n displayOption: DisplayOption;\n}) => {\n const [expandedGuideRowKey, setExpandedGuideRowKey] = React.useState<\n string | undefined\n >();\n\n React.useEffect(() => {\n setExpandedGuideRowKey(undefined);\n }, [displayOption]);\n\n return guides.map((guide, idx) => {\n const { isEligible, isQualified } = guide.annotation;\n const isDisplayable = isEligible && isQualified;\n\n if (displayOption === \"only-displayable\" && !isDisplayable) {\n return null;\n }\n if (displayOption === \"only-eligible\" && !isEligible) {\n return null;\n }\n return (\n <GuideRow\n key={guide.key}\n guide={guide}\n orderIndex={idx}\n isExpanded={guide.key === expandedGuideRowKey}\n onClick={() => {\n setExpandedGuideRowKey((k) =>\n k && k === guide.key ? undefined : guide.key,\n );\n }}\n />\n );\n });\n};\n\nexport const V2 = () => {\n const { client } = useGuideContext();\n\n const [displayOption, setDisplayOption] =\n React.useState<DisplayOption>(\"only-eligible\");\n const [runConfig, setRunConfig] = React.useState(() => getRunConfig());\n const [isCollapsed, setIsCollapsed] = React.useState(false);\n const [isContextPanelOpen, setIsContextPanelOpen] = React.useState(false);\n\n const { debugSettings } = useStore(client.store, (state) => ({\n debugSettings: state.debug || {},\n }));\n\n React.useEffect(() => {\n const { isVisible = false, focusedGuideKeys = {} } = runConfig || {};\n const isDebugging = client.store.state.debug?.debugging;\n if (isVisible && !isDebugging) {\n client.setDebug({ focusedGuideKeys });\n\n // If focused, switch to all guides so you can see in the list.\n if (Object.keys(focusedGuideKeys).length > 0) {\n setDisplayOption(\"all-guides\");\n }\n }\n\n return () => {\n client.unsetDebug();\n };\n }, [runConfig, client, setDisplayOption]);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const { position, isDragging, handlePointerDown, hasDraggedRef } =\n useDraggable({\n elementRef: containerRef,\n reclampDeps: [isCollapsed],\n initialPosition: { top: 16, right: 16 },\n });\n\n const result = useInspectGuideClientStore(runConfig);\n if (!result || !runConfig?.isVisible) {\n return null;\n }\n\n return (\n <Box\n tgphRef={containerRef}\n position=\"fixed\"\n style={{\n top: position.top + \"px\",\n right: position.right + \"px\",\n zIndex: TOOLBAR_Z_INDEX,\n }}\n >\n {isCollapsed ? (\n <Stack\n border=\"px\"\n rounded=\"4\"\n align=\"center\"\n justify=\"center\"\n w=\"10\"\n h=\"10\"\n onPointerDown={handlePointerDown}\n backgroundColor=\"surface-1\"\n style={{\n cursor: isDragging ? \"grabbing\" : \"grab\",\n touchAction: \"none\",\n userSelect: \"none\",\n }}\n >\n <Box\n style={{\n transform: \"scale(0.7)\",\n transformOrigin: \"center center\",\n }}\n >\n <KnockButton\n onClick={() => {\n if (!hasDraggedRef.current) {\n setIsCollapsed(false);\n }\n }}\n positioned={false}\n />\n </Box>\n </Stack>\n ) : (\n <Stack\n direction=\"column\"\n backgroundColor=\"surface-1\"\n rounded=\"4\"\n border=\"px\"\n overflow=\"hidden\"\n style={{\n width: TOOLBAR_WIDTH,\n boxShadow: \"0 8px 32px var(--tgph-gray-5)\",\n }}\n >\n {/* Header — also acts as drag handle area */}\n <Stack\n w=\"full\"\n p=\"2\"\n justify=\"space-between\"\n direction=\"row\"\n align=\"center\"\n gap=\"2\"\n borderBottom=\"px\"\n onPointerDown={handlePointerDown}\n style={{\n boxSizing: \"border-box\",\n cursor: isDragging ? \"grabbing\" : \"grab\",\n touchAction: \"none\",\n userSelect: \"none\",\n }}\n >\n {/* Left: drag icon + segmented control + settings */}\n <Stack align=\"center\" gap=\"1_5\" style={{ minWidth: 0, flex: 1 }}>\n <Stack\n display=\"inline-flex\"\n align=\"center\"\n style={{\n cursor: isDragging ? \"grabbing\" : \"grab\",\n touchAction: \"none\",\n userSelect: \"none\",\n }}\n onPointerDown={(e: React.PointerEvent) => {\n // Already handled by parent, prevent double-fire\n e.stopPropagation();\n handlePointerDown(e);\n }}\n >\n <Icon color=\"gray\" size=\"1\" icon={GripVertical} aria-hidden />\n </Stack>\n <Stack\n align=\"center\"\n gap=\"1_5\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <SegmentedControl.Root\n size=\"1\"\n type=\"single\"\n value={displayOption}\n onValueChange={(val: DisplayOption) => {\n if (!val) return;\n setDisplayOption(val);\n }}\n >\n <SegmentedControl.Option value=\"all-guides\">\n All guides\n </SegmentedControl.Option>\n <SegmentedControl.Option value=\"only-eligible\">\n Eligible\n </SegmentedControl.Option>\n <SegmentedControl.Option value=\"only-displayable\">\n On this page\n </SegmentedControl.Option>\n </SegmentedControl.Root>\n\n <Tooltip label=\"Sandbox: Contain engagement actions to client side only\">\n <Button\n size=\"1\"\n variant={\n debugSettings.skipEngagementTracking ? \"outline\" : \"ghost\"\n }\n color={\n debugSettings.skipEngagementTracking ? \"blue\" : \"gray\"\n }\n icon={{ icon: BoxIcon, alt: \"Sandbox mode\" }}\n onClick={() => {\n client.setDebug({\n ...debugSettings,\n skipEngagementTracking:\n !debugSettings.skipEngagementTracking,\n });\n }}\n />\n </Tooltip>\n\n <Tooltip label=\"Ignore throttle: Show next guide immediately\">\n <Button\n size=\"1\"\n variant={\n debugSettings.ignoreDisplayInterval ? \"outline\" : \"ghost\"\n }\n color={\n debugSettings.ignoreDisplayInterval ? \"blue\" : \"gray\"\n }\n icon={{ icon: Gauge, alt: \"Ignore throttle\" }}\n onClick={() => {\n client.setDebug({\n ...debugSettings,\n ignoreDisplayInterval:\n !debugSettings.ignoreDisplayInterval,\n });\n }}\n />\n </Tooltip>\n\n <Tooltip label=\"Inspect target params\">\n <Button\n size=\"1\"\n variant={isContextPanelOpen ? \"outline\" : \"ghost\"}\n color={isContextPanelOpen ? \"blue\" : \"gray\"}\n leadingIcon={{\n icon: SlidersHorizontal,\n alt: \"Inspect target params\",\n }}\n trailingIcon={\n isContextPanelOpen\n ? { icon: ChevronDown, alt: \"Hide context data\" }\n : { icon: ChevronRight, alt: \"Show context data\" }\n }\n onClick={() => setIsContextPanelOpen((v) => !v)}\n />\n </Tooltip>\n </Stack>\n </Stack>\n\n {/* Right: exit + minimize buttons */}\n <Stack\n align=\"center\"\n gap=\"1_5\"\n style={{ flexShrink: 0 }}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <Stack align=\"center\" gap=\"1_5\">\n <Button\n size=\"1\"\n variant=\"outline\"\n leadingIcon={{ icon: LogOut, alt: \"Exit\" }}\n onClick={() => {\n setRunConfig((curr) => ({ ...curr, isVisible: false }));\n clearRunConfigLS();\n client.unsetDebug();\n }}\n >\n Exit\n </Button>\n <Tooltip label=\"Minimize toolbar\">\n <Button\n size=\"1\"\n variant=\"outline\"\n leadingIcon={{ icon: Minimize2, alt: \"Minimize\" }}\n onClick={() => setIsCollapsed(true)}\n />\n </Tooltip>\n </Stack>\n </Stack>\n </Stack>\n\n {/* Collapsible panel to show context data */}\n {isContextPanelOpen && (\n <Box borderBottom=\"px\">\n <GuideContextDetails />\n </Box>\n )}\n\n {/* Guide list content area */}\n <Box p=\"1\" overflow=\"auto\" style={{ maxHeight: \"calc(80vh - 96px)\" }}>\n {result.status === \"error\" ? (\n <Box px=\"2\" pb=\"1\">\n <Text\n as=\"span\"\n size=\"1\"\n weight=\"medium\"\n color={\n result.error === \"no_guides_fetched\" ? \"default\" : \"red\"\n }\n >\n {result.message}\n </Text>\n </Box>\n ) : (\n <GuidesList\n guides={result.guides}\n displayOption={displayOption}\n />\n )}\n </Box>\n </Stack>\n )}\n </Box>\n );\n};\n"],"names":["TOOLBAR_WIDTH","GuidesList","guides","displayOption","expandedGuideRowKey","setExpandedGuideRowKey","React","useState","useEffect","undefined","map","guide","idx","isEligible","isQualified","annotation","GuideRow","key","k","V2","client","useGuideContext","setDisplayOption","runConfig","setRunConfig","getRunConfig","isCollapsed","setIsCollapsed","isContextPanelOpen","setIsContextPanelOpen","debugSettings","useStore","store","state","debug","isVisible","focusedGuideKeys","isDebugging","debugging","setDebug","Object","keys","length","unsetDebug","containerRef","useRef","position","isDragging","handlePointerDown","hasDraggedRef","useDraggable","elementRef","reclampDeps","initialPosition","top","right","result","useInspectGuideClientStore","Box","zIndex","TOOLBAR_Z_INDEX","Stack","cursor","touchAction","userSelect","transform","transformOrigin","KnockButton","current","width","boxShadow","boxSizing","minWidth","flex","e","stopPropagation","Icon","GripVertical","SegmentedControl","val","Tooltip","Button","skipEngagementTracking","icon","BoxIcon","alt","ignoreDisplayInterval","Gauge","SlidersHorizontal","ChevronDown","ChevronRight","v","flexShrink","LogOut","curr","clearRunConfigLS","Minimize2","GuideContextDetails","maxHeight","status","Text","error","message"],"mappings":"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"}
@@ -2,12 +2,49 @@ import "@knocklabs/react-core";
2
2
  import "react";
3
3
  /* empty css */
4
4
  import "lodash.debounce";
5
- import { checkForWindow as o } from "../../../../core/utils.mjs";
6
- const a = "knock_guide_toolbar", l = () => {
7
- const r = o();
8
- return !r || !r.location ? !1 : new URLSearchParams(r.location.search).get(a) === "true";
5
+ import { checkForWindow as e } from "../../../../core/utils.mjs";
6
+ const s = "knock_guide_toolbar", l = "focused_guide_key", n = "knock_guide_debug", R = () => {
7
+ const t = {
8
+ isVisible: !1
9
+ }, o = e();
10
+ if (!o || !o.location)
11
+ return t;
12
+ const c = new URLSearchParams(o.location.search), i = c.get(s), a = c.get(l);
13
+ if (i !== null) {
14
+ const r = {
15
+ isVisible: i === "true"
16
+ };
17
+ return a && (r.focusedGuideKeys = {
18
+ [a]: !0
19
+ }), u(r), r;
20
+ }
21
+ return g() || t;
22
+ }, u = (t) => {
23
+ const o = e();
24
+ if (!(!o || !o.localStorage))
25
+ try {
26
+ o.localStorage.setItem(n, JSON.stringify(t));
27
+ } catch {
28
+ }
29
+ }, g = () => {
30
+ const t = e();
31
+ if (!(!t || !t.localStorage))
32
+ try {
33
+ const o = t.localStorage.getItem(n);
34
+ if (o)
35
+ return JSON.parse(o);
36
+ } catch {
37
+ }
38
+ }, h = () => {
39
+ const t = e();
40
+ if (!(!t || !t.localStorage))
41
+ try {
42
+ t.localStorage.removeItem(n);
43
+ } catch {
44
+ }
9
45
  };
10
46
  export {
11
- l as detectToolbarParam
47
+ h as clearRunConfigLS,
48
+ R as getRunConfig
12
49
  };
13
50
  //# sourceMappingURL=helpers.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.mjs","sources":["../../../../../../../src/modules/guide/components/Toolbar/V2/helpers.ts"],"sourcesContent":["import { checkForWindow } from \"../../../../../modules/core\";\n\n// Use this param to start Toolbar and enter into a debugging session when\n// it is present and set to true.\nconst TOOLBAR_QUERY_PARAM = \"knock_guide_toolbar\";\n\nexport const detectToolbarParam = () => {\n const win = checkForWindow();\n if (!win || !win.location) {\n return false;\n }\n\n const urlSearchParams = new URLSearchParams(win.location.search);\n const hasToolbarParam = urlSearchParams.get(TOOLBAR_QUERY_PARAM) === \"true\";\n\n return hasToolbarParam;\n};\n"],"names":["TOOLBAR_QUERY_PARAM","detectToolbarParam","win","checkForWindow","location","URLSearchParams","search","get"],"mappings":";;;;;AAIA,MAAMA,IAAsB,uBAEfC,IAAqBA,MAAM;AACtC,QAAMC,IAAMC,EAAe;AAC3B,SAAI,CAACD,KAAO,CAACA,EAAIE,WACR,KAGe,IAAIC,gBAAgBH,EAAIE,SAASE,MAAM,EACvBC,IAAIP,CAAmB,MAAM;AAGvE;"}
1
+ {"version":3,"file":"helpers.mjs","sources":["../../../../../../../src/modules/guide/components/Toolbar/V2/helpers.ts"],"sourcesContent":["import { KnockGuide } from \"@knocklabs/client\";\n\nimport { checkForWindow } from \"../../../../../modules/core\";\n\n// Use this param to start Toolbar and enter into a debugging session when\n// it is present and set to true.\nconst TOOLBAR_QUERY_PARAM = \"knock_guide_toolbar\";\n\n// Optional, when present pin/focus on this guide.\nconst GUIDE_KEY_PARAM = \"focused_guide_key\";\n\n// Use this key to read and write the run config data.\nconst LOCAL_STORAGE_KEY = \"knock_guide_debug\";\n\nexport type ToolbarV2RunConfig = {\n isVisible: boolean;\n focusedGuideKeys?: Record<KnockGuide[\"key\"], true>;\n};\n\nexport const getRunConfig = (): ToolbarV2RunConfig => {\n const fallback = { isVisible: false };\n\n const win = checkForWindow();\n if (!win || !win.location) {\n return fallback;\n }\n\n const urlSearchParams = new URLSearchParams(win.location.search);\n const toolbarParamValue = urlSearchParams.get(TOOLBAR_QUERY_PARAM);\n const guideKeyParamValue = urlSearchParams.get(GUIDE_KEY_PARAM);\n\n // If toolbar param detected in the URL, write to local storage before\n // returning.\n if (toolbarParamValue !== null) {\n const config: ToolbarV2RunConfig = {\n isVisible: toolbarParamValue === \"true\",\n };\n if (guideKeyParamValue) {\n config.focusedGuideKeys = { [guideKeyParamValue]: true };\n }\n\n writeRunConfigLS(config);\n return config;\n }\n\n // If not detected, check local storage for a persisted run config. If not\n // present then fall back to a default config.\n return readRunConfigLS() || fallback;\n};\n\nconst writeRunConfigLS = (config: ToolbarV2RunConfig) => {\n const win = checkForWindow();\n if (!win || !win.localStorage) return;\n\n try {\n win.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(config));\n } catch {\n // localStorage may be unavailable (e.g. private browsing)\n }\n};\n\nconst readRunConfigLS = (): ToolbarV2RunConfig | undefined => {\n const win = checkForWindow();\n if (!win || !win.localStorage) return undefined;\n\n try {\n const stored = win.localStorage.getItem(LOCAL_STORAGE_KEY);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch {\n // localStorage may be unavailable (e.g. private browsing)\n }\n return undefined;\n};\n\nexport const clearRunConfigLS = () => {\n const win = checkForWindow();\n if (!win || !win.localStorage) return;\n\n try {\n win.localStorage.removeItem(LOCAL_STORAGE_KEY);\n } catch {\n // localStorage may be unavailable (e.g. private browsing)\n }\n};\n"],"names":["TOOLBAR_QUERY_PARAM","GUIDE_KEY_PARAM","LOCAL_STORAGE_KEY","getRunConfig","fallback","isVisible","win","checkForWindow","location","urlSearchParams","URLSearchParams","search","toolbarParamValue","get","guideKeyParamValue","config","focusedGuideKeys","writeRunConfigLS","readRunConfigLS","localStorage","setItem","JSON","stringify","stored","getItem","parse","clearRunConfigLS","removeItem"],"mappings":";;;;;AAMA,MAAMA,IAAsB,uBAGtBC,IAAkB,qBAGlBC,IAAoB,qBAObC,IAAeA,MAA0B;AACpD,QAAMC,IAAW;AAAA,IAAEC,WAAW;AAAA,EAAM,GAE9BC,IAAMC,EAAe;AAC3B,MAAI,CAACD,KAAO,CAACA,EAAIE;AACRJ,WAAAA;AAGT,QAAMK,IAAkB,IAAIC,gBAAgBJ,EAAIE,SAASG,MAAM,GACzDC,IAAoBH,EAAgBI,IAAIb,CAAmB,GAC3Dc,IAAqBL,EAAgBI,IAAIZ,CAAe;AAI9D,MAAIW,MAAsB,MAAM;AAC9B,UAAMG,IAA6B;AAAA,MACjCV,WAAWO,MAAsB;AAAA,IACnC;AACA,WAAIE,MACFC,EAAOC,mBAAmB;AAAA,MAAE,CAACF,CAAkB,GAAG;AAAA,IAAK,IAGzDG,EAAiBF,CAAM,GAChBA;AAAAA,EAAAA;AAKT,SAAOG,EAAqBd,KAAAA;AAC9B,GAEMa,IAAmBA,CAACF,MAA+B;AACvD,QAAMT,IAAMC,EAAe;AAC3B,MAAI,GAACD,KAAO,CAACA,EAAIa;AAEb,QAAA;AACFb,MAAAA,EAAIa,aAAaC,QAAQlB,GAAmBmB,KAAKC,UAAUP,CAAM,CAAC;AAAA,IAAA,QAC5D;AAAA,IAAA;AAGV,GAEMG,IAAkBA,MAAsC;AAC5D,QAAMZ,IAAMC,EAAe;AAC3B,MAAI,GAACD,KAAO,CAACA,EAAIa;AAEb,QAAA;AACF,YAAMI,IAASjB,EAAIa,aAAaK,QAAQtB,CAAiB;AACzD,UAAIqB;AACKF,eAAAA,KAAKI,MAAMF,CAAM;AAAA,IAC1B,QACM;AAAA,IAAA;AAIV,GAEaG,IAAmBA,MAAM;AACpC,QAAMpB,IAAMC,EAAe;AAC3B,MAAI,GAACD,KAAO,CAACA,EAAIa;AAEb,QAAA;AACEA,MAAAA,EAAAA,aAAaQ,WAAWzB,CAAiB;AAAA,IAAA,QACvC;AAAA,IAAA;AAGV;"}
@@ -1,56 +1,58 @@
1
1
  import e from "react";
2
- const C = {
2
+ const S = {
3
3
  top: 16,
4
4
  right: 16
5
- };
6
- function L(n, i, h, o = 0) {
7
- const r = window.innerWidth, f = window.innerHeight, w = i + o, p = r - n.right - i, d = Math.max(0, Math.min(p, r - w)), s = Math.max(0, Math.min(n.top, f - h)), u = r - d - i;
5
+ }, T = 5;
6
+ function y(n, s, w, o = 0) {
7
+ const r = window.innerWidth, f = window.innerHeight, D = s + o, p = r - n.right - s, d = Math.max(0, Math.min(p, r - D)), c = Math.max(0, Math.min(n.top, f - w)), u = r - d - s;
8
8
  return {
9
- top: s,
9
+ top: c,
10
10
  right: u
11
11
  };
12
12
  }
13
13
  function b({
14
14
  elementRef: n,
15
- initialPosition: i = C,
16
- reclampDeps: h = [],
15
+ initialPosition: s = S,
16
+ reclampDeps: w = [],
17
17
  rightPadding: o = 0
18
18
  }) {
19
- const [r, f] = e.useState(i), [w, p] = e.useState(!1), d = e.useRef(r);
19
+ const [r, f] = e.useState(s), [D, p] = e.useState(!1), d = e.useRef(r);
20
20
  d.current = r;
21
- const s = e.useRef({
21
+ const c = e.useRef({
22
22
  x: 0,
23
23
  y: 0
24
24
  }), u = e.useRef({
25
25
  top: 0,
26
26
  right: 0
27
- }), c = e.useRef(null), m = e.useRef(!1), a = e.useRef(null), v = e.useCallback(() => {
27
+ }), i = e.useRef(null), g = e.useRef(!1), h = e.useRef(!1), a = e.useRef(null), v = e.useCallback(() => {
28
28
  const t = n.current;
29
29
  if (!t) return;
30
30
  const l = t.getBoundingClientRect();
31
- f((g) => L(g, l.width, l.height, o));
32
- }, [n, o]), P = e.useCallback((t) => {
33
- t.preventDefault(), s.current = {
31
+ f((m) => y(m, l.width, l.height, o));
32
+ }, [n, o]), A = e.useCallback((t) => {
33
+ t.preventDefault(), c.current = {
34
34
  x: t.clientX,
35
35
  y: t.clientY
36
36
  }, u.current = {
37
37
  ...d.current
38
- }, m.current = !0, p(!0);
39
- const l = (E) => {
40
- m.current && c.current === null && (c.current = requestAnimationFrame(() => {
41
- if (c.current = null, !m.current) return;
42
- const A = E.clientX - s.current.x, F = E.clientY - s.current.y, M = {
43
- top: u.current.top + F,
44
- right: u.current.right - A
45
- }, x = n.current;
46
- if (!x) return;
47
- const D = x.getBoundingClientRect(), y = L(M, D.width, D.height, o);
48
- f(y);
38
+ }, g.current = !0, h.current = !1, p(!0);
39
+ const l = (R) => {
40
+ if (!g.current) return;
41
+ const M = R.clientX - c.current.x, P = R.clientY - c.current.y;
42
+ !h.current && Math.hypot(M, P) >= T && (h.current = !0), i.current === null && (i.current = requestAnimationFrame(() => {
43
+ if (i.current = null, !g.current) return;
44
+ const F = R.clientX - c.current.x, C = R.clientY - c.current.y, H = {
45
+ top: u.current.top + C,
46
+ right: u.current.right - F
47
+ }, E = n.current;
48
+ if (!E) return;
49
+ const L = E.getBoundingClientRect(), I = y(H, L.width, L.height, o);
50
+ f(I);
49
51
  }));
50
- }, g = () => {
51
- m.current = !1, p(!1), c.current !== null && (cancelAnimationFrame(c.current), c.current = null), document.removeEventListener("pointermove", l), document.removeEventListener("pointerup", R), a.current = null;
52
- }, R = () => g();
53
- document.addEventListener("pointermove", l), document.addEventListener("pointerup", R), a.current = g;
52
+ }, m = () => {
53
+ g.current = !1, p(!1), i.current !== null && (cancelAnimationFrame(i.current), i.current = null), document.removeEventListener("pointermove", l), document.removeEventListener("pointerup", x), a.current = null;
54
+ }, x = () => m();
55
+ document.addEventListener("pointermove", l), document.addEventListener("pointerup", x), a.current = m;
54
56
  }, [n, o]);
55
57
  return e.useEffect(() => () => {
56
58
  var t;
@@ -61,14 +63,15 @@ function b({
61
63
  }, [v]), e.useEffect(() => {
62
64
  const t = requestAnimationFrame(() => v());
63
65
  return () => cancelAnimationFrame(t);
64
- }, h), {
66
+ }, w), {
65
67
  position: r,
66
- isDragging: w,
67
- handlePointerDown: P
68
+ isDragging: D,
69
+ handlePointerDown: A,
70
+ hasDraggedRef: h
68
71
  };
69
72
  }
70
73
  export {
71
- L as clampPosition,
74
+ y as clampPosition,
72
75
  b as useDraggable
73
76
  };
74
77
  //# sourceMappingURL=useDraggable.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDraggable.mjs","sources":["../../../../../../../src/modules/guide/components/Toolbar/V2/useDraggable.ts"],"sourcesContent":["import React from \"react\";\n\n// NOTE: This hook was generated entirely with Claude then lightly touched up,\n// and the behavior works correctly from testing it manually in the browser.\n\ntype Position = { top: number; right: number };\n\ntype UseDraggableOptions = {\n elementRef: React.RefObject<HTMLElement | null>;\n initialPosition?: Position;\n reclampDeps?: React.DependencyList;\n /** Extra space to reserve beyond the element's right edge (px). */\n rightPadding?: number;\n};\n\ntype UseDraggableReturn = {\n position: Position;\n isDragging: boolean;\n handlePointerDown: (e: React.PointerEvent) => void;\n};\n\nconst DEFAULT_POSITION: Position = { top: 16, right: 16 };\n\n/**\n * @param rightPadding Extra space to reserve on the right edge (e.g. for a\n * drag handle that protrudes beyond the element). The element's left edge\n * is clamped so that `elementWidth + rightPadding` stays within the viewport.\n */\nexport function clampPosition(\n pos: Position,\n elementWidth: number,\n elementHeight: number,\n rightPadding = 0,\n): Position {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const totalWidth = elementWidth + rightPadding;\n const left = viewportWidth - pos.right - elementWidth;\n const clampedLeft = Math.max(0, Math.min(left, viewportWidth - totalWidth));\n const clampedTop = Math.max(\n 0,\n Math.min(pos.top, viewportHeight - elementHeight),\n );\n const clampedRight = viewportWidth - clampedLeft - elementWidth;\n\n return { top: clampedTop, right: clampedRight };\n}\n\nexport function useDraggable({\n elementRef,\n initialPosition = DEFAULT_POSITION,\n reclampDeps = [],\n rightPadding = 0,\n}: UseDraggableOptions): UseDraggableReturn {\n const [position, setPosition] = React.useState<Position>(initialPosition);\n const [isDragging, setIsDragging] = React.useState(false);\n\n const positionRef = React.useRef(position);\n positionRef.current = position;\n\n const startPointerRef = React.useRef({ x: 0, y: 0 });\n const startPositionRef = React.useRef<Position>({ top: 0, right: 0 });\n const rafIdRef = React.useRef<number | null>(null);\n const isDraggingRef = React.useRef(false);\n const cleanupListenersRef = React.useRef<(() => void) | null>(null);\n\n const reclamp = React.useCallback(() => {\n const el = elementRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n setPosition((prev) =>\n clampPosition(prev, rect.width, rect.height, rightPadding),\n );\n }, [elementRef, rightPadding]);\n\n // Stable pointerdown handler\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n startPointerRef.current = { x: e.clientX, y: e.clientY };\n startPositionRef.current = { ...positionRef.current };\n isDraggingRef.current = true;\n setIsDragging(true);\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n if (!isDraggingRef.current) return;\n\n if (rafIdRef.current !== null) return;\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n if (!isDraggingRef.current) return;\n\n const dx = moveEvent.clientX - startPointerRef.current.x;\n const dy = moveEvent.clientY - startPointerRef.current.y;\n\n const newPos: Position = {\n top: startPositionRef.current.top + dy,\n right: startPositionRef.current.right - dx,\n };\n\n const el = elementRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const clamped = clampPosition(\n newPos,\n rect.width,\n rect.height,\n rightPadding,\n );\n setPosition(clamped);\n });\n };\n\n const cleanup = () => {\n isDraggingRef.current = false;\n setIsDragging(false);\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n document.removeEventListener(\"pointermove\", onPointerMove);\n document.removeEventListener(\"pointerup\", onPointerUp);\n cleanupListenersRef.current = null;\n };\n\n const onPointerUp = () => cleanup();\n\n document.addEventListener(\"pointermove\", onPointerMove);\n document.addEventListener(\"pointerup\", onPointerUp);\n cleanupListenersRef.current = cleanup;\n },\n [elementRef, rightPadding],\n );\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n cleanupListenersRef.current?.();\n };\n }, []);\n\n // Re-clamp on window resize\n React.useEffect(() => {\n const onResize = () => reclamp();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [reclamp]);\n\n // Re-clamp when deps change (e.g. collapse toggle)\n React.useEffect(() => {\n const id = requestAnimationFrame(() => reclamp());\n return () => cancelAnimationFrame(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, reclampDeps);\n\n return { position, isDragging, handlePointerDown };\n}\n"],"names":["DEFAULT_POSITION","top","right","clampPosition","pos","elementWidth","elementHeight","rightPadding","viewportWidth","window","innerWidth","viewportHeight","innerHeight","totalWidth","left","clampedLeft","Math","max","min","clampedTop","clampedRight","useDraggable","elementRef","initialPosition","reclampDeps","position","setPosition","React","useState","isDragging","setIsDragging","positionRef","useRef","current","startPointerRef","x","y","startPositionRef","rafIdRef","isDraggingRef","cleanupListenersRef","reclamp","useCallback","el","rect","getBoundingClientRect","prev","width","height","handlePointerDown","e","preventDefault","clientX","clientY","onPointerMove","moveEvent","requestAnimationFrame","dx","dy","newPos","clamped","cleanup","cancelAnimationFrame","removeEventListener","onPointerUp","addEventListener","useEffect","onResize","id"],"mappings":"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"}
1
+ {"version":3,"file":"useDraggable.mjs","sources":["../../../../../../../src/modules/guide/components/Toolbar/V2/useDraggable.ts"],"sourcesContent":["import React from \"react\";\n\n// NOTE: This hook was generated entirely with Claude then lightly touched up,\n// and the behavior works correctly from testing it manually in the browser.\n\ntype Position = { top: number; right: number };\n\ntype UseDraggableOptions = {\n elementRef: React.RefObject<HTMLElement | null>;\n initialPosition?: Position;\n reclampDeps?: React.DependencyList;\n /** Extra space to reserve beyond the element's right edge (px). */\n rightPadding?: number;\n};\n\ntype UseDraggableReturn = {\n position: Position;\n isDragging: boolean;\n handlePointerDown: (e: React.PointerEvent) => void;\n /** True if the pointer moved beyond a small threshold during the last interaction. */\n hasDraggedRef: React.RefObject<boolean>;\n};\n\nconst DEFAULT_POSITION: Position = { top: 16, right: 16 };\nconst DRAG_THRESHOLD = 5;\n\n/**\n * @param rightPadding Extra space to reserve on the right edge (e.g. for a\n * drag handle that protrudes beyond the element). The element's left edge\n * is clamped so that `elementWidth + rightPadding` stays within the viewport.\n */\nexport function clampPosition(\n pos: Position,\n elementWidth: number,\n elementHeight: number,\n rightPadding = 0,\n): Position {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const totalWidth = elementWidth + rightPadding;\n const left = viewportWidth - pos.right - elementWidth;\n const clampedLeft = Math.max(0, Math.min(left, viewportWidth - totalWidth));\n const clampedTop = Math.max(\n 0,\n Math.min(pos.top, viewportHeight - elementHeight),\n );\n const clampedRight = viewportWidth - clampedLeft - elementWidth;\n\n return { top: clampedTop, right: clampedRight };\n}\n\nexport function useDraggable({\n elementRef,\n initialPosition = DEFAULT_POSITION,\n reclampDeps = [],\n rightPadding = 0,\n}: UseDraggableOptions): UseDraggableReturn {\n const [position, setPosition] = React.useState<Position>(initialPosition);\n const [isDragging, setIsDragging] = React.useState(false);\n\n const positionRef = React.useRef(position);\n positionRef.current = position;\n\n const startPointerRef = React.useRef({ x: 0, y: 0 });\n const startPositionRef = React.useRef<Position>({ top: 0, right: 0 });\n const rafIdRef = React.useRef<number | null>(null);\n const isDraggingRef = React.useRef(false);\n const hasDraggedRef = React.useRef(false);\n const cleanupListenersRef = React.useRef<(() => void) | null>(null);\n\n const reclamp = React.useCallback(() => {\n const el = elementRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n setPosition((prev) =>\n clampPosition(prev, rect.width, rect.height, rightPadding),\n );\n }, [elementRef, rightPadding]);\n\n // Stable pointerdown handler\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n startPointerRef.current = { x: e.clientX, y: e.clientY };\n startPositionRef.current = { ...positionRef.current };\n isDraggingRef.current = true;\n hasDraggedRef.current = false;\n setIsDragging(true);\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n if (!isDraggingRef.current) return;\n\n const dx = moveEvent.clientX - startPointerRef.current.x;\n const dy = moveEvent.clientY - startPointerRef.current.y;\n if (!hasDraggedRef.current && Math.hypot(dx, dy) >= DRAG_THRESHOLD) {\n hasDraggedRef.current = true;\n }\n\n if (rafIdRef.current !== null) return;\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n if (!isDraggingRef.current) return;\n\n const dx = moveEvent.clientX - startPointerRef.current.x;\n const dy = moveEvent.clientY - startPointerRef.current.y;\n\n const newPos: Position = {\n top: startPositionRef.current.top + dy,\n right: startPositionRef.current.right - dx,\n };\n\n const el = elementRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const clamped = clampPosition(\n newPos,\n rect.width,\n rect.height,\n rightPadding,\n );\n setPosition(clamped);\n });\n };\n\n const cleanup = () => {\n isDraggingRef.current = false;\n setIsDragging(false);\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n document.removeEventListener(\"pointermove\", onPointerMove);\n document.removeEventListener(\"pointerup\", onPointerUp);\n cleanupListenersRef.current = null;\n };\n\n const onPointerUp = () => cleanup();\n\n document.addEventListener(\"pointermove\", onPointerMove);\n document.addEventListener(\"pointerup\", onPointerUp);\n cleanupListenersRef.current = cleanup;\n },\n [elementRef, rightPadding],\n );\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n cleanupListenersRef.current?.();\n };\n }, []);\n\n // Re-clamp on window resize\n React.useEffect(() => {\n const onResize = () => reclamp();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [reclamp]);\n\n // Re-clamp when deps change (e.g. collapse toggle)\n React.useEffect(() => {\n const id = requestAnimationFrame(() => reclamp());\n return () => cancelAnimationFrame(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, reclampDeps);\n\n return { position, isDragging, handlePointerDown, hasDraggedRef };\n}\n"],"names":["DEFAULT_POSITION","top","right","DRAG_THRESHOLD","clampPosition","pos","elementWidth","elementHeight","rightPadding","viewportWidth","window","innerWidth","viewportHeight","innerHeight","totalWidth","left","clampedLeft","Math","max","min","clampedTop","clampedRight","useDraggable","elementRef","initialPosition","reclampDeps","position","setPosition","React","useState","isDragging","setIsDragging","positionRef","useRef","current","startPointerRef","x","y","startPositionRef","rafIdRef","isDraggingRef","hasDraggedRef","cleanupListenersRef","reclamp","useCallback","el","rect","getBoundingClientRect","prev","width","height","handlePointerDown","e","preventDefault","clientX","clientY","onPointerMove","moveEvent","dx","dy","hypot","requestAnimationFrame","newPos","clamped","cleanup","cancelAnimationFrame","removeEventListener","onPointerUp","addEventListener","useEffect","onResize","id"],"mappings":"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"}
@@ -3,103 +3,103 @@ import { useGuideContext as _, useStore as b } from "@knocklabs/react-core";
3
3
  const g = (e) => e.reduce((t, s) => ({
4
4
  ...t,
5
5
  [s.key]: s
6
- }), {}), v = (e, t, s, r) => {
7
- var u, n, o, l, a, c, d, f;
8
- const i = !!((l = (o = (n = (u = r.key) == null ? void 0 : u.one) == null ? void 0 : n.metadata) == null ? void 0 : o.opts) != null && l.includeThrottled) || !!((f = (d = (c = (a = r.key) == null ? void 0 : a.all) == null ? void 0 : c.metadata) == null ? void 0 : d.opts) != null && f.includeThrottled);
9
- return e.bypass_global_group_limit ? "returned" : e.key === s.resolved ? t.throttled && !i ? "throttled" : "returned" : "queried";
10
- }, h = (e, t, s, r) => {
11
- var n, o, l, a;
12
- const i = !!((a = (l = (o = (n = r.type) == null ? void 0 : n.one) == null ? void 0 : o.metadata) == null ? void 0 : l.opts) != null && a.includeThrottled), u = r.type.one;
13
- if (u.size === 0)
6
+ }), {}), v = (e, t, s, n) => {
7
+ var r, o, i, d, u, l, c, f;
8
+ const a = !!((d = (i = (o = (r = n.key) == null ? void 0 : r.one) == null ? void 0 : o.metadata) == null ? void 0 : i.opts) != null && d.includeThrottled) || !!((f = (c = (l = (u = n.key) == null ? void 0 : u.all) == null ? void 0 : l.metadata) == null ? void 0 : c.opts) != null && f.includeThrottled);
9
+ return e.bypass_global_group_limit ? "returned" : e.key === s.resolved ? t.throttled && !a ? "throttled" : "returned" : "queried";
10
+ }, h = (e, t, s, n) => {
11
+ var o, i, d, u;
12
+ const a = !!((u = (d = (i = (o = n.type) == null ? void 0 : o.one) == null ? void 0 : i.metadata) == null ? void 0 : d.opts) != null && u.includeThrottled), r = n.type.one;
13
+ if (r.size === 0)
14
14
  return "queried";
15
15
  if (e.bypass_global_group_limit) {
16
- const d = [...u.values()][0];
17
- return e.key !== d.key ? "queried" : "returned";
16
+ const c = [...r.values()][0];
17
+ return e.key !== c.key ? "queried" : "returned";
18
18
  }
19
- return e.key === s.resolved ? t.throttled && !i ? "throttled" : "returned" : "queried";
20
- }, G = (e, t, s, r) => {
21
- var a, c, d, f;
22
- const i = r.type.all;
23
- if (i.size === 0)
19
+ return e.key === s.resolved ? t.throttled && !a ? "throttled" : "returned" : "queried";
20
+ }, G = (e, t, s, n) => {
21
+ var u, l, c, f;
22
+ const a = n.type.all;
23
+ if (a.size === 0)
24
24
  return "queried";
25
- const u = [...i.values()], n = u[0], o = g(u);
26
- return (f = (d = (c = (a = r.type) == null ? void 0 : a.all) == null ? void 0 : c.metadata) == null ? void 0 : d.opts) != null && f.includeThrottled ? o[e.key] ? "returned" : "queried" : (n.bypass_global_group_limit || n.key === s.resolved) && o[e.key] ? t.throttled ? e.bypass_global_group_limit ? "returned" : "throttled" : "returned" : "queried";
27
- }, S = (e, t, s, r) => {
28
- var i, u;
29
- if (r.key)
30
- return v(e, t, s, r);
31
- if ((i = r.type) != null && i.all)
32
- return G(e, t, s, r);
33
- if ((u = r.type) != null && u.one)
34
- return h(e, t, s, r);
25
+ const r = [...a.values()], o = r[0], i = g(r);
26
+ return (f = (c = (l = (u = n.type) == null ? void 0 : u.all) == null ? void 0 : l.metadata) == null ? void 0 : c.opts) != null && f.includeThrottled ? i[e.key] ? "returned" : "queried" : (o.bypass_global_group_limit || o.key === s.resolved) && i[e.key] ? t.throttled ? e.bypass_global_group_limit ? "returned" : "throttled" : "returned" : "queried";
27
+ }, S = (e, t, s, n) => {
28
+ var a, r;
29
+ if (n.key)
30
+ return v(e, t, s, n);
31
+ if ((a = n.type) != null && a.all)
32
+ return G(e, t, s, n);
33
+ if ((r = n.type) != null && r.one)
34
+ return h(e, t, s, n);
35
35
  }, T = (e, t, s) => {
36
36
  if (!s || s.status === "open")
37
37
  return {
38
38
  status: void 0
39
39
  };
40
- const r = {
40
+ const n = {
41
41
  key: (s.results.key || {})[e.key],
42
42
  type: (s.results.type || {})[e.type]
43
43
  };
44
- if (!!!(r.key || r.type))
44
+ if (!!!(n.key || n.type))
45
45
  return {
46
46
  status: void 0
47
47
  };
48
- const u = S(e, t, s, r);
49
- return u ? {
50
- status: u,
51
- query: r
48
+ const r = S(e, t, s, n);
49
+ return r ? {
50
+ status: r,
51
+ query: n
52
52
  } : {
53
53
  status: void 0
54
54
  };
55
- }, w = (e, t) => {
55
+ }, q = (e, t) => {
56
56
  const s = {};
57
57
  return ((t == null ? void 0 : t.reason) === "not_in_target_audience" || (t == null ? void 0 : t.reason) === "target_conditions_not_met") && (s.targetable = {
58
58
  status: !1,
59
59
  reason: t.reason,
60
60
  message: t.message
61
- }), ((t == null ? void 0 : t.reason) === "marked_as_archived" || (e.steps || []).every((r) => !!r.message.archived_at)) && (s.archived = {
61
+ }), ((t == null ? void 0 : t.reason) === "marked_as_archived" || (e.steps || []).every((n) => !!n.message.archived_at)) && (s.archived = {
62
62
  status: !0
63
63
  }), (t == null ? void 0 : t.reason) === "guide_not_active" && (s.active = {
64
64
  status: !1
65
65
  }), s;
66
- }, B = ({
66
+ }, k = ({
67
67
  active: e,
68
68
  targetable: t,
69
69
  archived: s
70
- }) => !(!e.status || !t.status || s.status), I = ({
70
+ }) => !(!e.status || !t.status || s.status), w = ({
71
71
  activatable: e,
72
72
  selectable: t
73
- }) => !(!e.status || !t.status), q = (e, t, s) => {
73
+ }) => !(!e.status || !t.status), m = (e, t, s) => {
74
74
  const {
75
- ineligibleGuides: r,
76
- location: i
77
- } = t, u = r[e.key], n = w(e, u), o = {
75
+ ineligibleGuides: n,
76
+ location: a
77
+ } = t, r = n[e.key], o = q(e, r), i = {
78
78
  // isEligible:
79
- active: (n == null ? void 0 : n.active) || {
79
+ active: (o == null ? void 0 : o.active) || {
80
80
  status: !0
81
81
  },
82
- targetable: (n == null ? void 0 : n.targetable) || {
82
+ targetable: (o == null ? void 0 : o.targetable) || {
83
83
  status: !0
84
84
  },
85
- archived: (n == null ? void 0 : n.archived) || {
85
+ archived: (o == null ? void 0 : o.archived) || {
86
86
  status: !1
87
87
  },
88
88
  // isQualified:
89
89
  activatable: {
90
- status: y(e, i)
90
+ status: y(e, a)
91
91
  },
92
92
  selectable: T(e, t, s)
93
- }, l = {
94
- ...o,
95
- isEligible: B(o),
96
- isQualified: I(o)
93
+ }, d = {
94
+ ...i,
95
+ isEligible: k(i),
96
+ isQualified: w(i)
97
97
  };
98
98
  return {
99
99
  ...e,
100
- annotation: l
100
+ annotation: d
101
101
  };
102
- }, R = (e) => ({
102
+ }, B = (e) => ({
103
103
  __typename: "UnknownGuide",
104
104
  key: e,
105
105
  active: !1,
@@ -111,41 +111,55 @@ const g = (e) => e.reduce((t, s) => ({
111
111
  status: void 0
112
112
  }
113
113
  }
114
- }), E = () => {
115
- var u;
114
+ }), R = (e) => {
115
+ var d;
116
116
  const {
117
- client: e
118
- } = _(), t = b(e.store, (n) => {
119
- const o = p(n);
117
+ client: t
118
+ } = _(), s = b(t.store, (u) => {
119
+ const l = p(u);
120
120
  return {
121
- location: n.location,
122
- guides: n.guides,
123
- guideGroups: n.guideGroups,
124
- ineligibleGuides: n.ineligibleGuides,
125
- debug: n.debug,
126
- counter: n.counter,
127
- throttled: o
121
+ location: u.location,
122
+ guides: u.guides,
123
+ guideGroups: u.guideGroups,
124
+ ineligibleGuides: u.ineligibleGuides,
125
+ debug: u.debug,
126
+ counter: u.counter,
127
+ queries: u.queries,
128
+ throttled: l
128
129
  };
129
130
  });
130
- if (!((u = t.debug) != null && u.debugging))
131
+ if (!((d = s.debug) != null && d.debugging))
131
132
  return;
132
- const s = t.guideGroups[0];
133
- if (!s)
133
+ const n = Object.entries(s.queries)[0];
134
+ if (!n || n[1].status === "loading")
134
135
  return {
136
+ status: "error",
137
+ error: "no_guides_fetched",
138
+ message: "Loading..."
139
+ };
140
+ const a = s.guideGroups[0];
141
+ if (!a)
142
+ return {
143
+ status: "error",
135
144
  error: "no_guide_group",
136
- guides: []
145
+ message: "No guide group found"
137
146
  };
138
- const r = e.getStage();
139
- return {
140
- guides: s.display_sequence.map((n) => {
141
- const o = t.guides[n];
142
- return o ? q(o, t, r) : R(n);
143
- })
147
+ const r = t.getStage(), o = a.display_sequence.map((u) => {
148
+ const l = s.guides[u];
149
+ return l ? m(l, s, r) : B(u);
150
+ }), i = Object.keys(e.focusedGuideKeys || {})[0];
151
+ return (r == null ? void 0 : r.status) === "closed" && i && !o.find((l) => l.key === i && l.annotation.selectable.status) ? {
152
+ status: "error",
153
+ error: "no_guide_present",
154
+ message: `No component that can render \`${i}\` was found`
155
+ } : {
156
+ status: "ok",
157
+ guides: o
144
158
  };
145
- }, Q = (e) => typeof e == "object" && e !== null && "__typename" in e && e.__typename === "UnknownGuide";
159
+ }, U = (e) => typeof e == "object" && e !== null && "__typename" in e && e.__typename === "UnknownGuide";
146
160
  export {
147
- Q as isUnknownGuide,
148
- I as resolveIsQualified,
149
- E as useInspectGuideClientStore
161
+ U as isUnknownGuide,
162
+ w as resolveIsQualified,
163
+ R as useInspectGuideClientStore
150
164
  };
151
165
  //# sourceMappingURL=useInspectGuideClientStore.mjs.map