@peers-app/peers-ui 0.20.2 → 0.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,3 @@
1
1
  import type React from "react";
2
+ /** Application settings organized by user, system, and developer concerns. */
2
3
  export declare const SettingsPage: React.FC;
@@ -48,6 +48,7 @@ const voice_settings_1 = require("./voice-settings");
48
48
  function getAppVersion() {
49
49
  return globalThis.__PEERS_APP_VERSION__ || "unknown";
50
50
  }
51
+ /** Application settings organized by user, system, and developer concerns. */
51
52
  const SettingsPage = () => {
52
53
  return ((0, jsx_runtime_1.jsx)("div", { className: "container-fluid", children: (0, jsx_runtime_1.jsx)(tabs_1.Tabs, { tabs: [
53
54
  {
@@ -95,7 +96,7 @@ const ProfileSection = () => {
95
96
  try {
96
97
  const userContext = await (0, peers_sdk_1.getUserContext)();
97
98
  const device = await (0, peers_sdk_1.Devices)(userContext.userDataContext).get(deviceId);
98
- deviceName(device?.name || "");
99
+ deviceName((device?.name || "").slice(0, peers_sdk_1.DISPLAY_NAME_MAX_LENGTH));
99
100
  savedDeviceName(device?.name || "");
100
101
  }
101
102
  catch (err) {
@@ -111,7 +112,10 @@ const ProfileSection = () => {
111
112
  // signAndSave call is serialized to JSON over the socket to the server.
112
113
  if (me?.q()) {
113
114
  const userContext = await (0, peers_sdk_1.getUserContext)();
114
- await (0, peers_sdk_1.Users)(userContext.userDataContext).signAndSave(me.toJS());
115
+ const updatedUser = me.toJS();
116
+ updatedUser.name = updatedUser.name.slice(0, peers_sdk_1.DISPLAY_NAME_MAX_LENGTH);
117
+ await (0, peers_sdk_1.Users)(userContext.userDataContext).signAndSave(updatedUser);
118
+ me.qs.name(updatedUser.name);
115
119
  me.q(0); // Reset change counter
116
120
  }
117
121
  // Save device name if changed
@@ -142,7 +146,7 @@ const ProfileSection = () => {
142
146
  return null;
143
147
  }
144
148
  const hasChanges = !!me.q() || deviceName() !== savedDeviceName();
145
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center mb-3", children: [(0, jsx_runtime_1.jsx)("h5", { className: "mb-0 me-auto", children: "Settings" }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-primary btn-sm", onClick: handleSave, disabled: !hasChanges, children: "Save" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsx)("small", { className: "form-label", children: "Display Name:" }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: me.qs.name, className: "form-control", placeholder: "Enter your name" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["Device Name:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "Give this device a friendly name to identify it in your network." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: deviceName, className: "form-control", placeholder: "e.g., My Laptop" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["User ID:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "This uniquely identifies you to all other users." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: me.userId, className: "form-control", disabled: true })] }), (0, jsx_runtime_1.jsxs)("div", { className: "row", children: [(0, jsx_runtime_1.jsxs)("div", { className: "col-md-6 mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["Public Key:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "This is your public key that other users will use to verify your signatures." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: me.publicKey, className: "form-control form-control-sm", disabled: true })] }), (0, jsx_runtime_1.jsxs)("div", { className: "col-md-6 mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["Public Box Key:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "This is the public key that other users can use to encrypt data so that only you can open it." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: me.publicBoxKey, className: "form-control form-control-sm", disabled: true })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["Device ID:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "This uniquely identifies this device on Peers networks." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: deviceId || "", className: "form-control form-control-sm", disabled: true })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsx)("small", { className: "form-label", children: "App Version:" }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: getAppVersion(), className: "form-control form-control-sm", disabled: true })] })] }));
149
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center mb-3", children: [(0, jsx_runtime_1.jsx)("h5", { className: "mb-0 me-auto", children: "Settings" }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-primary btn-sm", onClick: handleSave, disabled: !hasChanges, children: "Save" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsx)("small", { className: "form-label", children: "Display Name:" }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: me.qs.name, className: "form-control", maxLength: peers_sdk_1.DISPLAY_NAME_MAX_LENGTH, placeholder: "Enter your name" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["Device Name:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "Give this device a friendly name to identify it in your network." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: deviceName, className: "form-control", maxLength: peers_sdk_1.DISPLAY_NAME_MAX_LENGTH, placeholder: "e.g., My Laptop" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["User ID:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "This uniquely identifies you to all other users." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: me.userId, className: "form-control", disabled: true })] }), (0, jsx_runtime_1.jsxs)("div", { className: "row", children: [(0, jsx_runtime_1.jsxs)("div", { className: "col-md-6 mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["Public Key:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "This is your public key that other users will use to verify your signatures." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: me.publicKey, className: "form-control form-control-sm", disabled: true })] }), (0, jsx_runtime_1.jsxs)("div", { className: "col-md-6 mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["Public Box Key:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "This is the public key that other users can use to encrypt data so that only you can open it." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: me.publicBoxKey, className: "form-control form-control-sm", disabled: true })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("small", { className: "form-label", children: ["Device ID:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: "This uniquely identifies this device on Peers networks." })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: deviceId || "", className: "form-control form-control-sm", disabled: true })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsx)("small", { className: "form-label", children: "App Version:" }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: getAppVersion(), className: "form-control form-control-sm", disabled: true })] })] }));
146
150
  };
147
151
  const PackagesRootDirectory = () => {
148
152
  return ((0, jsx_runtime_1.jsxs)("div", { className: "mt-3", children: [(0, jsx_runtime_1.jsxs)("small", { children: ["Packages Directory:", (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { markdownContent: `Changing this will not effect existing packages.` })] }), (0, jsx_runtime_1.jsx)(input_1.Input, { value: peers_sdk_1.packagesRootDir, className: "form-control" })] }));
@@ -2,5 +2,6 @@ interface WelcomeModalProps {
2
2
  colorMode: string;
3
3
  onClose: () => void;
4
4
  }
5
+ /** First-run profile dialog for naming the user and current device. */
5
6
  export declare function WelcomeModal({ colorMode, onClose }: WelcomeModalProps): import("react/jsx-runtime").JSX.Element | null;
6
7
  export {};
@@ -15,6 +15,7 @@ async function tryRegisterPeersServicesAfterWelcome() {
15
15
  console.warn("Peers services registration after welcome modal:", err);
16
16
  }
17
17
  }
18
+ /** First-run profile dialog for naming the user and current device. */
18
19
  function WelcomeModal({ colorMode, onClose }) {
19
20
  const [displayName, setDisplayName] = (0, react_1.useState)("");
20
21
  const [deviceName, setDeviceName] = (0, react_1.useState)("");
@@ -27,7 +28,7 @@ function WelcomeModal({ colorMode, onClose }) {
27
28
  // Pre-populate with existing values if any
28
29
  (0, react_1.useEffect)(() => {
29
30
  if (me?.name) {
30
- setDisplayName(me.name);
31
+ setDisplayName(me.name.slice(0, peers_sdk_1.DISPLAY_NAME_MAX_LENGTH));
31
32
  }
32
33
  }, [me?.name]);
33
34
  (0, react_1.useEffect)(() => {
@@ -38,7 +39,7 @@ function WelcomeModal({ colorMode, onClose }) {
38
39
  const userContext = await (0, peers_sdk_1.getUserContext)();
39
40
  const device = await (0, peers_sdk_1.Devices)(userContext.userDataContext).get(deviceId);
40
41
  if (device?.name) {
41
- setDeviceName(device.name);
42
+ setDeviceName(device.name.slice(0, peers_sdk_1.DISPLAY_NAME_MAX_LENGTH));
42
43
  }
43
44
  }
44
45
  catch (err) {
@@ -115,16 +116,16 @@ function WelcomeModal({ colorMode, onClose }) {
115
116
  overflow: "hidden",
116
117
  }, children: [(0, jsx_runtime_1.jsxs)("div", { className: "p-4 text-center", style: {
117
118
  borderBottom: `1px solid ${isDark ? "#495057" : "#dee2e6"}`,
118
- }, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-person-circle text-primary d-block mb-3", style: { fontSize: "48px" } }), (0, jsx_runtime_1.jsx)("h4", { className: "mb-2", children: "Welcome to Peers!" }), (0, jsx_runtime_1.jsx)("p", { className: `mb-0 ${isDark ? "text-light opacity-75" : "text-muted"}`, style: { fontSize: "14px" }, children: "Let's personalize your experience. You can change these anytime in Settings." })] }), (0, jsx_runtime_1.jsxs)("div", { className: "p-4", children: [error && ((0, jsx_runtime_1.jsxs)("div", { className: "alert alert-danger py-2 px-3 mb-3", style: { fontSize: "14px" }, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-exclamation-triangle me-2" }), error] })), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("label", { className: "form-label fw-semibold mb-1", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-person me-2" }), "Display Name"] }), (0, jsx_runtime_1.jsx)("input", { type: "text", className: `form-control ${isDark ? "bg-dark text-light border-secondary" : ""}`, placeholder: "How should others see you?", value: displayName, onChange: (e) => {
119
+ }, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-person-circle text-primary d-block mb-3", style: { fontSize: "48px" } }), (0, jsx_runtime_1.jsx)("h4", { className: "mb-2", children: "Welcome to Peers!" }), (0, jsx_runtime_1.jsx)("p", { className: `mb-0 ${isDark ? "text-light opacity-75" : "text-muted"}`, style: { fontSize: "14px" }, children: "Let's personalize your experience. You can change these anytime in Settings." })] }), (0, jsx_runtime_1.jsxs)("div", { className: "p-4", children: [error && ((0, jsx_runtime_1.jsxs)("div", { className: "alert alert-danger py-2 px-3 mb-3", style: { fontSize: "14px" }, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-exclamation-triangle me-2" }), error] })), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("label", { className: "form-label fw-semibold mb-1", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-person me-2" }), "Display Name"] }), (0, jsx_runtime_1.jsx)("input", { type: "text", className: `form-control ${isDark ? "bg-dark text-light border-secondary" : ""}`, maxLength: peers_sdk_1.DISPLAY_NAME_MAX_LENGTH, placeholder: "How should others see you?", value: displayName, onChange: (e) => {
119
120
  setDisplayName(e.target.value);
120
121
  setError(null);
121
- }, onKeyDown: handleKeyDown, disabled: isSaving, maxLength: 100, style: {
122
+ }, onKeyDown: handleKeyDown, disabled: isSaving, style: {
122
123
  fontSize: "14px",
123
124
  backgroundColor: isDark ? "#343a40" : "#ffffff",
124
- } }), (0, jsx_runtime_1.jsx)("small", { className: isDark ? "text-light opacity-50" : "text-muted", style: { fontSize: "11px" }, children: "This name will be visible to others when you connect" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("label", { className: "form-label fw-semibold mb-1", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-laptop me-2" }), "Device Name"] }), (0, jsx_runtime_1.jsx)("input", { type: "text", className: `form-control ${isDark ? "bg-dark text-light border-secondary" : ""}`, placeholder: "e.g., My Laptop, Work Computer", value: deviceName, onChange: (e) => {
125
+ } }), (0, jsx_runtime_1.jsx)("small", { className: isDark ? "text-light opacity-50" : "text-muted", style: { fontSize: "11px" }, children: "This name will be visible to others when you connect" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("label", { className: "form-label fw-semibold mb-1", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-laptop me-2" }), "Device Name"] }), (0, jsx_runtime_1.jsx)("input", { type: "text", className: `form-control ${isDark ? "bg-dark text-light border-secondary" : ""}`, maxLength: peers_sdk_1.DISPLAY_NAME_MAX_LENGTH, placeholder: "e.g., My Laptop, Work Computer", value: deviceName, onChange: (e) => {
125
126
  setDeviceName(e.target.value);
126
127
  setError(null);
127
- }, onKeyDown: handleKeyDown, disabled: isSaving, maxLength: 100, style: {
128
+ }, onKeyDown: handleKeyDown, disabled: isSaving, style: {
128
129
  fontSize: "14px",
129
130
  backgroundColor: isDark ? "#343a40" : "#ffffff",
130
131
  } }), (0, jsx_runtime_1.jsx)("small", { className: isDark ? "text-light opacity-50" : "text-muted", style: { fontSize: "11px" }, children: "Helps you identify this device when syncing across multiple devices" })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "p-3 d-flex justify-content-between align-items-center", style: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peers-app/peers-ui",
3
- "version": "0.20.2",
3
+ "version": "0.20.3",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/peers-app/peers-ui.git"
@@ -28,7 +28,7 @@
28
28
  "lint:fix": "biome check --write ."
29
29
  },
30
30
  "peerDependencies": {
31
- "@peers-app/peers-sdk": "^0.20.2",
31
+ "@peers-app/peers-sdk": "^0.20.3",
32
32
  "bootstrap": "^5.3.3",
33
33
  "react": "^18.0.0",
34
34
  "react-dom": "^18.0.0"
@@ -39,7 +39,7 @@
39
39
  "@babel/preset-env": "^7.24.5",
40
40
  "@babel/preset-react": "^7.24.1",
41
41
  "@babel/preset-typescript": "^7.27.1",
42
- "@peers-app/peers-sdk": "0.20.2",
42
+ "@peers-app/peers-sdk": "0.20.3",
43
43
  "@testing-library/dom": "^10.4.0",
44
44
  "@testing-library/jest-dom": "^6.6.3",
45
45
  "@testing-library/react": "^16.3.0",
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  autoUpdatePeersCore,
3
3
  Devices,
4
+ DISPLAY_NAME_MAX_LENGTH,
4
5
  getUserContext,
5
6
  type IDevice,
6
7
  packagesRootDir,
@@ -37,6 +38,7 @@ function getAppVersion() {
37
38
  return (globalThis as PeersGlobal).__PEERS_APP_VERSION__ || "unknown";
38
39
  }
39
40
 
41
+ /** Application settings organized by user, system, and developer concerns. */
40
42
  export const SettingsPage: React.FC = () => {
41
43
  return (
42
44
  <div className="container-fluid">
@@ -121,7 +123,7 @@ const ProfileSection: React.FC = () => {
121
123
  try {
122
124
  const userContext = await getUserContext();
123
125
  const device = await Devices(userContext.userDataContext).get(deviceId);
124
- deviceName(device?.name || "");
126
+ deviceName((device?.name || "").slice(0, DISPLAY_NAME_MAX_LENGTH));
125
127
  savedDeviceName(device?.name || "");
126
128
  } catch (err) {
127
129
  console.error("Error loading device name:", err);
@@ -137,7 +139,10 @@ const ProfileSection: React.FC = () => {
137
139
  // signAndSave call is serialized to JSON over the socket to the server.
138
140
  if (me?.q()) {
139
141
  const userContext = await getUserContext();
140
- await Users(userContext.userDataContext).signAndSave(me.toJS());
142
+ const updatedUser = me.toJS();
143
+ updatedUser.name = updatedUser.name.slice(0, DISPLAY_NAME_MAX_LENGTH);
144
+ await Users(userContext.userDataContext).signAndSave(updatedUser);
145
+ me.qs.name(updatedUser.name);
141
146
  me.q(0); // Reset change counter
142
147
  }
143
148
 
@@ -183,7 +188,12 @@ const ProfileSection: React.FC = () => {
183
188
 
184
189
  <div className="mb-3">
185
190
  <small className="form-label">Display Name:</small>
186
- <Input value={me.qs.name} className="form-control" placeholder="Enter your name" />
191
+ <Input
192
+ value={me.qs.name}
193
+ className="form-control"
194
+ maxLength={DISPLAY_NAME_MAX_LENGTH}
195
+ placeholder="Enter your name"
196
+ />
187
197
  </div>
188
198
 
189
199
  <div className="mb-3">
@@ -191,7 +201,12 @@ const ProfileSection: React.FC = () => {
191
201
  Device Name:
192
202
  <Tooltip markdownContent="Give this device a friendly name to identify it in your network." />
193
203
  </small>
194
- <Input value={deviceName} className="form-control" placeholder="e.g., My Laptop" />
204
+ <Input
205
+ value={deviceName}
206
+ className="form-control"
207
+ maxLength={DISPLAY_NAME_MAX_LENGTH}
208
+ placeholder="e.g., My Laptop"
209
+ />
195
210
  </div>
196
211
 
197
212
  <div className="mb-3">
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  Devices,
3
+ DISPLAY_NAME_MAX_LENGTH,
3
4
  getMe,
4
5
  getUserContext,
5
6
  hasShownWelcomeModal,
@@ -28,6 +29,7 @@ async function tryRegisterPeersServicesAfterWelcome(): Promise<void> {
28
29
  }
29
30
  }
30
31
 
32
+ /** First-run profile dialog for naming the user and current device. */
31
33
  export function WelcomeModal({ colorMode, onClose }: WelcomeModalProps) {
32
34
  const [displayName, setDisplayName] = useState("");
33
35
  const [deviceName, setDeviceName] = useState("");
@@ -43,7 +45,7 @@ export function WelcomeModal({ colorMode, onClose }: WelcomeModalProps) {
43
45
  // Pre-populate with existing values if any
44
46
  useEffect(() => {
45
47
  if (me?.name) {
46
- setDisplayName(me.name);
48
+ setDisplayName(me.name.slice(0, DISPLAY_NAME_MAX_LENGTH));
47
49
  }
48
50
  }, [me?.name]);
49
51
 
@@ -54,7 +56,7 @@ export function WelcomeModal({ colorMode, onClose }: WelcomeModalProps) {
54
56
  const userContext = await getUserContext();
55
57
  const device = await Devices(userContext.userDataContext).get(deviceId);
56
58
  if (device?.name) {
57
- setDeviceName(device.name);
59
+ setDeviceName(device.name.slice(0, DISPLAY_NAME_MAX_LENGTH));
58
60
  }
59
61
  } catch (err) {
60
62
  console.error("Error loading device name:", err);
@@ -182,6 +184,7 @@ export function WelcomeModal({ colorMode, onClose }: WelcomeModalProps) {
182
184
  <input
183
185
  type="text"
184
186
  className={`form-control ${isDark ? "bg-dark text-light border-secondary" : ""}`}
187
+ maxLength={DISPLAY_NAME_MAX_LENGTH}
185
188
  placeholder="How should others see you?"
186
189
  value={displayName}
187
190
  onChange={(e) => {
@@ -190,7 +193,6 @@ export function WelcomeModal({ colorMode, onClose }: WelcomeModalProps) {
190
193
  }}
191
194
  onKeyDown={handleKeyDown}
192
195
  disabled={isSaving}
193
- maxLength={100}
194
196
  style={{
195
197
  fontSize: "14px",
196
198
  backgroundColor: isDark ? "#343a40" : "#ffffff",
@@ -213,6 +215,7 @@ export function WelcomeModal({ colorMode, onClose }: WelcomeModalProps) {
213
215
  <input
214
216
  type="text"
215
217
  className={`form-control ${isDark ? "bg-dark text-light border-secondary" : ""}`}
218
+ maxLength={DISPLAY_NAME_MAX_LENGTH}
216
219
  placeholder="e.g., My Laptop, Work Computer"
217
220
  value={deviceName}
218
221
  onChange={(e) => {
@@ -221,7 +224,6 @@ export function WelcomeModal({ colorMode, onClose }: WelcomeModalProps) {
221
224
  }}
222
225
  onKeyDown={handleKeyDown}
223
226
  disabled={isSaving}
224
- maxLength={100}
225
227
  style={{
226
228
  fontSize: "14px",
227
229
  backgroundColor: isDark ? "#343a40" : "#ffffff",