sunrize 1.8.26 → 1.8.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sunrize",
3
3
  "productName": "Sunrize X3D Editor",
4
- "version": "1.8.26",
4
+ "version": "1.8.27",
5
5
  "description": "A Multi-Platform X3D Editor",
6
6
  "main": "src/main.js",
7
7
  "bin": {
@@ -110,7 +110,7 @@
110
110
  "string-similarity": "^4.0.4",
111
111
  "tweakpane": "^3.1.10",
112
112
  "update-electron-app": "^3.1.1",
113
- "x_ite": "^12.0.3",
113
+ "x_ite": "^12.0.4",
114
114
  "x3d-traverse": "^1.0.13"
115
115
  }
116
116
  }
@@ -35,6 +35,10 @@ $.fn.addPrototypePopover = function (executionContext, type)
35
35
  .on ("change", () => config .selectedIndex = protoMenu .prop ("selectedIndex"))
36
36
  .appendTo (content);
37
37
 
38
+ $("<span></span>")
39
+ .text (_("Name"))
40
+ .appendTo (content);
41
+
38
42
  const nameInput = $("<input></input>")
39
43
  .attr ("placeholder", _("Enter name"))
40
44
  .appendTo (content);
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ const
4
+ X3D = require ("../X3D"),
5
+ $ = require ("jquery"),
6
+ _ = require ("../Application/GetText");
7
+
8
+ require ("./Popover");
9
+ require ("./RenameNodeInput");
10
+
11
+ $.fn.editNodePopover = function (node)
12
+ {
13
+ // Create content.
14
+
15
+ const content = $("<div></div>");
16
+
17
+ $("<span></span>")
18
+ .text (_("Name"))
19
+ .appendTo (content);
20
+
21
+ const nameInput = $("<input></input>")
22
+ .attr ("placeholder", _("Enter name"))
23
+ .appendTo (content);
24
+
25
+ if (node instanceof X3D .X3DProtoDeclaration)
26
+ {
27
+ $("<span></span>")
28
+ .text (_("Application Information"))
29
+ .appendTo (content);
30
+
31
+ $("<input></input>")
32
+ .addClass ("appinfo")
33
+ .attr ("placeholder", _("Enter application information"))
34
+ .val (node .getAppInfo ())
35
+ .appendTo (content);
36
+
37
+ $("<span></span>")
38
+ .text (_("Documentation"))
39
+ .appendTo (content);
40
+
41
+ $("<input></input>")
42
+ .addClass ("documentation")
43
+ .attr ("placeholder", _("Enter documentation"))
44
+ .val (node .getDocumentation ())
45
+ .appendTo (content);
46
+ }
47
+
48
+ // Setup input after appInfo and documentation.
49
+ nameInput .renameNodeInput (node);
50
+
51
+ // Create tooltip.
52
+
53
+ const tooltip = this .popover ({
54
+ content: content,
55
+ extension:
56
+ {
57
+ wide: node instanceof X3D .X3DProtoDeclaration,
58
+ },
59
+ events: {
60
+ show: (event, api) =>
61
+ {
62
+ content .children () .off (".editNodePopover") .on ("keydown.editNodePopover", (event) =>
63
+ {
64
+ if (event .key !== "Enter")
65
+ return;
66
+
67
+ api .toggle (false);
68
+ })
69
+
70
+ setTimeout (() => nameInput .trigger ("select"), 1);
71
+ },
72
+ },
73
+ });
74
+
75
+ return this;
76
+ };
77
+
@@ -35,7 +35,7 @@ $.fn.editUserDefinedFieldPopover = function (executionContext, node, field = -1)
35
35
  const typeNameMenu = $("<select></select>")
36
36
  .appendTo (content);
37
37
 
38
- const singleFields = $("<optgroup></optgroup>")
38
+ $("<optgroup></optgroup>")
39
39
  .attr ("label", "Single Fields")
40
40
  .append ($("<option></option>") .text ("SFBool"))
41
41
  .append ($("<option></option>") .text ("SFColor"))
@@ -60,7 +60,7 @@ $.fn.editUserDefinedFieldPopover = function (executionContext, node, field = -1)
60
60
  .append ($("<option></option>") .text ("SFVec4f"))
61
61
  .appendTo (typeNameMenu);
62
62
 
63
- const multiFields = $("<optgroup></optgroup>")
63
+ $("<optgroup></optgroup>")
64
64
  .attr ("label", "Multi Fields")
65
65
  .append ($("<option></option>") .text ("MFBool"))
66
66
  .append ($("<option></option>") .text ("MFColor"))
@@ -92,13 +92,12 @@ $.fn.editUserDefinedFieldPopover = function (executionContext, node, field = -1)
92
92
  .append ($("<option></option>") .text ("inputOutput"))
93
93
  .appendTo (content);
94
94
 
95
- const nameInput = $("<input></input>")
96
- .attr ("placeholder", _("Enter name"))
95
+ $("<span></span>")
96
+ .text (_("Name"))
97
97
  .appendTo (content);
98
98
 
99
- const okButton = $("<button></button>")
100
- .text (_("Apply"))
101
- .on ("click", confirm)
99
+ const nameInput = $("<input></input>")
100
+ .attr ("placeholder", _("Enter name"))
102
101
  .appendTo (content);
103
102
 
104
103
  if (field instanceof X3D .X3DField)
@@ -114,6 +113,26 @@ $.fn.editUserDefinedFieldPopover = function (executionContext, node, field = -1)
114
113
  .prop ("selected", true);
115
114
 
116
115
  nameInput .val (field .getName ());
116
+
117
+ $("<span></span>")
118
+ .text (_("Application Information"))
119
+ .appendTo (content);
120
+
121
+ $("<input></input>")
122
+ .addClass ("appinfo")
123
+ .attr ("placeholder", _("Enter application information"))
124
+ .val (field .getAppInfo ())
125
+ .appendTo (content);
126
+
127
+ $("<span></span>")
128
+ .text (_("Documentation"))
129
+ .appendTo (content);
130
+
131
+ $("<input></input>")
132
+ .addClass ("documentation")
133
+ .attr ("placeholder", _("Enter documentation"))
134
+ .val (field .getDocumentation ())
135
+ .appendTo (content);
117
136
  }
118
137
  else
119
138
  {
@@ -128,10 +147,19 @@ $.fn.editUserDefinedFieldPopover = function (executionContext, node, field = -1)
128
147
  .prop ("selected", true);
129
148
  }
130
149
 
150
+ $("<button></button>")
151
+ .text (_("Apply"))
152
+ .on ("click", confirm)
153
+ .appendTo (content);
154
+
131
155
  // Create tooltip.
132
156
 
133
157
  const tooltip = this .popover ({
134
158
  content: content,
159
+ extension:
160
+ {
161
+ wide: field instanceof X3D .X3DField,
162
+ },
135
163
  events: {
136
164
  show (event, api)
137
165
  {
@@ -140,7 +168,7 @@ $.fn.editUserDefinedFieldPopover = function (executionContext, node, field = -1)
140
168
  electron .shell .beep ();
141
169
  nameInput .highlight ();
142
170
  })
143
- .on ("keydown", event =>
171
+ .siblings (".appinfo, .documentation") .addBack () .on ("keydown", event =>
144
172
  {
145
173
  if (event .key !== "Enter")
146
174
  return;
@@ -181,17 +209,26 @@ $.fn.editUserDefinedFieldPopover = function (executionContext, node, field = -1)
181
209
  if (!name .length)
182
210
  return;
183
211
 
184
- if (type === field .getType () && accessType == field .getAccessType () && name === field .getName ())
185
- return;
186
-
187
- // Change field.
212
+ // Edit field.
188
213
 
189
- const fields = Array .from (node .getUserDefinedFields ());
214
+ const
215
+ fields = Array .from (node .getUserDefinedFields ()),
216
+ appInfo = content .children (".appinfo") .val (),
217
+ documentation = content .children (".documentation") .val ();
190
218
 
191
219
  if (type === field .getType ())
192
220
  {
193
221
  UndoManager .shared .beginUndo (_("Edit Field »%s«"), field .getName ());
194
- Editor .updateUserDefinedField (executionContext, node, field, accessType, name);
222
+
223
+ if (accessType !== field .getAccessType () || name !== field .getName ())
224
+ Editor .updateUserDefinedField (executionContext, node, field, accessType, name);
225
+
226
+ if (appInfo !== field .getAppInfo ())
227
+ Editor .updateAppInfo (field, appInfo);
228
+
229
+ if (documentation !== field .getDocumentation ())
230
+ Editor .updateDocumentation (field, documentation);
231
+
195
232
  UndoManager .shared .endUndo ();
196
233
  }
197
234
  else
@@ -207,6 +244,13 @@ $.fn.editUserDefinedFieldPopover = function (executionContext, node, field = -1)
207
244
  fields .splice (index, 1, newField);
208
245
 
209
246
  Editor .setUserDefinedFields (executionContext, node, fields);
247
+
248
+ if (appInfo !== field .getAppInfo ())
249
+ Editor .updateAppInfo (newField, appInfo);
250
+
251
+ if (documentation !== field .getDocumentation ())
252
+ Editor .updateDocumentation (newField, documentation);
253
+
210
254
  UndoManager .shared .endUndo ();
211
255
  }
212
256
  }
@@ -15,14 +15,21 @@ $.fn.exportNodePopover = function (node, oldExportedName)
15
15
 
16
16
  const scene = node .getExecutionContext ();
17
17
 
18
+ const content = $("<div></div>");
19
+
20
+ $("<span></span>")
21
+ .text (_("Name"))
22
+ .appendTo (content);
23
+
18
24
  const nameInput = $("<input></input>")
19
25
  .attr ("placeholder", _("Enter exported name"))
20
- .val (oldExportedName ?? scene .getUniqueExportName (node .getName ()));
26
+ .val (oldExportedName ?? scene .getUniqueExportName (node .getName ()))
27
+ .appendTo (content);
21
28
 
22
29
  // Create tooltip.
23
30
 
24
31
  const tooltip = this .popover ({
25
- content: nameInput,
32
+ content: content,
26
33
  events: {
27
34
  show: (event, api) =>
28
35
  {
@@ -15,14 +15,21 @@ $.fn.importNodePopover = function (inlineNode, exportedName, oldImportedName)
15
15
 
16
16
  const executionContext = inlineNode .getExecutionContext ();
17
17
 
18
+ const content = $("<div></div>");
19
+
20
+ $("<span></span>")
21
+ .text (_("Name"))
22
+ .appendTo (content);
23
+
18
24
  const nameInput = $("<input></input>")
19
25
  .attr ("placeholder", _("Enter imported name"))
20
- .val (oldImportedName ?? executionContext .getUniqueImportName (exportedName));
26
+ .val (oldImportedName ?? executionContext .getUniqueImportName (exportedName))
27
+ .appendTo (content);
21
28
 
22
29
  // Create tooltip.
23
30
 
24
31
  const tooltip = this .popover ({
25
- content: nameInput,
32
+ content: content,
26
33
  events: {
27
34
  show: (event, api) =>
28
35
  {
@@ -13,6 +13,11 @@ $.fn.popover = function (options)
13
13
  if (!options .preview)
14
14
  $(".show-preview.on") .removeClass ("on") .addClass ("off");
15
15
 
16
+ let classes = "qtip-tipsy";
17
+
18
+ if (options .extension ?.wide)
19
+ classes += " qtip-wide";
20
+
16
21
  return this .qtip ($.extend (true,
17
22
  {
18
23
  position: {
@@ -22,7 +27,7 @@ $.fn.popover = function (options)
22
27
  effect: false,
23
28
  },
24
29
  style: {
25
- classes: "qtip-tipsy",
30
+ classes: classes,
26
31
  },
27
32
  show: {
28
33
  ready: true,
@@ -13,15 +13,15 @@ require ("../Bits/Validate");
13
13
  $.fn.renameNodeInput = function (node)
14
14
  {
15
15
  this
16
- .off ("keydown.renameNodeInput")
17
- .val (node ? node .getName () : "");
16
+ .val (node ? node .getName () : "")
17
+ .siblings () .addBack () .off ("keydown.renameNodeInput")
18
18
 
19
19
  this .validate (Editor .Id, () =>
20
20
  {
21
21
  electron .shell .beep ();
22
22
  this .highlight ();
23
23
  })
24
- .on ("keydown.renameNodeInput", (event) =>
24
+ .siblings () .addBack () .on ("keydown.renameNodeInput", (event) =>
25
25
  {
26
26
  if (!node)
27
27
  return;
@@ -33,9 +33,6 @@ $.fn.renameNodeInput = function (node)
33
33
 
34
34
  let name = this .val ();
35
35
 
36
- if (name === node .getName ())
37
- return;
38
-
39
36
  const executionContext = node .getExecutionContext ();
40
37
 
41
38
  if (node instanceof X3D .X3DProtoDeclarationNode)
@@ -45,12 +42,15 @@ $.fn.renameNodeInput = function (node)
45
42
 
46
43
  if (node .isExternProto)
47
44
  {
48
- name = executionContext .getUniqueExternProtoName (name);
45
+ if (name === node .getName ())
46
+ return;
49
47
 
50
48
  const externproto = node;
51
49
 
52
50
  UndoManager .shared .beginUndo (_("Update Extern Proto Declaration »%s«"), name);
53
51
 
52
+ name = executionContext .getUniqueExternProtoName (name);
53
+
54
54
  Editor .updateExternProtoDeclaration (executionContext, name, externproto);
55
55
 
56
56
  if (!executionContext .protos .get (name))
@@ -65,13 +65,25 @@ $.fn.renameNodeInput = function (node)
65
65
  }
66
66
  else
67
67
  {
68
- name = executionContext .getUniqueProtoName (name);
69
-
70
- const proto = node;
68
+ const
69
+ proto = node,
70
+ appInfo = this .siblings (".appinfo") .val (),
71
+ documentation = this .siblings (".documentation") .val ();
71
72
 
72
73
  UndoManager .shared .beginUndo (_("Update Proto Declaration »%s«"), name);
73
74
 
74
- Editor .updateProtoDeclaration (executionContext, name, proto);
75
+ if (name !== node .getName ())
76
+ {
77
+ name = executionContext .getUniqueProtoName (name);
78
+
79
+ Editor .updateProtoDeclaration (executionContext, name, proto);
80
+ }
81
+
82
+ if (appInfo !== node .getAppInfo ())
83
+ Editor .updateAppInfo (proto, appInfo);
84
+
85
+ if (documentation !== node .getDocumentation ())
86
+ Editor .updateDocumentation (proto, documentation);
75
87
 
76
88
  const available = Editor .getNextAvailableProtoNode (executionContext, proto);
77
89
 
@@ -83,6 +95,9 @@ $.fn.renameNodeInput = function (node)
83
95
  }
84
96
  else
85
97
  {
98
+ if (name === node .getName ())
99
+ return;
100
+
86
101
  if (name)
87
102
  Editor .updateNamedNode (executionContext, executionContext .getUniqueName (name), node);
88
103
  else
@@ -201,14 +201,15 @@ module .exports = class OutlineEditor extends OutlineRouteGraph
201
201
  {
202
202
  const
203
203
  parentFieldElement = element .closest (".field, .scene", this .sceneGraph),
204
- parentNodeElement = parentFieldElement .closest (".node, .proto, .scene", this .sceneGraph);
204
+ parentNodeElement = parentFieldElement .closest (".node, .proto, .scene", this .sceneGraph),
205
+ innerNode = $.try (() => node .getInnerNode ()) ?? node;
205
206
 
206
207
  if (node)
207
208
  {
208
209
  var menu = [
209
210
  {
210
- label: _("Rename Node..."),
211
- args: ["renameNode", element .attr ("id"), executionContext .getId (), node .getId ()],
211
+ label: _("Edit Node..."),
212
+ args: ["editNode", element .attr ("id"), executionContext .getId (), node .getId ()],
212
213
  },
213
214
  {
214
215
  label: _("Export Node..."),
@@ -250,7 +251,7 @@ module .exports = class OutlineEditor extends OutlineRouteGraph
250
251
  { type: "separator" },
251
252
  ];
252
253
 
253
- if (node .getType () .includes (X3D .X3DConstants .X3DChildNode))
254
+ if (innerNode .getType () .includes (X3D .X3DConstants .X3DChildNode))
254
255
  {
255
256
  menu .push ({
256
257
  label: _("Add Parent Group"),
@@ -556,9 +557,9 @@ module .exports = class OutlineEditor extends OutlineRouteGraph
556
557
 
557
558
  var menu = [
558
559
  {
559
- label: _("Rename Exported Node..."),
560
+ label: _("Edit Exported Node..."),
560
561
  visible: exportedNode .getExecutionContext () === this .executionContext,
561
- args: ["renameExportedNode", element .attr ("id")],
562
+ args: ["editExportedNode", element .attr ("id")],
562
563
  },
563
564
  {
564
565
  label: _("Remove Exported Node"),
@@ -579,9 +580,9 @@ module .exports = class OutlineEditor extends OutlineRouteGraph
579
580
 
580
581
  var menu = [
581
582
  {
582
- label: _("Rename Imported Node..."),
583
+ label: _("Edit Imported Node..."),
583
584
  visible: importedNode .getExecutionContext () .getLocalScene () === this .executionContext,
584
- args: ["renameImportedNode", element .attr ("id")],
585
+ args: ["editImportedNode", element .attr ("id")],
585
586
  },
586
587
  {
587
588
  label: _("Remove Imported Node"),
@@ -604,8 +605,8 @@ module .exports = class OutlineEditor extends OutlineRouteGraph
604
605
  args: ["addPrototype", element .attr ("id"), executionContext .getId ()],
605
606
  },
606
607
  {
607
- label: _("Rename Prototype..."),
608
- args: ["renamePrototype", element .attr ("id"), executionContext .getId (), protoNode .getId ()],
608
+ label: _("Edit Prototype..."),
609
+ args: ["editPrototype", element .attr ("id"), executionContext .getId (), protoNode .getId ()],
609
610
  },
610
611
  {
611
612
  label: _("Delete Prototype"),
@@ -761,15 +762,15 @@ module .exports = class OutlineEditor extends OutlineRouteGraph
761
762
  field .addEvent ();
762
763
  }
763
764
 
764
- renameNode (id, executionContextId, nodeId)
765
+ editNode (id, executionContextId, nodeId)
765
766
  {
766
- require ("../Controls/RenameNodePopover");
767
+ require ("../Controls/EditNodePopover");
767
768
 
768
769
  const
769
770
  element = $(`#${id}`),
770
771
  node = this .objects .get (nodeId);
771
772
 
772
- element .find ("> .item") .renameNodePopover (node);
773
+ element .find ("> .item") .editNodePopover (node);
773
774
  }
774
775
 
775
776
  openLibrary (id, executionContextId, nodeId, fieldId)
@@ -793,7 +794,7 @@ module .exports = class OutlineEditor extends OutlineRouteGraph
793
794
  element .find ("> .item") .exportNodePopover (node);
794
795
  }
795
796
 
796
- renameExportedNode (id)
797
+ editExportedNode (id)
797
798
  {
798
799
  require ("../Controls/ExportNodePopover");
799
800
 
@@ -825,7 +826,7 @@ module .exports = class OutlineEditor extends OutlineRouteGraph
825
826
  element .find ("> .item") .importNodePopover (inlineNode, exportedNode .getExportedName ());
826
827
  }
827
828
 
828
- renameImportedNode (id)
829
+ editImportedNode (id)
829
830
  {
830
831
  require ("../Controls/ImportNodePopover");
831
832
 
@@ -1992,15 +1993,15 @@ module .exports = class OutlineEditor extends OutlineRouteGraph
1992
1993
  element .addPrototypePopover (executionContext);
1993
1994
  }
1994
1995
 
1995
- renamePrototype (id, executionContextId, protoNodeId)
1996
+ editPrototype (id, executionContextId, protoNodeId)
1996
1997
  {
1997
- require ("../Controls/RenameNodePopover");
1998
+ require ("../Controls/EditNodePopover");
1998
1999
 
1999
2000
  const
2000
2001
  element = $(`#${id}`),
2001
2002
  protoNode = this .objects .get (protoNodeId);
2002
2003
 
2003
- element .find ("> .item") .renameNodePopover (protoNode);
2004
+ element .find ("> .item") .editNodePopover (protoNode);
2004
2005
  }
2005
2006
 
2006
2007
  deletePrototype (id, executionContextId, protoNodeId, used, availableId)
@@ -284,9 +284,7 @@ module .exports = class OutlineView extends Interface
284
284
  }
285
285
 
286
286
  child .find (".externproto .name, .externproto .icon, .proto .name, .proto .icon, .node .name, .node .icon")
287
- .on ("click", this .selectNode .bind (this));
288
-
289
- child .find (".node .name")
287
+ .on ("click", this .selectNode .bind (this))
290
288
  .on ("mouseenter", this .updateNodeTitle .bind (this));
291
289
 
292
290
  child .find ("[action]")
@@ -1860,16 +1858,16 @@ module .exports = class OutlineView extends Interface
1860
1858
  {
1861
1859
  const
1862
1860
  name = $(event .currentTarget),
1863
- element = $(event .currentTarget) .closest (".node, .special", this .sceneGraph),
1861
+ element = $(event .currentTarget) .closest (".externproto, .proto, .node, .special", this .sceneGraph),
1864
1862
  node = this .objects .get (parseInt (element .attr ("node-id")));
1865
1863
 
1866
1864
  // Handle NULL node element.
1867
1865
  if (!node)
1868
1866
  return;
1869
1867
 
1870
- const interfaceDefinitionElement = X3DUOM .find (`ConcreteNode[name="${node .getTypeName ()}"] InterfaceDefinition`);
1868
+ const nodeElement = X3DUOM .find (`ConcreteNode[name="${node .getTypeName ()}"] InterfaceDefinition`);
1871
1869
 
1872
- name .attr ("title", this .getNodeTitle (interfaceDefinitionElement));
1870
+ name .attr ("title", this .getNodeTitle (node, nodeElement));
1873
1871
  }
1874
1872
 
1875
1873
  updateFieldTitle (event)
@@ -1884,9 +1882,9 @@ module .exports = class OutlineView extends Interface
1884
1882
  name .attr ("title", this .getFieldTitle (node, field, fieldElement));
1885
1883
  }
1886
1884
 
1887
- getNodeTitle (interfaceDefinitionElement)
1885
+ getNodeTitle (node, nodeElement)
1888
1886
  {
1889
- const description = interfaceDefinitionElement .attr ("appinfo");
1887
+ const description = nodeElement .attr ("appinfo") ?? node .getAppInfo ?.();
1890
1888
 
1891
1889
  let title = "";
1892
1890
 
@@ -1903,7 +1901,10 @@ module .exports = class OutlineView extends Interface
1903
1901
  return string .length > n ? string .slice (0, n) + "..." : string;
1904
1902
  };
1905
1903
 
1906
- const description = fieldElement .attr ("description");
1904
+ if (node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
1905
+ field = node .getFieldDefinitions () .get (field .getName ()) .getValue ();
1906
+
1907
+ const description = fieldElement .attr ("description") ?? field .getAppInfo ();
1907
1908
 
1908
1909
  let title = "";
1909
1910
 
@@ -137,9 +137,9 @@ module .exports = new class Panel extends Interface
137
137
 
138
138
  // Set title.
139
139
 
140
- const interfaceDefinitionElement = concreteNode .find (`InterfaceDefinition`);
140
+ const nodeElement = concreteNode .find (`InterfaceDefinition`);
141
141
 
142
- this .container .attr ("title", this .getNodeTitle (interfaceDefinitionElement));
142
+ this .container .attr ("title", this .getNodeTitle (node, nodeElement));
143
143
 
144
144
  // Make first folder title draggable.
145
145
 
@@ -736,9 +736,9 @@ module .exports = new class Panel extends Interface
736
736
  }
737
737
  }
738
738
 
739
- getNodeTitle (interfaceDefinitionElement)
739
+ getNodeTitle (node, nodeElement)
740
740
  {
741
- const description = interfaceDefinitionElement .attr ("appinfo");
741
+ const description = nodeElement .attr ("appinfo") ?? node .getAppInfo ?.();
742
742
 
743
743
  let title = "";
744
744
 
@@ -755,7 +755,10 @@ module .exports = new class Panel extends Interface
755
755
  return string .length > n ? string .slice (0, n) + "..." : string;
756
756
  };
757
757
 
758
- const description = fieldElement .attr ("description");
758
+ if (node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
759
+ field = node .getFieldDefinitions () .get (field .getName ()) .getValue ();
760
+
761
+ const description = fieldElement .attr ("description") ?? field .getAppInfo ();
759
762
 
760
763
  let title = "";
761
764
 
@@ -76,7 +76,7 @@ class X3DGridNodeTool extends X3DActiveLayerNodeTool
76
76
  continue;
77
77
  }
78
78
 
79
- field .assign (this .tool .getFieldDefinition (field .getName ()) .value);
79
+ field .assign (this .tool .getFieldDefinition (field .getName ()) .getValue ());
80
80
 
81
81
  configNode ?.getMetaData (`Sunrize/${this .tool .getNodeTypeName ()}/${field .getName ()}`, field);
82
82
  }
@@ -89,7 +89,7 @@ class X3DGridNodeTool extends X3DActiveLayerNodeTool
89
89
 
90
90
  const path = `Sunrize/${this .tool .getNodeTypeName ()}/${field .getName ()}`;
91
91
 
92
- if (field .equals (this .tool .getFieldDefinition (field .getName ()) .value))
92
+ if (field .equals (this .tool .getFieldDefinition (field .getName ()) .getValue ()))
93
93
  {
94
94
  const configNode = Editor .getConfigNode (this .getBrowser ());
95
95
 
@@ -1673,6 +1673,48 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
1673
1673
  });
1674
1674
  }
1675
1675
 
1676
+ /**
1677
+ *
1678
+ * @param {X3DProtoDeclaration | X3DField} object
1679
+ * @param {UndoManager} undoManager
1680
+ */
1681
+ static updateAppInfo (object, appInfo, undoManager = UndoManager .shared)
1682
+ {
1683
+ const oldAppInfo = object .getAppInfo ();
1684
+
1685
+ undoManager .beginUndo (_("Update App Info"));
1686
+
1687
+ object .setAppInfo (appInfo);
1688
+
1689
+ undoManager .registerUndo (() =>
1690
+ {
1691
+ this .updateAppInfo (object, oldAppInfo, undoManager);
1692
+ });
1693
+
1694
+ undoManager .endUndo ();
1695
+ }
1696
+
1697
+ /**
1698
+ *
1699
+ * @param {X3DProtoDeclaration | X3DField} object
1700
+ * @param {UndoManager} undoManager
1701
+ */
1702
+ static updateDocumentation (object, documentation, undoManager = UndoManager .shared)
1703
+ {
1704
+ const oldDocumentation = object .getDocumentation ();
1705
+
1706
+ undoManager .beginUndo (_("Update App Info"));
1707
+
1708
+ object .setDocumentation (documentation);
1709
+
1710
+ undoManager .registerUndo (() =>
1711
+ {
1712
+ this .updateDocumentation (object, oldDocumentation, undoManager);
1713
+ });
1714
+
1715
+ undoManager .endUndo ();
1716
+ }
1717
+
1676
1718
  /**
1677
1719
  *
1678
1720
  * @param {X3DExecutionContext} executionContext
@@ -2822,7 +2864,7 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
2822
2864
  if (node .canUserDefinedFields () && node .getUserDefinedFields () .has (field .getName ()))
2823
2865
  this .setFieldValue (executionContext, node, field, field .create (), undoManager);
2824
2866
  else
2825
- this .setFieldValue (executionContext, node, field, fieldDefinition .value, undoManager);
2867
+ this .setFieldValue (executionContext, node, field, fieldDefinition .getValue (), undoManager);
2826
2868
 
2827
2869
  undoManager .endUndo ();
2828
2870
  }
@@ -2,7 +2,7 @@
2
2
  <!-- X3D Unified Object Model (X3DUOM) X3dUnifiedObjectModel-4.0.xml -->
3
3
  <!-- Online at https://www.web3d.org/specifications/X3dUnifiedObjectModel-4.0.xml -->
4
4
  <!-- This file contains a listing of all abstract and concrete nodes in version 4.0 of X3D -->
5
- <!-- Generated 2025-02-14-08:00 18:39:56.6470403-08:00 -->
5
+ <!-- Generated 2025-08-23-07:00 09:15:12.7342832-07:00 -->
6
6
  <X3dUnifiedObjectModel xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
7
7
  version="4.0"
8
8
  xsd:noNamespaceSchemaLocation="X3dUnifiedObjectModel.xsd">
@@ -499,9 +499,15 @@
499
499
  appinfo="parent node is TextureBackground or ComposedCubeMapTexture"/>
500
500
  <enumeration value="topTexture"
501
501
  appinfo="parent node is TextureBackground or ComposedCubeMapTexture"/>
502
+ <enumeration value="ambientTexture"
503
+ appinfo="X3D4 Physically Based Rendering (PBR) capability, parent node is Material"
504
+ documentation="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/shape.html#Material"/>
502
505
  <enumeration value="baseTexture"
503
506
  appinfo="X3D4 Physically Based Rendering (PBR) capability, parent node is PhysicalMaterial"
504
507
  documentation="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/shape.html#PhysicalMaterial"/>
508
+ <enumeration value="diffuseTexture"
509
+ appinfo="X3D4 Physically Based Rendering (PBR) capability, parent node is Material"
510
+ documentation="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/shape.html#Material"/>
505
511
  <enumeration value="emissiveTexture"
506
512
  appinfo="X3D4 Physically Based Rendering (PBR) capability, parent node is PhysicalMaterial or UnlitMaterial"
507
513
  documentation="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/shape.html#UnlitMaterial"/>
@@ -514,6 +520,12 @@
514
520
  <enumeration value="occlusionTexture"
515
521
  appinfo="X3D4 Physically Based Rendering (PBR) capability, parent node is PhysicalMaterial"
516
522
  documentation="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/shape.html#PhysicalMaterial"/>
523
+ <enumeration value="shininessTexture"
524
+ appinfo="X3D4 Physically Based Rendering (PBR) capability, parent node is Material"
525
+ documentation="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/shape.html#Material"/>
526
+ <enumeration value="specularTexture"
527
+ appinfo="X3D4 Physically Based Rendering (PBR) capability, parent node is Material"
528
+ documentation="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/shape.html#Material"/>
517
529
  </SimpleType>
518
530
  <SimpleType name="distanceModelChoices"
519
531
  baseType="SFString"
@@ -4850,7 +4862,7 @@
4850
4862
  defaultValue="0 0 0"
4851
4863
  regex="\s*([+]?(0|[1-9][0-9]*)([Ee][+]?[0-9]+)?\s+){2}[+]?[0-4](\s+(0x[0-9a-fA-F]{1,16}|[+]?(0|[1-9][0-9]*)([Ee][+]?[0-9]+)?))*\s*">
4852
4864
  <InterfaceDefinition specificationUrl="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/fieldsDef.html#SFImageAndMFImage"
4853
- appinfo="SFImage specifies a single uncompressed 2-dimensional pixel image. SFImage fields contain three integers representing the width, height and number of components in the image, followed by (width x height) hexadecimal or integer values representing the pixels in the image.">
4865
+ appinfo="SFImage specifies a single uncompressed 2-dimensional pixel image. SFImage fields contain three integers representing the width, height, and number of components in the image, followed by (width x height) hexadecimal or integer values representing the pixels in the image.">
4854
4866
  <Inheritance baseType="xs:string" x3dType="X3DField"/>
4855
4867
  </InterfaceDefinition>
4856
4868
  </FieldType>
@@ -10062,7 +10074,7 @@
10062
10074
  </ConcreteNode>
10063
10075
  <ConcreteNode name="Analyser">
10064
10076
  <InterfaceDefinition specificationUrl="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/sound.html#Analyser"
10065
- appinfo="Analyser provides real-time frequency and time-domain analysis information, without any change to the input.">
10077
+ appinfo="Analyser provides real-time frequency and time-domain analysis information, without any signal-processing change to the audio stream which is passed unprocessed from input to output.">
10066
10078
  <componentInfo name="Sound" level="2"/>
10067
10079
  <Inheritance baseType="X3DSoundProcessingNode"/>
10068
10080
  <field name="channelCount"
@@ -10147,7 +10159,7 @@
10147
10159
  accessType="inputOutput"
10148
10160
  default="1"
10149
10161
  inheritedFrom="X3DSoundProcessingNode"
10150
- description="The gain field is a factor that represents the amount of linear amplification to apply to the output of the node."/>
10162
+ description="The gain value only affects analysis, not output signal."/>
10151
10163
  <field name="IS"
10152
10164
  type="SFNode"
10153
10165
  accessType="inputOutput"
@@ -10777,7 +10789,7 @@
10777
10789
  accessType="inputOutput"
10778
10790
  default="true"
10779
10791
  inheritedFrom="X3DUrlObject"
10780
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
10792
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
10781
10793
  <field name="loop"
10782
10794
  type="SFBool"
10783
10795
  accessType="inputOutput"
@@ -10957,7 +10969,7 @@
10957
10969
  type="SFString"
10958
10970
  accessType="inputOutput"
10959
10971
  inheritedFrom="X3DSoundDestinationNode"
10960
- description="mediaDeviceID field provides ID parameter functionality."/>
10972
+ description="mediaDeviceID field provides a unique identifier for the active device that corresponds to deviceId functionality defined in W3C Web Audio API."/>
10961
10973
  <field name="metadata"
10962
10974
  type="SFNode"
10963
10975
  accessType="inputOutput"
@@ -12325,7 +12337,7 @@
12325
12337
  accessType="inputOutput"
12326
12338
  default="true"
12327
12339
  inheritedFrom="X3DUrlObject"
12328
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
12340
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
12329
12341
  <field name="loop"
12330
12342
  type="SFBool"
12331
12343
  accessType="inputOutput"
@@ -16263,7 +16275,7 @@
16263
16275
  accessType="inputOutput"
16264
16276
  default="0"
16265
16277
  minInclusive="0"
16266
- description="delayTime is duration of delay (in seconds) to apply."/>
16278
+ description="delayTime is duration of delay applied (in seconds)."/>
16267
16279
  <field name="description"
16268
16280
  type="SFString"
16269
16281
  accessType="inputOutput"
@@ -16659,7 +16671,7 @@
16659
16671
  accessType="inputOutput"
16660
16672
  default="true"
16661
16673
  inheritedFrom="X3DUrlObject"
16662
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
16674
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
16663
16675
  <field name="metadata"
16664
16676
  type="SFNode"
16665
16677
  accessType="inputOutput"
@@ -19547,7 +19559,7 @@
19547
19559
  accessType="inputOutput"
19548
19560
  default="true"
19549
19561
  inheritedFrom="X3DUrlObject"
19550
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
19562
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
19551
19563
  <field name="metadata"
19552
19564
  type="SFNode"
19553
19565
  accessType="inputOutput"
@@ -24494,7 +24506,7 @@
24494
24506
  accessType="inputOutput"
24495
24507
  default="true"
24496
24508
  inheritedFrom="X3DUrlObject"
24497
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
24509
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
24498
24510
  <field name="metadata"
24499
24511
  type="SFNode"
24500
24512
  accessType="inputOutput"
@@ -24588,7 +24600,7 @@
24588
24600
  accessType="inputOutput"
24589
24601
  default="true"
24590
24602
  inheritedFrom="X3DUrlObject"
24591
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
24603
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
24592
24604
  <field name="metadata"
24593
24605
  type="SFNode"
24594
24606
  accessType="inputOutput"
@@ -24695,7 +24707,7 @@
24695
24707
  accessType="inputOutput"
24696
24708
  default="true"
24697
24709
  inheritedFrom="X3DUrlObject"
24698
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
24710
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
24699
24711
  <field name="metadata"
24700
24712
  type="SFNode"
24701
24713
  accessType="inputOutput"
@@ -25651,7 +25663,7 @@
25651
25663
  accessType="inputOutput"
25652
25664
  default="true"
25653
25665
  inheritedFrom="X3DUrlObject"
25654
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
25666
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
25655
25667
  <field name="metadata"
25656
25668
  type="SFNode"
25657
25669
  accessType="inputOutput"
@@ -28182,7 +28194,7 @@
28182
28194
  <field name="mediaDeviceID"
28183
28195
  type="SFString"
28184
28196
  accessType="inputOutput"
28185
- description="mediaDeviceID field provides ID parameter functionality."/>
28197
+ description="mediaDeviceID field provides a unique identifier for the active device that corresponds to deviceId functionality defined in W3C Web Audio API."/>
28186
28198
  <field name="metadata"
28187
28199
  type="SFNode"
28188
28200
  accessType="inputOutput"
@@ -28516,7 +28528,7 @@
28516
28528
  accessType="inputOutput"
28517
28529
  default="true"
28518
28530
  inheritedFrom="X3DUrlObject"
28519
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
28531
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
28520
28532
  <field name="loop"
28521
28533
  type="SFBool"
28522
28534
  accessType="inputOutput"
@@ -30935,7 +30947,7 @@
30935
30947
  accessType="inputOutput"
30936
30948
  default="true"
30937
30949
  inheritedFrom="X3DUrlObject"
30938
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
30950
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
30939
30951
  <field name="metadata"
30940
30952
  type="SFNode"
30941
30953
  accessType="inputOutput"
@@ -34972,7 +34984,7 @@
34972
34984
  accessType="inputOutput"
34973
34985
  default="true"
34974
34986
  inheritedFrom="X3DScriptNode"
34975
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
34987
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
34976
34988
  <field name="metadata"
34977
34989
  type="SFNode"
34978
34990
  accessType="inputOutput"
@@ -35275,7 +35287,7 @@
35275
35287
  accessType="inputOutput"
35276
35288
  default="true"
35277
35289
  inheritedFrom="X3DUrlObject"
35278
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
35290
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
35279
35291
  <field name="metadata"
35280
35292
  type="SFNode"
35281
35293
  accessType="inputOutput"
@@ -35384,7 +35396,7 @@
35384
35396
  accessType="inputOutput"
35385
35397
  default="true"
35386
35398
  inheritedFrom="X3DUrlObject"
35387
- description="load=true means load immediately, load=false means defer loading or else unload a previously loaded scene."/>
35399
+ description="load=true means load immediately, load=false means defer loading or else unload a previously loaded asset."/>
35388
35400
  <field name="metadata"
35389
35401
  type="SFNode"
35390
35402
  accessType="inputOutput"
@@ -36259,7 +36271,7 @@
36259
36271
  default="6.2832"
36260
36272
  minInclusive="0"
36261
36273
  maxInclusive="6.2832"
36262
- description="coneOuterAngle is centered along direction and defines an outer conical volume, within which the sound gain decreases linearly from full gain to coneOuterGain."/>
36274
+ description="coneOuterAngle is centered along direction and defines an outer conical volume, within which the sound gain decreases from full gain to coneOuterGain."/>
36263
36275
  <field name="coneOuterGain"
36264
36276
  type="SFFloat"
36265
36277
  accessType="inputOutput"
@@ -36282,7 +36294,7 @@
36282
36294
  additionalEnumerationValuesAllowed="false"
36283
36295
  simpleType="distanceModelChoices"
36284
36296
  baseType="SFString"
36285
- description="distanceModel determines how field specifies which algorithm to use for sound attenuation, corresponding to distance between an audio source and a listener, as it moves away from the listener.">
36297
+ description="distanceModel determines which algorithm to use for sound attenuation, corresponding to distance between an audio source and a listener, as it moves away from the listener.">
36286
36298
  <enumeration value="LINEAR"
36287
36299
  alias="linear"
36288
36300
  appinfo="X3D version of &#34;linear&#34; in Web Audio API."
@@ -37212,7 +37224,7 @@
37212
37224
  type="SFString"
37213
37225
  accessType="inputOutput"
37214
37226
  inheritedFrom="X3DSoundDestinationNode"
37215
- description="mediaDeviceID field provides ID parameter functionality."/>
37227
+ description="mediaDeviceID field provides a unique identifier for the active device that corresponds to deviceId functionality defined in W3C Web Audio API."/>
37216
37228
  <field name="metadata"
37217
37229
  type="SFNode"
37218
37230
  accessType="inputOutput"
@@ -37221,7 +37233,7 @@
37221
37233
  inheritedFrom="X3DNode"
37222
37234
  description="Information about this node can be contained in a MetadataBoolean, MetadataDouble, MetadataFloat, MetadataInteger, MetadataString or MetadataSet node."/>
37223
37235
  <field name="streamIdentifier"
37224
- type="SFString"
37236
+ type="MFString"
37225
37237
  accessType="inputOutput"
37226
37238
  description="Stream identification TBD Hint: W3C Media Capture and Streams https://www."/>
37227
37239
  <field name="DEF"
@@ -37378,7 +37390,7 @@
37378
37390
  inheritedFrom="X3DTimeDependentNode"
37379
37391
  description="Absolute time: number of seconds since January 1, 1970, 00:00:00 GMT."/>
37380
37392
  <field name="streamIdentifier"
37381
- type="SFString"
37393
+ type="MFString"
37382
37394
  accessType="inputOutput"
37383
37395
  description="Stream identification TBD Hint: W3C Media Capture and Streams https://www."/>
37384
37396
  <field name="DEF"
@@ -41756,6 +41768,10 @@
41756
41768
  accessType="inputOutput"
41757
41769
  acceptableNodeTypes="Analyser|AudioClip|AudioDestination|BiquadFilter|BufferAudioSource|ChannelMerger|ChannelSelector|ChannelSplitter|Convolver|Delay|DynamicsCompressor|Gain|ListenerPointSource|MicrophoneSource|MovieTexture|OscillatorSource|Sound|SpatialSound|StreamAudioDestination|StreamAudioSource|WaveShaper"
41758
41770
  description="The children field specifies audio-graph sound sources providing input signals for this node."/>
41771
+ <field name="curve"
41772
+ type="MFFloat"
41773
+ accessType="inputOutput"
41774
+ description="The curve field is an array of floating-point numbers describing the distortion to apply."/>
41759
41775
  <field name="description"
41760
41776
  type="SFString"
41761
41777
  accessType="inputOutput"
@@ -397,6 +397,15 @@ tr.disabled ~ tr > td > div {
397
397
  box-shadow: var(--qtip-shadow);
398
398
  }
399
399
 
400
+ .qtip-tipsy {
401
+ color: var(--system-gray1);
402
+ }
403
+
404
+ body.light .qtip-tipsy {
405
+ color: black;
406
+ text-shadow: none;
407
+ }
408
+
400
409
  .qtip-tipsy .qtip-tip {
401
410
  background: inherit !important;
402
411
  }
@@ -412,12 +421,7 @@ tr.disabled ~ tr > td > div {
412
421
  }
413
422
 
414
423
  .qtip-tipsy .qtip-content {
415
- padding: 5px;
416
- }
417
-
418
- body.light .qtip-tipsy {
419
- color: black;
420
- text-shadow: none;
424
+ padding: 8px;
421
425
  }
422
426
 
423
427
  .qtip input,
@@ -431,7 +435,7 @@ body.light .qtip-tipsy {
431
435
  }
432
436
 
433
437
  .qtip .qtip-content > div > * {
434
- margin: 0.2em 0em;
438
+ margin: 0.3em 0em;
435
439
  }
436
440
 
437
441
  .qtip .qtip-content > div:first-child {
@@ -448,6 +452,10 @@ body.light .qtip-tipsy {
448
452
  color: var(--system-gray0);
449
453
  }
450
454
 
455
+ .qtip-wide {
456
+ width: 300px;
457
+ }
458
+
451
459
  /* Toolbar */
452
460
 
453
461
  .toolbar {
@@ -397,6 +397,15 @@ tr.disabled ~ tr > td > div {
397
397
  box-shadow: var(--qtip-shadow);
398
398
  }
399
399
 
400
+ .qtip-tipsy {
401
+ color: var(--system-gray1);
402
+ }
403
+
404
+ body.light .qtip-tipsy {
405
+ color: black;
406
+ text-shadow: none;
407
+ }
408
+
400
409
  .qtip-tipsy .qtip-tip {
401
410
  background: inherit !important;
402
411
  }
@@ -412,12 +421,7 @@ tr.disabled ~ tr > td > div {
412
421
  }
413
422
 
414
423
  .qtip-tipsy .qtip-content {
415
- padding: 5px;
416
- }
417
-
418
- body.light .qtip-tipsy {
419
- color: black;
420
- text-shadow: none;
424
+ padding: 8px;
421
425
  }
422
426
 
423
427
  .qtip input,
@@ -431,7 +435,7 @@ body.light .qtip-tipsy {
431
435
  }
432
436
 
433
437
  .qtip .qtip-content > div > * {
434
- margin: 0.2em 0em;
438
+ margin: 0.3em 0em;
435
439
  }
436
440
 
437
441
  .qtip .qtip-content > div:first-child {
@@ -448,6 +452,10 @@ body.light .qtip-tipsy {
448
452
  color: var(--system-gray0);
449
453
  }
450
454
 
455
+ .qtip-wide {
456
+ width: 300px;
457
+ }
458
+
451
459
  /* Toolbar */
452
460
 
453
461
  .toolbar {
@@ -1,40 +0,0 @@
1
- "use strict";
2
-
3
- const
4
- $ = require ("jquery"),
5
- _ = require ("../Application/GetText");
6
-
7
- require ("./Popover");
8
- require ("./RenameNodeInput");
9
-
10
- $.fn.renameNodePopover = function (node)
11
- {
12
- // Create content.
13
-
14
- const nameInput = $("<input></input>")
15
- .attr ("placeholder", _("Enter name"))
16
- .renameNodeInput (node);
17
-
18
- // Create tooltip.
19
-
20
- const tooltip = this .popover ({
21
- content: nameInput,
22
- events: {
23
- show: (event, api) =>
24
- {
25
- nameInput .off (".renameNodePopover") .on ("keydown.renameNodePopover", (event) =>
26
- {
27
- if (event .key !== "Enter")
28
- return;
29
-
30
- api .toggle (false);
31
- })
32
-
33
- setTimeout (() => nameInput .trigger ("select"), 1);
34
- },
35
- },
36
- });
37
-
38
- return this;
39
- };
40
-