@baasix/lexical 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +281 -0
  2. package/dist/DateTimeComponent-4MX2IKXK.css +45 -0
  3. package/dist/DateTimeComponent-4MX2IKXK.css.map +1 -0
  4. package/dist/DateTimeComponent-7V5RW3AE.js +2928 -0
  5. package/dist/DateTimeComponent-7V5RW3AE.js.map +1 -0
  6. package/dist/EquationComponent-3IW3ONJD.js +159 -0
  7. package/dist/EquationComponent-3IW3ONJD.js.map +1 -0
  8. package/dist/EquationComponent-C2C6477P.css +28 -0
  9. package/dist/EquationComponent-C2C6477P.css.map +1 -0
  10. package/dist/ExcalidrawComponent-GZYLHNOY.js +267 -0
  11. package/dist/ExcalidrawComponent-GZYLHNOY.js.map +1 -0
  12. package/dist/ExcalidrawComponent-U6BD7DUB.css +152 -0
  13. package/dist/ExcalidrawComponent-U6BD7DUB.css.map +1 -0
  14. package/dist/ImageComponent-IYUGOT6O.css +73 -0
  15. package/dist/ImageComponent-IYUGOT6O.css.map +1 -0
  16. package/dist/ImageComponent-TTUYUG3M.js +429 -0
  17. package/dist/ImageComponent-TTUYUG3M.js.map +1 -0
  18. package/dist/PollComponent-CWI5UJF5.css +187 -0
  19. package/dist/PollComponent-CWI5UJF5.css.map +1 -0
  20. package/dist/PollComponent-KLJZSW5O.js +199 -0
  21. package/dist/PollComponent-KLJZSW5O.js.map +1 -0
  22. package/dist/StickyComponent-MZSTQF47.css +774 -0
  23. package/dist/StickyComponent-MZSTQF47.css.map +1 -0
  24. package/dist/StickyComponent-ZED6LNTX.js +233 -0
  25. package/dist/StickyComponent-ZED6LNTX.js.map +1 -0
  26. package/dist/chunk-35UCX4ZT.js +168 -0
  27. package/dist/chunk-35UCX4ZT.js.map +1 -0
  28. package/dist/chunk-44LUNGL3.js +16608 -0
  29. package/dist/chunk-44LUNGL3.js.map +1 -0
  30. package/dist/chunk-BHROZTZU.js +42 -0
  31. package/dist/chunk-BHROZTZU.js.map +1 -0
  32. package/dist/chunk-FJ6COZ4H.js +275 -0
  33. package/dist/chunk-FJ6COZ4H.js.map +1 -0
  34. package/dist/chunk-GSFNU3JE.js +211 -0
  35. package/dist/chunk-GSFNU3JE.js.map +1 -0
  36. package/dist/chunk-I43VQAHW.js +918 -0
  37. package/dist/chunk-I43VQAHW.js.map +1 -0
  38. package/dist/chunk-N22RKA5D.js +402 -0
  39. package/dist/chunk-N22RKA5D.js.map +1 -0
  40. package/dist/chunk-OIMMC5C3.js +134 -0
  41. package/dist/chunk-OIMMC5C3.js.map +1 -0
  42. package/dist/chunk-PZ5AY32C.js +10 -0
  43. package/dist/chunk-PZ5AY32C.js.map +1 -0
  44. package/dist/chunk-TVF6V3BJ.js +41 -0
  45. package/dist/chunk-TVF6V3BJ.js.map +1 -0
  46. package/dist/chunk-XTKVR2JI.js +225 -0
  47. package/dist/chunk-XTKVR2JI.js.map +1 -0
  48. package/dist/emoji-list-MUV74SND.js +8 -0
  49. package/dist/emoji-list-MUV74SND.js.map +1 -0
  50. package/dist/index.css +4234 -0
  51. package/dist/index.css.map +1 -0
  52. package/dist/index.d.ts +17 -0
  53. package/dist/index.js +16050 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/landscape-RJWVK6ET.jpg +0 -0
  56. package/dist/yellow-flower-R72KOP74.jpg +0 -0
  57. package/package.json +76 -0
@@ -0,0 +1,187 @@
1
+ /* src/nodes/PollNode.css */
2
+ .PollNode__container {
3
+ border: 1px solid #eee;
4
+ background-color: #fcfcfc;
5
+ border-radius: 10px;
6
+ max-width: 600px;
7
+ min-width: 400px;
8
+ cursor: pointer;
9
+ user-select: none;
10
+ }
11
+ .PollNode__container.focused {
12
+ outline: 2px solid rgb(60, 132, 244);
13
+ }
14
+ .PollNode__inner {
15
+ margin: 15px;
16
+ cursor: default;
17
+ }
18
+ .PollNode__heading {
19
+ margin-left: 0px;
20
+ margin-top: 0px;
21
+ margin-right: 0px;
22
+ margin-bottom: 15px;
23
+ color: #444;
24
+ text-align: center;
25
+ font-size: 18px;
26
+ }
27
+ .PollNode__optionContainer {
28
+ display: flex;
29
+ flex-direction: row;
30
+ margin-bottom: 10px;
31
+ align-items: center;
32
+ }
33
+ .PollNode__optionInputWrapper {
34
+ display: flex;
35
+ flex: 10px;
36
+ border: 1px solid rgb(61, 135, 245);
37
+ border-radius: 5px;
38
+ position: relative;
39
+ overflow: hidden;
40
+ cursor: pointer;
41
+ }
42
+ .PollNode__optionInput {
43
+ display: flex;
44
+ flex: 1px;
45
+ border: 0px;
46
+ padding: 7px;
47
+ color: rgb(61, 135, 245);
48
+ background-color: transparent;
49
+ font-weight: bold;
50
+ outline: 0px;
51
+ z-index: 0;
52
+ }
53
+ .PollNode__optionInput::placeholder {
54
+ font-weight: normal;
55
+ color: #999;
56
+ }
57
+ .PollNode__optionInputVotes {
58
+ background-color: rgb(236, 243, 254);
59
+ height: 100%;
60
+ position: absolute;
61
+ top: 0px;
62
+ left: 0px;
63
+ transition: width 1s ease;
64
+ z-index: 0;
65
+ }
66
+ .PollNode__optionInputVotesCount {
67
+ color: rgb(61, 135, 245);
68
+ position: absolute;
69
+ right: 15px;
70
+ font-size: 12px;
71
+ top: 5px;
72
+ }
73
+ .PollNode__optionCheckboxWrapper {
74
+ position: relative;
75
+ display: flex;
76
+ width: 22px;
77
+ height: 22px;
78
+ border: 1px solid #999;
79
+ margin-right: 10px;
80
+ border-radius: 5px;
81
+ }
82
+ .PollNode__optionCheckboxChecked {
83
+ border: 1px solid rgb(61, 135, 245);
84
+ background-color: rgb(61, 135, 245);
85
+ }
86
+ .PollNode__optionCheckboxChecked:after {
87
+ content: "";
88
+ cursor: pointer;
89
+ border-color: #fff;
90
+ border-style: solid;
91
+ position: absolute;
92
+ display: block;
93
+ top: 4px;
94
+ width: 5px;
95
+ left: 8px;
96
+ height: 9px;
97
+ margin: 0;
98
+ transform: rotate(45deg);
99
+ border-width: 0 2px 2px 0;
100
+ pointer-events: none;
101
+ }
102
+ .PollNode__optionCheckbox {
103
+ border: 0px;
104
+ position: absolute;
105
+ display: block;
106
+ width: 100%;
107
+ height: 100%;
108
+ opacity: 0;
109
+ cursor: pointer;
110
+ }
111
+ .PollNode__optionDelete {
112
+ position: relative;
113
+ display: flex;
114
+ width: 28px;
115
+ height: 28px;
116
+ margin-left: 6px;
117
+ border: 0px;
118
+ background-color: transparent;
119
+ background-position: 6px 6px;
120
+ background-repeat: no-repeat;
121
+ z-index: 0;
122
+ cursor: pointer;
123
+ border-radius: 5px;
124
+ opacity: 0.3;
125
+ }
126
+ .PollNode__optionDelete:before,
127
+ .PollNode__optionDelete:after {
128
+ position: absolute;
129
+ display: block;
130
+ content: "";
131
+ background-color: #999;
132
+ width: 2px;
133
+ height: 15px;
134
+ top: 6px;
135
+ left: 13px;
136
+ }
137
+ .PollNode__optionDelete:before {
138
+ transform: rotate(-45deg);
139
+ }
140
+ .PollNode__optionDelete:after {
141
+ transform: rotate(45deg);
142
+ }
143
+ .PollNode__optionDelete:hover {
144
+ opacity: 1;
145
+ background-color: #eee;
146
+ }
147
+ .PollNode__optionDeleteDisabled {
148
+ cursor: not-allowed;
149
+ }
150
+ .PollNode__optionDeleteDisabled:hover {
151
+ opacity: 0.3;
152
+ background-color: transparent;
153
+ }
154
+ .PollNode__footer {
155
+ display: flex;
156
+ justify-content: center;
157
+ }
158
+
159
+ /* src/ui/Button.css */
160
+ .Button__root {
161
+ padding-top: 10px;
162
+ padding-bottom: 10px;
163
+ padding-left: 15px;
164
+ padding-right: 15px;
165
+ border: 0px;
166
+ background-color: #eee;
167
+ border-radius: 5px;
168
+ cursor: pointer;
169
+ font-size: 14px;
170
+ }
171
+ .Button__root:hover {
172
+ background-color: #ddd;
173
+ }
174
+ .Button__small {
175
+ padding-top: 5px;
176
+ padding-bottom: 5px;
177
+ padding-left: 10px;
178
+ padding-right: 10px;
179
+ font-size: 13px;
180
+ }
181
+ .Button__disabled {
182
+ cursor: not-allowed;
183
+ }
184
+ .Button__disabled:hover {
185
+ background-color: #eee;
186
+ }
187
+ /*# sourceMappingURL=PollComponent-CWI5UJF5.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nodes/PollNode.css","../src/ui/Button.css"],"sourcesContent":["/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n *\r\n */\r\n\r\n.PollNode__container {\r\n border: 1px solid #eee;\r\n background-color: #fcfcfc;\r\n border-radius: 10px;\r\n max-width: 600px;\r\n min-width: 400px;\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n.PollNode__container.focused {\r\n outline: 2px solid rgb(60, 132, 244);\r\n}\r\n.PollNode__inner {\r\n margin: 15px;\r\n cursor: default;\r\n}\r\n.PollNode__heading {\r\n margin-left: 0px;\r\n margin-top: 0px;\r\n margin-right: 0px;\r\n margin-bottom: 15px;\r\n color: #444;\r\n text-align: center;\r\n font-size: 18px;\r\n}\r\n.PollNode__optionContainer {\r\n display: flex;\r\n flex-direction: row;\r\n margin-bottom: 10px;\r\n align-items: center;\r\n}\r\n.PollNode__optionInputWrapper {\r\n display: flex;\r\n flex: 10px;\r\n border: 1px solid rgb(61, 135, 245);\r\n border-radius: 5px;\r\n position: relative;\r\n overflow: hidden;\r\n cursor: pointer;\r\n}\r\n.PollNode__optionInput {\r\n display: flex;\r\n flex: 1px;\r\n border: 0px;\r\n padding: 7px;\r\n color: rgb(61, 135, 245);\r\n background-color: transparent;\r\n font-weight: bold;\r\n outline: 0px;\r\n z-index: 0;\r\n}\r\n.PollNode__optionInput::placeholder {\r\n font-weight: normal;\r\n color: #999;\r\n}\r\n.PollNode__optionInputVotes {\r\n background-color: rgb(236, 243, 254);\r\n height: 100%;\r\n position: absolute;\r\n top: 0px;\r\n left: 0px;\r\n transition: width 1s ease;\r\n z-index: 0;\r\n}\r\n.PollNode__optionInputVotesCount {\r\n color: rgb(61, 135, 245);\r\n position: absolute;\r\n right: 15px;\r\n font-size: 12px;\r\n top: 5px;\r\n}\r\n.PollNode__optionCheckboxWrapper {\r\n position: relative;\r\n display: flex;\r\n width: 22px;\r\n height: 22px;\r\n border: 1px solid #999;\r\n margin-right: 10px;\r\n border-radius: 5px;\r\n}\r\n.PollNode__optionCheckboxChecked {\r\n border: 1px solid rgb(61, 135, 245);\r\n background-color: rgb(61, 135, 245);\r\n}\r\n.PollNode__optionCheckboxChecked:after {\r\n content: '';\r\n cursor: pointer;\r\n border-color: #fff;\r\n border-style: solid;\r\n position: absolute;\r\n display: block;\r\n top: 4px;\r\n width: 5px;\r\n left: 8px;\r\n height: 9px;\r\n margin: 0;\r\n transform: rotate(45deg);\r\n border-width: 0 2px 2px 0;\r\n pointer-events: none;\r\n}\r\n.PollNode__optionCheckbox {\r\n border: 0px;\r\n position: absolute;\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n opacity: 0;\r\n cursor: pointer;\r\n}\r\n.PollNode__optionDelete {\r\n position: relative;\r\n display: flex;\r\n width: 28px;\r\n height: 28px;\r\n margin-left: 6px;\r\n border: 0px;\r\n background-color: transparent;\r\n background-position: 6px 6px;\r\n background-repeat: no-repeat;\r\n z-index: 0;\r\n cursor: pointer;\r\n border-radius: 5px;\r\n opacity: 0.3;\r\n}\r\n.PollNode__optionDelete:before,\r\n.PollNode__optionDelete:after {\r\n position: absolute;\r\n display: block;\r\n content: '';\r\n background-color: #999;\r\n width: 2px;\r\n height: 15px;\r\n top: 6px;\r\n left: 13px;\r\n}\r\n.PollNode__optionDelete:before {\r\n transform: rotate(-45deg);\r\n}\r\n.PollNode__optionDelete:after {\r\n transform: rotate(45deg);\r\n}\r\n.PollNode__optionDelete:hover {\r\n opacity: 1;\r\n background-color: #eee;\r\n}\r\n.PollNode__optionDeleteDisabled {\r\n cursor: not-allowed;\r\n}\r\n.PollNode__optionDeleteDisabled:hover {\r\n opacity: 0.3;\r\n background-color: transparent;\r\n}\r\n.PollNode__footer {\r\n display: flex;\r\n justify-content: center;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n *\r\n */\r\n\r\n.Button__root {\r\n padding-top: 10px;\r\n padding-bottom: 10px;\r\n padding-left: 15px;\r\n padding-right: 15px;\r\n border: 0px;\r\n background-color: #eee;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n font-size: 14px;\r\n}\r\n.Button__root:hover {\r\n background-color: #ddd;\r\n}\r\n.Button__small {\r\n padding-top: 5px;\r\n padding-bottom: 5px;\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n font-size: 13px;\r\n}\r\n.Button__disabled {\r\n cursor: not-allowed;\r\n}\r\n.Button__disabled:hover {\r\n background-color: #eee;\r\n}\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,199 @@
1
+ import {
2
+ $isPollNode,
3
+ createPollOption
4
+ } from "./chunk-35UCX4ZT.js";
5
+ import {
6
+ Button,
7
+ joinClasses
8
+ } from "./chunk-TVF6V3BJ.js";
9
+ import "./chunk-PZ5AY32C.js";
10
+
11
+ // src/nodes/PollComponent.tsx
12
+ import { useCollaborationContext } from "@lexical/react/LexicalCollaborationContext";
13
+ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
14
+ import { useLexicalNodeSelection } from "@lexical/react/useLexicalNodeSelection";
15
+ import { mergeRegister } from "@lexical/utils";
16
+ import {
17
+ $getNodeByKey,
18
+ $getSelection,
19
+ $isNodeSelection,
20
+ CLICK_COMMAND,
21
+ COMMAND_PRIORITY_LOW
22
+ } from "lexical";
23
+ import { useEffect, useMemo, useRef, useState } from "react";
24
+ import { jsx, jsxs } from "react/jsx-runtime";
25
+ function getTotalVotes(options) {
26
+ return options.reduce((totalVotes, next) => {
27
+ return totalVotes + next.votes.length;
28
+ }, 0);
29
+ }
30
+ function PollOptionComponent({
31
+ option,
32
+ index,
33
+ options,
34
+ totalVotes,
35
+ withPollNode
36
+ }) {
37
+ const { name: username } = useCollaborationContext();
38
+ const checkboxRef = useRef(null);
39
+ const votesArray = option.votes;
40
+ const checkedIndex = votesArray.indexOf(username);
41
+ const checked = checkedIndex !== -1;
42
+ const votes = votesArray.length;
43
+ const text = option.text;
44
+ return /* @__PURE__ */ jsxs("div", { className: "PollNode__optionContainer", children: [
45
+ /* @__PURE__ */ jsx(
46
+ "div",
47
+ {
48
+ className: joinClasses(
49
+ "PollNode__optionCheckboxWrapper",
50
+ checked && "PollNode__optionCheckboxChecked"
51
+ ),
52
+ children: /* @__PURE__ */ jsx(
53
+ "input",
54
+ {
55
+ ref: checkboxRef,
56
+ className: "PollNode__optionCheckbox",
57
+ type: "checkbox",
58
+ onChange: (e) => {
59
+ withPollNode((node) => {
60
+ node.toggleVote(option, username);
61
+ });
62
+ },
63
+ checked
64
+ }
65
+ )
66
+ }
67
+ ),
68
+ /* @__PURE__ */ jsxs("div", { className: "PollNode__optionInputWrapper", children: [
69
+ /* @__PURE__ */ jsx(
70
+ "div",
71
+ {
72
+ className: "PollNode__optionInputVotes",
73
+ style: { width: `${votes === 0 ? 0 : votes / totalVotes * 100}%` }
74
+ }
75
+ ),
76
+ /* @__PURE__ */ jsx("span", { className: "PollNode__optionInputVotesCount", children: votes > 0 && (votes === 1 ? "1 vote" : `${votes} votes`) }),
77
+ /* @__PURE__ */ jsx(
78
+ "input",
79
+ {
80
+ className: "PollNode__optionInput",
81
+ type: "text",
82
+ value: text,
83
+ onChange: (e) => {
84
+ const target = e.target;
85
+ const value = target.value;
86
+ const selectionStart = target.selectionStart;
87
+ const selectionEnd = target.selectionEnd;
88
+ withPollNode(
89
+ (node) => {
90
+ node.setOptionText(option, value);
91
+ },
92
+ () => {
93
+ target.selectionStart = selectionStart;
94
+ target.selectionEnd = selectionEnd;
95
+ }
96
+ );
97
+ },
98
+ placeholder: `Option ${index + 1}`
99
+ }
100
+ )
101
+ ] }),
102
+ /* @__PURE__ */ jsx(
103
+ "button",
104
+ {
105
+ type: "button",
106
+ disabled: options.length < 3,
107
+ className: joinClasses(
108
+ "PollNode__optionDelete",
109
+ options.length < 3 && "PollNode__optionDeleteDisabled"
110
+ ),
111
+ "aria-label": "Remove",
112
+ onClick: () => {
113
+ withPollNode((node) => {
114
+ node.deleteOption(option);
115
+ });
116
+ }
117
+ }
118
+ )
119
+ ] });
120
+ }
121
+ function PollComponent({
122
+ question,
123
+ options,
124
+ nodeKey
125
+ }) {
126
+ const [editor] = useLexicalComposerContext();
127
+ const totalVotes = useMemo(() => getTotalVotes(options), [options]);
128
+ const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);
129
+ const [selection, setSelection] = useState(null);
130
+ const ref = useRef(null);
131
+ useEffect(() => {
132
+ return mergeRegister(
133
+ editor.registerUpdateListener(({ editorState }) => {
134
+ setSelection(editorState.read(() => $getSelection()));
135
+ }),
136
+ editor.registerCommand(
137
+ CLICK_COMMAND,
138
+ (payload) => {
139
+ const event = payload;
140
+ if (event.target === ref.current) {
141
+ if (!event.shiftKey) {
142
+ clearSelection();
143
+ }
144
+ setSelected(!isSelected);
145
+ return true;
146
+ }
147
+ return false;
148
+ },
149
+ COMMAND_PRIORITY_LOW
150
+ )
151
+ );
152
+ }, [clearSelection, editor, isSelected, nodeKey, setSelected]);
153
+ const withPollNode = (cb, onUpdate) => {
154
+ editor.update(
155
+ () => {
156
+ const node = $getNodeByKey(nodeKey);
157
+ if ($isPollNode(node)) {
158
+ cb(node);
159
+ }
160
+ },
161
+ { onUpdate }
162
+ );
163
+ };
164
+ const addOption = () => {
165
+ withPollNode((node) => {
166
+ node.addOption(createPollOption());
167
+ });
168
+ };
169
+ const isFocused = $isNodeSelection(selection) && isSelected;
170
+ return /* @__PURE__ */ jsx(
171
+ "div",
172
+ {
173
+ className: `PollNode__container ${isFocused ? "focused" : ""}`,
174
+ ref,
175
+ children: /* @__PURE__ */ jsxs("div", { className: "PollNode__inner", children: [
176
+ /* @__PURE__ */ jsx("h2", { className: "PollNode__heading", children: question }),
177
+ options.map((option, index) => {
178
+ const key = option.uid;
179
+ return /* @__PURE__ */ jsx(
180
+ PollOptionComponent,
181
+ {
182
+ withPollNode,
183
+ option,
184
+ index,
185
+ options,
186
+ totalVotes
187
+ },
188
+ key
189
+ );
190
+ }),
191
+ /* @__PURE__ */ jsx("div", { className: "PollNode__footer", children: /* @__PURE__ */ jsx(Button, { onClick: addOption, small: true, children: "Add Option" }) })
192
+ ] })
193
+ }
194
+ );
195
+ }
196
+ export {
197
+ PollComponent as default
198
+ };
199
+ //# sourceMappingURL=PollComponent-KLJZSW5O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nodes/PollComponent.tsx"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {Option, Options, PollNode} from './PollNode';\nimport type {JSX} from 'react';\n\nimport './PollNode.css';\n\nimport {useCollaborationContext} from '@lexical/react/LexicalCollaborationContext';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\nimport {mergeRegister} from '@lexical/utils';\nimport {\n $getNodeByKey,\n $getSelection,\n $isNodeSelection,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n NodeKey,\n} from 'lexical';\nimport {useEffect, useMemo, useRef, useState} from 'react';\n\nimport Button from '../ui/Button';\nimport joinClasses from '../utils/joinClasses';\nimport {$isPollNode, createPollOption} from './PollNode';\n\nfunction getTotalVotes(options: Options): number {\n return options.reduce((totalVotes, next) => {\n return totalVotes + next.votes.length;\n }, 0);\n}\n\nfunction PollOptionComponent({\n option,\n index,\n options,\n totalVotes,\n withPollNode,\n}: {\n index: number;\n option: Option;\n options: Options;\n totalVotes: number;\n withPollNode: (\n cb: (pollNode: PollNode) => void,\n onSelect?: () => void,\n ) => void;\n}): JSX.Element {\n const {name: username} = useCollaborationContext();\n const checkboxRef = useRef(null);\n const votesArray = option.votes;\n const checkedIndex = votesArray.indexOf(username);\n const checked = checkedIndex !== -1;\n const votes = votesArray.length;\n const text = option.text;\n\n return (\n <div className=\"PollNode__optionContainer\">\n <div\n className={joinClasses(\n 'PollNode__optionCheckboxWrapper',\n checked && 'PollNode__optionCheckboxChecked',\n )}>\n <input\n ref={checkboxRef}\n className=\"PollNode__optionCheckbox\"\n type=\"checkbox\"\n onChange={(e) => {\n withPollNode((node) => {\n node.toggleVote(option, username);\n });\n }}\n checked={checked}\n />\n </div>\n <div className=\"PollNode__optionInputWrapper\">\n <div\n className=\"PollNode__optionInputVotes\"\n style={{width: `${votes === 0 ? 0 : (votes / totalVotes) * 100}%`}}\n />\n <span className=\"PollNode__optionInputVotesCount\">\n {votes > 0 && (votes === 1 ? '1 vote' : `${votes} votes`)}\n </span>\n <input\n className=\"PollNode__optionInput\"\n type=\"text\"\n value={text}\n onChange={(e) => {\n const target = e.target;\n const value = target.value;\n const selectionStart = target.selectionStart;\n const selectionEnd = target.selectionEnd;\n withPollNode(\n (node) => {\n node.setOptionText(option, value);\n },\n () => {\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n },\n );\n }}\n placeholder={`Option ${index + 1}`}\n />\n </div>\n <button type=\"button\"\n disabled={options.length < 3}\n className={joinClasses(\n 'PollNode__optionDelete',\n options.length < 3 && 'PollNode__optionDeleteDisabled',\n )}\n aria-label=\"Remove\"\n onClick={() => {\n withPollNode((node) => {\n node.deleteOption(option);\n });\n }}\n />\n </div>\n );\n}\n\nexport default function PollComponent({\n question,\n options,\n nodeKey,\n}: {\n nodeKey: NodeKey;\n options: Options;\n question: string;\n}): JSX.Element {\n const [editor] = useLexicalComposerContext();\n const totalVotes = useMemo(() => getTotalVotes(options), [options]);\n const [isSelected, setSelected, clearSelection] =\n useLexicalNodeSelection(nodeKey);\n const [selection, setSelection] = useState<BaseSelection | null>(null);\n const ref = useRef(null);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({editorState}) => {\n setSelection(editorState.read(() => $getSelection()));\n }),\n editor.registerCommand<MouseEvent>(\n CLICK_COMMAND,\n (payload) => {\n const event = payload;\n\n if (event.target === ref.current) {\n if (!event.shiftKey) {\n clearSelection();\n }\n setSelected(!isSelected);\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n }, [clearSelection, editor, isSelected, nodeKey, setSelected]);\n\n const withPollNode = (\n cb: (node: PollNode) => void,\n onUpdate?: () => void,\n ): void => {\n editor.update(\n () => {\n const node = $getNodeByKey(nodeKey);\n if ($isPollNode(node)) {\n cb(node);\n }\n },\n {onUpdate},\n );\n };\n\n const addOption = () => {\n withPollNode((node) => {\n node.addOption(createPollOption());\n });\n };\n\n const isFocused = $isNodeSelection(selection) && isSelected;\n\n return (\n <div\n className={`PollNode__container ${isFocused ? 'focused' : ''}`}\n ref={ref}>\n <div className=\"PollNode__inner\">\n <h2 className=\"PollNode__heading\">{question}</h2>\n {options.map((option, index) => {\n const key = option.uid;\n return (\n <PollOptionComponent\n key={key}\n withPollNode={withPollNode}\n option={option}\n index={index}\n options={options}\n totalVotes={totalVotes}\n />\n );\n })}\n <div className=\"PollNode__footer\">\n <Button onClick={addOption} small={true}>\n Add Option\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}