@vibe/core 4.6.0-alpha-3c271.0 → 4.6.0-alpha-27d50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/components/StrokeSpotlight/StrokeSpotlight.d.ts +4 -0
  2. package/dist/components/StrokeSpotlight/StrokeSpotlight.types.d.ts +15 -0
  3. package/dist/components/StrokeSpotlight/index.d.ts +3 -0
  4. package/dist/components/StrokeSpotlight/useStrokeSpotlight.d.ts +24 -0
  5. package/dist/components/index.d.ts +1 -0
  6. package/dist/metadata/components.json +169 -0
  7. package/dist/metadata/examples/StrokeSpotlight.md +41 -0
  8. package/dist/metadata.json +169 -0
  9. package/dist/mocked_classnames/components/StrokeSpotlight/StrokeSpotlight.d.ts +4 -0
  10. package/dist/mocked_classnames/components/StrokeSpotlight/StrokeSpotlight.types.d.ts +15 -0
  11. package/dist/mocked_classnames/components/StrokeSpotlight/index.d.ts +3 -0
  12. package/dist/mocked_classnames/components/StrokeSpotlight/useStrokeSpotlight.d.ts +24 -0
  13. package/dist/mocked_classnames/components/index.d.ts +1 -0
  14. package/dist/mocked_classnames/src/components/ListItem/ListItem.module.scss.js +1 -1
  15. package/dist/mocked_classnames/src/components/Menu/MenuItem/components/BaseMenuItem/BaseMenuItem.module.scss.js +1 -1
  16. package/dist/mocked_classnames/src/components/StrokeSpotlight/StrokeSpotlight.js +2 -0
  17. package/dist/mocked_classnames/src/components/StrokeSpotlight/StrokeSpotlight.js.map +1 -0
  18. package/dist/mocked_classnames/src/components/StrokeSpotlight/StrokeSpotlight.module.scss.js +2 -0
  19. package/dist/mocked_classnames/src/components/StrokeSpotlight/StrokeSpotlight.module.scss.js.map +1 -0
  20. package/dist/mocked_classnames/src/components/StrokeSpotlight/useStrokeSpotlight.js +2 -0
  21. package/dist/mocked_classnames/src/components/StrokeSpotlight/useStrokeSpotlight.js.map +1 -0
  22. package/dist/mocked_classnames/src/index.js +1 -1
  23. package/dist/mocked_classnames/src/tests/constants.js +1 -1
  24. package/dist/mocked_classnames/src/tests/constants.js.map +1 -1
  25. package/dist/mocked_classnames/tests/constants.d.ts +2 -0
  26. package/dist/src/components/ListItem/ListItem.module.scss.js +1 -1
  27. package/dist/src/components/Menu/MenuItem/components/BaseMenuItem/BaseMenuItem.module.scss.js +1 -1
  28. package/dist/src/components/StrokeSpotlight/StrokeSpotlight.js +2 -0
  29. package/dist/src/components/StrokeSpotlight/StrokeSpotlight.js.map +1 -0
  30. package/dist/src/components/StrokeSpotlight/StrokeSpotlight.module.scss.js +2 -0
  31. package/dist/src/components/StrokeSpotlight/StrokeSpotlight.module.scss.js.map +1 -0
  32. package/dist/src/components/StrokeSpotlight/useStrokeSpotlight.js +2 -0
  33. package/dist/src/components/StrokeSpotlight/useStrokeSpotlight.js.map +1 -0
  34. package/dist/src/index.js +1 -1
  35. package/dist/src/tests/constants.js +1 -1
  36. package/dist/src/tests/constants.js.map +1 -1
  37. package/dist/tests/constants.d.ts +2 -0
  38. package/package.json +21 -21
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { type StrokeSpotlightProps } from "./StrokeSpotlight.types";
3
+ declare const StrokeSpotlight: React.ForwardRefExoticComponent<StrokeSpotlightProps & React.RefAttributes<HTMLDivElement>>;
4
+ export default StrokeSpotlight;
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from "react";
2
+ import { type VibeComponentProps } from "../../types";
3
+ import { type StrokeSpotlightOptions } from "./useStrokeSpotlight";
4
+ export type StrokeSpotlightPalette = "default" | "sidekick" | "vibe";
5
+ export interface StrokeSpotlightProps extends VibeComponentProps, StrokeSpotlightOptions {
6
+ children: ReactNode;
7
+ /** Border stroke width in px; mirrored to CSS `--border`. */
8
+ borderWidth?: number;
9
+ /** Blur radius in px of the halo bleeding outward from the stroke. */
10
+ glowBlur?: number;
11
+ /** Stroke/glow color palette. Default matches agents cyan→blue→violet. */
12
+ palette?: StrokeSpotlightPalette;
13
+ /** Corner radius in px (unitless CSS var `--radius`). */
14
+ radius?: number;
15
+ }
@@ -0,0 +1,3 @@
1
+ export { default as StrokeSpotlight } from "./StrokeSpotlight";
2
+ export type { StrokeSpotlightProps, StrokeSpotlightPalette } from "./StrokeSpotlight.types";
3
+ export { STROKE_NO_PULSE_ATTR, type StrokeSpotlightOptions } from "./useStrokeSpotlight";
@@ -0,0 +1,24 @@
1
+ import { type RefObject } from "react";
2
+ export interface StrokeSpotlightOptions {
3
+ /** How far outside the box (px) the glow still responds. */
4
+ proximity?: number;
5
+ /** Fraction of half-min-side; inside this radius from center, glow is off. */
6
+ inactiveZone?: number;
7
+ /**
8
+ * Outward distance from the outer margins (px) over which the stroke fades
9
+ * from full to off. Inside the box stays full strength.
10
+ */
11
+ edgeFade?: number;
12
+ /** Angular width of the glowing arc (degrees). */
13
+ spread?: number;
14
+ /** Seconds for angle interpolation. */
15
+ movementDuration?: number;
16
+ }
17
+ /** Mark controls that should not trigger the click pulse (e.g. attach, model picker). */
18
+ export declare const STROKE_NO_PULSE_ATTR = "data-stroke-no-pulse";
19
+ /**
20
+ * Pointer-following conic border glow via `--start` / `--active`, plus one-shot
21
+ * click pulse. Traveling stroke is suppressed while the box is `:focus-within`
22
+ * and resumes on hover after focus leaves.
23
+ */
24
+ export declare function useStrokeSpotlight(ref: RefObject<HTMLElement | null>, activeClassName: string, clickPulsingClassName: string, options?: StrokeSpotlightOptions): void;
@@ -50,6 +50,7 @@ export * from "./Skeleton";
50
50
  export * from "./Slider";
51
51
  export * from "./SplitButton";
52
52
  export * from "./Steps";
53
+ export * from "./StrokeSpotlight";
53
54
  export * from "./Table";
54
55
  export * from "./Tabs";
55
56
  export { Text, type TextProps, type TextType, type TextWeight } from "@vibe/typography";
@@ -15801,6 +15801,175 @@
15801
15801
  "storyUrl": "https://vibe.monday.com/?path=/docs/components-steps--docs",
15802
15802
  "previewUrl": "https://vibe.monday.com/iframe.html?id=components-steps--overview&viewMode=story&shortcuts=false&singleStory=true"
15803
15803
  },
15804
+ {
15805
+ "filePath": "src/components/StrokeSpotlight/StrokeSpotlight.tsx",
15806
+ "aggregator": "core",
15807
+ "symbols": [
15808
+ "default as StrokeSpotlight",
15809
+ "StrokeSpotlightProps",
15810
+ "StrokeSpotlightPalette"
15811
+ ],
15812
+ "displayName": "StrokeSpotlight",
15813
+ "description": "",
15814
+ "props": {
15815
+ "borderWidth": {
15816
+ "defaultValue": {
15817
+ "value": "2"
15818
+ },
15819
+ "description": "Border stroke width in px; mirrored to CSS `--border`.",
15820
+ "name": "borderWidth",
15821
+ "required": false,
15822
+ "type": {
15823
+ "name": "number"
15824
+ }
15825
+ },
15826
+ "glowBlur": {
15827
+ "defaultValue": {
15828
+ "value": "12"
15829
+ },
15830
+ "description": "Blur radius in px of the halo bleeding outward from the stroke.",
15831
+ "name": "glowBlur",
15832
+ "required": false,
15833
+ "type": {
15834
+ "name": "number"
15835
+ }
15836
+ },
15837
+ "palette": {
15838
+ "defaultValue": {
15839
+ "value": "default"
15840
+ },
15841
+ "description": "Stroke/glow color palette. Default matches agents cyan→blue→violet.",
15842
+ "name": "palette",
15843
+ "required": false,
15844
+ "type": {
15845
+ "name": "enum",
15846
+ "raw": "StrokeSpotlightPalette",
15847
+ "value": [
15848
+ {
15849
+ "value": "\"default\""
15850
+ },
15851
+ {
15852
+ "value": "\"sidekick\""
15853
+ },
15854
+ {
15855
+ "value": "\"vibe\""
15856
+ }
15857
+ ]
15858
+ }
15859
+ },
15860
+ "radius": {
15861
+ "defaultValue": {
15862
+ "value": "16"
15863
+ },
15864
+ "description": "Corner radius in px (unitless CSS var `--radius`).",
15865
+ "name": "radius",
15866
+ "required": false,
15867
+ "type": {
15868
+ "name": "number"
15869
+ }
15870
+ },
15871
+ "className": {
15872
+ "defaultValue": null,
15873
+ "description": "A CSS class name to apply to the component.",
15874
+ "name": "className",
15875
+ "required": false,
15876
+ "type": {
15877
+ "name": "string"
15878
+ }
15879
+ },
15880
+ "data-testid": {
15881
+ "defaultValue": null,
15882
+ "description": "A unique identifier for testing purposes.",
15883
+ "name": "data-testid",
15884
+ "required": false,
15885
+ "type": {
15886
+ "name": "string"
15887
+ }
15888
+ },
15889
+ "id": {
15890
+ "defaultValue": null,
15891
+ "description": "An HTML id attribute for the component.",
15892
+ "name": "id",
15893
+ "required": false,
15894
+ "type": {
15895
+ "name": "string"
15896
+ }
15897
+ },
15898
+ "proximity": {
15899
+ "defaultValue": null,
15900
+ "description": "How far outside the box (px) the glow still responds.",
15901
+ "name": "proximity",
15902
+ "required": false,
15903
+ "type": {
15904
+ "name": "number"
15905
+ }
15906
+ },
15907
+ "inactiveZone": {
15908
+ "defaultValue": null,
15909
+ "description": "Fraction of half-min-side; inside this radius from center, glow is off.",
15910
+ "name": "inactiveZone",
15911
+ "required": false,
15912
+ "type": {
15913
+ "name": "number"
15914
+ }
15915
+ },
15916
+ "edgeFade": {
15917
+ "defaultValue": null,
15918
+ "description": "Outward distance from the outer margins (px) over which the stroke fades\nfrom full to off. Inside the box stays full strength.",
15919
+ "name": "edgeFade",
15920
+ "required": false,
15921
+ "type": {
15922
+ "name": "number"
15923
+ }
15924
+ },
15925
+ "spread": {
15926
+ "defaultValue": null,
15927
+ "description": "Angular width of the glowing arc (degrees).",
15928
+ "name": "spread",
15929
+ "required": false,
15930
+ "type": {
15931
+ "name": "number"
15932
+ }
15933
+ },
15934
+ "movementDuration": {
15935
+ "defaultValue": null,
15936
+ "description": "Seconds for angle interpolation.",
15937
+ "name": "movementDuration",
15938
+ "required": false,
15939
+ "type": {
15940
+ "name": "number"
15941
+ }
15942
+ }
15943
+ },
15944
+ "import": "import { StrokeSpotlight } from \"@vibe/core\"",
15945
+ "subComponents": []
15946
+ },
15947
+ {
15948
+ "filePath": "src/components/StrokeSpotlight/useStrokeSpotlight.ts",
15949
+ "aggregator": "core",
15950
+ "symbols": [
15951
+ "STROKE_NO_PULSE_ATTR",
15952
+ "type StrokeSpotlightOptions"
15953
+ ],
15954
+ "displayName": "useStrokeSpotlight",
15955
+ "description": "Pointer-following conic border glow via `--start` / `--active`, plus one-shot\nclick pulse. Traveling stroke is suppressed while the box is `:focus-within`\nand resumes on hover after focus leaves.",
15956
+ "props": {},
15957
+ "import": "import { useStrokeSpotlight } from \"@vibe/core\"",
15958
+ "subComponents": []
15959
+ },
15960
+ {
15961
+ "filePath": "src/components/StrokeSpotlight/useStrokeSpotlight.ts",
15962
+ "aggregator": "core",
15963
+ "symbols": [
15964
+ "STROKE_NO_PULSE_ATTR",
15965
+ "type StrokeSpotlightOptions"
15966
+ ],
15967
+ "displayName": "STROKE_NO_PULSE_ATTR",
15968
+ "description": "Mark controls that should not trigger the click pulse (e.g. attach, model picker).",
15969
+ "props": {},
15970
+ "import": "import { STROKE_NO_PULSE_ATTR } from \"@vibe/core\"",
15971
+ "subComponents": []
15972
+ },
15804
15973
  {
15805
15974
  "filePath": "src/components/Table/Table/Table.tsx",
15806
15975
  "aggregator": "core",
@@ -0,0 +1,41 @@
1
+ # Storybook Code Examples
2
+
3
+ ## Overview
4
+
5
+ ```tsx
6
+ <div className={styles.stage}>
7
+ <div className={styles.shell}>
8
+ <StrokeSpotlight {...args}>
9
+ <ChatComposer />
10
+ </StrokeSpotlight>
11
+ </div>
12
+ </div>
13
+ ```
14
+
15
+ ## Palettes
16
+
17
+ ```tsx
18
+ <div className={styles.paletteGrid}>
19
+ {([["default", "Default (Agents)"], ["sidekick", "Sidekick"], ["vibe", "Vibe"]] as const).map(([palette, label]) => <div key={palette} className={styles.paletteItem}>
20
+ <Text type="text2" weight="medium" className={styles.paletteLabel}>
21
+ {label}
22
+ </Text>
23
+ <StrokeSpotlight palette={palette} borderWidth={1.5} glowBlur={12} spread={40}>
24
+ <ChatComposer placeholder={`Compose with ${label} palette…`} />
25
+ </StrokeSpotlight>
26
+ </div>)}
27
+ </div>
28
+ ```
29
+
30
+ ## Chat composer
31
+
32
+ ```tsx
33
+ <div className={styles.stage}>
34
+ <div className={styles.shell}>
35
+ <StrokeSpotlight palette="sidekick" borderWidth={1.5} glowBlur={12} spread={40} proximity={64}>
36
+ <ChatComposer placeholder="@ Mention boards and docs..." />
37
+ </StrokeSpotlight>
38
+ </div>
39
+ </div>
40
+ ```
41
+
@@ -15801,6 +15801,175 @@
15801
15801
  "storyUrl": "https://vibe.monday.com/?path=/docs/components-steps--docs",
15802
15802
  "previewUrl": "https://vibe.monday.com/iframe.html?id=components-steps--overview&viewMode=story&shortcuts=false&singleStory=true"
15803
15803
  },
15804
+ {
15805
+ "filePath": "src/components/StrokeSpotlight/StrokeSpotlight.tsx",
15806
+ "aggregator": "core",
15807
+ "symbols": [
15808
+ "default as StrokeSpotlight",
15809
+ "StrokeSpotlightProps",
15810
+ "StrokeSpotlightPalette"
15811
+ ],
15812
+ "displayName": "StrokeSpotlight",
15813
+ "description": "",
15814
+ "props": {
15815
+ "borderWidth": {
15816
+ "defaultValue": {
15817
+ "value": "2"
15818
+ },
15819
+ "description": "Border stroke width in px; mirrored to CSS `--border`.",
15820
+ "name": "borderWidth",
15821
+ "required": false,
15822
+ "type": {
15823
+ "name": "number"
15824
+ }
15825
+ },
15826
+ "glowBlur": {
15827
+ "defaultValue": {
15828
+ "value": "12"
15829
+ },
15830
+ "description": "Blur radius in px of the halo bleeding outward from the stroke.",
15831
+ "name": "glowBlur",
15832
+ "required": false,
15833
+ "type": {
15834
+ "name": "number"
15835
+ }
15836
+ },
15837
+ "palette": {
15838
+ "defaultValue": {
15839
+ "value": "default"
15840
+ },
15841
+ "description": "Stroke/glow color palette. Default matches agents cyan→blue→violet.",
15842
+ "name": "palette",
15843
+ "required": false,
15844
+ "type": {
15845
+ "name": "enum",
15846
+ "raw": "StrokeSpotlightPalette",
15847
+ "value": [
15848
+ {
15849
+ "value": "\"default\""
15850
+ },
15851
+ {
15852
+ "value": "\"sidekick\""
15853
+ },
15854
+ {
15855
+ "value": "\"vibe\""
15856
+ }
15857
+ ]
15858
+ }
15859
+ },
15860
+ "radius": {
15861
+ "defaultValue": {
15862
+ "value": "16"
15863
+ },
15864
+ "description": "Corner radius in px (unitless CSS var `--radius`).",
15865
+ "name": "radius",
15866
+ "required": false,
15867
+ "type": {
15868
+ "name": "number"
15869
+ }
15870
+ },
15871
+ "className": {
15872
+ "defaultValue": null,
15873
+ "description": "A CSS class name to apply to the component.",
15874
+ "name": "className",
15875
+ "required": false,
15876
+ "type": {
15877
+ "name": "string"
15878
+ }
15879
+ },
15880
+ "data-testid": {
15881
+ "defaultValue": null,
15882
+ "description": "A unique identifier for testing purposes.",
15883
+ "name": "data-testid",
15884
+ "required": false,
15885
+ "type": {
15886
+ "name": "string"
15887
+ }
15888
+ },
15889
+ "id": {
15890
+ "defaultValue": null,
15891
+ "description": "An HTML id attribute for the component.",
15892
+ "name": "id",
15893
+ "required": false,
15894
+ "type": {
15895
+ "name": "string"
15896
+ }
15897
+ },
15898
+ "proximity": {
15899
+ "defaultValue": null,
15900
+ "description": "How far outside the box (px) the glow still responds.",
15901
+ "name": "proximity",
15902
+ "required": false,
15903
+ "type": {
15904
+ "name": "number"
15905
+ }
15906
+ },
15907
+ "inactiveZone": {
15908
+ "defaultValue": null,
15909
+ "description": "Fraction of half-min-side; inside this radius from center, glow is off.",
15910
+ "name": "inactiveZone",
15911
+ "required": false,
15912
+ "type": {
15913
+ "name": "number"
15914
+ }
15915
+ },
15916
+ "edgeFade": {
15917
+ "defaultValue": null,
15918
+ "description": "Outward distance from the outer margins (px) over which the stroke fades\nfrom full to off. Inside the box stays full strength.",
15919
+ "name": "edgeFade",
15920
+ "required": false,
15921
+ "type": {
15922
+ "name": "number"
15923
+ }
15924
+ },
15925
+ "spread": {
15926
+ "defaultValue": null,
15927
+ "description": "Angular width of the glowing arc (degrees).",
15928
+ "name": "spread",
15929
+ "required": false,
15930
+ "type": {
15931
+ "name": "number"
15932
+ }
15933
+ },
15934
+ "movementDuration": {
15935
+ "defaultValue": null,
15936
+ "description": "Seconds for angle interpolation.",
15937
+ "name": "movementDuration",
15938
+ "required": false,
15939
+ "type": {
15940
+ "name": "number"
15941
+ }
15942
+ }
15943
+ },
15944
+ "import": "import { StrokeSpotlight } from \"@vibe/core\"",
15945
+ "subComponents": []
15946
+ },
15947
+ {
15948
+ "filePath": "src/components/StrokeSpotlight/useStrokeSpotlight.ts",
15949
+ "aggregator": "core",
15950
+ "symbols": [
15951
+ "STROKE_NO_PULSE_ATTR",
15952
+ "type StrokeSpotlightOptions"
15953
+ ],
15954
+ "displayName": "useStrokeSpotlight",
15955
+ "description": "Pointer-following conic border glow via `--start` / `--active`, plus one-shot\nclick pulse. Traveling stroke is suppressed while the box is `:focus-within`\nand resumes on hover after focus leaves.",
15956
+ "props": {},
15957
+ "import": "import { useStrokeSpotlight } from \"@vibe/core\"",
15958
+ "subComponents": []
15959
+ },
15960
+ {
15961
+ "filePath": "src/components/StrokeSpotlight/useStrokeSpotlight.ts",
15962
+ "aggregator": "core",
15963
+ "symbols": [
15964
+ "STROKE_NO_PULSE_ATTR",
15965
+ "type StrokeSpotlightOptions"
15966
+ ],
15967
+ "displayName": "STROKE_NO_PULSE_ATTR",
15968
+ "description": "Mark controls that should not trigger the click pulse (e.g. attach, model picker).",
15969
+ "props": {},
15970
+ "import": "import { STROKE_NO_PULSE_ATTR } from \"@vibe/core\"",
15971
+ "subComponents": []
15972
+ },
15804
15973
  {
15805
15974
  "filePath": "src/components/Table/Table/Table.tsx",
15806
15975
  "aggregator": "core",
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { type StrokeSpotlightProps } from "./StrokeSpotlight.types";
3
+ declare const StrokeSpotlight: React.ForwardRefExoticComponent<StrokeSpotlightProps & React.RefAttributes<HTMLDivElement>>;
4
+ export default StrokeSpotlight;
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from "react";
2
+ import { type VibeComponentProps } from "../../types";
3
+ import { type StrokeSpotlightOptions } from "./useStrokeSpotlight";
4
+ export type StrokeSpotlightPalette = "default" | "sidekick" | "vibe";
5
+ export interface StrokeSpotlightProps extends VibeComponentProps, StrokeSpotlightOptions {
6
+ children: ReactNode;
7
+ /** Border stroke width in px; mirrored to CSS `--border`. */
8
+ borderWidth?: number;
9
+ /** Blur radius in px of the halo bleeding outward from the stroke. */
10
+ glowBlur?: number;
11
+ /** Stroke/glow color palette. Default matches agents cyan→blue→violet. */
12
+ palette?: StrokeSpotlightPalette;
13
+ /** Corner radius in px (unitless CSS var `--radius`). */
14
+ radius?: number;
15
+ }
@@ -0,0 +1,3 @@
1
+ export { default as StrokeSpotlight } from "./StrokeSpotlight";
2
+ export type { StrokeSpotlightProps, StrokeSpotlightPalette } from "./StrokeSpotlight.types";
3
+ export { STROKE_NO_PULSE_ATTR, type StrokeSpotlightOptions } from "./useStrokeSpotlight";
@@ -0,0 +1,24 @@
1
+ import { type RefObject } from "react";
2
+ export interface StrokeSpotlightOptions {
3
+ /** How far outside the box (px) the glow still responds. */
4
+ proximity?: number;
5
+ /** Fraction of half-min-side; inside this radius from center, glow is off. */
6
+ inactiveZone?: number;
7
+ /**
8
+ * Outward distance from the outer margins (px) over which the stroke fades
9
+ * from full to off. Inside the box stays full strength.
10
+ */
11
+ edgeFade?: number;
12
+ /** Angular width of the glowing arc (degrees). */
13
+ spread?: number;
14
+ /** Seconds for angle interpolation. */
15
+ movementDuration?: number;
16
+ }
17
+ /** Mark controls that should not trigger the click pulse (e.g. attach, model picker). */
18
+ export declare const STROKE_NO_PULSE_ATTR = "data-stroke-no-pulse";
19
+ /**
20
+ * Pointer-following conic border glow via `--start` / `--active`, plus one-shot
21
+ * click pulse. Traveling stroke is suppressed while the box is `:focus-within`
22
+ * and resumes on hover after focus leaves.
23
+ */
24
+ export declare function useStrokeSpotlight(ref: RefObject<HTMLElement | null>, activeClassName: string, clickPulsingClassName: string, options?: StrokeSpotlightOptions): void;
@@ -50,6 +50,7 @@ export * from "./Skeleton";
50
50
  export * from "./Slider";
51
51
  export * from "./SplitButton";
52
52
  export * from "./Steps";
53
+ export * from "./StrokeSpotlight";
53
54
  export * from "./Table";
54
55
  export * from "./Tabs";
55
56
  export { Text, type TextProps, type TextType, type TextWeight } from "@vibe/typography";
@@ -1,2 +1,2 @@
1
- var e={listItem:"listItem","focus-visible":"focus-visible",disabled:"disabled",selected:"selected",small:"small",medium:"medium",large:"large"};!function(e){const n="s_id-8402a299d384_4_5_10";if("undefined"!=typeof document){const l=document.head||document.getElementsByTagName("head")[0];if(l.querySelector("#"+n))return;const t=document.createElement("style");t.id=n,l.firstChild?l.insertBefore(t,l.firstChild):l.appendChild(t),t.appendChild(document.createTextNode(e))}else globalThis.injectedStyles&&(globalThis.injectedStyles[n]=e)}("/* stylelint-disable selector-class-pattern */\n/* stylelint-disable */\n/* stylelint-enable */\n.listItem {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n}\n.listItem:focus-visible, .listItem.focus-visible {\n outline: none;\n z-index: 11;\n border-radius: 4px;\n box-shadow: 0 0 0 3px hsla(209, 100%, 50%, 0.5) inset, 0 0 0 1px var(--primary-hover-color) inset;\n}\n.listItem:focus:not(.focus-visible) {\n outline: none;\n}\n\n.listItem:hover {\n background-color: var(--primary-background-hover-color);\n}\n\n.disabled {\n cursor: not-allowed;\n}\n\n.disabled:hover {\n background-color: transparent;\n}\n\n.selected {\n background-color: var(--primary-selected-color);\n}\n\n.selected:hover {\n background-color: var(--primary-selected-color);\n}\n\n.small {\n height: 32px;\n}\n\n.medium {\n height: 40px;\n}\n\n.large {\n height: 48px;\n}");export{e as default};
1
+ var e={listItem:"listItem","focus-visible":"focus-visible",disabled:"disabled",selected:"selected",small:"small",medium:"medium",large:"large"};!function(e){const n="s_id-875a4db0e337_4_5_10";if("undefined"!=typeof document){const l=document.head||document.getElementsByTagName("head")[0];if(l.querySelector("#"+n))return;const t=document.createElement("style");t.id=n,l.firstChild?l.insertBefore(t,l.firstChild):l.appendChild(t),t.appendChild(document.createTextNode(e))}else globalThis.injectedStyles&&(globalThis.injectedStyles[n]=e)}("/* stylelint-disable selector-class-pattern */\n/* stylelint-disable */\n/* stylelint-enable */\n.listItem {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n border-radius: var(--border-radius-small);\n cursor: pointer;\n}\n.listItem:focus-visible, .listItem.focus-visible {\n outline: none;\n z-index: 11;\n border-radius: 4px;\n box-shadow: 0 0 0 3px hsla(209, 100%, 50%, 0.5) inset, 0 0 0 1px var(--primary-hover-color) inset;\n}\n.listItem:focus:not(.focus-visible) {\n outline: none;\n}\n\n.listItem:hover {\n background-color: var(--primary-background-hover-color);\n}\n\n.disabled {\n cursor: not-allowed;\n}\n\n.disabled:hover {\n background-color: transparent;\n}\n\n.selected {\n background-color: var(--primary-selected-color);\n}\n\n.selected:hover {\n background-color: var(--primary-selected-color);\n}\n\n.small {\n height: 32px;\n}\n\n.medium {\n height: 40px;\n}\n\n.large {\n height: 48px;\n}");export{e as default};
2
2
  //# sourceMappingURL=ListItem.module.scss.js.map
@@ -1,2 +1,2 @@
1
- var e={item:"item",splitMenuItem:"splitMenuItem",disabled:"disabled",focused:"focused",initialSelected:"initialSelected",selected:"selected"};!function(e){const n="s_id-8562a1149ca1_4_5_10";if("undefined"!=typeof document){const t=document.head||document.getElementsByTagName("head")[0];if(t.querySelector("#"+n))return;const o=document.createElement("style");o.id=n,t.firstChild?t.insertBefore(o,t.firstChild):t.appendChild(o),o.appendChild(document.createTextNode(e))}else globalThis.injectedStyles&&(globalThis.injectedStyles[n]=e)}("/* stylelint-disable */\n/* stylelint-enable */\n/* stylelint-disable */\n/* stylelint-enable */\n/* stylelint-disable selector-class-pattern */\n.item {\n -webkit-font-smoothing: var(--font-smoothing-webkit);\n -moz-osx-font-smoothing: var(--font-smoothing-moz);\n margin: unset;\n display: flex;\n flex-direction: row;\n width: 100%;\n box-sizing: border-box;\n padding: var(--space-4) var(--space-8);\n cursor: pointer;\n user-select: none;\n align-items: center;\n overflow: visible;\n border: 1px solid transparent;\n border-radius: 8px;\n outline: none;\n}\n.item.splitMenuItem {\n padding: 0 0 0 var(--space-8);\n}\n.item.disabled {\n cursor: not-allowed;\n color: var(--disabled-text-color);\n}\n.item.focused:not(.disabled) {\n background-color: var(--primary-background-hover-color);\n}\n.item.focused:not(.disabled):not(:hover):not(.initialSelected) {\n outline: none;\n z-index: 11;\n border-radius: 4px;\n box-shadow: 0 0 0 3px hsla(209, 100%, 50%, 0.5), 0 0 0 1px var(--primary-hover-color) inset;\n}\n.item:hover:not(.disabled) {\n background-color: var(--primary-background-hover-color);\n}\n.item.selected:not(.disabled) {\n background-color: var(--primary-background-hover-color);\n}");export{e as default};
1
+ var e={item:"item",splitMenuItem:"splitMenuItem",disabled:"disabled",focused:"focused",initialSelected:"initialSelected",selected:"selected"};!function(e){const n="s_id-a4f779bce409_4_5_10";if("undefined"!=typeof document){const o=document.head||document.getElementsByTagName("head")[0];if(o.querySelector("#"+n))return;const t=document.createElement("style");t.id=n,o.firstChild?o.insertBefore(t,o.firstChild):o.appendChild(t),t.appendChild(document.createTextNode(e))}else globalThis.injectedStyles&&(globalThis.injectedStyles[n]=e)}("/* stylelint-disable */\n/* stylelint-enable */\n/* stylelint-disable */\n/* stylelint-enable */\n/* stylelint-disable selector-class-pattern */\n.item {\n -webkit-font-smoothing: var(--font-smoothing-webkit);\n -moz-osx-font-smoothing: var(--font-smoothing-moz);\n margin: unset;\n display: flex;\n flex-direction: row;\n width: 100%;\n box-sizing: border-box;\n padding: var(--space-4) var(--space-8);\n cursor: pointer;\n user-select: none;\n align-items: center;\n overflow: visible;\n border: 1px solid transparent;\n border-radius: var(--border-radius-small);\n outline: none;\n}\n.item.splitMenuItem {\n padding: 0 0 0 var(--space-8);\n}\n.item.disabled {\n cursor: not-allowed;\n color: var(--disabled-text-color);\n}\n.item.focused:not(.disabled) {\n background-color: var(--primary-background-hover-color);\n}\n.item.focused:not(.disabled):not(:hover):not(.initialSelected) {\n outline: none;\n z-index: 11;\n border-radius: 4px;\n box-shadow: 0 0 0 3px hsla(209, 100%, 50%, 0.5), 0 0 0 1px var(--primary-hover-color) inset;\n}\n.item:hover:not(.disabled) {\n background-color: var(--primary-background-hover-color);\n}\n.item.selected:not(.disabled) {\n background-color: var(--primary-background-hover-color);\n}");export{e as default};
2
2
  //# sourceMappingURL=BaseMenuItem.module.scss.js.map
@@ -0,0 +1,2 @@
1
+ import e,{forwardRef as t,useRef as i}from"react";import a from"classnames";import r from"./StrokeSpotlight.module.scss.js";import{useStrokeSpotlight as o}from"./useStrokeSpotlight.js";import{getTestId as s,ComponentDefaultTestId as d}from"../../tests/testIds.js";import{ComponentVibeId as l}from"../../tests/constants.js";var c=t((function(t,c){var n=t.children,m=t.className,p=t.proximity,u=t.inactiveZone,v=t.edgeFade,f=t.spread,k=t.movementDuration,g=t.borderWidth,S=void 0===g?2:g,h=t.glowBlur,b=void 0===h?12:h,E=t.palette,T=void 0===E?"default":E,N=t.radius,j=void 0===N?16:N,x=t.id,y=t["data-testid"],O=i(null);o(O,"is-spotlight-active","is-click-pulsing",{proximity:p,inactiveZone:u,edgeFade:v,spread:f,movementDuration:k});var w={"--border":S,"--glow-blur":"".concat(b,"px"),"--radius":j};return e.createElement("div",{ref:function(e){O.current=e,"function"==typeof c?c(e):c&&(c.current=e)},className:a(r.root,"sidekick"===T?r.paletteSidekick:"vibe"===T?r.paletteVibe:void 0,m),style:w,id:x,"data-testid":y||s(d.STROKE_SPOTLIGHT,x),"data-vibe":l.STROKE_SPOTLIGHT},e.createElement("div",{"aria-hidden":!0,className:r.glow}),e.createElement("div",{"aria-hidden":!0,"data-stroke-click-pulse":!0,className:r.clickPulse}),e.createElement("div",{className:r.surface},n))}));export{c as default};
2
+ //# sourceMappingURL=StrokeSpotlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StrokeSpotlight.js","sources":["../../../../../src/components/StrokeSpotlight/StrokeSpotlight.tsx"],"sourcesContent":["import React, { forwardRef, useRef, type CSSProperties } from \"react\";\nimport cx from \"classnames\";\nimport { type StrokeSpotlightProps } from \"./StrokeSpotlight.types\";\nimport styles from \"./StrokeSpotlight.module.scss\";\nimport { useStrokeSpotlight } from \"./useStrokeSpotlight\";\nimport { ComponentDefaultTestId, getTestId } from \"../../tests/test-ids-utils\";\nimport { ComponentVibeId } from \"../../tests/constants\";\n\nconst SPOTLIGHT_ACTIVE_CLASS = \"is-spotlight-active\";\nconst CLICK_PULSING_CLASS = \"is-click-pulsing\";\n\nconst StrokeSpotlight = forwardRef<HTMLDivElement, StrokeSpotlightProps>(\n (\n {\n children,\n className,\n proximity,\n inactiveZone,\n edgeFade,\n spread,\n movementDuration,\n borderWidth = 2,\n glowBlur = 12,\n palette = \"default\",\n radius = 16,\n id,\n \"data-testid\": dataTestId\n },\n forwardedRef\n ) => {\n const localRef = useRef<HTMLDivElement>(null);\n\n useStrokeSpotlight(localRef, SPOTLIGHT_ACTIVE_CLASS, CLICK_PULSING_CLASS, {\n proximity,\n inactiveZone,\n edgeFade,\n spread,\n movementDuration\n });\n\n const setRefs = (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n (forwardedRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n };\n\n const style = {\n \"--border\": borderWidth,\n \"--glow-blur\": `${glowBlur}px`,\n \"--radius\": radius\n } as CSSProperties;\n\n const paletteClass =\n palette === \"sidekick\" ? styles.paletteSidekick : palette === \"vibe\" ? styles.paletteVibe : undefined;\n\n return (\n <div\n ref={setRefs}\n className={cx(styles.root, paletteClass, className)}\n style={style}\n id={id}\n data-testid={dataTestId || getTestId(ComponentDefaultTestId.STROKE_SPOTLIGHT, id)}\n data-vibe={ComponentVibeId.STROKE_SPOTLIGHT}\n >\n <div aria-hidden className={styles.glow} />\n <div aria-hidden data-stroke-click-pulse className={styles.clickPulse} />\n <div className={styles.surface}>{children}</div>\n </div>\n );\n }\n);\n\nexport default StrokeSpotlight;\n"],"names":["StrokeSpotlight","forwardRef","_ref","forwardedRef","children","className","proximity","inactiveZone","edgeFade","spread","movementDuration","_ref$borderWidth","borderWidth","_ref$glowBlur","glowBlur","_ref$palette","palette","_ref$radius","radius","id","dataTestId","localRef","useRef","useStrokeSpotlight","style","concat","React","createElement","ref","node","current","cx","styles","root","paletteSidekick","paletteVibe","undefined","getTestId","ComponentDefaultTestId","STROKE_SPOTLIGHT","ComponentVibeId","glow","clickPulse","surface"],"mappings":"mUAQA,IAGMA,EAAkBC,GACtB,SAAAC,EAgBEC,GACE,IAfAC,EAAQF,EAARE,SACAC,EAASH,EAATG,UACAC,EAASJ,EAATI,UACAC,EAAYL,EAAZK,aACAC,EAAQN,EAARM,SACAC,EAAMP,EAANO,OACAC,EAAgBR,EAAhBQ,iBAAgBC,EAAAT,EAChBU,YAAAA,OAAc,IAAHD,EAAG,EAACA,EAAAE,EAAAX,EACfY,SAAAA,OAAW,IAAHD,EAAG,GAAEA,EAAAE,EAAAb,EACbc,QAAAA,OAAU,IAAHD,EAAG,UAASA,EAAAE,EAAAf,EACnBgB,OAAAA,OAAS,IAAHD,EAAG,GAAEA,EACXE,EAAEjB,EAAFiB,GACeC,EAAUlB,EAAzB,eAIImB,EAAWC,EAAuB,MAExCC,EAAmBF,EAxBQ,sBACH,mBAuBkD,CACxEf,UAAAA,EACAC,aAAAA,EACAC,SAAAA,EACAC,OAAAA,EACAC,iBAAAA,IAGF,IASMc,EAAQ,CACZ,WAAYZ,EACZ,cAAaa,GAAAA,OAAKX,EAAY,MAC9B,WAAYI,GAMd,OACEQ,EACEC,cAAA,MAAA,CAAAC,IApBY,SAACC,GACfR,EAASS,QAAUD,EACS,mBAAjB1B,EACTA,EAAa0B,GACJ1B,IACRA,EAA+D2B,QAAUD,IAgB1ExB,UAAW0B,EAAGC,EAAOC,KALX,aAAZjB,EAAyBgB,EAAOE,gBAA8B,SAAZlB,EAAqBgB,EAAOG,iBAAcC,EAKjD/B,GACzCmB,MAAOA,EACPL,GAAIA,EACS,cAAAC,GAAciB,EAAUC,EAAuBC,iBAAkBpB,GACnE,YAAAqB,EAAgBD,kBAE3Bb,EAAAC,cAAA,MAAA,CAAA,eAAA,EAAiBtB,UAAW2B,EAAOS,OACnCf,EAAAC,cAAA,MAAA,CAAA,eAAA,EAAA,2BAAA,EAAyCtB,UAAW2B,EAAOU,aAC3DhB,EAAKC,cAAA,MAAA,CAAAtB,UAAW2B,EAAOW,SAAUvC,GAGvC"}
@@ -0,0 +1,2 @@
1
+ var e={root:"root",paletteSidekick:"paletteSidekick",paletteVibe:"paletteVibe",surface:"surface",clickPulse:"clickPulse",glow:"glow","stroke-spotlight-scale-grow":"stroke-spotlight-scale-grow","stroke-spotlight-click-expand":"stroke-spotlight-click-expand","stroke-spotlight-click-blur":"stroke-spotlight-click-blur","stroke-spotlight-click-fade":"stroke-spotlight-click-fade","stroke-spotlight-click-fade-reduced":"stroke-spotlight-click-fade-reduced"};!function(e){const r="s_id-cb48ec090904_4_5_10";if("undefined"!=typeof document){const t=document.head||document.getElementsByTagName("head")[0];if(t.querySelector("#"+r))return;const n=document.createElement("style");n.id=r,t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.appendChild(document.createTextNode(e))}else globalThis.injectedStyles&&(globalThis.injectedStyles[r]=e)}('@charset "UTF-8";\n/* stylelint-disable monday-ui-style/use-defined-css-var-when-available -- brand stroke stops are product palettes, not semantic tokens */\n@keyframes stroke-spotlight-scale-grow {\n 0% {\n transform: scale(1);\n }\n 60% {\n transform: scale(0.98);\n }\n 100% {\n transform: scale(1);\n }\n}\n.root {\n /* Stroke palette defaults — Sidekick / Vibe override via modifiers. */\n --stroke-stop-1: #04f7fb;\n --stroke-stop-2: #0074fd;\n --stroke-stop-3: #9450fd;\n --stroke-stop-4: #04f7fb;\n --stroke-stop-2-at: 120deg;\n --stroke-stop-3-at: 240deg;\n --stroke-stop-4-at: 300deg;\n --radius: 16;\n --border: 2;\n --border-size: calc(var(--border, 2) * 1px);\n --start: 0;\n --active: 0;\n --spread: 22;\n --outer-radius: calc((var(--radius) + var(--border)) * 1px);\n --glow-blur: 12px;\n --glow-strength: 0.25;\n --glow-saturation: 0.55;\n --stroke-strength: 0.8;\n --click-pulse-blur: 32px;\n --click-pulse-blur-spread: 96px;\n --click-pulse-strength: 0.2;\n --click-pulse-end-scale-x: 3.2;\n --click-pulse-end-scale-y: 4.5;\n --stroke-duration-short: 20ms;\n --stroke-duration-scale: var(--motion-productive-long, 150ms);\n --stroke-duration-wash: 650ms;\n --stroke-duration-fade: var(--motion-expressive-short, 250ms);\n --stroke-duration-reduced: var(--motion-productive-short, 70ms);\n --stroke-ease: var(--motion-timing-transition, cubic-bezier(0.4, 0, 0.2, 1));\n position: relative;\n isolation: isolate;\n display: block;\n width: 100%;\n height: 100%;\n overflow: visible;\n transform-origin: center center;\n border-radius: var(--outer-radius);\n background-color: transparent;\n border: var(--border-size) solid transparent;\n touch-action: none;\n box-sizing: border-box;\n}\n\n/* Sidekick home: lilac → teal → green */\n.paletteSidekick {\n --stroke-stop-1: #8181ff;\n --stroke-stop-2: #33dbdb;\n --stroke-stop-3: #33d58e;\n --stroke-stop-4: #8181ff;\n --stroke-stop-2-at: 120deg;\n --stroke-stop-3-at: 240deg;\n --stroke-stop-4-at: 300deg;\n}\n\n/* Vibe home: gold → orange → pink → orchid */\n.paletteVibe {\n --stroke-stop-1: #f0c020;\n --stroke-stop-2: #ff9e52;\n --stroke-stop-3: #ff74cd;\n --stroke-stop-4: #ff92e8;\n --stroke-stop-2-at: 90deg;\n --stroke-stop-3-at: 180deg;\n --stroke-stop-4-at: 270deg;\n}\n\n.surface {\n position: relative;\n z-index: 0;\n width: 100%;\n height: 100%;\n transform-origin: center center;\n}\n\n.clickPulse {\n pointer-events: none;\n position: absolute;\n inset: 0;\n border-radius: calc(var(--radius) * 1px);\n z-index: 0;\n opacity: 0;\n background: conic-gradient(from 0deg at 57.6% 61.3%, var(--stroke-stop-1) 0deg, var(--stroke-stop-2) var(--stroke-stop-2-at), var(--stroke-stop-3) var(--stroke-stop-3-at), var(--stroke-stop-4) var(--stroke-stop-4-at), var(--stroke-stop-1) 1turn);\n filter: blur(var(--click-pulse-blur));\n transform-origin: center center;\n}\n\n.root::after {\n content: "";\n position: absolute;\n inset: calc(var(--border-size) * -1);\n box-sizing: border-box;\n border-radius: calc(var(--radius) * 1px + var(--border-size));\n border: var(--border-size) solid transparent;\n background: conic-gradient(from 0deg at 57.6% 61.3%, var(--stroke-stop-1) 0deg, var(--stroke-stop-2) var(--stroke-stop-2-at), var(--stroke-stop-3) var(--stroke-stop-3-at), var(--stroke-stop-4) var(--stroke-stop-4-at), var(--stroke-stop-1) 1turn);\n mask-clip: padding-box, border-box;\n mask-composite: intersect;\n mask-image: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0)), conic-gradient(from calc((var(--start) - var(--spread)) * 1deg), rgba(0, 0, 0, 0) 0deg, #fff, rgba(0, 0, 0, 0) calc(var(--spread) * 2deg));\n pointer-events: none;\n opacity: calc(var(--active) * var(--stroke-strength));\n transition: opacity var(--stroke-duration-fade) linear;\n z-index: 2;\n}\n\n.glow {\n --glow-band: var(--border-size);\n --halo: calc(var(--glow-band) + var(--glow-blur) * 3);\n pointer-events: none;\n position: absolute;\n inset: calc(var(--halo) * -1);\n box-sizing: border-box;\n border: var(--halo) solid transparent;\n border-radius: calc(var(--radius) * 1px + var(--halo));\n z-index: 1;\n filter: blur(var(--glow-blur)) saturate(var(--glow-saturation));\n mask-image: linear-gradient(#fff 0 0), linear-gradient(#fff 0 0);\n mask-clip: border-box, padding-box;\n mask-composite: exclude;\n opacity: calc(var(--active) * var(--glow-strength));\n transition: opacity var(--stroke-duration-fade) linear;\n}\n\n.glow::after {\n content: "";\n position: absolute;\n inset: calc(var(--glow-band) * -1);\n box-sizing: border-box;\n border-radius: calc(var(--radius) * 1px + var(--glow-band));\n border: var(--glow-band) solid transparent;\n background: conic-gradient(from 0deg at 57.6% 61.3%, var(--stroke-stop-1) 0deg, var(--stroke-stop-2) var(--stroke-stop-2-at), var(--stroke-stop-3) var(--stroke-stop-3-at), var(--stroke-stop-4) var(--stroke-stop-4-at), var(--stroke-stop-1) 1turn);\n mask-clip: padding-box, border-box;\n mask-composite: intersect;\n mask-image: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0)), conic-gradient(from calc((var(--start) - var(--spread)) * 1deg), rgba(0, 0, 0, 0) 0deg, #fff, rgba(0, 0, 0, 0) calc(var(--spread) * 2deg));\n pointer-events: none;\n}\n\n.root.is-click-pulsing {\n animation: stroke-spotlight-scale-grow var(--stroke-duration-scale) var(--stroke-ease) forwards;\n}\n.root.is-click-pulsing .clickPulse {\n animation: stroke-spotlight-click-expand var(--stroke-duration-wash) var(--stroke-ease) both, stroke-spotlight-click-blur var(--stroke-duration-wash) var(--stroke-ease) both, stroke-spotlight-click-fade var(--stroke-duration-wash) linear var(--stroke-duration-short) both;\n}\n\n@keyframes stroke-spotlight-click-expand {\n 0% {\n transform: scale(1, 1);\n }\n 100% {\n transform: scale(var(--click-pulse-end-scale-x), var(--click-pulse-end-scale-y));\n }\n}\n@keyframes stroke-spotlight-click-blur {\n 0% {\n filter: blur(var(--click-pulse-blur));\n }\n 100% {\n filter: blur(var(--click-pulse-blur-spread));\n }\n}\n@keyframes stroke-spotlight-click-fade {\n 0% {\n opacity: var(--click-pulse-strength);\n }\n 100% {\n opacity: 0;\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .root::after,\n .glow {\n transition: none;\n opacity: 0;\n }\n .root.is-click-pulsing {\n animation: none;\n transform: scale(1);\n }\n .root.is-click-pulsing .clickPulse {\n animation: stroke-spotlight-click-fade-reduced var(--stroke-duration-reduced) linear forwards;\n }\n .clickPulse {\n opacity: 0;\n }\n}\n@keyframes stroke-spotlight-click-fade-reduced {\n 0% {\n opacity: var(--click-pulse-strength);\n }\n 100% {\n opacity: 0;\n }\n}');export{e as default};
2
+ //# sourceMappingURL=StrokeSpotlight.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StrokeSpotlight.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{useEffect as e}from"react";var t=64,n=.01,i=48,o=40,r=1.5,a="data-stroke-no-pulse",s="[".concat(a,"]");function l(a,l,c){var d,u,v,m,h,f=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},w=null!==(d=f.proximity)&&void 0!==d?d:t,p=null!==(u=f.inactiveZone)&&void 0!==u?u:n,L=null!==(v=f.edgeFade)&&void 0!==v?v:i,g=null!==(m=f.spread)&&void 0!==m?m:o,y=null!==(h=f.movementDuration)&&void 0!==h?h:r;e((function(){var e=a.current;if(e&&l&&c){var t=e.querySelector("[data-stroke-click-pulse]"),n=window.matchMedia("(prefers-reduced-motion: reduce)"),i=n.matches,o=!1,r=e.getBoundingClientRect(),d=null,u=0,v=0,m=!1,h=null,f=0,E=0,M=0;e.style.setProperty("--spread",g+""),e.style.setProperty("--start","0"),e.style.setProperty("--active","0");var P=function(){e.classList.remove(c)},F=function(){null!==h&&(cancelAnimationFrame(h),h=null)},q=function t(n){var i=Math.min(1,(n-M)/(1e3*y)),o=f+(E-f)*function(e){return 1>e?1-Math.pow(2,-10*e):1}(i);e.style.setProperty("--start",o+""),h=1>i?requestAnimationFrame(t):null},A=function(){e.style.setProperty("--active","0"),e.classList.remove(l),F()},C=function(t,n,i){if(e.matches(":focus-within"))A();else if(i.width>0&&i.height>0){var o=i.left+.5*i.width,r=i.top+.5*i.height;if(Math.hypot(t-o,n-r)<.5*Math.min(i.width,i.height)*p)A();else if(t>i.left-w&&i.left+i.width+w>t&&n>i.top-w&&i.top+i.height+w>n){var a=t-i.left,s=n-i.top,c=Math.max(0-a,0,a-i.width),d=Math.max(0-s,0,s-i.height),u=Math.sqrt(c*c+d*d);e.style.setProperty("--active",(u>0?Math.max(0,Math.min(1,1-u/(L>0?L:w))):1)+""),e.classList.add(l);var v,m,g=parseFloat(e.style.getPropertyValue("--start"))||0;v=g,m=g+((180*Math.atan2(n-r,t-o)/Math.PI+90-g+180)%360-180),F(),f=v,E=m,M=performance.now(),h=requestAnimationFrame(q)}else A()}},x=function(){(i=n.matches)&&(A(),P())};n.addEventListener("change",x);var B=function(){r=e.getBoundingClientRect()},R=function(t){if(!i&&e.isConnected)return 0>t.clientX||0>t.clientY||t.clientX>window.innerWidth||t.clientY>window.innerHeight?(e.matches(":focus-within")||(o=!1),m=!1,void A()):(u=t.clientX,v=t.clientY,m=!0,void(null===d&&(d=requestAnimationFrame((function(){d=null,r=e.getBoundingClientRect(),C(u,v,r)})))));A()},k=function(){o=!1,m=!1,A()},X=function(e){e.target===t&&P()},Y=function(){o=!0,A()},b=function(){requestAnimationFrame((function(){e.isConnected&&!e.matches(":focus-within")&&(o=!1,m&&(r=e.getBoundingClientRect(),C(u,v,r)))}))},z=function(t){if(!i){var n=t.target;n instanceof Element&&n.closest(s)||(o||e.matches(":focus-within")?A():(o=!0,A(),e.classList.remove(c),e.classList.add(c)))}};return window.addEventListener("pointermove",R,{passive:!0}),window.addEventListener("blur",k),window.addEventListener("scroll",B,{passive:!0}),window.addEventListener("resize",B,{passive:!0}),e.addEventListener("pointerdown",z),e.addEventListener("focusin",Y),e.addEventListener("focusout",b),null==t||t.addEventListener("animationend",X),function(){n.removeEventListener("change",x),null!==d&&cancelAnimationFrame(d),F(),e.classList.remove(l),P(),e.style.setProperty("--active","0"),window.removeEventListener("pointermove",R),window.removeEventListener("blur",k),window.removeEventListener("scroll",B),window.removeEventListener("resize",B),e.removeEventListener("pointerdown",z),e.removeEventListener("focusin",Y),e.removeEventListener("focusout",b),null==t||t.removeEventListener("animationend",X)}}}),[a,l,c,w,p,L,g,y])}export{a as STROKE_NO_PULSE_ATTR,l as useStrokeSpotlight};
2
+ //# sourceMappingURL=useStrokeSpotlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStrokeSpotlight.js","sources":["../../../../../src/components/StrokeSpotlight/useStrokeSpotlight.ts"],"sourcesContent":["import { type RefObject, useEffect } from \"react\";\n\nexport interface StrokeSpotlightOptions {\n /** How far outside the box (px) the glow still responds. */\n proximity?: number;\n /** Fraction of half-min-side; inside this radius from center, glow is off. */\n inactiveZone?: number;\n /**\n * Outward distance from the outer margins (px) over which the stroke fades\n * from full to off. Inside the box stays full strength.\n */\n edgeFade?: number;\n /** Angular width of the glowing arc (degrees). */\n spread?: number;\n /** Seconds for angle interpolation. */\n movementDuration?: number;\n}\n\nconst DEFAULTS = {\n proximity: 64,\n inactiveZone: 0.01,\n edgeFade: 48,\n spread: 40,\n movementDuration: 1.5\n} as const;\n\n/** Mark controls that should not trigger the click pulse (e.g. attach, model picker). */\nexport const STROKE_NO_PULSE_ATTR = \"data-stroke-no-pulse\";\nconst STROKE_NO_PULSE_SELECTOR = `[${STROKE_NO_PULSE_ATTR}]`;\n\n/**\n * Pointer-following conic border glow via `--start` / `--active`, plus one-shot\n * click pulse. Traveling stroke is suppressed while the box is `:focus-within`\n * and resumes on hover after focus leaves.\n */\nexport function useStrokeSpotlight(\n ref: RefObject<HTMLElement | null>,\n activeClassName: string,\n clickPulsingClassName: string,\n options: StrokeSpotlightOptions = {}\n) {\n const proximity = options.proximity ?? DEFAULTS.proximity;\n const inactiveZone = options.inactiveZone ?? DEFAULTS.inactiveZone;\n const edgeFade = options.edgeFade ?? DEFAULTS.edgeFade;\n const spread = options.spread ?? DEFAULTS.spread;\n const movementDuration = options.movementDuration ?? DEFAULTS.movementDuration;\n\n useEffect(() => {\n const el = ref.current;\n if (!el || !activeClassName || !clickPulsingClassName) return;\n\n const pulseEl = el.querySelector<HTMLElement>(\"[data-stroke-click-pulse]\");\n const mql = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n let reducedMotion = mql.matches;\n // One-shot click pulse: after the first choose, don't re-pulse until blur.\n let engaged = false;\n let cachedRect = el.getBoundingClientRect();\n let rafId: number | null = null;\n let lastX = 0;\n let lastY = 0;\n let hasPointer = false;\n let angleRafId: number | null = null;\n let angleFrom = 0;\n let angleTo = 0;\n let angleStartMs = 0;\n\n el.style.setProperty(\"--spread\", String(spread));\n el.style.setProperty(\"--start\", \"0\");\n el.style.setProperty(\"--active\", \"0\");\n\n const clearClickPulse = () => {\n el.classList.remove(clickPulsingClassName);\n };\n\n const stopAngleAnimation = () => {\n if (angleRafId !== null) {\n cancelAnimationFrame(angleRafId);\n angleRafId = null;\n }\n };\n\n const easeOutExpo = (t: number) => (t >= 1 ? 1 : 1 - Math.pow(2, -10 * t));\n\n const tickAngle = (now: number) => {\n const t = Math.min(1, (now - angleStartMs) / (movementDuration * 1000));\n const value = angleFrom + (angleTo - angleFrom) * easeOutExpo(t);\n el.style.setProperty(\"--start\", String(value));\n if (t < 1) {\n angleRafId = requestAnimationFrame(tickAngle);\n } else {\n angleRafId = null;\n }\n };\n\n const animateAngle = (from: number, to: number) => {\n stopAngleAnimation();\n angleFrom = from;\n angleTo = to;\n angleStartMs = performance.now();\n angleRafId = requestAnimationFrame(tickAngle);\n };\n\n const deactivate = () => {\n el.style.setProperty(\"--active\", \"0\");\n el.classList.remove(activeClassName);\n stopAngleAnimation();\n };\n\n const applyGlow = (clientX: number, clientY: number, rect: DOMRect) => {\n // No traveling stroke while the prompt (or anything inside) is focused.\n if (el.matches(\":focus-within\")) {\n deactivate();\n return;\n }\n\n if (rect.width <= 0 || rect.height <= 0) return;\n\n const centerX = rect.left + rect.width * 0.5;\n const centerY = rect.top + rect.height * 0.5;\n const distanceFromCenter = Math.hypot(clientX - centerX, clientY - centerY);\n const inactiveRadius = 0.5 * Math.min(rect.width, rect.height) * inactiveZone;\n\n if (distanceFromCenter < inactiveRadius) {\n deactivate();\n return;\n }\n\n const isActive =\n clientX > rect.left - proximity &&\n clientX < rect.left + rect.width + proximity &&\n clientY > rect.top - proximity &&\n clientY < rect.top + rect.height + proximity;\n\n if (!isActive) {\n deactivate();\n return;\n }\n\n const localX = clientX - rect.left;\n const localY = clientY - rect.top;\n const outsideX = Math.max(0 - localX, 0, localX - rect.width);\n const outsideY = Math.max(0 - localY, 0, localY - rect.height);\n const distOutside = Math.sqrt(outsideX * outsideX + outsideY * outsideY);\n const fadeRange = edgeFade > 0 ? edgeFade : proximity;\n const active = distOutside <= 0 ? 1 : Math.max(0, Math.min(1, 1 - distOutside / fadeRange));\n\n el.style.setProperty(\"--active\", String(active));\n el.classList.add(activeClassName);\n\n const currentAngle = parseFloat(el.style.getPropertyValue(\"--start\")) || 0;\n const targetAngle = (180 * Math.atan2(clientY - centerY, clientX - centerX)) / Math.PI + 90;\n const angleDiff = ((targetAngle - currentAngle + 180) % 360) - 180;\n animateAngle(currentAngle, currentAngle + angleDiff);\n };\n\n const scheduleGlow = (clientX: number, clientY: number) => {\n lastX = clientX;\n lastY = clientY;\n hasPointer = true;\n if (rafId !== null) return;\n rafId = requestAnimationFrame(() => {\n rafId = null;\n cachedRect = el.getBoundingClientRect();\n applyGlow(lastX, lastY, cachedRect);\n });\n };\n\n const onMotionChange = () => {\n reducedMotion = mql.matches;\n if (reducedMotion) {\n deactivate();\n clearClickPulse();\n }\n };\n mql.addEventListener(\"change\", onMotionChange);\n\n const refreshRect = () => {\n cachedRect = el.getBoundingClientRect();\n };\n\n const onWindowPointerMove = (e: PointerEvent) => {\n if (reducedMotion || !el.isConnected) {\n deactivate();\n return;\n }\n\n if (e.clientX < 0 || e.clientY < 0 || e.clientX > window.innerWidth || e.clientY > window.innerHeight) {\n if (!el.matches(\":focus-within\")) engaged = false;\n hasPointer = false;\n deactivate();\n return;\n }\n\n scheduleGlow(e.clientX, e.clientY);\n };\n\n const onWindowBlur = () => {\n engaged = false;\n hasPointer = false;\n deactivate();\n };\n\n const restartClickPulse = () => {\n el.classList.remove(clickPulsingClassName);\n void el.offsetWidth;\n el.classList.add(clickPulsingClassName);\n };\n\n const onPulseAnimationEnd = (e: AnimationEvent) => {\n if (e.target !== pulseEl) return;\n clearClickPulse();\n };\n\n const onFocusIn = () => {\n engaged = true;\n deactivate();\n };\n\n const onFocusOut = () => {\n // Wait a frame so :focus-within reflects the new target.\n requestAnimationFrame(() => {\n if (!el.isConnected || el.matches(\":focus-within\")) return;\n engaged = false;\n // Resume hover stroke immediately if the pointer is still nearby.\n if (hasPointer) {\n cachedRect = el.getBoundingClientRect();\n applyGlow(lastX, lastY, cachedRect);\n }\n });\n };\n\n const onDown = (e: PointerEvent) => {\n if (reducedMotion) return;\n const target = e.target;\n if (target instanceof Element && target.closest(STROKE_NO_PULSE_SELECTOR)) return;\n if (engaged || el.matches(\":focus-within\")) {\n deactivate();\n return;\n }\n engaged = true;\n deactivate();\n restartClickPulse();\n };\n\n window.addEventListener(\"pointermove\", onWindowPointerMove, {\n passive: true\n });\n window.addEventListener(\"blur\", onWindowBlur);\n window.addEventListener(\"scroll\", refreshRect, { passive: true });\n window.addEventListener(\"resize\", refreshRect, { passive: true });\n el.addEventListener(\"pointerdown\", onDown);\n el.addEventListener(\"focusin\", onFocusIn);\n el.addEventListener(\"focusout\", onFocusOut);\n pulseEl?.addEventListener(\"animationend\", onPulseAnimationEnd);\n\n return () => {\n mql.removeEventListener(\"change\", onMotionChange);\n if (rafId !== null) cancelAnimationFrame(rafId);\n stopAngleAnimation();\n el.classList.remove(activeClassName);\n clearClickPulse();\n el.style.setProperty(\"--active\", \"0\");\n window.removeEventListener(\"pointermove\", onWindowPointerMove);\n window.removeEventListener(\"blur\", onWindowBlur);\n window.removeEventListener(\"scroll\", refreshRect);\n window.removeEventListener(\"resize\", refreshRect);\n el.removeEventListener(\"pointerdown\", onDown);\n el.removeEventListener(\"focusin\", onFocusIn);\n el.removeEventListener(\"focusout\", onFocusOut);\n pulseEl?.removeEventListener(\"animationend\", onPulseAnimationEnd);\n };\n }, [ref, activeClassName, clickPulsingClassName, proximity, inactiveZone, edgeFade, spread, movementDuration]);\n}\n"],"names":["DEFAULTS","STROKE_NO_PULSE_ATTR","STROKE_NO_PULSE_SELECTOR","concat","useStrokeSpotlight","ref","activeClassName","clickPulsingClassName","options","arguments","length","undefined","proximity","_a","inactiveZone","_b","edgeFade","_c","spread","_d","movementDuration","_e","useEffect","el","current","pulseEl","querySelector","mql","window","matchMedia","reducedMotion","matches","engaged","cachedRect","getBoundingClientRect","rafId","lastX","lastY","hasPointer","angleRafId","angleFrom","angleTo","angleStartMs","style","setProperty","String","clearClickPulse","classList","remove","stopAngleAnimation","cancelAnimationFrame","tickAngle","now","t","Math","min","value","pow","easeOutExpo","requestAnimationFrame","deactivate","applyGlow","clientX","clientY","rect","width","height","centerX","left","centerY","top","hypot","localX","localY","outsideX","max","outsideY","distOutside","sqrt","add","from","to","currentAngle","parseFloat","getPropertyValue","atan2","PI","performance","onMotionChange","addEventListener","refreshRect","onWindowPointerMove","e","isConnected","innerWidth","innerHeight","onWindowBlur","onPulseAnimationEnd","target","onFocusIn","onFocusOut","onDown","Element","closest","passive","removeEventListener"],"mappings":"kCAkBA,IAAMA,EACO,GADPA,EAEU,IAFVA,EAGM,GAHNA,EAII,GAJJA,EAKc,IAIPC,EAAuB,uBAC9BC,EAAwB,IAAAC,OAAOF,EAAuB,KAOtD,SAAUG,EACdC,EACAC,EACAC,GACoC,cAApCC,EAAAC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAkC,CAAA,EAE5BG,EAAiC,QAArBC,EAAAL,EAAQI,iBAAa,IAAAC,EAAAA,EAAAb,EACjCc,EAAuC,QAAxBC,EAAAP,EAAQM,oBAAgB,IAAAC,EAAAA,EAAAf,EACvCgB,EAA+B,QAApBC,EAAAT,EAAQQ,gBAAY,IAAAC,EAAAA,EAAAjB,EAC/BkB,EAA2B,QAAlBC,EAAAX,EAAQU,cAAU,IAAAC,EAAAA,EAAAnB,EAC3BoB,EAA+C,QAA5BC,EAAAb,EAAQY,wBAAoB,IAAAC,EAAAA,EAAArB,EAErDsB,GAAU,WACR,IAAMC,EAAKlB,EAAImB,QACf,GAAKD,GAAOjB,GAAoBC,EAAhC,CAEA,IAAMkB,EAAUF,EAAGG,cAA2B,6BACxCC,EAAMC,OAAOC,WAAW,oCAC1BC,EAAgBH,EAAII,QAEpBC,GAAU,EACVC,EAAaV,EAAGW,wBAChBC,EAAuB,KACvBC,EAAQ,EACRC,EAAQ,EACRC,GAAa,EACbC,EAA4B,KAC5BC,EAAY,EACZC,EAAU,EACVC,EAAe,EAEnBnB,EAAGoB,MAAMC,YAAY,WAAmB1B,EAAP2B,IACjCtB,EAAGoB,MAAMC,YAAY,UAAW,KAChCrB,EAAGoB,MAAMC,YAAY,WAAY,KAEjC,IAAME,EAAkB,WACtBvB,EAAGwB,UAAUC,OAAOzC,IAGhB0C,EAAqB,WACN,OAAfV,IACFW,qBAAqBX,GACrBA,EAAa,OAMXY,EAAY,SAAZA,EAAaC,GACjB,IAAMC,EAAIC,KAAKC,IAAI,GAAIH,EAAMV,IAAoC,IAAnBtB,IACxCoC,EAAQhB,GAAaC,EAAUD,GAJnB,SAACa,GAAS,OAAW,EAALA,EAAa,EAAIC,KAAKG,IAAI,GAAI,GAAKJ,GAA1B,EAIOK,CAAYL,GAC9D9B,EAAGoB,MAAMC,YAAY,UAAkBY,EAAPX,IAE9BN,EADM,EAAJc,EACWM,sBAAsBR,GAEtB,MAYXS,EAAa,WACjBrC,EAAGoB,MAAMC,YAAY,WAAY,KACjCrB,EAAGwB,UAAUC,OAAO1C,GACpB2C,KAGIY,EAAY,SAACC,EAAiBC,EAAiBC,GAEnD,GAAIzC,EAAGQ,QAAQ,iBACb6B,SAIF,GAAII,EAAKC,MAAS,GAAKD,EAAKE,OAAU,EAAtC,CAEA,IAAMC,EAAUH,EAAKI,KAAoB,GAAbJ,EAAKC,MAC3BI,EAAUL,EAAKM,IAAoB,GAAdN,EAAKE,OAIhC,GAH2BZ,KAAKiB,MAAMT,EAAUK,EAASJ,EAAUM,GAC5C,GAAMf,KAAKC,IAAIS,EAAKC,MAAOD,EAAKE,QAAUpD,EAG/D8C,SAUF,GALEE,EAAUE,EAAKI,KAAOxD,GACZoD,EAAKI,KAAOJ,EAAKC,MAAQrD,EAAnCkD,GACAC,EAAUC,EAAKM,IAAM1D,GACXoD,EAAKM,IAAMN,EAAKE,OAAStD,EAAnCmD,EAEF,CAKA,IAAMS,EAASV,EAAUE,EAAKI,KACxBK,EAASV,EAAUC,EAAKM,IACxBI,EAAWpB,KAAKqB,IAAI,EAAIH,EAAQ,EAAGA,EAASR,EAAKC,OACjDW,EAAWtB,KAAKqB,IAAI,EAAIF,EAAQ,EAAGA,EAAST,EAAKE,QACjDW,EAAcvB,KAAKwB,KAAKJ,EAAWA,EAAWE,EAAWA,GAI/DrD,EAAGoB,MAAMC,YAAY,YAFNiC,EAAe,EAAQvB,KAAKqB,IAAI,EAAGrB,KAAKC,IAAI,EAAG,EAAIsB,GADhD7D,EAAW,EAAIA,EAAWJ,KACV,GAEDiC,IACjCtB,EAAGwB,UAAUgC,IAAIzE,GAEjB,IAvDoB0E,EAAcC,EAuD5BC,EAAeC,WAAW5D,EAAGoB,MAAMyC,iBAAiB,aAAe,EAvDrDJ,EA0DPE,EA1DqBD,EA0DPC,IAFN,IAAM5B,KAAK+B,MAAMtB,EAAUM,EAASP,EAAUK,GAAYb,KAAKgC,GAAK,GACvDJ,EAAe,KAAO,IAAO,KAxD/DjC,IACAT,EAAYwC,EACZvC,EAAUwC,EACVvC,EAAe6C,YAAYnC,MAC3Bb,EAAaoB,sBAAsBR,EAqCnC,MAFES,GAnBuC,GAoDrC4B,EAAiB,YACrB1D,EAAgBH,EAAII,WAElB6B,IACAd,MAGJnB,EAAI8D,iBAAiB,SAAUD,GAE/B,IAAME,EAAc,WAClBzD,EAAaV,EAAGW,yBAGZyD,EAAsB,SAACC,GAC3B,IAAI9D,GAAkBP,EAAGsE,YAKzB,OAAgB,EAAZD,EAAE9B,SAA2B,EAAZ8B,EAAE7B,SAAe6B,EAAE9B,QAAUlC,OAAOkE,YAAcF,EAAE7B,QAAUnC,OAAOmE,aACnFxE,EAAGQ,QAAQ,mBAAkBC,GAAU,GAC5CM,GAAa,OACbsB,MAjCFxB,EAqCawD,EAAE9B,QApCfzB,EAoCwBuD,EAAE7B,QAnC1BzB,GAAa,OACC,OAAVH,IACJA,EAAQwB,uBAAsB,WAC5BxB,EAAQ,KACRF,EAAaV,EAAGW,wBAChB2B,EAAUzB,EAAOC,EAAOJ,EAC1B,OAkBE2B,KAcEoC,EAAe,WACnBhE,GAAU,EACVM,GAAa,EACbsB,KASIqC,EAAsB,SAACL,GACvBA,EAAEM,SAAWzE,GACjBqB,KAGIqD,EAAY,WAChBnE,GAAU,EACV4B,KAGIwC,EAAa,WAEjBzC,uBAAsB,WACfpC,EAAGsE,cAAetE,EAAGQ,QAAQ,mBAClCC,GAAU,EAENM,IACFL,EAAaV,EAAGW,wBAChB2B,EAAUzB,EAAOC,EAAOJ,IAE5B,KAGIoE,EAAS,SAACT,GACd,IAAI9D,EAAJ,CACA,IAAMoE,EAASN,EAAEM,OACbA,aAAkBI,SAAWJ,EAAOK,QAAQrG,KAC5C8B,GAAWT,EAAGQ,QAAQ,iBACxB6B,KAGF5B,GAAU,EACV4B,IArCArC,EAAGwB,UAAUC,OAAOzC,GAEpBgB,EAAGwB,UAAUgC,IAAIxE,IA2BE,GAuBrB,OAXAqB,OAAO6D,iBAAiB,cAAeE,EAAqB,CAC1Da,SAAS,IAEX5E,OAAO6D,iBAAiB,OAAQO,GAChCpE,OAAO6D,iBAAiB,SAAUC,EAAa,CAAEc,SAAS,IAC1D5E,OAAO6D,iBAAiB,SAAUC,EAAa,CAAEc,SAAS,IAC1DjF,EAAGkE,iBAAiB,cAAeY,GACnC9E,EAAGkE,iBAAiB,UAAWU,GAC/B5E,EAAGkE,iBAAiB,WAAYW,GAChC3E,SAAAA,EAASgE,iBAAiB,eAAgBQ,GAEnC,WACLtE,EAAI8E,oBAAoB,SAAUjB,GACpB,OAAVrD,GAAgBe,qBAAqBf,GACzCc,IACA1B,EAAGwB,UAAUC,OAAO1C,GACpBwC,IACAvB,EAAGoB,MAAMC,YAAY,WAAY,KACjChB,OAAO6E,oBAAoB,cAAed,GAC1C/D,OAAO6E,oBAAoB,OAAQT,GACnCpE,OAAO6E,oBAAoB,SAAUf,GACrC9D,OAAO6E,oBAAoB,SAAUf,GACrCnE,EAAGkF,oBAAoB,cAAeJ,GACtC9E,EAAGkF,oBAAoB,UAAWN,GAClC5E,EAAGkF,oBAAoB,WAAYL,GACnC3E,SAAAA,EAASgF,oBAAoB,eAAgBR,GA5NQ,CA8NzD,GAAG,CAAC5F,EAAKC,EAAiBC,EAAuBK,EAAWE,EAAcE,EAAUE,EAAQE,GAC9F"}