Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
ff98df6
feat: detect language and change direction
raizasafeel Apr 1, 2026
453862a
chore(deps): bump frappe-ui to v.0.1.275 for rtl support
raizasafeel Apr 10, 2026
1f040c4
refactor: jobs list and form ui
pateljannat Apr 10, 2026
2ebb6ca
refactor: job applications list
pateljannat Apr 10, 2026
c7ccb2d
refactor: certified participants list
pateljannat Apr 10, 2026
af08e68
fix: list pagination
pateljannat Apr 10, 2026
19cb56c
chore: update POT file
frappe-pr-bot Apr 10, 2026
f5b1fea
Merge pull request #2304 from frappe/pot_develop_2026-04-10
pateljannat Apr 11, 2026
ec5e45e
fix: mobile view of lists
pateljannat Apr 11, 2026
411b400
fix: quiz scroll issue in lessons
pateljannat Apr 11, 2026
dc4f188
fix: certified participants page height
pateljannat Apr 11, 2026
04fe735
Merge pull request #2308 from pateljannat/misc-issues
pateljannat Apr 11, 2026
88e86e6
fix: page length for jobs and certification listing
pateljannat Apr 12, 2026
fa94e5f
refactor(pages): swap tailwindcss classes with ones with rtl support
raizasafeel Apr 10, 2026
c5236b2
refactor(components): swap tailwindcss classes with ones with rtl sup…
raizasafeel Apr 10, 2026
aec9556
feat: sidebar toggle icon adjusts to text direction
raizasafeel Apr 10, 2026
3e05dce
feat(lesson): add rtl support
raizasafeel Apr 12, 2026
8b39301
feat: add rtl support to icons, css styles
raizasafeel Apr 13, 2026
cb5d19e
Merge remote-tracking branch 'upstream/develop' into feat/rtl
raizasafeel Apr 13, 2026
f891f72
feat: rtl support for dates
raizasafeel Apr 13, 2026
4278361
fix: prevent breaking of batch time in rtl
raizasafeel Apr 13, 2026
5de889c
fix: render dayjs import properly
raizasafeel Apr 13, 2026
07e9b62
chore: bump frappe-ui to v.0.1.276 for rtl support
raizasafeel Apr 13, 2026
aed4c69
refactor: swap remaining physical tailwind classes for rtl-safe equiv…
raizasafeel Apr 14, 2026
0838a9d
Merge pull request #2310 from raizasafeel/feat/rtl
raizasafeel Apr 14, 2026
bc13976
feat: add empty state to batch student progress detail
raizasafeel Apr 14, 2026
46c24b1
fix: admin roles can enroll students in course/batch successfully
raizasafeel Apr 14, 2026
2b1df68
Merge branch 'frappe:develop' into fix/misc
raizasafeel Apr 14, 2026
189cae3
Merge pull request #2311 from raizasafeel/fix
raizasafeel Apr 14, 2026
2878f02
fix: allow None for optional args in get_payment_link
raizasafeel Apr 15, 2026
70a9ee1
Merge pull request #2314 from raizasafeel/fix/types
raizasafeel Apr 15, 2026
d559515
fix: allow None for optional args in get_order_summary
raizasafeel Apr 15, 2026
193374d
Merge branch 'frappe:develop' into fix/types
raizasafeel Apr 15, 2026
0fe8d3a
Merge pull request #2315 from raizasafeel/fix/types
raizasafeel Apr 15, 2026
d94d08f
chore: update POT file
frappe-pr-bot Apr 17, 2026
8db8fd4
Merge pull request #2319 from frappe/pot_develop_2026-04-17
raizasafeel Apr 18, 2026
c082f1d
feat: on chapter completion continue learning takes you to next chapter
raizasafeel Apr 20, 2026
80b802a
fix: render styles properly in text editor for batchform and courseform
raizasafeel Apr 20, 2026
79d5da7
fix: show job count on jobs listing for guest users
raizasafeel Apr 22, 2026
e3e4b9a
Merge branch 'frappe:develop' into fix/loading-state
raizasafeel Apr 22, 2026
dc6e326
fix: tab navigation to closed jobs
raizasafeel Apr 22, 2026
23996da
Merge pull request #2322 from raizasafeel/fix/text-editor
raizasafeel Apr 22, 2026
e4e6f04
Merge pull request #2321 from raizasafeel/chapter-progression
raizasafeel Apr 22, 2026
bb5e277
Merge pull request #2325 from raizasafeel/fix/loading-state
raizasafeel Apr 22, 2026
aea1059
chore: update POT file
frappe-pr-bot Apr 24, 2026
371b766
Merge pull request #2330 from frappe/pot_develop_2026-04-24
raizasafeel Apr 27, 2026
56eb556
fix(patches): stale imports breaking bench migrate
raizasafeel Apr 29, 2026
65f4cde
test: fix closeOnboardingModal to reliably close the modal
raizasafeel Apr 29, 2026
e25b7c6
test: refactor batch and course creation ui tests
raizasafeel Apr 29, 2026
7c46d8b
Merge pull request #2337 from raizasafeel/fix/ui-test
raizasafeel Apr 29, 2026
7fecbe5
fix: update notification count on sidebar after they are read
raizasafeel Apr 29, 2026
8cff1cf
fix: render notification count even after sidebar rebuilds
raizasafeel Apr 29, 2026
08794c2
Merge pull request #2336 from raizasafeel/fix/patches
raizasafeel Apr 29, 2026
ad1f516
Merge pull request #2338 from raizasafeel/fix/notification
raizasafeel Apr 29, 2026
1e7da9b
chore(deps): update build env deps
raizasafeel Apr 30, 2026
e702853
Merge pull request #2339 from raizasafeel/chore-deps
raizasafeel Apr 30, 2026
e3e19c6
fix: sidebar_for_certified_members patch
raizasafeel Apr 30, 2026
eff914c
Merge pull request #2342 from raizasafeel/fix/patches
raizasafeel Apr 30, 2026
47b5b60
fix(lesson): sanitize lesson server side
raizasafeel Apr 30, 2026
07ca95c
fix(lesson): sanitize lesson server side
raizasafeel Apr 30, 2026
ad037e5
fix(lesson): sanitize lesson client side
raizasafeel Apr 30, 2026
3bb7f51
docs: updated readme to include instructions for payments app
pateljannat May 1, 2026
5e18ba3
Merge pull request #2346 from frappe/readme-payments-app
pateljannat May 1, 2026
6e57e24
chore: update POT file
frappe-pr-bot May 1, 2026
ee9c460
Merge pull request #2344 from raizasafeel/security
raizasafeel May 1, 2026
1b13f20
Merge pull request #2347 from frappe/pot_develop_2026-05-01
raizasafeel May 3, 2026
ffbe3d6
chore: add hindi translation
raizasafeel May 3, 2026
6211c50
Merge pull request #2351 from raizasafeel/chore/translate
raizasafeel May 3, 2026
c2a4ef6
chore: add payments in pyproject for auto install
raizasafeel May 5, 2026
0fa4dd7
Merge pull request #2354 from raizasafeel/chore/dependency
raizasafeel May 6, 2026
553367f
fix: use before_insert to assign student role to preserve password
raizasafeel May 6, 2026
efdff1c
Merge pull request #2363 from raizasafeel/fix/user
raizasafeel May 6, 2026
b72dd16
fix: set proper payments version in frappe dependencies
raizasafeel May 6, 2026
eb6e37c
Merge pull request #2365 from raizasafeel/fix/dependency
raizasafeel May 6, 2026
a85e484
refactor: consolidate layouts under components/Layouts/
raizasafeel May 6, 2026
09bace5
feat(settings): add empty states to settings panels
raizasafeel May 6, 2026
1c1ab38
Merge pull request #2367 from raizasafeel/ui-teardown
raizasafeel May 7, 2026
1207b01
fix: timezone now renders for courses and batches
raizasafeel May 8, 2026
335c8cc
chore: update POT file
frappe-pr-bot May 8, 2026
acc2544
fix: keep only active course chapter expanded
musaabhasan May 9, 2026
e405e11
Merge pull request #2370 from frappe/pot_develop_2026-05-08
raizasafeel May 11, 2026
90a6cde
chore: add rtl semgrep to identify tailwindcss physical classes
raizasafeel May 11, 2026
c6350c3
Merge pull request #2375 from raizasafeel/chore/rtl-semgrep
raizasafeel May 11, 2026
6e9660b
Merge pull request #2376 from raizasafeel/fix/notification
raizasafeel May 11, 2026
cfef062
Merge pull request #2372 from musaabhasan/fix/course-outline-active-c…
raizasafeel May 11, 2026
308a926
fix: user roles are removed on uninstall
raizasafeel May 11, 2026
8b06742
Merge pull request #2377 from raizasafeel/fix/bug
raizasafeel May 11, 2026
34d8350
fix: user input questions now renders in quiz results
raizasafeel May 11, 2026
6654a10
Merge branch 'frappe:develop' into fix/bug
raizasafeel May 11, 2026
eaf7613
Merge pull request #2378 from raizasafeel/fix/bug
raizasafeel May 11, 2026
8a9319b
fix: meta image uploads successfully
raizasafeel May 11, 2026
bf83543
Merge branch 'frappe:develop' into fix/bug
raizasafeel May 11, 2026
f7ce708
Merge pull request #2380 from raizasafeel/fix/bug
raizasafeel May 11, 2026
4e5c3d8
perf(lms): move course outline and lesson endpoints to use qb
raizasafeel May 12, 2026
3fa55f6
fix(lesson): handle lessons with no editor content
raizasafeel May 12, 2026
5d25450
Merge pull request #2381 from raizasafeel/fix/performance
raizasafeel May 12, 2026
8943db0
fix: recalculate enrollment on course progress save from desk
raizasafeel May 12, 2026
919f92a
Merge branch 'frappe:develop' into fix/bug
raizasafeel May 12, 2026
12fa7ac
Merge pull request #2382 from raizasafeel/fix/bug
raizasafeel May 12, 2026
1893544
fix: cloudflare/bunny embeds auto-complete after 30s
raizasafeel May 12, 2026
629a6ee
fix(quiz): unauthorised roles are restricted from viewing quiz results
raizasafeel May 12, 2026
538edbb
fix(quiz): save current answer before submitting exam-mode quiz
raizasafeel May 12, 2026
e6599a8
Merge pull request #2383 from raizasafeel/fix/security
raizasafeel May 12, 2026
5e9d559
fix: persona alignment
raizasafeel May 12, 2026
876504f
fix(quiz): block direct create/write on LMS Quiz Submission
raizasafeel May 13, 2026
c5f7d05
fix: persona options are now translated
raizasafeel May 12, 2026
a8dcc43
refactor: changed create button style to be consistent
raizasafeel May 13, 2026
bd49f89
fix(ui): footer is consistent across all pages
raizasafeel May 13, 2026
57420db
refactor(header): refactored all pages to use same layoutheader compo…
raizasafeel May 13, 2026
ffc6f37
refactor(ui): layout alignment, replace form control with select and …
raizasafeel May 13, 2026
5b1b770
fix(ui): sidebar more chevron transition
raizasafeel May 13, 2026
1dcc773
Merge pull request #2388 from raizasafeel/fix/ui
raizasafeel May 13, 2026
7af6997
Merge branch 'frappe:develop' into fix/bug
raizasafeel May 14, 2026
debd72c
Merge branch 'frappe:develop' into fix/security
raizasafeel May 14, 2026
2590533
Merge pull request #2394 from raizasafeel/fix/bug
raizasafeel May 14, 2026
4ba4c0b
Merge pull request #2395 from raizasafeel/fix/security
raizasafeel May 14, 2026
6b32c65
Merge remote-tracking branch 'upstream/develop' into sync/develop-int…
raizasafeel May 14, 2026
26c1de1
Merge upstream/main-hotfix into sync/develop-into-main-hotfix
raizasafeel May 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .github/semgrep/tailwind-rtl.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Local run: semgrep scan --config .github/semgrep/tailwind-rtl.yml --metrics off .
rules:
- id: tailwind-physical-class
message: |
RTL: replace physical Tailwind class with logical equivalent.
languages: [generic]
severity: WARNING
paths: { include: ["*.vue"] }
pattern-regex: |
(?x)
(?:^|[\s'"`{(\[,]) !?(?:[a-z][a-z0-9-]*:)*-?
(?:
(?:scroll-)?[mp][lr]-(?:auto|px|full|\d+(?:[./]\d+)?|\[[^\]]+\])
| (?:left|right)-(?:auto|px|full|\d+(?:[./]\d+)?|\[[^\]]+\])
| text-(?:left|right)
| float-(?:left|right)
| clear-(?:left|right)
| (?:border|rounded)-[lr](?:-[A-Za-z0-9\[\]./#%_-]+)?
| rounded-(?:tl|tr|bl|br)(?:-[A-Za-z0-9\[\]./#%_-]+)?
| space-x-(?:auto|px|reverse|\d+(?:[./]\d+)?|\[[^\]]+\])
)
!? (?=$|[\s'"`})\],>;])
5 changes: 4 additions & 1 deletion .github/workflows/linters.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,7 @@ jobs:
run: pip install semgrep

- name: Run Semgrep rules
run: semgrep ci --config ./frappe-semgrep-rules/rules
run: semgrep ci --config ./frappe-semgrep-rules/rules

- name: Run RTL Semgrep rules
run: semgrep scan --config ./.github/semgrep/tailwind-rtl.yml
18 changes: 13 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,11 +152,19 @@ You need Docker, docker-compose and git setup on your machine. Refer [Docker doc
To setup the repository locally follow the steps mentioned below:

1. Install bench and setup a `frappe-bench` directory by following the [Installation Steps](https://frappeframework.com/docs/user/en/installation)
1. Start the server by running `bench start`
1. In a separate terminal window, create a new site by running `bench new-site learning.test`
1. Map your site to localhost with the command `bench --site learning.test add-to-hosts`
1. Get the Learning app. Run `bench get-app https://github.com/frappe/lms`
1. Run `bench --site learning.test install-app lms`.
1. Start the server by running
```sh
$ bench start
```
1. In a separate terminal window, run the following commands.
```sh
$ bench new-site learning.test
$ bench --site learning.test add-to-hosts
$ bench get-app https://github.com/frappe/payments
$ bench get-app https://github.com/frappe/lms
$ bench --site learning.test install-app lms

```
1. Now open the URL `http://learning.test:8000/lms` in your browser, you should see the app running

## Learn and connect
Expand Down
32 changes: 21 additions & 11 deletions cypress/e2e/batch_creation.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ describe("Batch Creation", () => {

// Open Settings
cy.get("span").contains("Learning").click();
cy.get("span").contains("Settings").click();
cy.contains('[role="menuitem"]', "Settings").click();

// Add a new member
cy.get("[data-dismissable-layer]")
Expand Down Expand Up @@ -38,7 +38,7 @@ describe("Batch Creation", () => {
.find("button")
.contains("New")
.click();
cy.get("span").contains("New Evaluator").click();
cy.contains('[role="menuitem"]', "New Evaluator").click();

const randomEvaluator = `evaluator${dateNow}@example.com`;
cy.get("input[placeholder='jane@doe.com']").type(randomEvaluator);
Expand All @@ -52,7 +52,7 @@ describe("Batch Creation", () => {

// Create a batch
cy.get("button").contains("Create").click();
cy.get("span").contains("New Batch").click();
cy.contains('[role="menuitem"]', "New Batch").click();
cy.wait(500);
cy.get("label").contains("Title").type("Test Batch");
cy.get("label").contains("Start Date").type("2030-10-01");
Expand All @@ -65,7 +65,7 @@ describe("Batch Creation", () => {
cy.get("label")
.contains("Description")
.type("Test Batch Short Description to test the UI");
cy.get("div[contenteditable=true").invoke(
cy.get("div.ProseMirror").invoke(
"text",
"Test Batch Description. I need a very big description to test the UI. This is a very big description. It contains more than once sentence. Its meant to be this long as this is a UI test. Its unbearably long and I'm not sure why I'm typing this much. I'm just going to keep typing until I feel like its long enough. I think its long enough now. I'm going to stop typing now."
);
Expand All @@ -74,7 +74,7 @@ describe("Batch Creation", () => {
.contains("Instructors")
.parent()
.within(() => {
cy.get("input").click().type("evaluator");
cy.get("input").click().clear().type(randomEvaluator);
cy.get("input")
.invoke("attr", "aria-controls")
.as("instructor_list_id");
Expand All @@ -87,7 +87,20 @@ describe("Batch Creation", () => {
});
});
cy.button("Save").click();
cy.get("label").contains("Published").click();
cy.wait(1000);

// going to batch settings and publishing the batch
cy.url().should("include", "#settings");
cy.closeOnboardingModal();
cy.contains("label", "Published")
.invoke("attr", "for")
.then((id) => {
cy.get(`#${id}`)
.scrollIntoView()
.should("be.visible")
.click({ force: true });
cy.get(`#${id}`).should("have.attr", "aria-checked", "true");
});
cy.button("Save").click();
cy.wait(1000);
let batchName;
Expand All @@ -105,11 +118,7 @@ describe("Batch Creation", () => {

cy.url().should("include", "/lms/batches");

cy.get('[id^="headlessui-radiogroup-v-"]')
.find("span")
.contains("Upcoming")
.should("be.visible")
.click();
cy.contains('[role="radio"]', "Upcoming").should("be.visible").click();

cy.get("@batchName").then((batchName) => {
cy.get(`a[href='/lms/batches/${batchName}'`).within(() => {
Expand Down Expand Up @@ -154,6 +163,7 @@ describe("Batch Creation", () => {
cy.get("button:visible").contains("Dashboard").click();

/* Add student to batch */
cy.closeOnboardingModal();
cy.get("button").contains("Enroll").click();
cy.get('div[role="dialog"]')
.first()
Expand Down
12 changes: 6 additions & 6 deletions cypress/e2e/course_creation.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ describe("Course Creation", () => {

// Create a course
cy.get("button").contains("Create").click();
cy.get("span").contains("New Course").click();
cy.contains('[role="menuitem"]', "New Course").click();
cy.wait(500);

cy.get("label").contains("Title").type("Test Course");
cy.get("label")
.contains("Short Introduction")
.type("Test Course Short Introduction to test the UI");
cy.get("div[contenteditable=true").invoke(
cy.get("div.ProseMirror").invoke(
"text",
"Test Course Description. I need a very big description to test the UI. This is a very big description. It contains more than once sentence. Its meant to be this long as this is a UI test. Its unbearably long and I'm not sure why I'm typing this much. I'm just going to keep typing until I feel like its long enough. I think its long enough now. I'm going to stop typing now."
);
Expand Down Expand Up @@ -61,7 +61,7 @@ describe("Course Creation", () => {
});

cy.button("Save").last().click();

cy.closeOnboardingModal();
// Edit Course Details
cy.wait(500);
cy.get("label")
Expand Down Expand Up @@ -153,7 +153,7 @@ describe("Course Creation", () => {
cy.wait(500);
cy.get("[data-dismissable-layer]").within(() => {
cy.get("label").contains("Title").type("Test Discussion");
cy.get("div[contenteditable=true]").invoke(
cy.get("div.ProseMirror").invoke(
"text",
"This is a test discussion. This will check if the UI is working properly."
);
Expand All @@ -163,7 +163,7 @@ describe("Course Creation", () => {
// View Discussion
cy.wait(500);
cy.get("div").contains("Test Discussion").click();
cy.get("div[contenteditable=true").invoke(
cy.get("div.ProseMirror").invoke(
"text",
"This is a test comment. This will check if the UI is working properly."
);
Expand All @@ -179,7 +179,7 @@ describe("Course Creation", () => {
cy.get("svg.lucide.lucide-ellipsis-icon").click();
});
cy.get("div[role=menu]").within(() => {
cy.get("span").contains("Delete").click();
cy.contains('[role="menuitem"]', "Delete").click();
});
cy.get("span").contains("Delete").click();
cy.wait(500);
Expand Down
20 changes: 12 additions & 8 deletions cypress/support/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,19 @@ Cypress.Commands.add("paste", { prevSubject: true }, (subject, text) => {

Cypress.Commands.add("closeOnboardingModal", () => {
cy.wait(500);
const modalSelector = '[data-testid="onboarding-help-modal"]';
cy.get("body").then(($body) => {
// Check if any element with class including 'z-50' exists
if ($body.find('[class*="z-50"]').length > 0) {
cy.get('[class*="z-50"]')
.find('button:has(svg[class*="feather-x"])')
.realClick();
cy.wait(1000);
} else {
cy.log("Onboarding modal not found, skipping close.");
if (!$body.find(modalSelector).length) {
cy.log("Onboarding modal not present, skipping close.");
return;
}

// Skip onboarding steps if the button exists, otherwise just close the modal.
if ($body.find(`${modalSelector} button:contains("Skip all")`).length) {
cy.get(modalSelector).contains("button", "Skip all").click();
}

cy.get(modalSelector).find("button:has(svg.feather-x)").click();
cy.get(modalSelector).should("not.exist");
});
});
9 changes: 5 additions & 4 deletions frontend/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,15 @@ declare module 'vue' {
CourseReviews: typeof import('./src/components/CourseReviews.vue')['default']
CreateOutline: typeof import('./src/components/CreateOutline.vue')['default']
DateRange: typeof import('./src/components/Common/DateRange.vue')['default']
DesktopLayout: typeof import('./src/components/DesktopLayout.vue')['default']
DesktopLayout: typeof import('./src/components/Layouts/DesktopLayout.vue')['default']
DiscussionModal: typeof import('./src/components/Modals/DiscussionModal.vue')['default']
DiscussionReplies: typeof import('./src/components/DiscussionReplies.vue')['default']
Discussions: typeof import('./src/components/Discussions.vue')['default']
EditCoverImage: typeof import('./src/components/Modals/EditCoverImage.vue')['default']
EditProfile: typeof import('./src/components/Modals/EditProfile.vue')['default']
EmailTemplateModal: typeof import('./src/components/Modals/EmailTemplateModal.vue')['default']
EmailTemplates: typeof import('./src/components/Settings/EmailTemplates.vue')['default']
EmptyState: typeof import('./src/components/EmptyState.vue')['default']
EmptyStateLayout: typeof import('./src/components/Layouts/EmptyStateLayout.vue')['default']
EvaluationModal: typeof import('./src/components/Modals/EvaluationModal.vue')['default']
Evaluators: typeof import('./src/components/Settings/Evaluators.vue')['default']
Event: typeof import('./src/components/Modals/Event.vue')['default']
Expand All @@ -70,18 +70,19 @@ declare module 'vue' {
InviteIcon: typeof import('./src/components/Icons/InviteIcon.vue')['default']
JobApplicationModal: typeof import('./src/components/Modals/JobApplicationModal.vue')['default']
JobCard: typeof import('./src/components/JobCard.vue')['default']
LayoutHeader: typeof import('./src/components/Layouts/LayoutHeader.vue')['default']
LessonContent: typeof import('./src/components/LessonContent.vue')['default']
LessonHelp: typeof import('./src/components/LessonHelp.vue')['default']
Link: typeof import('./src/components/Controls/Link.vue')['default']
LiveClassAttendance: typeof import('./src/components/Modals/LiveClassAttendance.vue')['default']
LiveClassModal: typeof import('./src/components/Modals/LiveClassModal.vue')['default']
LMSLogo: typeof import('./src/components/Icons/LMSLogo.vue')['default']
Members: typeof import('./src/components/Settings/Members.vue')['default']
MobileLayout: typeof import('./src/components/MobileLayout.vue')['default']
MobileLayout: typeof import('./src/components/Layouts/MobileLayout.vue')['default']
MultiSelect: typeof import('./src/components/Controls/MultiSelect.vue')['default']
NewMemberModal: typeof import('./src/components/Modals/NewMemberModal.vue')['default']
NoPermission: typeof import('./src/components/NoPermission.vue')['default']
NoSidebarLayout: typeof import('./src/components/NoSidebarLayout.vue')['default']
NoSidebarLayout: typeof import('./src/components/Layouts/NoSidebarLayout.vue')['default']
Notes: typeof import('./src/components/Notes/Notes.vue')['default']
NotPermitted: typeof import('./src/components/NotPermitted.vue')['default']
NumberChartGraph: typeof import('./src/components/NumberChartGraph.vue')['default']
Expand Down
2 changes: 1 addition & 1 deletion frontend/index.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="{{ boot.lang }}" dir="{{ boot.text_direction }}">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="{{ favicon }}" />
Expand Down
4 changes: 2 additions & 2 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"dayjs": "1.11.10",
"dompurify": "3.2.6",
"feather-icons": "4.28.0",
"frappe-ui": "^0.1.264",
"frappe-ui": "^0.1.276",
"highlight.js": "11.11.1",
"lucide-vue-next": "0.383.0",
"markdown-it": "14.0.0",
Expand All @@ -49,7 +49,7 @@
"vuedraggable": "4.1.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "5.0.3",
"@vitejs/plugin-vue": "5.0.3",
"autoprefixer": "10.4.2",
"postcss": "8.4.5",
"tailwindcss": "^3.4.15",
Expand Down
8 changes: 4 additions & 4 deletions frontend/src/components/Assignment.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
:class="{ 'border rounded-lg overflow-auto': !showTitle }"
>
<div
class="border-r p-5 overflow-y-auto h-[calc(100vh-3.2rem)]"
class="border-e p-5 overflow-y-auto h-[calc(100vh-3.2rem)]"
:class="{ 'h-full': !showTitle }"
>
<div v-if="showTitle" class="text-lg font-semibold mb-5 text-ink-gray-9">
Expand All @@ -31,7 +31,7 @@
<div class="font-semibold text-ink-gray-9">
{{ __('Submission') }}
</div>
<div class="flex items-center space-x-2">
<div class="flex items-center gap-x-2">
<Badge v-if="isDirty" theme="orange">
{{ __('Not Saved') }}
</Badge>
Expand Down Expand Up @@ -106,7 +106,7 @@
class="cursor-pointer !no-underline text-sm leading-5"
>
<div class="flex items-center">
<div class="border rounded-md p-2 mr-2">
<div class="border rounded-md p-2 me-2">
<FileText class="h-5 w-5 stroke-1.5" />
</div>
<span>
Expand All @@ -117,7 +117,7 @@
<X
v-if="canModifyAssignment"
@click="removeSubmission()"
class="bg-surface-gray-3 rounded-md cursor-pointer stroke-1.5 w-5 h-5 p-1 ml-4"
class="bg-surface-gray-3 rounded-md cursor-pointer stroke-1.5 w-5 h-5 p-1 ms-4"
/>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/AudioBlock.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<audio @ended="handleAudioEnd" controlsList="nodownload" class="mb-4">
<source :src="encodeURI(file)" type="audio/mp3" />
</audio>
<div class="flex items-center space-x-2 shadow rounded-lg p-1 w-1/2">
<div class="flex items-center gap-x-2 shadow rounded-lg p-1 w-1/2">
<Button variant="ghost" @click="togglePlay">
<template #icon>
<Play v-if="!isPlaying" class="w-4 h-4 text-ink-gray-9" />
Expand Down
12 changes: 6 additions & 6 deletions frontend/src/components/CommandPalette/CommandPalette.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
<Dialog v-model="show" :options="{ size: '2xl' }">
<template #body>
<div class="text-base">
<div class="flex items-center space-x-2 pl-4.5 border-b">
<div class="flex items-center gap-x-2 ps-4.5 border-b">
<Search class="size-4 text-ink-gray-4" />
<input
ref="inputRef"
type="text"
placeholder="Search"
class="w-full border-none bg-transparent py-3 !pl-2 pr-4.5 text-base text-ink-gray-7 placeholder-ink-gray-4 focus:ring-0"
class="w-full border-none bg-transparent py-3 !ps-2 pe-4.5 text-base text-ink-gray-7 placeholder-ink-gray-4 focus:ring-0"
@input="onInput"
v-model="query"
autocomplete="off"
Expand All @@ -32,9 +32,9 @@
</div>

<div
class="flex items-center space-x-5 w-full border-t py-2 text-sm text-ink-gray-7 px-4.5"
class="flex items-center gap-x-5 w-full border-t py-2 text-sm text-ink-gray-7 px-4.5"
>
<div class="flex items-center space-x-2">
<div class="flex items-center gap-x-2">
<MoveUp
class="size-5 stroke-1.5 bg-surface-gray-2 p-1 rounded-sm"
/>
Expand All @@ -45,15 +45,15 @@
{{ __('to navigate') }}
</span>
</div>
<div class="flex items-center space-x-2">
<div class="flex items-center gap-x-2">
<CornerDownLeft
class="size-5 stroke-1.5 bg-surface-gray-2 p-1 rounded-sm"
/>
<span>
{{ __('to select') }}
</span>
</div>
<div class="flex items-center space-x-2">
<div class="flex items-center gap-x-2">
<span class="bg-surface-gray-2 p-1 rounded-sm"> esc </span>
<span>
{{ __('to close') }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
:class="{ 'bg-surface-gray-2': item.isActive }"
@click="emit('navigateTo', item.route)"
>
<div class="flex items-center space-x-3">
<div class="flex items-center gap-x-3">
<component
v-if="item.icon"
:is="item.icon"
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/Common/DateRange.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template>
<div class="flex items-center text-ink-gray-7">
<Calendar class="h-4 w-4 stroke-1.5 mr-2" />
<Calendar class="h-4 w-4 stroke-1.5 me-2" />
<span>
{{ getFormattedDateRange(props.startDate, props.endDate) }}
</span>
Expand Down
Loading
Loading