roxxie-proxy-u-prod 0.1.0 → 0.2.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 (47) hide show
  1. package/README.md +62 -74
  2. package/dist/assets/{index-DcvPYWS3.js → index-CttvagWK.js} +164 -172
  3. package/dist/assets/index-EeRhLAof.css +1 -0
  4. package/dist/assets/{inject-BnVzMVpl.js → inject-xtH4w5z9.js} +8 -5
  5. package/dist/favicon.png +0 -0
  6. package/embed.js +2 -1
  7. package/examples/single-page.html +3 -1
  8. package/package.json +43 -41
  9. package/runtime/index.html +5 -4
  10. package/scripts/build.mjs +11 -5
  11. package/scripts/smoke.mjs +264 -73
  12. package/scripts/verify.mjs +100 -1
  13. package/source/packages/chrome/index.html +3 -2
  14. package/source/packages/chrome/public/favicon.png +0 -0
  15. package/source/packages/chrome/src/Tab/Tab.tsx +1 -1
  16. package/source/packages/chrome/src/assets/favicon.ts +1 -1
  17. package/source/packages/chrome/src/components/Button.tsx +11 -22
  18. package/source/packages/chrome/src/components/Checkbox.tsx +8 -12
  19. package/source/packages/chrome/src/components/Input.tsx +3 -4
  20. package/source/packages/chrome/src/components/StartScreen.tsx +34 -49
  21. package/source/packages/chrome/src/components/TopSiteButton.tsx +2 -2
  22. package/source/packages/chrome/src/pages/NewTabPage.tsx +42 -10
  23. package/source/packages/chrome/src/pages/SettingsPage.tsx +10 -11
  24. package/source/packages/chrome/src/runtime-base.ts +1 -1
  25. package/source/packages/chrome/src/services/SettingsService.ts +1 -1
  26. package/source/packages/chrome/src/style.css +7 -7
  27. package/source/packages/chrome/src/themes.ts +21 -21
  28. package/source/packages/inject/src/errorpage/errorpage.css +22 -35
  29. package/source/packages/inject/src/errorpage/errorpage.ts +6 -3
  30. package/source/packages/roxxie-transport/package.json +1 -1
  31. package/source/packages/roxxie-transport/src/connection.ts +1 -1
  32. package/source/packages/roxxie-transport/src/transport.ts +2 -2
  33. package/source/packages/scramjet/packages/core/dist/scramjet.js +1 -1
  34. package/source/packages/scramjet/packages/core/dist/scramjet.mjs +1 -1
  35. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.js +1 -1
  36. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.mjs +1 -1
  37. package/source/packages/tracker-protocol/package.json +1 -1
  38. package/source/packages/tracker-protocol/src/index.ts +34 -10
  39. package/source/pnpm-lock.yaml +4 -1
  40. package/standalone.html +27 -0
  41. package/dist/assets/index-BdRlQ7d_.css +0 -1
  42. package/dist/icon.png +0 -0
  43. package/dist/roxxie-icon.svg +0 -12
  44. package/source/packages/chrome/public/icon.png +0 -0
  45. package/source/packages/chrome/public/roxxie-icon.svg +0 -12
  46. package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js +0 -23
  47. package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js.map +0 -1
@@ -119,31 +119,31 @@ export const THEMES: readonly ThemeDefinition[] = [
119
119
  },
120
120
  {
121
121
  id: "dark",
122
- name: "Default Dark",
122
+ name: "EDUrocks Dark",
123
123
  appearance: "dark",
124
- description: "The default dark theme for Roxxie Proxy U.",
124
+ description: "Roxxie's flat dark theme based on EDUrocks.",
125
125
  preview: {
126
- toolbar: "#1f2429",
127
- field: "#131719",
128
- text: "#eaf2f7",
129
- accent: "#5bb4f4",
126
+ toolbar: "#222230",
127
+ field: "#11111b",
128
+ text: "#ebeff5",
129
+ accent: "#eb458b",
130
130
  },
131
131
  tokens: {
132
- frame: "#131719",
133
- toolbar: "#1f2429",
134
- toolbar_text: "#eaf2f7",
135
- tab_background_text: "#eaf2f7",
136
- toolbar_field: "#131719",
137
- toolbar_field_text: "#eaf2f7",
138
- tab_line: "#5bb4f4",
139
- popup: "#1a1f23",
140
- popup_border: "#3c4046",
141
- popup_text: "#eaf2f7",
142
- icons: "#eaf2f7",
143
- ntp_background: "#0c0f13",
144
- ntp_text: "#eaf2f7",
145
- toolbar_top_separator: "#131719",
146
- tab_loading: "#5bb4f4",
132
+ frame: "#11111b",
133
+ toolbar: "#222230",
134
+ toolbar_text: "#ebeff5",
135
+ tab_background_text: "#ebeff5",
136
+ toolbar_field: "#11111b",
137
+ toolbar_field_text: "#ebeff5",
138
+ tab_line: "#eb458b",
139
+ popup: "#222230",
140
+ popup_border: "#4f526b",
141
+ popup_text: "#ebeff5",
142
+ icons: "#b2bdcb",
143
+ ntp_background: "#11111b",
144
+ ntp_text: "#ebeff5",
145
+ toolbar_top_separator: "#4f526b",
146
+ tab_loading: "#eb458b",
147
147
  },
148
148
  },
149
149
  {
@@ -1,10 +1,13 @@
1
1
  :root {
2
2
  /* Fallbacks from themes.ts DEFAULT_THEME_ID (dark) */
3
- --bg: #0c0f13;
4
- --text: #eaf2f7;
5
- --toolbar_field: #131719;
6
- --toolbar_field_text: #eaf2f7;
7
- --tab_line: #5bb4f4;
3
+ --bg: #11111b;
4
+ --text: #ebeff5;
5
+ --toolbar_field: #222230;
6
+ --toolbar_field_text: #ebeff5;
7
+ --tab_line: #eb458b;
8
+ --border: #4f526b;
9
+ --button-text: #11111b;
10
+ --hover: #383a4c;
8
11
 
9
12
  /* Local derived utility tokens used by error page + buttons */
10
13
  --radius-xs: 3px;
@@ -25,10 +28,6 @@
25
28
  --text-20: color-mix(in srgb, var(--text) 20%, transparent);
26
29
  --text-40: color-mix(in srgb, var(--text) 40%, transparent);
27
30
 
28
- --accent-shade-5: color-mix(in srgb, var(--tab_line) 95%, black);
29
- --accent-shade-10: color-mix(in srgb, var(--tab_line) 90%, black);
30
- --accent-shade-20: color-mix(in srgb, var(--tab_line) 80%, black);
31
- --accent-shade-25: color-mix(in srgb, var(--tab_line) 75%, black);
32
31
  }
33
32
 
34
33
  html,
@@ -55,8 +54,8 @@ body {
55
54
  display: flex;
56
55
  gap: 24px;
57
56
  align-items: flex-start;
58
- background: color-mix(in srgb, var(--toolbar_field) 55%, transparent);
59
- border: 1px solid var(--text-15);
57
+ background: var(--toolbar_field);
58
+ border: 1px solid var(--border);
60
59
  border-radius: var(--radius-xl);
61
60
  padding: 24px;
62
61
  box-sizing: border-box;
@@ -138,7 +137,7 @@ body {
138
137
  .btn {
139
138
  color: inherit;
140
139
  background: var(--toolbar_field);
141
- border: 1px solid var(--text-20);
140
+ border: 1px solid var(--border);
142
141
  border-radius: var(--radius-md);
143
142
  padding: 0.5em 1em;
144
143
  font-size: 0.9em;
@@ -148,36 +147,24 @@ body {
148
147
  }
149
148
 
150
149
  .btn:hover {
151
- background: var(--text-10);
152
- background-image: radial-gradient(
153
- 70% 80% at 50% 100%,
154
- var(--text-8),
155
- var(--text-5)
156
- );
150
+ background: var(--hover);
157
151
  }
158
152
 
159
153
  .btn-primary {
160
- background-color: var(--tab_line);
161
- background-image: radial-gradient(
162
- 70% 80% at 50% 100%,
163
- var(--tab_line),
164
- var(--accent-shade-20)
165
- );
166
- box-shadow: inset 0px 0.05em 0.025em rgb(255 255 255 / 30%);
167
- text-shadow: 0 0.055em 0.05em var(--accent-shade-20);
168
- color: white;
169
- font-weight: 500;
154
+ background: var(--tab_line);
155
+ color: var(--button-text);
156
+ font-weight: 650;
170
157
  border-color: var(--tab_line);
171
158
  }
172
159
 
173
160
  .btn-primary:hover {
174
- background-color: var(--accent-shade-10);
175
- background-image: radial-gradient(
176
- 70% 80% at 50% 100%,
177
- var(--accent-shade-5),
178
- var(--accent-shade-25)
179
- );
180
- filter: saturate(1.1);
161
+ background: color-mix(in srgb, var(--tab_line) 92%, black);
162
+ border-color: color-mix(in srgb, var(--tab_line) 92%, black);
163
+ }
164
+
165
+ .btn:focus-visible {
166
+ outline: 2px solid var(--tab_line);
167
+ outline-offset: 2px;
181
168
  }
182
169
 
183
170
  .btn:disabled,
@@ -10,10 +10,13 @@ export function applyTheme(theme: ThemeDefinition) {
10
10
  --font: "Inter", system-ui, sans-serif;
11
11
  --bg: ${theme.tokens.ntp_background};
12
12
  --text: ${theme.tokens.ntp_text};
13
- --muted: color-mix(in srgb, ${theme.tokens.ntp_text} 55%, transparent);
14
- --accent: ${theme.tokens.tab_line};
15
- --button-bg: ${theme.tokens.tab_line};
13
+ --muted: ${theme.tokens.icons};
14
+ --toolbar_field: ${theme.tokens.toolbar_field};
15
+ --toolbar_field_text: ${theme.tokens.toolbar_field_text};
16
+ --tab_line: ${theme.tokens.tab_line};
17
+ --border: ${theme.tokens.popup_border};
16
18
  --button-text: ${theme.tokens.ntp_background};
19
+ --hover: color-mix(in srgb, ${theme.tokens.toolbar_field} 72%, ${theme.tokens.ntp_text});
17
20
  }`;
18
21
  }
19
22
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roxxie-transports",
3
- "version": "6.0.0",
3
+ "version": "6.0.1",
4
4
  "description": "Tracker-discovered WebRTC transport for Roxxie Proxy U",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -541,7 +541,7 @@ export class RoxxieConnection {
541
541
  frame.operation !== S2CRequestTypes.HTTPResponseChunk
542
542
  ) {
543
543
  throw new Error(
544
- `Node sent invalid operation for canceled HTTP sequence`
544
+ "Node sent invalid operation for canceled HTTP sequence"
545
545
  );
546
546
  }
547
547
  } else {
@@ -250,8 +250,8 @@ export class RoxxieProxyTransport implements ProxyTransport {
250
250
  .slice(0, 3)
251
251
  .sort(
252
252
  (left, right) =>
253
- left.utilization - right.utilization ||
254
- left.activeSessions - right.activeSessions
253
+ left.activeSessions - right.activeSessions ||
254
+ left.utilization - right.utilization
255
255
  );
256
256
  const compatible = discovered.filter(
257
257
  (candidate) => candidate.protocolVersion === PROTOCOL_VERSION
@@ -13534,7 +13534,7 @@ __webpack_require__.d(__webpack_exports__, {
13534
13534
  const versionInfo = {
13535
13535
  version: "2.0.67-alpha.2",
13536
13536
  build: "e3005a3b",
13537
- date: "2026-07-25T01:47:34.205Z"
13537
+ date: "2026-07-27T22:03:54.891Z"
13538
13538
  };
13539
13539
  const defaultConfig = {
13540
13540
  globals: {
@@ -13533,7 +13533,7 @@ __webpack_require__.d(__webpack_exports__, {
13533
13533
  const versionInfo = {
13534
13534
  version: "2.0.67-alpha.2",
13535
13535
  build: "e3005a3b",
13536
- date: "2026-07-25T01:47:34.219Z"
13536
+ date: "2026-07-27T22:03:54.938Z"
13537
13537
  };
13538
13538
  const defaultConfig = {
13539
13539
  globals: {
@@ -13534,7 +13534,7 @@ __webpack_require__.d(__webpack_exports__, {
13534
13534
  const versionInfo = {
13535
13535
  version: "2.0.67-alpha.2",
13536
13536
  build: "e3005a3b",
13537
- date: "2026-07-25T01:47:34.215Z"
13537
+ date: "2026-07-27T22:03:54.921Z"
13538
13538
  };
13539
13539
  const defaultConfig = {
13540
13540
  globals: {
@@ -13533,7 +13533,7 @@ __webpack_require__.d(__webpack_exports__, {
13533
13533
  const versionInfo = {
13534
13534
  version: "2.0.67-alpha.2",
13535
13535
  build: "e3005a3b",
13536
- date: "2026-07-25T01:47:34.226Z"
13536
+ date: "2026-07-27T22:03:54.961Z"
13537
13537
  };
13538
13538
  const defaultConfig = {
13539
13539
  globals: {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roxxie-transports-tracker-protocol",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Browser-safe control-plane contracts for the Roxxie tracker, nodes, and browsers",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -37,7 +37,16 @@ export type NodeLifecycleState =
37
37
  | "revoked";
38
38
 
39
39
  export type NodeAvailability = "online" | "unhealthy" | "offline";
40
- export type NodeCredentialKind = "enrollment" | "pending" | "approved";
40
+ /**
41
+ * `registration` is a node-generated bootstrap secret used for public
42
+ * admission. `enrollment` remains accepted for rolling compatibility with
43
+ * older, administrator-token-based nodes.
44
+ */
45
+ export type NodeCredentialKind =
46
+ | "registration"
47
+ | "enrollment"
48
+ | "pending"
49
+ | "approved";
41
50
 
42
51
  export interface SessionDescriptionJSON {
43
52
  type: "offer" | "answer" | "pranswer" | "rollback";
@@ -77,12 +86,17 @@ export interface NodeMetadata {
77
86
  nodeVersion: string;
78
87
  platform: string;
79
88
  arch: string;
89
+ /**
90
+ * Rolling-compatibility load scale. This field is not a concurrent-session
91
+ * limit and must not be used to reject a connection.
92
+ */
80
93
  maxSessions: number;
81
94
  protocolVersion: string;
82
95
  }
83
96
 
84
97
  export interface NodeMetrics {
85
98
  activeSessions: number;
99
+ /** @see NodeMetadata.maxSessions */
86
100
  maxSessions: number;
87
101
  uptimeSeconds: number;
88
102
  }
@@ -91,6 +105,7 @@ export interface CandidateNode {
91
105
  nodeId: string;
92
106
  name: string;
93
107
  activeSessions: number;
108
+ /** @see NodeMetadata.maxSessions */
94
109
  maxSessions: number;
95
110
  utilization: number;
96
111
  protocolVersion: string;
@@ -291,6 +306,16 @@ function requestId(value: unknown): string {
291
306
  return result;
292
307
  }
293
308
 
309
+ function registrationCredential(value: unknown): string {
310
+ const result = stringValue(value, "credential", 43);
311
+ if (!/^[A-Za-z0-9_-]{43}$/u.test(result)) {
312
+ throw new TrackerProtocolError(
313
+ "registration credential must be a 32-byte base64url secret"
314
+ );
315
+ }
316
+ return result;
317
+ }
318
+
294
319
  function assertMessageBase(value: unknown): Record<string, unknown> {
295
320
  const message = objectValue(value, "message");
296
321
  stringValue(message.type, "type", 64);
@@ -425,13 +450,17 @@ export function assertNodeClientMessage(
425
450
  );
426
451
  }
427
452
  if (
428
- !(["enrollment", "pending", "approved"] as unknown[]).includes(
429
- message.credentialKind
430
- )
453
+ !(
454
+ ["registration", "enrollment", "pending", "approved"] as unknown[]
455
+ ).includes(message.credentialKind)
431
456
  ) {
432
457
  throw new TrackerProtocolError("credentialKind is invalid");
433
458
  }
434
- stringValue(message.credential, "credential", 512);
459
+ if (message.credentialKind === "registration") {
460
+ registrationCredential(message.credential);
461
+ } else {
462
+ stringValue(message.credential, "credential", 512);
463
+ }
435
464
  const metadata = objectValue(message.metadata, "metadata");
436
465
  assertNodeId(metadata.nodeId, "metadata.nodeId");
437
466
  stringValue(
@@ -483,11 +512,6 @@ export function assertNodeClientMessage(
483
512
  if ((metrics.maxSessions as number) < 1) {
484
513
  throw new TrackerProtocolError("maxSessions must be at least one");
485
514
  }
486
- if (
487
- (metrics.activeSessions as number) > (metrics.maxSessions as number)
488
- ) {
489
- throw new TrackerProtocolError("activeSessions exceeds maxSessions");
490
- }
491
515
  return;
492
516
  }
493
517
  case "node.webrtc.answer": {
@@ -341,7 +341,7 @@ importers:
341
341
  specifier: 6.0.0
342
342
  version: link:../adrift-protocol
343
343
  roxxie-transports-tracker-protocol:
344
- specifier: 1.0.0
344
+ specifier: 1.2.0
345
345
  version: link:../tracker-protocol
346
346
  ws:
347
347
  specifier: 8.21.1
@@ -368,6 +368,9 @@ importers:
368
368
  '@roamhq/wrtc':
369
369
  specifier: 0.10.0
370
370
  version: 0.10.0
371
+ ipaddr.js:
372
+ specifier: 2.4.0
373
+ version: 2.4.0
371
374
  roxxie-transports:
372
375
  specifier: workspace:*
373
376
  version: link:../roxxie-transport
@@ -0,0 +1,27 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
6
+ <title>Roxxie Proxy U</title>
7
+ <style>
8
+ html,
9
+ body,
10
+ #roxxie-browser {
11
+ width: 100%;
12
+ height: 100%;
13
+ margin: 0;
14
+ }
15
+ </style>
16
+ </head>
17
+ <body>
18
+ <div id="roxxie-browser"></div>
19
+ <script
20
+ defer
21
+ src="https://cdn.jsdelivr.net/npm/roxxie-proxy-u-prod@0.2.2/embed.js"
22
+ integrity="sha384-3QVF5CQiWk0SKqCDSEAoupN0KXK0bxo9qaZeS5Tj8/8mO8J719dv+fvmrqmdthH2"
23
+ crossorigin="anonymous"
24
+ data-roxxie-target="#roxxie-browser"
25
+ ></script>
26
+ </body>
27
+ </html>
@@ -1 +0,0 @@
1
- html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}table{border-collapse:collapse;border-spacing:0}body,html,#app,#main{width:100vw;height:100vh;margin:0;padding:0;overflow:hidden;display:flex;flex-direction:column}#app.vertical-tabs{flex-direction:row}body.sidebar-right #app.vertical-tabs{flex-direction:row-reverse}#app.layout-bottom{flex-direction:column-reverse}iframe{height:100%}html,body{font-family:var(--font);color:var(--toolbar_text);background:var(--toolbar);accent-color:var(--tab_line);color-scheme:dark;--text-5: color-mix(in oklab, var(--toolbar_text) 5%, transparent);--text-8: color-mix(in oklab, var(--toolbar_text) 8%, transparent);--text-10: color-mix(in oklab, var(--toolbar_text) 10%, transparent);--text-15: color-mix(in oklab, var(--toolbar_text) 15%, transparent);--text-20: color-mix(in oklab, var(--toolbar_text) 20%, transparent);--text-30: color-mix(in oklab, var(--toolbar_text) 30%, transparent);--text-35: color-mix(in oklab, var(--toolbar_text) 35%, transparent);--text-40: color-mix(in oklab, var(--toolbar_text) 40%, transparent);--text-50: color-mix(in oklab, var(--toolbar_text) 50%, transparent);--text-60: color-mix(in oklab, var(--toolbar_text) 60%, transparent);--text-65: color-mix(in oklab, var(--toolbar_text) 65%, transparent);--text-70: color-mix(in oklab, var(--toolbar_text) 70%, transparent);--ntp-text-5: color-mix(in oklab, var(--ntp_text) 5%, transparent);--ntp-text-8: color-mix(in oklab, var(--ntp_text) 8%, transparent);--ntp-text-10: color-mix(in oklab, var(--ntp_text) 10%, transparent);--ntp-text-15: color-mix(in oklab, var(--ntp_text) 15%, transparent);--ntp-text-20: color-mix(in oklab, var(--ntp_text) 20%, transparent);--ntp-text-60: color-mix(in oklab, var(--ntp_text) 60%, transparent);--ntp-text-70: color-mix(in oklab, var(--ntp_text) 70%, transparent);--field-text-50: color-mix( in oklab, var(--toolbar_field_text) 50%, transparent );--field-text-60: color-mix( in oklab, var(--toolbar_field_text) 60%, transparent );--accent-75: color-mix(in oklab, var(--tab_line) 75%, transparent);--accent-50: color-mix(in oklab, var(--tab_line) 50%, transparent);--accent-40: color-mix(in oklab, var(--tab_line) 40%, transparent);--accent-30: color-mix(in oklab, var(--tab_line) 30%, transparent);--accent-25: color-mix(in oklab, var(--tab_line) 25%, transparent);--accent-20: color-mix(in oklab, var(--tab_line) 20%, transparent);--accent-15: color-mix(in oklab, var(--tab_line) 15%, transparent);--accent-10: color-mix(in oklab, var(--tab_line) 10%, transparent);--accent-tint-10: color-mix(in oklab, white 10%, var(--tab_line));--accent-tint-20: color-mix(in oklab, white 20%, var(--tab_line));--accent-tint-35: color-mix(in oklab, white 35%, var(--tab_line));--accent-tint-50: color-mix(in oklab, white 50%, var(--tab_line));--accent-shade-5: color-mix(in oklab, black 5%, var(--tab_line));--accent-shade-10: color-mix(in oklab, black 10%, var(--tab_line));--accent-shade-15: color-mix(in oklab, black 15%, var(--tab_line));--accent-shade-20: color-mix(in oklab, black 20%, var(--tab_line));--accent-shade-25: color-mix(in oklab, black 25%, var(--tab_line));--accent-shade-30: color-mix(in oklab, black 30%, var(--tab_line));--accent-shade-40: color-mix(in oklab, black 40%, var(--tab_line));--accent-shade-50: color-mix(in oklab, black 50%, var(--tab_line));--radius-xs: 3px;--radius-sm: 4px;--radius-md: 5px;--radius-lg: 6px;--radius-xl: 8px;--space-xxs: .15rem;--space-xs: .225rem;--space-sm: .375rem;--space-md: .6rem;--space-lg: .75rem;--space-xl: .95rem;--space-xxl: 1.25rem;--tab-height: 2rem;--omnibar-height: 2.5rem}body.ui-compact{--radius-xs: 2px;--radius-sm: 3px;--radius-md: 4px;--radius-lg: 5px;--radius-xl: 6px;--space-xxs: .1rem;--space-xs: .175rem;--space-sm: .25rem;--space-md: .35rem;--space-lg: .6rem;--space-xl: .75rem;--space-xxl: 1rem;--tab-height: 1.75rem;--omnibar-height: 2.25rem}body.ui-touch{--radius-xs: 5px;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 10px;--radius-xl: 12px;--space-xxs: .175rem;--space-xs: .25rem;--space-sm: .5rem;--space-md: .75rem;--space-lg: 1rem;--space-xl: 1.25rem;--space-xxl: 1.5rem;--tab-height: 2.2rem;--omnibar-height: 2.8rem}::selection{background:var(--accent-30)}body.light-mode{color-scheme:light}:root{--font: "Inter", system-ui, sans-serif;font-family:var(--font);--toolbarbutton-hover-background: color-mix( in srgb, currentColor 17%, transparent );--toolbarbutton-active-background: color-mix( in srgb, currentColor 30%, transparent )}body.full-vertical-tabs{--omnibar-height: 2.25rem}body.full-vertical-tabs.ui-compact{--omnibar-height: 2rem}body.full-vertical-tabs.ui-touch{--omnibar-height: 2.5rem}*{box-sizing:border-box}h1{font-size:2em}button{border:none;background:none;color:var(--toolbar_text);padding:0;cursor:pointer;font-family:var(--font)}#tabstrip #hovercard{transition:opacity .2s ease .7s,scale .2s cubic-bezier(.43,.91,.34,1.3) .7s,visibility 0s,left .2s cubic-bezier(.33,.22,.18,1.17);scale:1}#tabstrip:is(:has(:active),:not(:has(:hover:not(.extra,.extra *)))) #hovercard{visibility:hidden;opacity:0;scale:.8;transition:none}#tabstrip .extra.top:has(>.pinned-tabs.empty){padding:0}
package/dist/icon.png DELETED
Binary file
@@ -1,12 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Roxxie Proxy U">
2
- <defs>
3
- <linearGradient id="g" x1="8" y1="5" x2="57" y2="59" gradientUnits="userSpaceOnUse">
4
- <stop stop-color="#7c3aed"/>
5
- <stop offset="0.52" stop-color="#2563eb"/>
6
- <stop offset="1" stop-color="#06b6d4"/>
7
- </linearGradient>
8
- </defs>
9
- <rect x="3" y="3" width="58" height="58" rx="15" fill="url(#g)"/>
10
- <path d="M16 46V17h13.2c7.3 0 11.9 3.9 11.9 10.1 0 4.3-2.4 7.6-6.4 9.1L43 46h-8.2l-7.1-8.7h-4.4V46H16Zm7.3-15h5.4c3.2 0 5-1.4 5-3.9 0-2.6-1.8-3.9-5-3.9h-5.4V31Z" fill="white"/>
11
- <path d="M45.5 17v17.1c0 4.5 1.4 6.5 4.5 6.5 1.1 0 2-.2 2.8-.7v6.2c-1.4.6-3 .9-4.7.9-6.5 0-9.8-4.1-9.8-12.3V17h7.2Z" fill="white" fill-opacity=".78"/>
12
- </svg>
@@ -1,12 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Roxxie Proxy U">
2
- <defs>
3
- <linearGradient id="g" x1="8" y1="5" x2="57" y2="59" gradientUnits="userSpaceOnUse">
4
- <stop stop-color="#7c3aed"/>
5
- <stop offset="0.52" stop-color="#2563eb"/>
6
- <stop offset="1" stop-color="#06b6d4"/>
7
- </linearGradient>
8
- </defs>
9
- <rect x="3" y="3" width="58" height="58" rx="15" fill="url(#g)"/>
10
- <path d="M16 46V17h13.2c7.3 0 11.9 3.9 11.9 10.1 0 4.3-2.4 7.6-6.4 9.1L43 46h-8.2l-7.1-8.7h-4.4V46H16Zm7.3-15h5.4c3.2 0 5-1.4 5-3.9 0-2.6-1.8-3.9-5-3.9h-5.4V31Z" fill="white"/>
11
- <path d="M45.5 17v17.1c0 4.5 1.4 6.5 4.5 6.5 1.1 0 2-.2 2.8-.7v6.2c-1.4.6-3 .9-4.7.9-6.5 0-9.8-4.1-9.8-12.3V17h7.2Z" fill="white" fill-opacity=".78"/>
12
- </svg>