From 3027bb9037b3667b3df7d4776284d366928699da Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Mon, 23 Jan 2023 22:22:30 -0500 Subject: [PATCH 01/25] Bump minimum safari/ios version to 15.4. --- Nostore.xcodeproj/project.pbxproj | 4 +- Shared (Extension)/Resources/manifest.json | 46 +++++++++++++--------- iOS (Extension)/Info.plist | 2 + macOS (Extension)/Info.plist | 2 + 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/Nostore.xcodeproj/project.pbxproj b/Nostore.xcodeproj/project.pbxproj index a53719e..bb8fb3a 100644 --- a/Nostore.xcodeproj/project.pbxproj +++ b/Nostore.xcodeproj/project.pbxproj @@ -805,7 +805,7 @@ INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -847,7 +847,7 @@ INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Shared (Extension)/Resources/manifest.json b/Shared (Extension)/Resources/manifest.json index 28ae599..ab8fdfc 100644 --- a/Shared (Extension)/Resources/manifest.json +++ b/Shared (Extension)/Resources/manifest.json @@ -1,11 +1,9 @@ { "manifest_version": 3, "default_locale": "en", - "name": "__MSG_extension_name__", "description": "__MSG_extension_description__", "version": "1.0", - "icons": { "48": "images/icon-48.png", "96": "images/icon-96.png", @@ -13,17 +11,20 @@ "256": "images/icon-256.png", "512": "images/icon-512.png" }, - "background": { "service_worker": "background.build.js", "type": "module" }, - - "content_scripts": [{ - "js": [ "content.build.js" ], - "matches": [ "" ] - }], - + "content_scripts": [ + { + "js": [ + "content.build.js" + ], + "matches": [ + "" + ] + } + ], "action": { "default_popup": "popup.html", "default_icon": { @@ -35,17 +36,26 @@ "72": "images/toolbar-72.png" } }, - - "permissions": [ "storage" ], - - "web_accessible_resources": [ - { - "resources": ["nostr.build.js", "popup.build.js"], - "matches": [""] - } + "permissions": [ + "storage" + ], + "web_accessible_resources": [ + { + "resources": [ + "nostr.build.js", + "popup.build.js" + ], + "matches": [ + "" + ] + } ], - "content_security_policy": { "extension_pages": "script-src 'self' 'unsafe-eval'" + }, + "browser_specific_settings": { + "safari": { + "strict_min_version": "15.4" + } } } diff --git a/iOS (Extension)/Info.plist b/iOS (Extension)/Info.plist index 9ee504d..56a3ef0 100644 --- a/iOS (Extension)/Info.plist +++ b/iOS (Extension)/Info.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + NSExtension NSExtensionPointIdentifier diff --git a/macOS (Extension)/Info.plist b/macOS (Extension)/Info.plist index 9ee504d..56a3ef0 100644 --- a/macOS (Extension)/Info.plist +++ b/macOS (Extension)/Info.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + NSExtension NSExtensionPointIdentifier From 7537109c920f163257ef33be8dc297040b3cf345 Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Mon, 23 Jan 2023 22:38:42 -0500 Subject: [PATCH 02/25] Basic setup for an options page. --- Nostore.xcodeproj/project.pbxproj | 24 +++++++++++++ Shared (Extension)/Resources/manifest.json | 5 ++- Shared (Extension)/Resources/options.css | 0 Shared (Extension)/Resources/options.html | 14 ++++++++ Shared (Extension)/Resources/options.js | 0 Shared (Extension)/Resources/popup.html | 1 + build.js | 42 ++++++++++++---------- 7 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 Shared (Extension)/Resources/options.css create mode 100644 Shared (Extension)/Resources/options.html create mode 100644 Shared (Extension)/Resources/options.js diff --git a/Nostore.xcodeproj/project.pbxproj b/Nostore.xcodeproj/project.pbxproj index bb8fb3a..359798a 100644 --- a/Nostore.xcodeproj/project.pbxproj +++ b/Nostore.xcodeproj/project.pbxproj @@ -71,6 +71,14 @@ 941B04342978CDF900CA291E /* Icon-16.png in Resources */ = {isa = PBXBuildFile; fileRef = 941B042F2978CDF900CA291E /* Icon-16.png */; }; 941B04352978CDF900CA291E /* Icon-64.png in Resources */ = {isa = PBXBuildFile; fileRef = 941B04302978CDF900CA291E /* Icon-64.png */; }; 941B04362978CDF900CA291E /* Icon-64.png in Resources */ = {isa = PBXBuildFile; fileRef = 941B04302978CDF900CA291E /* Icon-64.png */; }; + 948C69D9297F887600FB3574 /* options.html in Resources */ = {isa = PBXBuildFile; fileRef = 948C69D8297F887600FB3574 /* options.html */; }; + 948C69DA297F887600FB3574 /* options.html in Resources */ = {isa = PBXBuildFile; fileRef = 948C69D8297F887600FB3574 /* options.html */; }; + 948C69DD297F88A200FB3574 /* options.css in Resources */ = {isa = PBXBuildFile; fileRef = 948C69DB297F88A200FB3574 /* options.css */; }; + 948C69DE297F88A200FB3574 /* options.css in Resources */ = {isa = PBXBuildFile; fileRef = 948C69DB297F88A200FB3574 /* options.css */; }; + 948C69DF297F88A200FB3574 /* options.js in Resources */ = {isa = PBXBuildFile; fileRef = 948C69DC297F88A200FB3574 /* options.js */; }; + 948C69E0297F88A200FB3574 /* options.js in Resources */ = {isa = PBXBuildFile; fileRef = 948C69DC297F88A200FB3574 /* options.js */; }; + 948C69E2297F891F00FB3574 /* options.build.js in Resources */ = {isa = PBXBuildFile; fileRef = 948C69E1297F891F00FB3574 /* options.build.js */; }; + 948C69E3297F891F00FB3574 /* options.build.js in Resources */ = {isa = PBXBuildFile; fileRef = 948C69E1297F891F00FB3574 /* options.build.js */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -159,6 +167,10 @@ 941B042E2978CDF900CA291E /* Icon-32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-32.png"; sourceTree = ""; }; 941B042F2978CDF900CA291E /* Icon-16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-16.png"; sourceTree = ""; }; 941B04302978CDF900CA291E /* Icon-64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-64.png"; sourceTree = ""; }; + 948C69D8297F887600FB3574 /* options.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = options.html; sourceTree = ""; }; + 948C69DB297F88A200FB3574 /* options.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = options.css; sourceTree = ""; }; + 948C69DC297F88A200FB3574 /* options.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = options.js; sourceTree = ""; }; + 948C69E1297F891F00FB3574 /* options.build.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = options.build.js; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -240,6 +252,10 @@ 941B03A2296FA90400CA291E /* Resources */ = { isa = PBXGroup; children = ( + 948C69E1297F891F00FB3574 /* options.build.js */, + 948C69DB297F88A200FB3574 /* options.css */, + 948C69DC297F88A200FB3574 /* options.js */, + 948C69D8297F887600FB3574 /* options.html */, 941B04162971138F00CA291E /* content.build.js */, 941B04152971138F00CA291E /* nostr.build.js */, 941B04172971138F00CA291E /* popup.build.js */, @@ -475,7 +491,10 @@ buildActionMask = 2147483647; files = ( 941B0413297110F100CA291E /* background.build.js in Resources */, + 948C69DF297F88A200FB3574 /* options.js in Resources */, + 948C69DD297F88A200FB3574 /* options.css in Resources */, 941B03F2296FA90400CA291E /* background.js in Resources */, + 948C69E2297F891F00FB3574 /* options.build.js in Resources */, 941B03F8296FA90400CA291E /* popup.css in Resources */, 941B04292977A28700CA291E /* Icon-128.png in Resources */, 941B04182971138F00CA291E /* nostr.build.js in Resources */, @@ -489,6 +508,7 @@ 941B041C2971139000CA291E /* popup.build.js in Resources */, 941B03EC296FA90400CA291E /* _locales in Resources */, 941B04222977A25700CA291E /* Icon-512.png in Resources */, + 948C69D9297F887600FB3574 /* options.html in Resources */, 941B03F4296FA90400CA291E /* content.js in Resources */, 941B04262977A25700CA291E /* Icon-1024.png in Resources */, 941B04352978CDF900CA291E /* Icon-64.png in Resources */, @@ -503,7 +523,10 @@ buildActionMask = 2147483647; files = ( 941B0414297110F100CA291E /* background.build.js in Resources */, + 948C69E0297F88A200FB3574 /* options.js in Resources */, + 948C69DE297F88A200FB3574 /* options.css in Resources */, 941B03F3296FA90400CA291E /* background.js in Resources */, + 948C69E3297F891F00FB3574 /* options.build.js in Resources */, 941B03F9296FA90400CA291E /* popup.css in Resources */, 941B042A2977A28700CA291E /* Icon-128.png in Resources */, 941B04192971138F00CA291E /* nostr.build.js in Resources */, @@ -517,6 +540,7 @@ 941B041D2971139000CA291E /* popup.build.js in Resources */, 941B03ED296FA90400CA291E /* _locales in Resources */, 941B04232977A25700CA291E /* Icon-512.png in Resources */, + 948C69DA297F887600FB3574 /* options.html in Resources */, 941B03F5296FA90400CA291E /* content.js in Resources */, 941B04272977A25700CA291E /* Icon-1024.png in Resources */, 941B04362978CDF900CA291E /* Icon-64.png in Resources */, diff --git a/Shared (Extension)/Resources/manifest.json b/Shared (Extension)/Resources/manifest.json index ab8fdfc..1b3e341 100644 --- a/Shared (Extension)/Resources/manifest.json +++ b/Shared (Extension)/Resources/manifest.json @@ -36,6 +36,9 @@ "72": "images/toolbar-72.png" } }, + "options_ui": { + "page": "options.html" + }, "permissions": [ "storage" ], @@ -58,4 +61,4 @@ "strict_min_version": "15.4" } } -} +} \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.css b/Shared (Extension)/Resources/options.css new file mode 100644 index 0000000..e69de29 diff --git a/Shared (Extension)/Resources/options.html b/Shared (Extension)/Resources/options.html new file mode 100644 index 0000000..241916d --- /dev/null +++ b/Shared (Extension)/Resources/options.html @@ -0,0 +1,14 @@ + + + + + + + + + + +

Settings

+ + + \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.js b/Shared (Extension)/Resources/options.js new file mode 100644 index 0000000..e69de29 diff --git a/Shared (Extension)/Resources/popup.html b/Shared (Extension)/Resources/popup.html index ec938fc..1d23ddf 100644 --- a/Shared (Extension)/Resources/popup.html +++ b/Shared (Extension)/Resources/popup.html @@ -61,6 +61,7 @@
+
diff --git a/build.js b/build.js index b0af100..88acb28 100755 --- a/build.js +++ b/build.js @@ -1,21 +1,27 @@ #!/usr/bin/env node -let watch = process.argv[2] === 'watch' ? { - onRebuild(error, result) { - if (error) console.error('watch rebuild failed: ', error) - else console.log('watch rebuild succeeded: ', result) - } -} : false; +let watch = + process.argv[2] === 'watch' + ? { + onRebuild(error, result) { + if (error) console.error('watch rebuild failed: ', error); + else console.log('watch rebuild succeeded: ', result); + }, + } + : false; -require('esbuild').build({ - entryPoints: { - 'background.build': './Shared (Extension)/Resources/background.js', - 'content.build': './Shared (Extension)/Resources/content.js', - 'nostr.build': './Shared (Extension)/Resources/nostr.js', - 'popup.build': './Shared (Extension)/Resources/popup.js', - }, - outdir: './Shared (Extension)/Resources', - sourcemap: 'inline', - bundle: true, - watch -}).catch(() => process.exit(1)) \ No newline at end of file +require('esbuild') + .build({ + entryPoints: { + 'background.build': './Shared (Extension)/Resources/background.js', + 'content.build': './Shared (Extension)/Resources/content.js', + 'nostr.build': './Shared (Extension)/Resources/nostr.js', + 'popup.build': './Shared (Extension)/Resources/popup.js', + 'options.build': './Shared (Extension)/Resources/options.js', + }, + outdir: './Shared (Extension)/Resources', + sourcemap: 'inline', + bundle: true, + watch, + }) + .catch(() => process.exit(1)); From 25da1d0cab50e53a26b14f20205a012f82963553 Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Mon, 23 Jan 2023 23:03:02 -0500 Subject: [PATCH 03/25] Setting up tailwinds-css for the options page --- Nostore.xcodeproj/project.pbxproj | 6 + README.md | 3 +- Shared (Extension)/Resources/manifest.json | 6 +- .../Resources/options.build.css | 642 ++++++++++++++ Shared (Extension)/Resources/options.css | 3 + Shared (Extension)/Resources/options.html | 7 +- Shared (Extension)/Resources/options.js | 7 + package-lock.json | 792 +++++++++++++++++- package.json | 6 +- tailwind.config.js | 8 + 10 files changed, 1472 insertions(+), 8 deletions(-) create mode 100644 Shared (Extension)/Resources/options.build.css create mode 100644 tailwind.config.js diff --git a/Nostore.xcodeproj/project.pbxproj b/Nostore.xcodeproj/project.pbxproj index 359798a..1075dea 100644 --- a/Nostore.xcodeproj/project.pbxproj +++ b/Nostore.xcodeproj/project.pbxproj @@ -79,6 +79,8 @@ 948C69E0297F88A200FB3574 /* options.js in Resources */ = {isa = PBXBuildFile; fileRef = 948C69DC297F88A200FB3574 /* options.js */; }; 948C69E2297F891F00FB3574 /* options.build.js in Resources */ = {isa = PBXBuildFile; fileRef = 948C69E1297F891F00FB3574 /* options.build.js */; }; 948C69E3297F891F00FB3574 /* options.build.js in Resources */ = {isa = PBXBuildFile; fileRef = 948C69E1297F891F00FB3574 /* options.build.js */; }; + 948C69E5297F8BA600FB3574 /* options.build.css in Resources */ = {isa = PBXBuildFile; fileRef = 948C69E4297F8BA600FB3574 /* options.build.css */; }; + 948C69E6297F8BA600FB3574 /* options.build.css in Resources */ = {isa = PBXBuildFile; fileRef = 948C69E4297F8BA600FB3574 /* options.build.css */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -171,6 +173,7 @@ 948C69DB297F88A200FB3574 /* options.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = options.css; sourceTree = ""; }; 948C69DC297F88A200FB3574 /* options.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = options.js; sourceTree = ""; }; 948C69E1297F891F00FB3574 /* options.build.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = options.build.js; sourceTree = ""; }; + 948C69E4297F8BA600FB3574 /* options.build.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = options.build.css; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -252,6 +255,7 @@ 941B03A2296FA90400CA291E /* Resources */ = { isa = PBXGroup; children = ( + 948C69E4297F8BA600FB3574 /* options.build.css */, 948C69E1297F891F00FB3574 /* options.build.js */, 948C69DB297F88A200FB3574 /* options.css */, 948C69DC297F88A200FB3574 /* options.js */, @@ -508,6 +512,7 @@ 941B041C2971139000CA291E /* popup.build.js in Resources */, 941B03EC296FA90400CA291E /* _locales in Resources */, 941B04222977A25700CA291E /* Icon-512.png in Resources */, + 948C69E5297F8BA600FB3574 /* options.build.css in Resources */, 948C69D9297F887600FB3574 /* options.html in Resources */, 941B03F4296FA90400CA291E /* content.js in Resources */, 941B04262977A25700CA291E /* Icon-1024.png in Resources */, @@ -540,6 +545,7 @@ 941B041D2971139000CA291E /* popup.build.js in Resources */, 941B03ED296FA90400CA291E /* _locales in Resources */, 941B04232977A25700CA291E /* Icon-512.png in Resources */, + 948C69E6297F8BA600FB3574 /* options.build.css in Resources */, 948C69DA297F887600FB3574 /* options.html in Resources */, 941B03F5296FA90400CA291E /* content.js in Resources */, 941B04272977A25700CA291E /* Icon-1024.png in Resources */, diff --git a/README.md b/README.md index c83a27f..2e4fbf8 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,8 @@ This extension does not collect any user data, or transmit any data over a netwo 2. Open project folder in terminal. 3. Run `npm install` to install the dependencies. 4. Run `npm run watch` to watch and build the necessary extension files. -5. After every rebuild, execute Run in XCode to deploy the latest changes to Safari. +5. Run `npm run watch-tailwind` to watch and build the pages with tailwinds CSS. +6. After every rebuild, execute Run in XCode to deploy the latest changes to Safari. If you do not see the Nostore extension in your Safari toolbar, you need to activate unsigned extensions and Nostore: diff --git a/Shared (Extension)/Resources/manifest.json b/Shared (Extension)/Resources/manifest.json index 1b3e341..ff1458f 100644 --- a/Shared (Extension)/Resources/manifest.json +++ b/Shared (Extension)/Resources/manifest.json @@ -46,7 +46,9 @@ { "resources": [ "nostr.build.js", - "popup.build.js" + "popup.build.js", + "options.build.js", + "options.build.css" ], "matches": [ "" @@ -61,4 +63,4 @@ "strict_min_version": "15.4" } } -} \ No newline at end of file +} diff --git a/Shared (Extension)/Resources/options.build.css b/Shared (Extension)/Resources/options.build.css new file mode 100644 index 0000000..7b8527a --- /dev/null +++ b/Shared (Extension)/Resources/options.build.css @@ -0,0 +1,642 @@ +/* +! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.visible { + visibility: visible; +} + +.collapse { + visibility: collapse; +} + +.static { + position: static; +} + +.isolate { + isolation: isolate; +} + +.block { + display: block; +} + +.inline { + display: inline; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.grow { + flex-grow: 1; +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.border { + border-width: 1px; +} + +.bg-fuchsia-400 { + --tw-bg-opacity: 1; + background-color: rgb(232 121 249 / var(--tw-bg-opacity)); +} + +.text-5xl { + font-size: 3rem; + line-height: 1; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-6xl { + font-size: 3.75rem; + line-height: 1; +} + +.font-bold { + font-weight: 700; +} + +.uppercase { + text-transform: uppercase; +} + +.lowercase { + text-transform: lowercase; +} + +.capitalize { + text-transform: capitalize; +} + +.text-green-500 { + --tw-text-opacity: 1; + color: rgb(34 197 94 / var(--tw-text-opacity)); +} + +.text-fuchsia-900 { + --tw-text-opacity: 1; + color: rgb(112 26 117 / var(--tw-text-opacity)); +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.ring { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.blur { + --tw-blur: blur(8px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.invert { + --tw-invert: invert(100%); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.css b/Shared (Extension)/Resources/options.css index e69de29..bd6213e 100644 --- a/Shared (Extension)/Resources/options.css +++ b/Shared (Extension)/Resources/options.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.html b/Shared (Extension)/Resources/options.html index 241916d..22851eb 100644 --- a/Shared (Extension)/Resources/options.html +++ b/Shared (Extension)/Resources/options.html @@ -4,11 +4,14 @@ + + - -

Settings

+ +

Settings

+

\ No newline at end of file diff --git a/Shared (Extension)/Resources/options.js b/Shared (Extension)/Resources/options.js index e69de29..47a21ec 100644 --- a/Shared (Extension)/Resources/options.js +++ b/Shared (Extension)/Resources/options.js @@ -0,0 +1,7 @@ +import Alpine from 'alpinejs'; + +Alpine.data('options', () => ({ + msg: 'Hello world!', +})); + +Alpine.start(); diff --git a/package-lock.json b/package-lock.json index dbfeb33..02e6fd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "nostr-tools": "^1.1.1" }, "devDependencies": { - "prettier": "^2.8.3" + "prettier": "^2.8.3", + "tailwindcss": "^3.2.4" } }, "node_modules/@esbuild/android-arm": { @@ -363,6 +364,41 @@ } ] }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", @@ -440,6 +476,38 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==" }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/alpinejs": { "version": "3.10.5", "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.10.5.tgz", @@ -448,6 +516,150 @@ "@vue/reactivity": "~3.1.1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/esbuild": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", @@ -484,6 +696,214 @@ "@esbuild/win32-x64": "0.16.17" } }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nostr-tools": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.1.1.tgz", @@ -496,6 +916,175 @@ "@scure/bip39": "^1.1.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "node_modules/prettier": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", @@ -510,6 +1099,207 @@ "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "dev": true, + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } } } } diff --git a/package.json b/package.json index 6678558..d4d9240 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "scripts": { "build": "./build.js", "watch": "./build.js watch", + "watch-tailwind": "tailwindcss -i './Shared (Extension)/Resources/options.css' -o 'Shared (Extension)/Resources/options.build.css' --watch", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", @@ -21,6 +22,7 @@ "nostr-tools": "^1.1.1" }, "devDependencies": { - "prettier": "^2.8.3" + "prettier": "^2.8.3", + "tailwindcss": "^3.2.4" } -} +} \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..31781fc --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./Shared (Extension)/Resources/*.{js,html}'], + theme: { + extend: {}, + }, + plugins: [], +}; From 03af8e71ad9f04dda1e8c4214f9bd65842e74b6f Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Mon, 23 Jan 2023 23:21:17 -0500 Subject: [PATCH 04/25] Verifying simple script messaging. --- Shared (Extension)/Resources/background.js | 3 ++- Shared (Extension)/Resources/options.html | 8 +++++++- Shared (Extension)/Resources/options.js | 12 ++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Shared (Extension)/Resources/background.js b/Shared (Extension)/Resources/background.js index 7d86548..2dab0de 100644 --- a/Shared (Extension)/Resources/background.js +++ b/Shared (Extension)/Resources/background.js @@ -10,7 +10,8 @@ const storage = browser.storage.local; browser.runtime.onInstalled.addListener(async ({ reason }) => { // I would like to be able to skip this for development purposes - let ignoreHook = (await storage.get('ignoreInstallHook')).ignoreInstallHook; + let ignoreHook = (await storage.get({ ignoreInstallHook: false })) + .ignoreInstallHook; if (ignoreHook === true) { return; } diff --git a/Shared (Extension)/Resources/options.html b/Shared (Extension)/Resources/options.html index 22851eb..89a3f06 100644 --- a/Shared (Extension)/Resources/options.html +++ b/Shared (Extension)/Resources/options.html @@ -11,7 +11,13 @@

Settings

-

+ + + \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.js b/Shared (Extension)/Resources/options.js index 47a21ec..a999c56 100644 --- a/Shared (Extension)/Resources/options.js +++ b/Shared (Extension)/Resources/options.js @@ -2,6 +2,18 @@ import Alpine from 'alpinejs'; Alpine.data('options', () => ({ msg: 'Hello world!', + profileNames: ['Default'], + profileIndex: 0, + + async init() { + await this.getProfileNames(); + }, + + async getProfileNames() { + this.profileNames = await browser.runtime.sendMessage({ + kind: 'getProfileNames', + }); + }, })); Alpine.start(); From 84a8d5ddeb6c5d19cae00104602e11569d98be14 Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Tue, 24 Jan 2023 22:44:34 -0500 Subject: [PATCH 05/25] Basic functionality for relay optoins --- Shared (Extension)/Resources/background.js | 21 +++++++ .../Resources/options.build.css | 63 +++++++++++++++++++ Shared (Extension)/Resources/options.html | 25 +++++++- Shared (Extension)/Resources/options.js | 32 ++++++++++ 4 files changed, 140 insertions(+), 1 deletion(-) diff --git a/Shared (Extension)/Resources/background.js b/Shared (Extension)/Resources/background.js index 2dab0de..7d8a133 100644 --- a/Shared (Extension)/Resources/background.js +++ b/Shared (Extension)/Resources/background.js @@ -89,6 +89,14 @@ browser.runtime.onMessage.addListener( case 'getRelays': sendResponse({}); break; + case 'getRelaysForProfile': + let profileRelays = await getRelaysForProfile(message.payload); + sendResponse(profileRelays); + break; + case 'saveRelaysForProfile': + let [srfpIndex, srfpRelays] = message.payload; + await saveRelaysForProfile(srfpIndex, srfpRelays); + break; default: break; } @@ -217,3 +225,16 @@ async function nip04Decrypt({ pubKey, cipherText }) { let privKey = await getPrivKey(); return nip04.decrypt(privKey, pubKey, cipherText); } + +async function getRelaysForProfile(profileIndex) { + let profiles = await get('profiles'); + let profile = profiles[profileIndex]; + return profile.relays || []; +} + +async function saveRelaysForProfile(profileIndex, relays) { + let profiles = await get('profiles'); + let profile = profiles[profileIndex]; + profile.relays = relays; + await storage.set({ profiles }); +} diff --git a/Shared (Extension)/Resources/options.build.css b/Shared (Extension)/Resources/options.build.css index 7b8527a..1ddc0a7 100644 --- a/Shared (Extension)/Resources/options.build.css +++ b/Shared (Extension)/Resources/options.build.css @@ -557,6 +557,10 @@ video { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } +.rounded-lg { + border-radius: 0.5rem; +} + .border { border-width: 1px; } @@ -566,6 +570,27 @@ video { background-color: rgb(232 121 249 / var(--tw-bg-opacity)); } +.bg-fuchsia-900 { + --tw-bg-opacity: 1; + background-color: rgb(112 26 117 / var(--tw-bg-opacity)); +} + +.p-44 { + padding: 11rem; +} + +.p-40 { + padding: 10rem; +} + +.p-32 { + padding: 8rem; +} + +.p-1 { + padding: 0.25rem; +} + .text-5xl { font-size: 3rem; line-height: 1; @@ -607,12 +632,25 @@ video { color: rgb(112 26 117 / var(--tw-text-opacity)); } +.text-fuchsia-400 { + --tw-text-opacity: 1; + color: rgb(232 121 249 / var(--tw-text-opacity)); +} + .shadow { --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } +.outline-1 { + outline-width: 1px; +} + +.outline-4 { + outline-width: 4px; +} + .ring { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); @@ -639,4 +677,29 @@ video { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; +} + +.hover\:bg-fuchsia-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(192 38 211 / var(--tw-bg-opacity)); +} + +.hover\:bg-fuchsia-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(134 25 143 / var(--tw-bg-opacity)); +} + +.hover\:text-fuchsia-300:hover { + --tw-text-opacity: 1; + color: rgb(240 171 252 / var(--tw-text-opacity)); +} + +.active\:bg-fuchsia-700:active { + --tw-bg-opacity: 1; + background-color: rgb(162 28 175 / var(--tw-bg-opacity)); +} + +.active\:text-fuchsia-200:active { + --tw-text-opacity: 1; + color: rgb(245 208 254 / var(--tw-text-opacity)); } \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.html b/Shared (Extension)/Resources/options.html index 89a3f06..20643be 100644 --- a/Shared (Extension)/Resources/options.html +++ b/Shared (Extension)/Resources/options.html @@ -9,7 +9,7 @@ - +

Settings

+

Relays

+ + + + + + + + + +
URLReadWriteActions
+ + + \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.js b/Shared (Extension)/Resources/options.js index a999c56..64c0bc2 100644 --- a/Shared (Extension)/Resources/options.js +++ b/Shared (Extension)/Resources/options.js @@ -4,9 +4,16 @@ Alpine.data('options', () => ({ msg: 'Hello world!', profileNames: ['Default'], profileIndex: 0, + relays: [], + newRelay: '', async init() { await this.getProfileNames(); + await this.getRelaysForProfile(); + + this.$watch('profileIndex', async () => { + await this.getRelaysForProfile(); + }); }, async getProfileNames() { @@ -14,6 +21,31 @@ Alpine.data('options', () => ({ kind: 'getProfileNames', }); }, + + async getRelaysForProfile() { + this.relays = await browser.runtime.sendMessage({ + kind: 'getRelaysForProfile', + payload: this.profileIndex, + }); + }, + + async saveRelaysForProfile() { + await browser.runtime.sendMessage({ + kind: 'saveRelaysForProfile', + payload: [this.profileIndex, this.relays], + }); + await this.getRelaysForProfile(); + }, + + async addRelay() { + this.relays.push({ url: this.newRelay, read: true, write: true }); + await this.saveRelaysForProfile(); + }, + + async deleteRelay(index) { + this.relays.splice(index, 1); + await this.saveRelaysForProfile(); + }, })); Alpine.start(); From 6d9235d8c023eb1ac2d33e63c467e40514c63b7c Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Tue, 24 Jan 2023 23:17:15 -0500 Subject: [PATCH 06/25] Validation for relay URL entry. --- .../Resources/options.build.css | 5 ++++ Shared (Extension)/Resources/options.html | 3 ++- Shared (Extension)/Resources/options.js | 26 +++++++++++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Shared (Extension)/Resources/options.build.css b/Shared (Extension)/Resources/options.build.css index 1ddc0a7..a93cc67 100644 --- a/Shared (Extension)/Resources/options.build.css +++ b/Shared (Extension)/Resources/options.build.css @@ -637,6 +637,11 @@ video { color: rgb(232 121 249 / var(--tw-text-opacity)); } +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity)); +} + .shadow { --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); diff --git a/Shared (Extension)/Resources/options.html b/Shared (Extension)/Resources/options.html index 20643be..5931873 100644 --- a/Shared (Extension)/Resources/options.html +++ b/Shared (Extension)/Resources/options.html @@ -39,7 +39,8 @@ - + +
diff --git a/Shared (Extension)/Resources/options.js b/Shared (Extension)/Resources/options.js index 64c0bc2..b636922 100644 --- a/Shared (Extension)/Resources/options.js +++ b/Shared (Extension)/Resources/options.js @@ -6,6 +6,7 @@ Alpine.data('options', () => ({ profileIndex: 0, relays: [], newRelay: '', + urlError: '', async init() { await this.getProfileNames(); @@ -35,17 +36,38 @@ Alpine.data('options', () => ({ payload: [this.profileIndex, this.relays], }); await this.getRelaysForProfile(); + this.newRelay = ''; }, async addRelay() { - this.relays.push({ url: this.newRelay, read: true, write: true }); - await this.saveRelaysForProfile(); + try { + let url = new URL(this.newRelay); + if (url.protocol !== 'wss:') { + this.setUrlError('Must be a websocket url'); + } + let urls = this.relays.map(v => v.url); + if (urls.includes(url.href)) { + this.setUrlError('URL already exists'); + return; + } + this.relays.push({ url: url.href, read: true, write: true }); + await this.saveRelaysForProfile(); + } catch (error) { + this.setUrlError('Invalid websocket URL'); + } }, async deleteRelay(index) { this.relays.splice(index, 1); await this.saveRelaysForProfile(); }, + + setUrlError(message) { + this.urlError = message; + setTimeout(() => { + this.urlError = ''; + }, 3000); + }, })); Alpine.start(); From b6acf270870e0d4c592420b005ba2225e2897580 Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Tue, 24 Jan 2023 23:29:12 -0500 Subject: [PATCH 07/25] Finally added getRelays call. --- Shared (Extension)/Resources/background.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Shared (Extension)/Resources/background.js b/Shared (Extension)/Resources/background.js index 7d8a133..29f3c87 100644 --- a/Shared (Extension)/Resources/background.js +++ b/Shared (Extension)/Resources/background.js @@ -87,7 +87,8 @@ browser.runtime.onMessage.addListener( sendResponse(plainText); break; case 'getRelays': - sendResponse({}); + let relays = await getRelays(); + sendResponse(relays); break; case 'getRelaysForProfile': let profileRelays = await getRelaysForProfile(message.payload); @@ -226,6 +227,16 @@ async function nip04Decrypt({ pubKey, cipherText }) { return nip04.decrypt(privKey, pubKey, cipherText); } +async function getRelays() { + let profile = await currentProfile(); + let relays = {}; + let profileRelays = profile.relays || []; + profileRelays.forEach(relay => { + relays[relay.url] = { read: relay.read, write: relay.write }; + }); + return relays; +} + async function getRelaysForProfile(profileIndex) { let profiles = await get('profiles'); let profile = profiles[profileIndex]; From 83cf21e5f57fb1b6fd3515263f548e40af340bc3 Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Wed, 25 Jan 2023 00:14:15 -0500 Subject: [PATCH 08/25] Some more CSS styling for the options page. --- .../Resources/options.build.css | 298 ++++++++++++++---- Shared (Extension)/Resources/options.css | 12 +- Shared (Extension)/Resources/options.html | 35 +- package-lock.json | 22 ++ package.json | 3 +- tailwind.config.js | 4 +- 6 files changed, 284 insertions(+), 90 deletions(-) diff --git a/Shared (Extension)/Resources/options.build.css b/Shared (Extension)/Resources/options.build.css index a93cc67..987a243 100644 --- a/Shared (Extension)/Resources/options.build.css +++ b/Shared (Extension)/Resources/options.build.css @@ -419,6 +419,172 @@ video { display: none; } +[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + border-radius: 0px; + padding-top: 0.5rem; + padding-right: 0.75rem; + padding-bottom: 0.5rem; + padding-left: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + --tw-shadow: 0 0 #0000; +} + +[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + border-color: #2563eb; +} + +input::-moz-placeholder, textarea::-moz-placeholder { + color: #6b7280; + opacity: 1; +} + +input::placeholder,textarea::placeholder { + color: #6b7280; + opacity: 1; +} + +::-webkit-datetime-edit-fields-wrapper { + padding: 0; +} + +::-webkit-date-and-time-value { + min-height: 1.5em; +} + +::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field { + padding-top: 0; + padding-bottom: 0; +} + +select { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 0.5rem center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; + padding-right: 2.5rem; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +[multiple] { + background-image: initial; + background-position: initial; + background-repeat: unset; + background-size: initial; + padding-right: 0.75rem; + -webkit-print-color-adjust: unset; + print-color-adjust: unset; +} + +[type='checkbox'],[type='radio'] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 0; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + display: inline-block; + vertical-align: middle; + background-origin: border-box; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + flex-shrink: 0; + height: 1rem; + width: 1rem; + color: #2563eb; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + --tw-shadow: 0 0 #0000; +} + +[type='checkbox'] { + border-radius: 0px; +} + +[type='radio'] { + border-radius: 100%; +} + +[type='checkbox']:focus,[type='radio']:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 2px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); +} + +[type='checkbox']:checked,[type='radio']:checked { + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +[type='checkbox']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); +} + +[type='radio']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); +} + +[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus { + border-color: transparent; + background-color: currentColor; +} + +[type='checkbox']:indeterminate { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { + border-color: transparent; + background-color: currentColor; +} + +[type='file'] { + background: unset; + border-color: inherit; + border-width: 0; + border-radius: 0; + padding: 0; + font-size: unset; + line-height: inherit; +} + +[type='file']:focus { + outline: 1px solid ButtonText; + outline: 1px auto -webkit-focus-ring-color; +} + *, ::before, ::after { --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; @@ -513,6 +679,38 @@ video { --tw-backdrop-sepia: ; } +.btn { + border-radius: 0.5rem; + --tw-bg-opacity: 1; + background-color: rgb(112 26 117 / var(--tw-bg-opacity)); + padding: 0.375rem; + --tw-text-opacity: 1; + color: rgb(232 121 249 / var(--tw-text-opacity)); +} + +.btn:hover { + --tw-bg-opacity: 1; + background-color: rgb(134 25 143 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(240 171 252 / var(--tw-text-opacity)); +} + +.btn:active { + --tw-bg-opacity: 1; + background-color: rgb(162 28 175 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(245 208 254 / var(--tw-text-opacity)); +} + +.input { + border-radius: 0.5rem; + --tw-bg-opacity: 1; + background-color: rgb(245 208 254 / var(--tw-bg-opacity)); + padding: 0.375rem; + --tw-text-opacity: 1; + color: rgb(134 25 143 / var(--tw-text-opacity)); +} + .visible { visibility: visible; } @@ -529,6 +727,14 @@ video { isolation: isolate; } +.mt-3 { + margin-top: 0.75rem; +} + +.mt-6 { + margin-top: 1.5rem; +} + .block { display: block; } @@ -549,6 +755,14 @@ video { display: none; } +.w-64 { + width: 16rem; +} + +.w-1\/3 { + width: 33.333333%; +} + .grow { flex-grow: 1; } @@ -557,10 +771,6 @@ video { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } -.rounded-lg { - border-radius: 0.5rem; -} - .border { border-width: 1px; } @@ -570,25 +780,21 @@ video { background-color: rgb(232 121 249 / var(--tw-bg-opacity)); } -.bg-fuchsia-900 { - --tw-bg-opacity: 1; - background-color: rgb(112 26 117 / var(--tw-bg-opacity)); -} - -.p-44 { - padding: 11rem; -} - -.p-40 { - padding: 10rem; -} - .p-32 { padding: 8rem; } -.p-1 { - padding: 0.25rem; +.p-2 { + padding: 0.5rem; +} + +.text-center { + text-align: center; +} + +.text-6xl { + font-size: 3.75rem; + line-height: 1; } .text-5xl { @@ -596,14 +802,9 @@ video { line-height: 1; } -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-6xl { - font-size: 3.75rem; - line-height: 1; +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; } .font-bold { @@ -622,21 +823,11 @@ video { text-transform: capitalize; } -.text-green-500 { - --tw-text-opacity: 1; - color: rgb(34 197 94 / var(--tw-text-opacity)); -} - .text-fuchsia-900 { --tw-text-opacity: 1; color: rgb(112 26 117 / var(--tw-text-opacity)); } -.text-fuchsia-400 { - --tw-text-opacity: 1; - color: rgb(232 121 249 / var(--tw-text-opacity)); -} - .text-red-500 { --tw-text-opacity: 1; color: rgb(239 68 68 / var(--tw-text-opacity)); @@ -648,14 +839,6 @@ video { box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } -.outline-1 { - outline-width: 1px; -} - -.outline-4 { - outline-width: 4px; -} - .ring { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); @@ -682,29 +865,4 @@ video { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; -} - -.hover\:bg-fuchsia-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(192 38 211 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(134 25 143 / var(--tw-bg-opacity)); -} - -.hover\:text-fuchsia-300:hover { - --tw-text-opacity: 1; - color: rgb(240 171 252 / var(--tw-text-opacity)); -} - -.active\:bg-fuchsia-700:active { - --tw-bg-opacity: 1; - background-color: rgb(162 28 175 / var(--tw-bg-opacity)); -} - -.active\:text-fuchsia-200:active { - --tw-text-opacity: 1; - color: rgb(245 208 254 / var(--tw-text-opacity)); } \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.css b/Shared (Extension)/Resources/options.css index bd6213e..368eb05 100644 --- a/Shared (Extension)/Resources/options.css +++ b/Shared (Extension)/Resources/options.css @@ -1,3 +1,13 @@ @tailwind base; @tailwind components; -@tailwind utilities; \ No newline at end of file +@tailwind utilities; + +@layer components { + .btn { + @apply rounded-lg p-1.5 bg-fuchsia-900 text-fuchsia-400 hover:bg-fuchsia-800 hover:text-fuchsia-300 active:bg-fuchsia-700 active:text-fuchsia-200; + } + + .input { + @apply bg-fuchsia-200 text-fuchsia-800 rounded-lg p-1.5; + } +} \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.html b/Shared (Extension)/Resources/options.html index 5931873..db7c1b7 100644 --- a/Shared (Extension)/Resources/options.html +++ b/Shared (Extension)/Resources/options.html @@ -10,36 +10,39 @@ -

Settings

+

Advanced

- -

Relays

+

Relays

- - - - - - +
URLReadWriteActions
+ + + + +
URLReadWriteActions
- + +
diff --git a/package-lock.json b/package-lock.json index 02e6fd5..a59b0c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "nostr-tools": "^1.1.1" }, "devDependencies": { + "@tailwindcss/forms": "^0.5.3", "prettier": "^2.8.3", "tailwindcss": "^3.2.4" } @@ -463,6 +464,18 @@ } ] }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", + "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, "node_modules/@vue/reactivity": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", @@ -874,6 +887,15 @@ "node": ">=8.6" } }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, "node_modules/minimist": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", diff --git a/package.json b/package.json index d4d9240..e830ad7 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "scripts": { "build": "./build.js", "watch": "./build.js watch", - "watch-tailwind": "tailwindcss -i './Shared (Extension)/Resources/options.css' -o 'Shared (Extension)/Resources/options.build.css' --watch", + "watch-tailwind": "tailwindcss -i './Shared (Extension)/Resources/options.css' -o './Shared (Extension)/Resources/options.build.css' --watch", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", @@ -22,6 +22,7 @@ "nostr-tools": "^1.1.1" }, "devDependencies": { + "@tailwindcss/forms": "^0.5.3", "prettier": "^2.8.3", "tailwindcss": "^3.2.4" } diff --git a/tailwind.config.js b/tailwind.config.js index 31781fc..15ee39c 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,8 +1,8 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: ['./Shared (Extension)/Resources/*.{js,html}'], + content: ['./Shared (Extension)/Resources/*.{html,js}'], theme: { extend: {}, }, - plugins: [], + plugins: [require('@tailwindcss/forms')], }; From dcc0fab5c6df712ef9cf1a836779cb6b12a99327 Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Wed, 25 Jan 2023 00:36:28 -0500 Subject: [PATCH 09/25] Some more nice styling. --- .../Resources/options.build.css | 11 ++++++++ Shared (Extension)/Resources/options.css | 4 +++ Shared (Extension)/Resources/options.html | 10 +++++--- package-lock.json | 25 ++++++++++++++++++- package.json | 2 +- tailwind.config.js | 2 +- 6 files changed, 47 insertions(+), 7 deletions(-) diff --git a/Shared (Extension)/Resources/options.build.css b/Shared (Extension)/Resources/options.build.css index 987a243..6ebff49 100644 --- a/Shared (Extension)/Resources/options.build.css +++ b/Shared (Extension)/Resources/options.build.css @@ -711,6 +711,17 @@ select { color: rgb(134 25 143 / var(--tw-text-opacity)); } +[type="checkbox"] { + height: 1.25rem; + width: 1.25rem; + border-radius: 9999px; + --tw-bg-opacity: 1; + background-color: rgb(245 208 254 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(134 25 143 / var(--tw-text-opacity)); + accent-color: #f5d0fe; +} + .visible { visibility: visible; } diff --git a/Shared (Extension)/Resources/options.css b/Shared (Extension)/Resources/options.css index 368eb05..28285c3 100644 --- a/Shared (Extension)/Resources/options.css +++ b/Shared (Extension)/Resources/options.css @@ -10,4 +10,8 @@ .input { @apply bg-fuchsia-200 text-fuchsia-800 rounded-lg p-1.5; } + + [type="checkbox"] { + @apply text-fuchsia-800 bg-fuchsia-200 rounded-full accent-fuchsia-200 w-5 h-5; + } } \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.html b/Shared (Extension)/Resources/options.html index db7c1b7..3fe87ed 100644 --- a/Shared (Extension)/Resources/options.html +++ b/Shared (Extension)/Resources/options.html @@ -30,10 +30,12 @@ - - + +
- +
diff --git a/Shared (Extension)/Resources/options.js b/Shared (Extension)/Resources/options.js index b636922..fc8724b 100644 --- a/Shared (Extension)/Resources/options.js +++ b/Shared (Extension)/Resources/options.js @@ -9,6 +9,7 @@ Alpine.data('options', () => ({ urlError: '', async init() { + await browser.runtime.getBackgroundPage(); await this.getProfileNames(); await this.getRelaysForProfile(); diff --git a/Shared (Extension)/Resources/popup.html b/Shared (Extension)/Resources/popup.html index 1d23ddf..056a02e 100644 --- a/Shared (Extension)/Resources/popup.html +++ b/Shared (Extension)/Resources/popup.html @@ -61,7 +61,7 @@
- +
diff --git a/Shared (Extension)/Resources/popup.js b/Shared (Extension)/Resources/popup.js index 219c022..f092782 100644 --- a/Shared (Extension)/Resources/popup.js +++ b/Shared (Extension)/Resources/popup.js @@ -1,3 +1,5 @@ +console.log('test!'); + import Alpine from 'alpinejs'; window.Alpine = Alpine; @@ -61,11 +63,15 @@ Alpine.data('popup', () => ({ }, async getNpubKey() { - this.pubKey = await browser.runtime.sendMessage({ kind: 'getNpubKey' }); + this.pubKey = await browser.runtime.sendMessage({ + kind: 'getNpubKey', + }); }, async getHosts() { - this.hosts = await browser.runtime.sendMessage({ kind: 'getHosts' }); + this.hosts = await browser.runtime.sendMessage({ + kind: 'getHosts', + }); }, async getProfileNames() { @@ -115,6 +121,11 @@ Alpine.data('popup', () => ({ this.confirmDelete = false; }, + async openOptions() { + await browser.runtime.openOptionsPage(); + window.close(); + }, + // Properties get hasValidPubKey() { diff --git a/Shared (Extension)/Resources/utils.js b/Shared (Extension)/Resources/utils.js new file mode 100644 index 0000000..34c825a --- /dev/null +++ b/Shared (Extension)/Resources/utils.js @@ -0,0 +1,3 @@ +export async function bglog(msg) { + await browser.runtime.sendMessage({ kind: 'log', payload: msg }); +} diff --git a/build.js b/build.js index 0c04377..e37c035 100755 --- a/build.js +++ b/build.js @@ -22,7 +22,7 @@ require('esbuild') outdir: './Shared (Extension)/Resources', sourcemap: 'inline', bundle: true, - minify: true, + // minify: true, watch, }) .catch(() => process.exit(1)); From f98ab34f0af695d9d45621aa38438d49f09fa81e Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Thu, 26 Jan 2023 20:26:23 -0500 Subject: [PATCH 14/25] Replace console.log with bglog. --- Shared (Extension)/Resources/background.js | 10 ++++++---- Shared (Extension)/Resources/nostr.js | 2 -- Shared (Extension)/Resources/popup.js | 7 ++++--- Shared (Extension)/Resources/utils.js | 7 +++++-- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Shared (Extension)/Resources/background.js b/Shared (Extension)/Resources/background.js index 0b84c33..eb0381d 100644 --- a/Shared (Extension)/Resources/background.js +++ b/Shared (Extension)/Resources/background.js @@ -7,6 +7,7 @@ import { } from 'nostr-tools'; const storage = browser.storage.local; +const log = msg => console.log('Background: ', msg); browser.runtime.onInstalled.addListener(async ({ reason }) => { // I would like to be able to skip this for development purposes @@ -24,11 +25,14 @@ browser.runtime.onInstalled.addListener(async ({ reason }) => { browser.runtime.onMessage.addListener( async (message, _sender, sendResponse) => { - console.log(message); + log(message); switch (message.kind) { case 'log': - console.log('Background Log: ', message.payload); + console.log( + message.payload.module ? `${module}: ` : '', + message.payload.msg + ); break; case 'init': await initialize(); @@ -146,9 +150,7 @@ async function getPrivKey() { async function getNpubKey() { let pubKey = await getPubKey(); - console.log('pubKey: ', pubKey); let npubKey = nip19.npubEncode(pubKey); - console.log('npub key: ', npubKey); return npubKey; } diff --git a/Shared (Extension)/Resources/nostr.js b/Shared (Extension)/Resources/nostr.js index f302f14..83371fd 100644 --- a/Shared (Extension)/Resources/nostr.js +++ b/Shared (Extension)/Resources/nostr.js @@ -23,7 +23,6 @@ window.nostr = { let reqId = Math.random().toString(); return new Promise((resolve, _reject) => { this.requests[reqId] = resolve; - console.log(`Event ${reqId}: ${kind}, payload: `, payload); window.postMessage({ kind, reqId, payload }, '*'); }); }, @@ -57,7 +56,6 @@ window.addEventListener('message', message => { if (!validEvents.includes(kind)) return; - console.log(`Event ${reqId}: Received payload:`, payload); window.nostr.requests[reqId](payload); delete window.nostr.requests[reqId]; }); diff --git a/Shared (Extension)/Resources/popup.js b/Shared (Extension)/Resources/popup.js index f092782..29b3323 100644 --- a/Shared (Extension)/Resources/popup.js +++ b/Shared (Extension)/Resources/popup.js @@ -1,8 +1,9 @@ -console.log('test!'); - +import { bglog } from './utils'; import Alpine from 'alpinejs'; window.Alpine = Alpine; +const log = msg => bglog(msg, 'popup'); + Alpine.data('popup', () => ({ privKey: '', pubKey: '', @@ -17,7 +18,7 @@ Alpine.data('popup', () => ({ confirmDelete: false, async init() { - console.log('Initializing backend.'); + log('Initializing backend.'); await browser.runtime.sendMessage({ kind: 'init' }); this.$watch('profileIndex', async () => { diff --git a/Shared (Extension)/Resources/utils.js b/Shared (Extension)/Resources/utils.js index 34c825a..7e7aa29 100644 --- a/Shared (Extension)/Resources/utils.js +++ b/Shared (Extension)/Resources/utils.js @@ -1,3 +1,6 @@ -export async function bglog(msg) { - await browser.runtime.sendMessage({ kind: 'log', payload: msg }); +export async function bglog(msg, module = null) { + await browser.runtime.sendMessage({ + kind: 'log', + payload: { msg, module }, + }); } From 252c9d52348c54c243720176325a1261ac0cd7c4 Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Thu, 26 Jan 2023 22:08:05 -0500 Subject: [PATCH 15/25] Relay functionality in options is complete. --- Shared (Extension)/Resources/options.css | 4 ++ Shared (Extension)/Resources/options.html | 87 ++++++++++++++--------- Shared (Extension)/Resources/options.js | 37 +++++++++- 3 files changed, 93 insertions(+), 35 deletions(-) diff --git a/Shared (Extension)/Resources/options.css b/Shared (Extension)/Resources/options.css index f92fc4c..c326dde 100644 --- a/Shared (Extension)/Resources/options.css +++ b/Shared (Extension)/Resources/options.css @@ -14,4 +14,8 @@ .checkbox { @apply text-fuchsia-800 bg-fuchsia-200 rounded-full accent-fuchsia-200 w-4 h-4 lg:w-5 lg:h-5; } + + .section { + @apply border-2 border-fuchsia-700 rounded-lg p-5 mt-6 shadow-md; + } } \ No newline at end of file diff --git a/Shared (Extension)/Resources/options.html b/Shared (Extension)/Resources/options.html index 32453ad..5558c8e 100644 --- a/Shared (Extension)/Resources/options.html +++ b/Shared (Extension)/Resources/options.html @@ -10,43 +10,66 @@ -

Advanced Settings

+

Nostore

-