Skip to content
Merged

4.1.0 #3034

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
133 commits
Select commit Hold shift + click to select a range
c83106e
Add cart button integration for block and classic themes
sazedul-haque Jul 23, 2026
9e17836
Merge branch 'dev' into tutor-mini-cart
sazedul-haque Jul 24, 2026
4207c51
Update CART_BUTTON_INTEGRATION.md
sazedul-haque Jul 24, 2026
167e7c2
Update CART_BUTTON_INTEGRATION.md
sazedul-haque Jul 24, 2026
e8dd836
Delete CART_BUTTON_INTEGRATION.md
sazedul-haque Jul 27, 2026
6fdc819
docs(dashboard): add architectural decision records for ajax lazyload…
b-l-i-n-d Sep 1, 2026
0ce1f4c
feat(components): add zero-cls Skeleton component and enhance DateFilter
b-l-i-n-d Sep 1, 2026
7878e7c
feat(dashboard): implement InstructorMetricsAdapter and DashboardSect…
b-l-i-n-d Sep 1, 2026
2829b7b
feat(dashboard): add lazy-section Alpine component and centralized ev…
b-l-i-n-d Sep 1, 2026
1409cdc
feat(dashboard): integrate lazyloaded dashboard sections and stat cards
b-l-i-n-d Sep 1, 2026
439a3b5
Merge branch 'dev' into feat/instructor-dashboard-ajax
b-l-i-n-d Sep 1, 2026
af6efc7
docs(dashboard): add @since 4.0.9 tags to newly added classes and met…
b-l-i-n-d Sep 1, 2026
e11b217
fix(dashboard): sanitize date_range inputs and format docblocks to st…
b-l-i-n-d Sep 2, 2026
cfd132a
chore: update @since tags from 4.0.9 to 4.0.8
b-l-i-n-d Sep 2, 2026
96b6591
fix(dashboard): remove redundant try-catch and sanitize adapter param…
b-l-i-n-d Sep 2, 2026
b23b57f
fix(security): replace esc_js with esc_attr wp_json_encode in filter …
b-l-i-n-d Sep 2, 2026
9b127db
fix(dashboard): remove legacy type parameter deletion in top performi…
b-l-i-n-d Sep 2, 2026
f6b8ec3
refactor(date-filter): simplify inline AlpineJS with declarative wind…
b-l-i-n-d Sep 2, 2026
718aef7
docs: Remove agent generated docs and research
b-l-i-n-d Sep 2, 2026
47d355b
fix(dashboard): resolve duplicate view-transition-name and fix sectio…
b-l-i-n-d Sep 2, 2026
9330cd2
Merge branch 'dev' into feat/instructor-dashboard-ajax
b-l-i-n-d Sep 15, 2026
35ae16d
chore: update @since tags from 4.0.8 to 4.1.0
b-l-i-n-d Sep 15, 2026
56a3fc1
refactor: Remove the inline presetLabels object in applyPreset() and …
b-l-i-n-d Sep 15, 2026
93e6701
fix(my-courses): Add nonce value for course duplication action
saadman30 Sep 15, 2026
532cce6
dev: Add openspec initial schema
b-l-i-n-d Sep 15, 2026
99e4b8f
update(docs): Update spec docs
b-l-i-n-d Sep 15, 2026
05bc804
docs(quiz): Update docs to match the required behavior
b-l-i-n-d Sep 15, 2026
4ce40b9
docs(openspec): update quiz-partial-negative-marking with manual grad…
b-l-i-n-d Sep 15, 2026
3fd209e
docs(openspec): Update requirements
b-l-i-n-d Sep 15, 2026
cf90b5a
feat(quiz): add attempt-answer correctness constants and status resolver
b-l-i-n-d Sep 15, 2026
9e9dcd5
feat(settings): support turn-off confirmation modals for grading sett…
b-l-i-n-d Sep 15, 2026
7548c9e
feat(course-builder): add partial and negative marking controls in qu…
b-l-i-n-d Sep 15, 2026
1c37354
feat(quiz): display partial results and non-binary status across atte…
b-l-i-n-d Sep 15, 2026
56bc220
feat(quiz): implement numeric manual marks and question feedback flows
b-l-i-n-d Sep 15, 2026
ce79263
docs(quiz): update task checklist and add verification report
b-l-i-n-d Sep 15, 2026
9bec03b
refactor(quiz): use QueryHelper for feedback persistence and track ma…
b-l-i-n-d Sep 15, 2026
2cd211e
feat(quiz): filter skipped questions and add feedback and override la…
b-l-i-n-d Sep 15, 2026
1e4f78f
feat(quiz): display auto-grade override notice in v4 question header
b-l-i-n-d Sep 15, 2026
1a05731
docs(quiz): mark all remaining verification tasks complete
b-l-i-n-d Sep 15, 2026
5ea68ad
refactor(quiz): address review feedback, centralize answer counts, an…
b-l-i-n-d Sep 16, 2026
fbc63b9
feat(quiz): specify N/M correct badge and archive legacy workflows
b-l-i-n-d Sep 16, 2026
431bbc1
feat(quiz): display N/M correct badge for partially graded questions …
b-l-i-n-d Sep 16, 2026
40b73b7
refactor(quiz): import QuizModel at top of file instead of inline
b-l-i-n-d Sep 16, 2026
1fe4507
feat(quiz): add tutor_quiz_summary_parameters filter and partial icon
b-l-i-n-d Sep 16, 2026
c7ca89b
docs(openspec): update quiz-partial-negative-marking plan with header…
b-l-i-n-d Sep 16, 2026
3c770a9
fix(quiz): streamline instructor feedback submission process and enha…
saadman30 Sep 16, 2026
5a2c916
feat(quiz): polish open-ended review, form validation, and header sco…
b-l-i-n-d Sep 16, 2026
7197b85
refactor(quiz): centralize attempt answer badge metadata and renderin…
b-l-i-n-d Sep 16, 2026
c5f9bb1
fix(quiz): remove override notice and remove redundant penalty styles…
b-l-i-n-d Sep 16, 2026
aee005a
feat(quiz): streamline v4 attempt question feedback and manual gradin…
b-l-i-n-d Sep 16, 2026
e9b9c9f
refactor(quiz): simplify score formatting and remove redundant floor …
b-l-i-n-d Sep 17, 2026
fdad3a3
refactor: Improve quiz types
b-l-i-n-d Sep 17, 2026
b258f79
feat(quiz): make attempt mark breakdown conditional on partial or neg…
b-l-i-n-d Sep 17, 2026
c06884e
fix(quiz): resolve question type and marks in manual quiz answer review
b-l-i-n-d Sep 17, 2026
6e2126e
refactor: Update admin feedback flow
b-l-i-n-d Sep 17, 2026
2240354
fix: Hide skipped questions from student view
b-l-i-n-d Sep 17, 2026
1b8b606
Merge branch 'dev' into tutor-mini-cart
sazedul-haque Sep 17, 2026
f354966
refactor(quiz): introduce notify_quiz_attempt_graded method for impro…
saadman30 Sep 17, 2026
0982261
AI Connector: Integrated WP AI connectors
shewa12 Sep 17, 2026
4686692
style: Update Instructor Feedback style
b-l-i-n-d Sep 17, 2026
5ae2f31
Showing alert if AI connector setup is not there
shewa12 Sep 17, 2026
fdbf63f
Move cart-button block to assets/blocks
sazedul-haque Sep 17, 2026
611c0cc
refactor(quiz): decouple partial and negative marking to pro via hooks
b-l-i-n-d Sep 17, 2026
9e5aabc
refactor(quiz): consolidate manual quiz review logic
b-l-i-n-d Sep 17, 2026
818d442
refactor(quiz): use QuizModel attempt info maps in templates
b-l-i-n-d Sep 17, 2026
5bb7d76
fix(admin): proceed toggle turn-off when not in use
b-l-i-n-d Sep 17, 2026
85568d5
docs(quiz): add quiz review fix plan
b-l-i-n-d Sep 17, 2026
056a57c
refactor(options): decouple turnoff confirmation from toggle template
b-l-i-n-d Sep 17, 2026
dcb077e
refactor(quiz): drop partial marking from core attempt details
b-l-i-n-d Sep 18, 2026
e4a26ff
chore(openspec): remove openspec planning files and skills
b-l-i-n-d Sep 18, 2026
af5c86a
chore(opsx): remove opsx workflows and commands
b-l-i-n-d Sep 18, 2026
7ec4c0a
docs(quiz): remove quiz review fix plan
b-l-i-n-d Sep 18, 2026
ada51b8
fix(quiz): polish instructor feedback panel in attempt details
b-l-i-n-d Sep 18, 2026
a2da9bb
fix(settings): resync toggle-dependent fields after turn-off confirm …
b-l-i-n-d Sep 18, 2026
e24bd32
refactor(quiz): enhance access control for quiz attempt details by co…
saadman30 Sep 18, 2026
a784d61
fix(quiz): inline negative marking penalty and regroup grading settings
b-l-i-n-d Sep 18, 2026
147864a
feat(field): Add tooltip support
b-l-i-n-d Sep 18, 2026
c07b4b7
Fix: PHP error null passing to array_merge
shewa12 Sep 18, 2026
cb83e90
Cart button: rename class, RTL & markup refactor
sazedul-haque Sep 18, 2026
0fb9c2d
Fix: Image base64 string issue
shewa12 Sep 18, 2026
b5266c3
Fix base64 image generation issue
shewa12 Sep 18, 2026
a9d53bf
Merge branch 'dev' of https://github.com/themeum/tutor into ai-connec…
shewa12 Sep 18, 2026
6b0f03f
feat(quiz): Add partial status to attempt details
b-l-i-n-d Sep 18, 2026
31fc106
refactor(quiz): Update admin manual grading flow
b-l-i-n-d Sep 18, 2026
1510167
refactor(quiz): Rework manual review actions and question feedback modal
b-l-i-n-d Sep 20, 2026
9fdb26f
refactor(quiz): Make attempt summary statics filterable and orderable
b-l-i-n-d Sep 20, 2026
89bfa91
fix(instructor-dashboard): show skeleton pre-JS, hide empty sections,…
b-l-i-n-d Sep 20, 2026
4e72149
fix(instructor-dashboard): give tiny completion-chart segments a mini…
b-l-i-n-d Sep 20, 2026
731c394
fix(quiz): gate mark breakdown to instructors and reorder summary par…
b-l-i-n-d Sep 21, 2026
2387995
feat(quiz): add settings filter and standardize negative marking conf…
b-l-i-n-d Sep 21, 2026
341a1db
refactor(quiz): separate quiz settings sanitization from filter
b-l-i-n-d Sep 21, 2026
2363d1c
Cart button block style fixed
sazedul-haque Sep 21, 2026
a7448f8
Removed the AI connectors localize data
shewa12 Sep 21, 2026
dd341a8
style(quiz): Update styles and icons
b-l-i-n-d Sep 21, 2026
d06293c
Add selectable cart icons and size support
sazedul-haque Sep 21, 2026
a09a3bb
Update style.scss
sazedul-haque Sep 21, 2026
3443b9d
Add @Icons alias and update icon imports
sazedul-haque Sep 21, 2026
b9e78c4
Merge pull request #3005 from themeum/fix/course-duplication-issues
shewa12 Sep 21, 2026
3f52197
Merge pull request #2928 from themeum/tutor-mini-cart
shewa12 Sep 21, 2026
80e8ebb
Merge pull request #2985 from themeum/feat/instructor-dashboard-ajax
shewa12 Sep 21, 2026
d00d886
refactor(quiz): drop Pro-owned partial constant and tidy quiz summary…
b-l-i-n-d Sep 22, 2026
6c59c60
chore(quiz): update version annotations for quiz methods to reflect c…
saadman30 Sep 22, 2026
6d7abcb
Merge pull request #3008 from themeum/fix/prevent-early-quiz-grading-…
shewa12 Sep 22, 2026
e51a12e
Merge branch '4.1.0' into feat/quiz-negative-partial
b-l-i-n-d Sep 22, 2026
39466fa
Merge pull request #3006 from themeum/feat/quiz-negative-partial
shewa12 Sep 22, 2026
d730978
Merged with base branch & resolved the conflict
shewa12 Sep 22, 2026
f7a2611
chore: update version to 4.1.0 in readme and main plugin file
saadman30 Sep 22, 2026
53c5d6e
Resolved PR reviews
shewa12 Sep 22, 2026
1875920
Merge pull request #3015 from themeum/update/tutor-version-4.1.0
shewa12 Sep 22, 2026
1e5733a
Merge branch '4.1.0' of https://github.com/themeum/tutor into ai-conn…
shewa12 Sep 22, 2026
9ca60ef
Add WordPress editor UI dependencies
sazedul-haque Sep 22, 2026
df7a326
Merge pull request #3017 from themeum/wp-editor-dependancies
shewa12 Sep 22, 2026
01ee20a
Merge branch '4.1.0' of https://github.com/themeum/tutor into ai-conn…
shewa12 Sep 22, 2026
1d69612
Fix: Image response format error
shewa12 Sep 22, 2026
d86db6f
refactor(utils): Update `get_students_data_by_course_id` and add filt…
b-l-i-n-d Sep 22, 2026
37539c8
style(skeleton): Add background color to table skeleton
b-l-i-n-d Sep 23, 2026
3a4a14c
style(icons): Add kids mode icon
b-l-i-n-d Sep 23, 2026
25ce323
Merge pull request #3012 from themeum/ai-connectors
shewa12 Sep 23, 2026
08f5eb4
Fix YouTube focus and fullscreen class for player
sazedul-haque Sep 23, 2026
223801b
refactor(quiz): Update quiz default value and validation
b-l-i-n-d Sep 23, 2026
7ca27ee
Merge pull request #3021 from themeum/fix-youtube-video-fullscreen
shewa12 Sep 23, 2026
5d1794f
Merge branch '4.1.0' into feat/quiz-negative-partial
b-l-i-n-d Sep 23, 2026
74acb30
AI connector warning modal content updated
shewa12 Sep 23, 2026
a1aaf31
Merge pull request #3023 from themeum/ai-connectors
shewa12 Sep 23, 2026
c14619b
Merge pull request #3020 from themeum/feat/bundle-reenrollment
shewa12 Sep 23, 2026
1592ea3
fix(quiz): ensure attempt earned marks floor at zero on submission
b-l-i-n-d Sep 23, 2026
10be60f
fix(quiz): recalculate attempt earned marks from answers on review
b-l-i-n-d Sep 24, 2026
e49f34a
feat(quiz-settings): Add negative mark type mismatch alert
b-l-i-n-d Sep 25, 2026
df5abcc
refactor(quiz): Resolve earned marks not showing
b-l-i-n-d Sep 25, 2026
901b732
refactor: Remove unnecessary code
b-l-i-n-d Sep 25, 2026
6ef5762
feat(quiz-settings): Add admin negative value normalization
b-l-i-n-d Sep 25, 2026
5f35b8d
fix(quiz): Allow fraction earned marks
b-l-i-n-d Sep 25, 2026
fa84e0c
Merge pull request #3029 from themeum/feat/quiz-negative-partial
shewa12 Sep 25, 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ node_modules/
assets/css/*
!assets/css/.gitkeep
assets/js/*
assets/blocks/
languages/*
!languages/.gitkeep
test/
Expand Down
68 changes: 59 additions & 9 deletions assets/core/ts/components/calendar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { __ } from '@wordpress/i18n';
import dayjs from 'dayjs';
import { type Calendar, Calendar as VanillaCalendar, type Options } from 'vanilla-calendar-pro';

import { TUTOR_CUSTOM_EVENTS } from '@Core/ts/constant';
import { DateFormats } from '@Core/ts/date-formats';
import { type AlpineComponentMeta } from '@Core/ts/types';

Expand Down Expand Up @@ -481,7 +482,7 @@ export function calendar({ options, hidePopover }: { options: Options; hidePopov
});
},

navigateWithParams(params: Record<string, string | null>) {
navigateWithParams(params: Record<string, string | null>, presetKey?: string, presetTitle?: string) {
const url = new URL(window.location.href);

// Always reset pagination when the date filter changes.
Expand All @@ -502,6 +503,44 @@ export function calendar({ options, hidePopover }: { options: Options; hidePopov
}
});

const isAjax = Boolean((options as Record<string, unknown>)?.ajaxMode);
if (isAjax) {
window.history.pushState({}, '', url.toString());

const startDate = params[TUTOR_CALENDAR_QUERY_PARAMS.startDate] || '';
const endDate = params[TUTOR_CALENDAR_QUERY_PARAMS.endDate] || '';
const date = params[TUTOR_CALENDAR_QUERY_PARAMS.date] || '';

if (startDate && endDate) {
this.calendar?.set({ selectedDates: [startDate, endDate] });
} else if (date) {
this.calendar?.set({ selectedDates: [date] });
} else {
this.calendar?.set({ selectedDates: [] });
}

this.updateActivePreset();

const formattedLabel =
presetTitle ||
(startDate && endDate ? (startDate === endDate ? startDate : `${startDate} - ${endDate}`) : date || '');

window.dispatchEvent(
new CustomEvent(TUTOR_CUSTOM_EVENTS.DATE_FILTER_CHANGED, {
detail: {
startDate,
endDate,
date,
label: formattedLabel,
preset: presetKey || '',
presetTitle: presetTitle || '',
url: url.toString(),
},
}),
);
return;
}

window.location.href = url.toString();
},

Expand Down Expand Up @@ -553,18 +592,29 @@ export function calendar({ options, hidePopover }: { options: Options; hidePopov
applyPreset(preset: Preset) {
if (!this.calendar) return;

hidePopover?.();

const dates = this.getPresetDates(preset);
const presetTitle = PRESET_LABELS[preset] || '';

if (dates.length) {
this.navigateWithParams({
[TUTOR_CALENDAR_QUERY_PARAMS.startDate]: dates[0],
[TUTOR_CALENDAR_QUERY_PARAMS.endDate]: dates[1],
});
this.navigateWithParams(
{
[TUTOR_CALENDAR_QUERY_PARAMS.startDate]: dates[0],
[TUTOR_CALENDAR_QUERY_PARAMS.endDate]: dates[1],
},
preset,
presetTitle,
);
} else {
this.navigateWithParams({
[TUTOR_CALENDAR_QUERY_PARAMS.startDate]: null,
[TUTOR_CALENDAR_QUERY_PARAMS.endDate]: null,
});
this.navigateWithParams(
{
[TUTOR_CALENDAR_QUERY_PARAMS.startDate]: null,
[TUTOR_CALENDAR_QUERY_PARAMS.endDate]: null,
},
preset,
presetTitle,
);
}
},

Expand Down
4 changes: 2 additions & 2 deletions assets/core/ts/components/form.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,12 +227,12 @@ async function validateFieldValue(name: string, value: unknown, rules?: Validati
}

// Numeric validations
if (rules.min && !isNaN(numericValue)) {
if (typeof rules.min !== 'undefined' && !isNaN(numericValue)) {
const error = ValidationHelpers.validateMin(numericValue, rules.min);
if (error) return error;
}

if (rules.max && !isNaN(numericValue)) {
if (typeof rules.max !== 'undefined' && !isNaN(numericValue)) {
const error = ValidationHelpers.validateMax(numericValue, rules.max);
if (error) return error;
}
Expand Down
19 changes: 18 additions & 1 deletion assets/core/ts/components/player.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { TUTOR_CUSTOM_EVENTS } from '@Core/ts/constant';
import { type AlpineComponentMeta } from '@Core/ts/types';
import { isMobileDevice } from '@Core/ts/utils/util';

import { isVimeoPlyr } from '@FrontendTypes/index';
import { isVimeoPlyr, isYouTubePlyr } from '@FrontendTypes/index';

export interface PlayerProps {
config?: Plyr.Options;
Expand Down Expand Up @@ -51,6 +51,13 @@ export const player = (props: PlayerProps = {}): AlpinePlayerData => ({
console.warn('Vimeo mute init failed:', err);
}
}

// Tab click reveals youtube controls fixed
if (this.plyr && isYouTubePlyr(this.plyr)) {
const iframe = this.plyr.elements.wrapper?.querySelector('iframe');
iframe?.setAttribute('tabindex', '-1');
iframe?.setAttribute('aria-hidden', 'true');
}
});

this.plyr.on('play', () => {
Expand All @@ -70,6 +77,16 @@ export const player = (props: PlayerProps = {}): AlpinePlayerData => ({
}
}
});

this.plyr.on('enterfullscreen', (event) => {
const instance = event.detail.plyr;
instance?.elements.wrapper?.classList.add('is-fullscreen');
});

this.plyr.on('exitfullscreen', (event) => {
const instance = event.detail.plyr;
instance?.elements.wrapper?.classList.remove('is-fullscreen');
});
}

// Dispatch custom event when player is ready
Expand Down
2 changes: 2 additions & 0 deletions assets/core/ts/constant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,6 @@ export const TUTOR_CUSTOM_EVENTS = {
QUIZ_ABANDON_REQUESTED: 'tutor-quiz-abandon-requested',
QUIZ_ATTEMPT_COMPLETED: 'tutor-quiz-attempt-completed',
CONTENT_CHANGED: 'tutor_content_changed_event',
DATE_FILTER_CHANGED: 'tutor:date-filter-changed',
SORT_CHANGED: 'tutor:sort-changed',
};
2 changes: 2 additions & 0 deletions assets/core/ts/utils/endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ const endpoints = {
QUIZ_ATTEMPT_SUBMIT: 'tutor_answering_quiz_question',
REVIEW_QUIZ_ANSWERS: 'tutor_review_quiz_answers',
INSTRUCTOR_FEEDBACK: 'tutor_instructor_feedback',
SAVE_QUESTION_FEEDBACK: 'tutor_save_question_feedback',
DELETE_QUESTION_FEEDBACK: 'tutor_delete_question_feedback',

// ZOOM
GET_ZOOM_MEETING_DETAILS: 'tutor_zoom_meeting_details',
Expand Down
4 changes: 4 additions & 0 deletions assets/icons/bag.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions assets/icons/basket.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/icons/comment-outline.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/icons/kids/minus-circle.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/icons/kids/partial.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/icons/minus-circle.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/icons/partial.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
48 changes: 48 additions & 0 deletions assets/src/blocks/cart-button/block.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "tutor-blocks/cart-button",
"title": "Cart Button",
"category": "tutor",
"icon": "cart",
"description": "Display a cart button with item count for Tutor LMS ecommerce",
"attributes": {
"showCount": {
"type": "string",
"default": "if_has_items"
},
"customClass": {
"type": "string",
"default": "tutor-cart-button"
},
"iconColor": {
"type": "string",
"default": ""
},
"cartIcon": {
"type": "string",
"default": "cart"
},
"iconSize": {
"type": "number",
"default": 20
},
"badgeBgColor": {
"type": "string",
"default": "#0c111d"
},
"badgeTextColor": {
"type": "string",
"default": "#ffffff"
}
},
"supports": {
"spacing": {
"margin": true,
"padding": true
}
},
"editorScript": "file:./index.js",
"style": "tutor-cart-button",
"render": "file:./render.php"
}
Loading
Loading