Commit ·
897c90d
1
Parent(s): e58b76f
Fix HF_HOME caching in Dockerfile and update UI
Browse files- .gitattributes +1 -1
- .gitignore +0 -0
- Dockerfile +6 -1
- extension/_locales/ar/messages.json +1 -1
- extension/_locales/en/messages.json +4 -4
- extension/background.js +21 -19
- extension/content-inline.js +8 -4
- extension/popup.css +4 -4
- extension/popup.html +2 -2
- extension/sidepanel/sidepanel.css +3 -3
- extension/sidepanel/sidepanel.html +2 -2
- generate_icons.py +8 -0
- src/index.html +5 -5
- tests/phase10/reports/phase10_results.json +0 -0
.gitattributes
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
*.db filter=lfs diff=lfs merge=lfs -text
|
| 2 |
quran_master.db filter=lfs diff=lfs merge=lfs -text
|
| 3 |
-
extension/assets/icons/fab_logo.png filter=lfs diff=lfs merge=lfs -text
|
| 4 |
*.png filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 1 |
*.db filter=lfs diff=lfs merge=lfs -text
|
| 2 |
quran_master.db filter=lfs diff=lfs merge=lfs -text
|
|
|
|
| 3 |
*.png filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
extension/assets/icons/fab_logo.png filter=lfs diff=lfs merge=lfs -text
|
.gitignore
CHANGED
|
Binary files a/.gitignore and b/.gitignore differ
|
|
|
Dockerfile
CHANGED
|
@@ -16,6 +16,9 @@ RUN pip install --no-cache-dir torch --index-url https://download.pytorch.org/wh
|
|
| 16 |
# Pre-download models during build (network is available here)
|
| 17 |
# At runtime, the container has NO outbound DNS, so models must be cached
|
| 18 |
|
|
|
|
|
|
|
|
|
|
| 19 |
# 1. Summarization model (MBart, float16)
|
| 20 |
RUN python -c "\
|
| 21 |
from transformers import MBartForConditionalGeneration, AutoTokenizer, AutoConfig; \
|
|
@@ -46,7 +49,9 @@ print('Spelling model + MLM cached!'); \
|
|
| 46 |
"
|
| 47 |
|
| 48 |
# 3. Grammar — camel-tools MLE disambiguator data
|
| 49 |
-
|
|
|
|
|
|
|
| 50 |
|
| 51 |
# 4. Punctuation model (PuncAra-v1 — EncoderDecoderModel)
|
| 52 |
RUN python -c "\
|
|
|
|
| 16 |
# Pre-download models during build (network is available here)
|
| 17 |
# At runtime, the container has NO outbound DNS, so models must be cached
|
| 18 |
|
| 19 |
+
# Set HF_HOME to a global path so non-root users (like in HF Spaces) can access cached models
|
| 20 |
+
ENV HF_HOME=/opt/huggingface
|
| 21 |
+
RUN mkdir -p /opt/huggingface && chmod 777 /opt/huggingface
|
| 22 |
# 1. Summarization model (MBart, float16)
|
| 23 |
RUN python -c "\
|
| 24 |
from transformers import MBartForConditionalGeneration, AutoTokenizer, AutoConfig; \
|
|
|
|
| 49 |
"
|
| 50 |
|
| 51 |
# 3. Grammar — camel-tools MLE disambiguator data
|
| 52 |
+
# Set CAMELTOOLS_DATA to a global path so non-root users (like in HF Spaces) can access it
|
| 53 |
+
ENV CAMELTOOLS_DATA=/opt/camel_tools
|
| 54 |
+
RUN mkdir -p /opt/camel_tools && chmod 777 /opt/camel_tools && camel_data -i light
|
| 55 |
|
| 56 |
# 4. Punctuation model (PuncAra-v1 — EncoderDecoderModel)
|
| 57 |
RUN python -c "\
|
extension/_locales/ar/messages.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
| 16 |
"description": "Context menu item for summarizing selected text"
|
| 17 |
},
|
| 18 |
"contextMenuDialect": {
|
| 19 |
-
"message": "تحويل
|
| 20 |
"description": "Context menu: dialect→MSA"
|
| 21 |
},
|
| 22 |
"contextMenuQuran": {
|
|
|
|
| 16 |
"description": "Context menu item for summarizing selected text"
|
| 17 |
},
|
| 18 |
"contextMenuDialect": {
|
| 19 |
+
"message": "تحويل للفصحى مع بيان",
|
| 20 |
"description": "Context menu: dialect→MSA"
|
| 21 |
},
|
| 22 |
"contextMenuQuran": {
|
extension/_locales/en/messages.json
CHANGED
|
@@ -8,19 +8,19 @@
|
|
| 8 |
"description": "Extension description shown in Chrome Web Store"
|
| 9 |
},
|
| 10 |
"contextMenuCorrect": {
|
| 11 |
-
"message": "
|
| 12 |
"description": "Context menu item for correcting selected text"
|
| 13 |
},
|
| 14 |
"contextMenuSummarize": {
|
| 15 |
-
"message": "
|
| 16 |
"description": "Context menu item for summarizing selected text"
|
| 17 |
},
|
| 18 |
"contextMenuDialect": {
|
| 19 |
-
"message": "
|
| 20 |
"description": "Context menu: dialect→MSA"
|
| 21 |
},
|
| 22 |
"contextMenuQuran": {
|
| 23 |
-
"message": "
|
| 24 |
"description": "Context menu: Quran verify"
|
| 25 |
}
|
| 26 |
}
|
|
|
|
| 8 |
"description": "Extension description shown in Chrome Web Store"
|
| 9 |
},
|
| 10 |
"contextMenuCorrect": {
|
| 11 |
+
"message": "تصحيح النص مع بيان",
|
| 12 |
"description": "Context menu item for correcting selected text"
|
| 13 |
},
|
| 14 |
"contextMenuSummarize": {
|
| 15 |
+
"message": "تلخيص النص مع بيان",
|
| 16 |
"description": "Context menu item for summarizing selected text"
|
| 17 |
},
|
| 18 |
"contextMenuDialect": {
|
| 19 |
+
"message": "تحويل للفصحى مع بيان",
|
| 20 |
"description": "Context menu: dialect→MSA"
|
| 21 |
},
|
| 22 |
"contextMenuQuran": {
|
| 23 |
+
"message": "تدقيق النص القرآني مع بيان",
|
| 24 |
"description": "Context menu: Quran verify"
|
| 25 |
}
|
| 26 |
}
|
extension/background.js
CHANGED
|
@@ -49,25 +49,27 @@ function getStorage() {
|
|
| 49 |
// ══════════════════════════════════════════════════════════
|
| 50 |
|
| 51 |
chrome.runtime.onInstalled.addListener(() => {
|
| 52 |
-
chrome.contextMenus.
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
|
|
|
|
|
|
| 71 |
});
|
| 72 |
});
|
| 73 |
|
|
|
|
| 49 |
// ══════════════════════════════════════════════════════════
|
| 50 |
|
| 51 |
chrome.runtime.onInstalled.addListener(() => {
|
| 52 |
+
chrome.contextMenus.removeAll(() => {
|
| 53 |
+
chrome.contextMenus.create({
|
| 54 |
+
id: 'bayan-correct',
|
| 55 |
+
title: 'تصحيح النص مع بيان',
|
| 56 |
+
contexts: ['selection'],
|
| 57 |
+
});
|
| 58 |
+
chrome.contextMenus.create({
|
| 59 |
+
id: 'bayan-summarize',
|
| 60 |
+
title: 'تلخيص النص مع بيان',
|
| 61 |
+
contexts: ['selection'],
|
| 62 |
+
});
|
| 63 |
+
chrome.contextMenus.create({
|
| 64 |
+
id: 'bayan-dialect',
|
| 65 |
+
title: 'تحويل للفصحى مع بيان',
|
| 66 |
+
contexts: ['selection'],
|
| 67 |
+
});
|
| 68 |
+
chrome.contextMenus.create({
|
| 69 |
+
id: 'bayan-quran',
|
| 70 |
+
title: 'تدقيق النص القرآني مع بيان',
|
| 71 |
+
contexts: ['selection'],
|
| 72 |
+
});
|
| 73 |
});
|
| 74 |
});
|
| 75 |
|
extension/content-inline.js
CHANGED
|
@@ -244,8 +244,10 @@
|
|
| 244 |
+ `left:${rect.left}px;width:${rect.width}px;height:${rect.height}px;`
|
| 245 |
+ `font-family:${cs.fontFamily};font-size:${cs.fontSize};line-height:${cs.lineHeight};`
|
| 246 |
+ `padding:${cs.padding};border:${cs.border};border-color:transparent;`
|
| 247 |
-
+ `direction:${cs.direction};text-align:${cs.textAlign};
|
| 248 |
-
+ `
|
|
|
|
|
|
|
| 249 |
+ `white-space:pre-wrap;word-wrap:break-word;color:transparent;`;
|
| 250 |
|
| 251 |
const html = esc(baseText) + `<span class="bayan-il-ghost-suffix">${esc(suffix)}</span>`;
|
|
@@ -341,8 +343,10 @@
|
|
| 341 |
+ `left:${rect.left}px;width:${rect.width}px;height:${rect.height}px;`
|
| 342 |
+ `font-family:${cs.fontFamily};font-size:${cs.fontSize};line-height:${cs.lineHeight};`
|
| 343 |
+ `padding:${cs.padding};border:${cs.border};border-color:transparent;`
|
| 344 |
-
+ `direction:${cs.direction};text-align:${cs.textAlign};
|
| 345 |
-
+ `
|
|
|
|
|
|
|
| 346 |
+ `white-space:pre-wrap;word-wrap:break-word;color:transparent;`;
|
| 347 |
|
| 348 |
const sorted = [...suggs].sort((a, b) => a.start - b.start);
|
|
|
|
| 244 |
+ `left:${rect.left}px;width:${rect.width}px;height:${rect.height}px;`
|
| 245 |
+ `font-family:${cs.fontFamily};font-size:${cs.fontSize};line-height:${cs.lineHeight};`
|
| 246 |
+ `padding:${cs.padding};border:${cs.border};border-color:transparent;`
|
| 247 |
+
+ `direction:${cs.direction};text-align:${cs.textAlign};`
|
| 248 |
+
+ `unicode-bidi:${cs.unicodeBidi};letter-spacing:${cs.letterSpacing};`
|
| 249 |
+
+ `word-spacing:${cs.wordSpacing};text-indent:${cs.textIndent};`
|
| 250 |
+
+ `overflow:hidden;pointer-events:none;z-index:2147483645;box-sizing:border-box;`
|
| 251 |
+ `white-space:pre-wrap;word-wrap:break-word;color:transparent;`;
|
| 252 |
|
| 253 |
const html = esc(baseText) + `<span class="bayan-il-ghost-suffix">${esc(suffix)}</span>`;
|
|
|
|
| 343 |
+ `left:${rect.left}px;width:${rect.width}px;height:${rect.height}px;`
|
| 344 |
+ `font-family:${cs.fontFamily};font-size:${cs.fontSize};line-height:${cs.lineHeight};`
|
| 345 |
+ `padding:${cs.padding};border:${cs.border};border-color:transparent;`
|
| 346 |
+
+ `direction:${cs.direction};text-align:${cs.textAlign};`
|
| 347 |
+
+ `unicode-bidi:${cs.unicodeBidi};letter-spacing:${cs.letterSpacing};`
|
| 348 |
+
+ `word-spacing:${cs.wordSpacing};text-indent:${cs.textIndent};`
|
| 349 |
+
+ `overflow:hidden;pointer-events:none;z-index:2147483645;box-sizing:border-box;`
|
| 350 |
+ `white-space:pre-wrap;word-wrap:break-word;color:transparent;`;
|
| 351 |
|
| 352 |
const sorted = [...suggs].sort((a, b) => a.start - b.start);
|
extension/popup.css
CHANGED
|
@@ -27,7 +27,7 @@
|
|
| 27 |
|
| 28 |
--bayan-spelling: #ef4444;
|
| 29 |
--bayan-grammar: #f59e0b;
|
| 30 |
-
--bayan-punctuation: #
|
| 31 |
|
| 32 |
--bayan-radius: 10px;
|
| 33 |
--bayan-radius-sm: 6px;
|
|
@@ -473,7 +473,7 @@ body::-webkit-scrollbar-thumb {
|
|
| 473 |
}
|
| 474 |
|
| 475 |
.bayan-punctuation-suggestion {
|
| 476 |
-
background: rgba(
|
| 477 |
border-bottom: 2px solid var(--bayan-punctuation);
|
| 478 |
border-radius: 2px;
|
| 479 |
padding: 0 2px;
|
|
@@ -481,7 +481,7 @@ body::-webkit-scrollbar-thumb {
|
|
| 481 |
transition: background var(--bayan-transition);
|
| 482 |
}
|
| 483 |
.bayan-punctuation-suggestion:hover {
|
| 484 |
-
background: rgba(
|
| 485 |
}
|
| 486 |
|
| 487 |
/* ══════════════════════════════════════════════
|
|
@@ -556,7 +556,7 @@ body::-webkit-scrollbar-thumb {
|
|
| 556 |
color: var(--bayan-grammar);
|
| 557 |
}
|
| 558 |
.bayan-badge-punctuation {
|
| 559 |
-
background: rgba(
|
| 560 |
color: var(--bayan-punctuation);
|
| 561 |
}
|
| 562 |
|
|
|
|
| 27 |
|
| 28 |
--bayan-spelling: #ef4444;
|
| 29 |
--bayan-grammar: #f59e0b;
|
| 30 |
+
--bayan-punctuation: #6BC98A;
|
| 31 |
|
| 32 |
--bayan-radius: 10px;
|
| 33 |
--bayan-radius-sm: 6px;
|
|
|
|
| 473 |
}
|
| 474 |
|
| 475 |
.bayan-punctuation-suggestion {
|
| 476 |
+
background: rgba(107, 201, 138, 0.14);
|
| 477 |
border-bottom: 2px solid var(--bayan-punctuation);
|
| 478 |
border-radius: 2px;
|
| 479 |
padding: 0 2px;
|
|
|
|
| 481 |
transition: background var(--bayan-transition);
|
| 482 |
}
|
| 483 |
.bayan-punctuation-suggestion:hover {
|
| 484 |
+
background: rgba(107, 201, 138, 0.28);
|
| 485 |
}
|
| 486 |
|
| 487 |
/* ══════════════════════════════════════════════
|
|
|
|
| 556 |
color: var(--bayan-grammar);
|
| 557 |
}
|
| 558 |
.bayan-badge-punctuation {
|
| 559 |
+
background: rgba(107, 201, 138, 0.15);
|
| 560 |
color: var(--bayan-punctuation);
|
| 561 |
}
|
| 562 |
|
extension/popup.html
CHANGED
|
@@ -35,7 +35,7 @@
|
|
| 35 |
</button>
|
| 36 |
<button class="bayan-tab" role="tab" aria-selected="false" data-tab="dialect" id="tab-dialect">
|
| 37 |
<svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129"/></svg>
|
| 38 |
-
ل
|
| 39 |
</button>
|
| 40 |
<button class="bayan-tab" role="tab" aria-selected="false" data-tab="quran" id="tab-quran">
|
| 41 |
<svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg>
|
|
@@ -195,7 +195,7 @@
|
|
| 195 |
<div class="bayan-actions">
|
| 196 |
<button class="bayan-btn bayan-btn-primary" id="btn-dialect" type="button">
|
| 197 |
<svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"/></svg>
|
| 198 |
-
تحويل
|
| 199 |
</button>
|
| 200 |
</div>
|
| 201 |
<div class="bayan-result is-hidden" id="dialect-result-section">
|
|
|
|
| 35 |
</button>
|
| 36 |
<button class="bayan-tab" role="tab" aria-selected="false" data-tab="dialect" id="tab-dialect">
|
| 37 |
<svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129"/></svg>
|
| 38 |
+
تحويل للفصحى
|
| 39 |
</button>
|
| 40 |
<button class="bayan-tab" role="tab" aria-selected="false" data-tab="quran" id="tab-quran">
|
| 41 |
<svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg>
|
|
|
|
| 195 |
<div class="bayan-actions">
|
| 196 |
<button class="bayan-btn bayan-btn-primary" id="btn-dialect" type="button">
|
| 197 |
<svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"/></svg>
|
| 198 |
+
تحويل للفصحى
|
| 199 |
</button>
|
| 200 |
</div>
|
| 201 |
<div class="bayan-result is-hidden" id="dialect-result-section">
|
extension/sidepanel/sidepanel.css
CHANGED
|
@@ -27,7 +27,7 @@
|
|
| 27 |
|
| 28 |
--sp-spelling: #ef4444;
|
| 29 |
--sp-grammar: #f59e0b;
|
| 30 |
-
--sp-punctuation: #
|
| 31 |
|
| 32 |
--sp-radius: 10px;
|
| 33 |
--sp-radius-sm: 6px;
|
|
@@ -439,7 +439,7 @@ body {
|
|
| 439 |
cursor: pointer;
|
| 440 |
}
|
| 441 |
.bayan-punctuation-suggestion {
|
| 442 |
-
background: rgba(
|
| 443 |
border-bottom: 2px solid var(--sp-punctuation);
|
| 444 |
padding: 0 2px;
|
| 445 |
border-radius: 2px;
|
|
@@ -504,7 +504,7 @@ body {
|
|
| 504 |
}
|
| 505 |
.bayan-badge-spelling { background: rgba(239, 68, 68, 0.15); color: var(--sp-spelling); }
|
| 506 |
.bayan-badge-grammar { background: rgba(245, 158, 11, 0.15); color: var(--sp-grammar); }
|
| 507 |
-
.bayan-badge-punctuation { background: rgba(
|
| 508 |
|
| 509 |
.bayan-suggestion-change {
|
| 510 |
display: flex;
|
|
|
|
| 27 |
|
| 28 |
--sp-spelling: #ef4444;
|
| 29 |
--sp-grammar: #f59e0b;
|
| 30 |
+
--sp-punctuation: #6BC98A;
|
| 31 |
|
| 32 |
--sp-radius: 10px;
|
| 33 |
--sp-radius-sm: 6px;
|
|
|
|
| 439 |
cursor: pointer;
|
| 440 |
}
|
| 441 |
.bayan-punctuation-suggestion {
|
| 442 |
+
background: rgba(107, 201, 138, 0.14);
|
| 443 |
border-bottom: 2px solid var(--sp-punctuation);
|
| 444 |
padding: 0 2px;
|
| 445 |
border-radius: 2px;
|
|
|
|
| 504 |
}
|
| 505 |
.bayan-badge-spelling { background: rgba(239, 68, 68, 0.15); color: var(--sp-spelling); }
|
| 506 |
.bayan-badge-grammar { background: rgba(245, 158, 11, 0.15); color: var(--sp-grammar); }
|
| 507 |
+
.bayan-badge-punctuation { background: rgba(107, 201, 138, 0.15); color: var(--sp-punctuation); }
|
| 508 |
|
| 509 |
.bayan-suggestion-change {
|
| 510 |
display: flex;
|
extension/sidepanel/sidepanel.html
CHANGED
|
@@ -35,7 +35,7 @@
|
|
| 35 |
</button>
|
| 36 |
<button class="sp-tab" role="tab" aria-selected="false" data-tab="dialect" id="tab-dialect">
|
| 37 |
<svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129"/></svg>
|
| 38 |
-
ل
|
| 39 |
</button>
|
| 40 |
<button class="sp-tab" role="tab" aria-selected="false" data-tab="quran" id="tab-quran">
|
| 41 |
<svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg>
|
|
@@ -193,7 +193,7 @@
|
|
| 193 |
<div class="sp-actions">
|
| 194 |
<button class="sp-btn sp-btn-primary" id="btn-dialect">
|
| 195 |
<svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"/></svg>
|
| 196 |
-
تحويل
|
| 197 |
</button>
|
| 198 |
</div>
|
| 199 |
<div class="sp-result is-hidden" id="dialect-result-section">
|
|
|
|
| 35 |
</button>
|
| 36 |
<button class="sp-tab" role="tab" aria-selected="false" data-tab="dialect" id="tab-dialect">
|
| 37 |
<svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129"/></svg>
|
| 38 |
+
تحويل للفصحى
|
| 39 |
</button>
|
| 40 |
<button class="sp-tab" role="tab" aria-selected="false" data-tab="quran" id="tab-quran">
|
| 41 |
<svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg>
|
|
|
|
| 193 |
<div class="sp-actions">
|
| 194 |
<button class="sp-btn sp-btn-primary" id="btn-dialect">
|
| 195 |
<svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"/></svg>
|
| 196 |
+
تحويل للفصحى
|
| 197 |
</button>
|
| 198 |
</div>
|
| 199 |
<div class="sp-result is-hidden" id="dialect-result-section">
|
generate_icons.py
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Generate extension icons from LOGOS/1.png (gradient bg for best small-size visibility)."""
|
| 2 |
+
from PIL import Image
|
| 3 |
+
|
| 4 |
+
img = Image.open("LOGOS/1.png")
|
| 5 |
+
for size in [16, 32, 48, 128]:
|
| 6 |
+
img.resize((size, size), Image.LANCZOS).save(f"extension/assets/icons/icon{size}.png")
|
| 7 |
+
print(f"Generated icon{size}.png ({size}x{size}) from LOGOS/1.png")
|
| 8 |
+
print("Done!")
|
src/index.html
CHANGED
|
@@ -7,12 +7,12 @@
|
|
| 7 |
<meta name="supabase-anon-key" content="">
|
| 8 |
<title>بيان - مساعد الكتابة العربية الذكي</title>
|
| 9 |
<meta name="description" content="بيان — منصة ذكاء اصطناعي متكاملة لتصحيح الإملاء والنحو والترقيم وتلخيص النصوص والإكمال التلقائي وتدقيق القرآن الكريم وتحويل اللهجات — مصمّمة خصيصًا للغة العربية. جرّبه مجاناً!">
|
| 10 |
-
<meta property="og:image" content="/
|
| 11 |
<meta property="og:title" content="بيان — مساعدك الذكي للكتابة بالعربية">
|
| 12 |
<meta property="og:description" content="تدقيق إملائي ونحوي وترقيم، تلخيص ذكي، إكمال تلقائي، تدقيق القرآن الكريم، وتحويل اللهجات">
|
| 13 |
<meta name="twitter:card" content="summary_large_image">
|
| 14 |
-
<meta name="twitter:image" content="/
|
| 15 |
-
<link rel="icon" type="image/png" href="/
|
| 16 |
<script src="https://cdn.tailwindcss.com"></script>
|
| 17 |
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 18 |
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
@@ -64,7 +64,7 @@
|
|
| 64 |
<button id="mobile-menu-btn" class="mobile-menu-btn md:hidden" aria-label="فتح القائمة" aria-expanded="false" aria-controls="mobile-drawer">
|
| 65 |
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/></svg>
|
| 66 |
</button>
|
| 67 |
-
<button onclick="showPage('home')" class="flex items-center gap-3" style="background:none;border:none;cursor:pointer;" aria-label="الرئيسية"><img src="/
|
| 68 |
</div>
|
| 69 |
<div class="hidden md:flex items-center gap-8">
|
| 70 |
<button onclick="showPage('home')" class="nav-link active text-base font-medium" data-page="home">الرئيسية</button>
|
|
@@ -1159,7 +1159,7 @@
|
|
| 1159 |
<div class="grid grid-cols-1 md:grid-cols-3 gap-12 mb-12" dir="rtl">
|
| 1160 |
<div>
|
| 1161 |
<div class="flex items-center gap-3 mb-4">
|
| 1162 |
-
<img src="/
|
| 1163 |
</div>
|
| 1164 |
<p class="text-sm leading-relaxed" style="color: var(--text-secondary); line-height: 1.8;">منصة ذكاء اصطناعي للكتابة العربية — تدقيق إملائي ونحوي، ترقيم، تلخيص، إكمال تلقائي، تدقيق القرآن، وتحويل اللهجات.</p>
|
| 1165 |
</div>
|
|
|
|
| 7 |
<meta name="supabase-anon-key" content="">
|
| 8 |
<title>بيان - مساعد الكتابة العربية الذكي</title>
|
| 9 |
<meta name="description" content="بيان — منصة ذكاء اصطناعي متكاملة لتصحيح الإملاء والنحو والترقيم وتلخيص النصوص والإكمال التلقائي وتدقيق القرآن الكريم وتحويل اللهجات — مصمّمة خصيصًا للغة العربية. جرّبه مجاناً!">
|
| 10 |
+
<meta property="og:image" content="/logos/logo-banner.png">
|
| 11 |
<meta property="og:title" content="بيان — مساعدك الذكي للكتابة بالعربية">
|
| 12 |
<meta property="og:description" content="تدقيق إملائي ونحوي وترقيم، تلخيص ذكي، إكمال تلقائي، تدقيق القرآن الكريم، وتحويل اللهجات">
|
| 13 |
<meta name="twitter:card" content="summary_large_image">
|
| 14 |
+
<meta name="twitter:image" content="/logos/logo-banner.png">
|
| 15 |
+
<link rel="icon" type="image/png" href="/logos/logo-icon.png">
|
| 16 |
<script src="https://cdn.tailwindcss.com"></script>
|
| 17 |
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 18 |
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
|
|
| 64 |
<button id="mobile-menu-btn" class="mobile-menu-btn md:hidden" aria-label="فتح القائمة" aria-expanded="false" aria-controls="mobile-drawer">
|
| 65 |
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/></svg>
|
| 66 |
</button>
|
| 67 |
+
<button onclick="showPage('home')" class="flex items-center gap-3" style="background:none;border:none;cursor:pointer;" aria-label="الرئيسية"><img src="/logos/logo-transparent.png" alt="بيان" width="28" height="28" style="flex-shrink:0;"><span id="nav-brand" class="text-xl md:text-2xl font-bold text-gradient">بيان</span></button>
|
| 68 |
</div>
|
| 69 |
<div class="hidden md:flex items-center gap-8">
|
| 70 |
<button onclick="showPage('home')" class="nav-link active text-base font-medium" data-page="home">الرئيسية</button>
|
|
|
|
| 1159 |
<div class="grid grid-cols-1 md:grid-cols-3 gap-12 mb-12" dir="rtl">
|
| 1160 |
<div>
|
| 1161 |
<div class="flex items-center gap-3 mb-4">
|
| 1162 |
+
<img src="/logos/logo-transparent.png" alt="بيان" width="28" height="28" style="flex-shrink:0;"><span id="footer-brand" class="text-2xl font-bold text-gradient">بيان</span>
|
| 1163 |
</div>
|
| 1164 |
<p class="text-sm leading-relaxed" style="color: var(--text-secondary); line-height: 1.8;">منصة ذكاء اصطناعي للكتابة العربية — تدقيق إملائي ونحوي، ترقيم، تلخيص، إكمال تلقائي، تدقيق القرآن، وتحويل اللهجات.</p>
|
| 1165 |
</div>
|
tests/phase10/reports/phase10_results.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|