Skip to content

Commit 4aecab5

Browse files
committed
v2.1.0
1 parent acd3c64 commit 4aecab5

File tree

17 files changed

+86
-216
lines changed

17 files changed

+86
-216
lines changed

README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@ FavBox is a local-first **experimental** browser extension that enhances and sim
2020

2121
Key features:
2222

23-
🔄 sync with your browser profile;\
24-
🔒 does not send your data to any third-party services;\
25-
🎨 minimalist and clean UI; \
26-
🏷 supports tags for easy organization;\
27-
🔍 provides advanced search, sorting, and filtering capabilities based on tags, domains, folders, and webpage keywords;\
28-
🌁 multiple display modes; \
29-
🌗 light and dark theme;\
30-
🗑️ includes a health check function that detects broken URLs; \
31-
⌨️ provides quick access to search with hotkeys; \
32-
🗒️ includes functionality for creating and managing **local** notes; \
33-
❤️ free and open source;
23+
🔄 Syncs with your browser profile \
24+
🔒 No data sent to third-party services\
25+
🎨 Minimalist, clean UI\
26+
🏷️ Tag support for easy organization\
27+
🔍 Advanced search, sorting, and filtering by tags, domains, folders, and keywords\
28+
🌁 Multiple display modes\
29+
🌗 Light and dark themes\
30+
🗑️ Detects broken and duplicate bookmarks\
31+
⌨️ Hotkeys for quick search access\
32+
🗒️ Local notes support\
33+
❤️ Free and open source
3434

3535
### Concept
3636

app_demo.png

-491 KB
Loading

manifest.chrome.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"manifest_version": 3,
33
"name": "FavBox",
44
"description": "A clean, modern bookmark app — local-first by design.",
5-
"version": "2.0.4",
5+
"version": "2.1.0",
66
"permissions": [
77
"bookmarks",
88
"activeTab",

manifest.firefox.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"manifest_version": 3,
33
"name": "FavBox",
44
"description": "A clean, modern bookmark app — local-first by design.",
5-
"version": "2.0.4",
5+
"version": "2.1.0",
66
"permissions": [
77
"bookmarks",
88
"activeTab",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "favbox",
3-
"version": "2.0.4",
3+
"version": "2.1.0",
44
"private": false,
55
"type": "module",
66
"scripts": {

src/ext/browser/components/BookmarkForm.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ const props = defineProps({
6666
},
6767
});
6868
69-
const bookmark = ref(props.bookmark);
69+
const bookmark = ref({ ...props.bookmark });
7070
const emit = defineEmits(['onSubmit']);
7171
7272
const findLabelById = (data, id) => {
@@ -102,6 +102,6 @@ const submit = () => {
102102
103103
watch(() => bookmark.value.folderId, (newId) => {
104104
bookmark.value.folderName = findLabelById(props.folders, newId);
105-
});
105+
}, { immediate: true });
106106
107107
</script>

src/ext/browser/components/BookmarksSync.vue

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
</Dialog>
6969
</TransitionRoot>
7070
<div
71-
v-if="!isOpen && !status && progress < 100"
71+
v-if="!isOpen && isSyncing"
7272
class="fixed bottom-4 right-4 z-50"
7373
>
7474
<button
@@ -103,26 +103,34 @@ import PixelarticonsHeart from '~icons/pixelarticons/heart';
103103
const status = ref(false);
104104
const progress = ref(0);
105105
const isOpen = ref(false);
106+
const isSyncing = ref(false);
107+
106108
const close = () => { isOpen.value = false; };
107109
const open = () => { isOpen.value = true; };
108-
const emit = defineEmits(['onRefresh']);
110+
const emit = defineEmits(['onSync']);
109111
110112
onMounted(async () => {
111-
status.value = (await browser.storage.session.get('status')).status ?? false;
112-
progress.value = (await browser.storage.session.get('progress')).progress ?? 0;
113-
isOpen.value = status.value === false && progress.value < 100;
113+
const storageData = await browser.storage.session.get(['status', 'progress']);
114+
status.value = storageData.status ?? false;
115+
progress.value = storageData.progress ?? 0;
116+
117+
isSyncing.value = !status.value && progress.value > 0 && progress.value < 100;
118+
119+
isOpen.value = isSyncing.value;
114120
});
115121
116122
browser.runtime.onMessage.addListener(async (message) => {
117-
if (message.action === 'refresh') {
123+
if (message.action === 'sync') {
124+
const wasSyncing = isSyncing.value;
118125
progress.value = message.data.progress;
119126
status.value = message.data.progress >= 100;
120-
121-
if (message.data.progress >= 100) {
127+
isSyncing.value = !status.value && message.data.progress > 0 && message.data.progress < 100;
128+
if (isSyncing.value && !wasSyncing) {
129+
isOpen.value = true;
130+
} else if (message.data.progress >= 100) {
122131
isOpen.value = false;
123132
}
124-
125-
emit('onRefresh', message.data);
133+
emit('onSync', message.data);
126134
console.warn('BookmarksSync', message.data);
127135
}
128136
});

src/ext/browser/components/DatePicker.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ const emit = defineEmits(['update:modelValue']);
5555
const isOpen = ref(false);
5656
const rootRef = ref(null);
5757
58-
5958
const selectedDate = computed({
6059
get: () => props.modelValue,
6160
set: (value) => emit('update:modelValue', value),

src/ext/browser/components/card/BookmarkCard.vue

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,6 @@
1414
>
1515
<CarbonTrashCan class="size-4" />
1616
</button>
17-
<button
18-
v-tooltip.bottom-start="{ content: 'Take a screenshot'}"
19-
class="-translate-y-8 rounded-md bg-black p-1.5 text-white opacity-100 shadow-md transition-transform delay-100 duration-300 ease-out group-hover:translate-y-2 group-hover:opacity-100"
20-
@click="$emit('onScreenshot', bookmark)"
21-
>
22-
<CarbonDropPhoto class="size-4" />
23-
</button>
2417
<button
2518
v-tooltip.bottom-start="{ content: 'Pin bookmark'}"
2619
class="-translate-y-8 rounded-md p-1.5 text-white opacity-100 shadow-md transition-transform delay-100 duration-500 ease-out group-hover:translate-y-2 group-hover:opacity-100"

src/ext/browser/components/card/BookmarkImage.vue

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,16 @@
3030
:class="[backgroundClasses, props.rounded]"
3131
>
3232
<!-- Grid pattern for grid variant -->
33-
<div v-if="currentVariant === 'grid'" class="absolute bottom-0 left-0 right-0 top-0 bg-[linear-gradient(to_right,#4f4f4f2e_1px,transparent_1px),linear-gradient(to_bottom,#4f4f4f2e_1px,transparent_1px)] bg-[size:14px_24px]"></div>
33+
<div
34+
v-if="currentVariant === 'grid'"
35+
class="absolute bottom-0 left-0 right-0 top-0 bg-[linear-gradient(to_right,#4f4f4f2e_1px,transparent_1px),linear-gradient(to_bottom,#4f4f4f2e_1px,transparent_1px)] bg-[size:14px_24px]"
36+
/>
3437

3538
<!-- Default pattern for other variants -->
36-
<div v-else class="absolute inset-0 opacity-10">
39+
<div
40+
v-else
41+
class="absolute inset-0 opacity-10"
42+
>
3743
<div class="absolute inset-0 bg-gradient-to-br from-white/20 to-transparent" />
3844
<div class="absolute bottom-0 right-0 size-32 translate-x-8 translate-y-8 rounded-full bg-white/10" />
3945
</div>
@@ -60,7 +66,7 @@
6066
</div>
6167
</div>
6268
<div class="text-center">
63-
<p class="text-sm font-medium text-gray-700 dark:text-gray-200">
69+
<p class="text-sm font-medium text-gray-700 dark:text-gray-200 line-clamp-2">
6470
{{ bookmark.domain || bookmark.title }}
6571
</p>
6672
<p class="text-xs text-gray-500 dark:text-gray-400">

0 commit comments

Comments
 (0)