mazer-rails 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/assets/fonts/Iconly---Bold.eot +0 -0
  3. data/assets/fonts/Iconly---Bold.svg +19 -0
  4. data/assets/fonts/Iconly---Bold.ttf +0 -0
  5. data/assets/fonts/Iconly---Bold.woff +0 -0
  6. data/assets/fonts/iconly/Iconly---Bold.eot +0 -0
  7. data/assets/fonts/iconly/Iconly---Bold.svg +19 -0
  8. data/assets/fonts/iconly/Iconly---Bold.ttf +0 -0
  9. data/assets/fonts/iconly/Iconly---Bold.woff +0 -0
  10. data/assets/images/bg/4853433.png +0 -0
  11. data/assets/images/faces/1.jpg +0 -0
  12. data/assets/images/faces/2.jpg +0 -0
  13. data/assets/images/faces/3.jpg +0 -0
  14. data/assets/images/faces/4.jpg +0 -0
  15. data/assets/images/faces/5.jpg +0 -0
  16. data/assets/images/faces/6.jpg +0 -0
  17. data/assets/images/faces/7.jpg +0 -0
  18. data/assets/images/faces/8.jpg +0 -0
  19. data/assets/images/logo/favicon.png +0 -0
  20. data/assets/images/logo/favicon.svg +1 -0
  21. data/assets/images/logo/logo.svg +1 -0
  22. data/assets/images/samples/1.png +0 -0
  23. data/assets/images/samples/2.png +0 -0
  24. data/assets/images/samples/3.png +0 -0
  25. data/assets/images/samples/4.png +0 -0
  26. data/assets/images/samples/architecture1.jpg +0 -0
  27. data/assets/images/samples/banana.jpg +0 -0
  28. data/assets/images/samples/bg-mountain.jpg +0 -0
  29. data/assets/images/samples/building.jpg +0 -0
  30. data/assets/images/samples/error-403.svg +94 -0
  31. data/assets/images/samples/error-404.svg +88 -0
  32. data/assets/images/samples/error-500.svg +76 -0
  33. data/assets/images/samples/jump.jpg +0 -0
  34. data/assets/images/samples/motorcycle.jpg +0 -0
  35. data/assets/images/samples/origami.jpg +0 -0
  36. data/assets/images/samples/water.jpg +0 -0
  37. data/assets/images/svg-loaders/audio.svg +29 -0
  38. data/assets/images/svg-loaders/ball-triangle.svg +1 -0
  39. data/assets/images/svg-loaders/bars.svg +1 -0
  40. data/assets/images/svg-loaders/circles.svg +20 -0
  41. data/assets/images/svg-loaders/grid.svg +1 -0
  42. data/assets/images/svg-loaders/hearts.svg +1 -0
  43. data/assets/images/svg-loaders/oval.svg +1 -0
  44. data/assets/images/svg-loaders/puff.svg +1 -0
  45. data/assets/images/svg-loaders/rings.svg +1 -0
  46. data/assets/images/svg-loaders/spinning-circles.svg +1 -0
  47. data/assets/images/svg-loaders/tail-spin.svg +1 -0
  48. data/assets/images/svg-loaders/three-dots.svg +1 -0
  49. data/assets/javascripts/app.js +9 -0
  50. data/assets/javascripts/bootstrap.js +6 -0
  51. data/assets/javascripts/components/dark.js +65 -0
  52. data/assets/javascripts/components/sidebar.js +185 -0
  53. data/assets/javascripts/helper/isDesktop.js +1 -0
  54. data/assets/javascripts/initTheme.js +5 -0
  55. data/assets/javascripts/mazer.js +9 -0
  56. data/assets/javascripts/pages/ckeditor.js +3 -0
  57. data/assets/javascripts/pages/component-toasts.js +9 -0
  58. data/assets/javascripts/pages/dashboard.js +158 -0
  59. data/assets/javascripts/pages/datatables.js +1 -0
  60. data/assets/javascripts/pages/filepond.js +181 -0
  61. data/assets/javascripts/pages/form-editor.js +27 -0
  62. data/assets/javascripts/pages/form-element-select.js +14 -0
  63. data/assets/javascripts/pages/horizontal-layout.js +43 -0
  64. data/assets/javascripts/pages/jquery.js +1 -0
  65. data/assets/javascripts/pages/jsvectormap.js +60 -0
  66. data/assets/javascripts/pages/parsley.js +55 -0
  67. data/assets/javascripts/pages/quill.js +27 -0
  68. data/assets/javascripts/pages/rater-js.js +38 -0
  69. data/assets/javascripts/pages/simple-datatables.js +46 -0
  70. data/assets/javascripts/pages/summernote.js +20 -0
  71. data/assets/javascripts/pages/sweetalert2.js +142 -0
  72. data/assets/javascripts/pages/tinymce.js +22 -0
  73. data/assets/javascripts/pages/toastify.js +81 -0
  74. data/assets/javascripts/pages/ui-apexchart.js +521 -0
  75. data/assets/javascripts/pages/ui-chartjs.js +445 -0
  76. data/assets/javascripts/pages/ui-todolist.js +5 -0
  77. data/assets/stylesheets/_fonts.scss +5 -0
  78. data/assets/stylesheets/_mazer.scss +103 -0
  79. data/assets/stylesheets/_utilities.scss +53 -0
  80. data/assets/stylesheets/_variables.scss +1626 -0
  81. data/assets/stylesheets/app.scss +20 -0
  82. data/assets/stylesheets/bootstrap.scss +58 -0
  83. data/assets/stylesheets/components/_alert.scss +43 -0
  84. data/assets/stylesheets/components/_avatar.scss +78 -0
  85. data/assets/stylesheets/components/_badge.scss +20 -0
  86. data/assets/stylesheets/components/_breadcrumb.scss +10 -0
  87. data/assets/stylesheets/components/_buttons.scss +62 -0
  88. data/assets/stylesheets/components/_card.scss +126 -0
  89. data/assets/stylesheets/components/_carousel.scss +6 -0
  90. data/assets/stylesheets/components/_divider.scss +37 -0
  91. data/assets/stylesheets/components/_dropdowns.scss +24 -0
  92. data/assets/stylesheets/components/_forms.scss +213 -0
  93. data/assets/stylesheets/components/_icons.scss +48 -0
  94. data/assets/stylesheets/components/_modal.scss +46 -0
  95. data/assets/stylesheets/components/_navbar.scss +280 -0
  96. data/assets/stylesheets/components/_navs.scss +32 -0
  97. data/assets/stylesheets/components/_pagination.scss +39 -0
  98. data/assets/stylesheets/components/_progress.scss +32 -0
  99. data/assets/stylesheets/components/_sidebar.scss +171 -0
  100. data/assets/stylesheets/components/_table.scss +36 -0
  101. data/assets/stylesheets/iconly.scss +327 -0
  102. data/assets/stylesheets/layouts/main.scss +48 -0
  103. data/assets/stylesheets/mixins/_navbar.scss +20 -0
  104. data/assets/stylesheets/pages/auth.scss +51 -0
  105. data/assets/stylesheets/pages/chat.scss +145 -0
  106. data/assets/stylesheets/pages/datatables.scss +7 -0
  107. data/assets/stylesheets/pages/dripicons.scss +20 -0
  108. data/assets/stylesheets/pages/email.scss +625 -0
  109. data/assets/stylesheets/pages/error.scss +22 -0
  110. data/assets/stylesheets/pages/form-element-select.scss +7 -0
  111. data/assets/stylesheets/pages/simple-datatables.scss +20 -0
  112. data/assets/stylesheets/pages/summernote.scss +4 -0
  113. data/assets/stylesheets/themes/dark/_mazer-dark.scss +82 -0
  114. data/assets/stylesheets/themes/dark/_root.scss +55 -0
  115. data/assets/stylesheets/themes/dark/_variables-dark.scss +329 -0
  116. data/assets/stylesheets/themes/dark/app-dark.scss +54 -0
  117. data/assets/stylesheets/widgets/chat.scss +26 -0
  118. data/assets/stylesheets/widgets/todo.scss +33 -0
  119. data/lib/mazer_rails/engine.rb +16 -0
  120. data/lib/mazer_rails/version.rb +5 -0
  121. data/lib/mazer_rails.rb +77 -0
  122. data/mazer-rails.gemspec +5 -5
  123. data/yarn.lock +9209 -0
  124. metadata +151 -4
  125. data/lib/mazer/rails/version.rb +0 -7
  126. data/lib/mazer/rails.rb +0 -10
@@ -0,0 +1,60 @@
1
+ var world_map = new jsVectorMap({
2
+ selector: "#world-map",
3
+ map: "world",
4
+ zoomOnScroll: false,
5
+ regionStyle: {
6
+ hover: {
7
+ fill: '#435ebe'
8
+ }
9
+ },
10
+ markers: [
11
+ {
12
+ name: 'Indonesia',
13
+ coords: [-6.229728, 106.6894311],
14
+ style: {
15
+ fill: '#435ebe'
16
+ }
17
+ },
18
+ {
19
+ name: 'United States',
20
+ coords: [38.8936708, -77.1546604],
21
+ style: {
22
+ fill: '#28ab55'
23
+ }
24
+ },
25
+ {
26
+ name: 'Russia',
27
+ coords: [55.5807481, 36.825129],
28
+ style: {
29
+ fill: '#f3616d'
30
+ }
31
+ },
32
+ {
33
+ name: 'China',
34
+ coords: [39.9385466, 116.1172735]
35
+ },
36
+ {
37
+ name: 'United Kingdom',
38
+ coords: [51.5285582, -0.2416812]
39
+ },
40
+ {
41
+ name: 'India',
42
+ coords: [26.8851417, 75.6504721]
43
+ },
44
+ {
45
+ name: 'Australia',
46
+ coords: [-35.2813046, 149.124822]
47
+ },
48
+ {
49
+ name: 'Brazil',
50
+ coords: [-22.9140693, -43.5860681]
51
+ },
52
+ {
53
+ name: 'Egypt',
54
+ coords: [26.834955, 26.3823725]
55
+ },
56
+ ],
57
+ onRegionTooltipShow(event, tooltip) {
58
+ tooltip.css({ backgroundColor: '#435ebe' })
59
+ }
60
+ });
@@ -0,0 +1,55 @@
1
+ $.extend(window.Parsley.options, {
2
+ focus: "first",
3
+ excluded:
4
+ "input[type=button], input[type=submit], input[type=reset], .search, .ignore",
5
+ triggerAfterFailure: "change blur",
6
+ errorsContainer: function (element) {},
7
+ trigger: "change",
8
+ successClass: "is-valid",
9
+ errorClass: "is-invalid",
10
+ classHandler: function (el) {
11
+ return el.$element.closest(".form-group")
12
+ },
13
+ errorsContainer: function (el) {
14
+ return el.$element.closest(".form-group")
15
+ },
16
+ errorsWrapper: '<div class="parsley-error"></div>',
17
+ errorTemplate: "<span></span>",
18
+ })
19
+
20
+ Parsley.on("field:validated", function (el) {
21
+ var elNode = $(el)[0]
22
+ if (elNode && !elNode.isValid()) {
23
+ var rqeuiredValResult = elNode.validationResult.filter(function (vr) {
24
+ return vr.assert.name === "required"
25
+ })
26
+ if (rqeuiredValResult.length > 0) {
27
+ var fieldNode = $(elNode.element)
28
+ var formGroupNode = fieldNode.closest(".form-group")
29
+ var lblNode = formGroupNode.find(".form-label:first")
30
+ if (lblNode.length > 0) {
31
+ // change default error message to include field label
32
+ var errorNode = formGroupNode.find(
33
+ "div.parsley-error span[class*=parsley-]"
34
+ )
35
+ if (errorNode.length > 0) {
36
+ var lblText = lblNode.text()
37
+ if (lblText) {
38
+ errorNode.html(lblText + " is required.")
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ })
45
+
46
+ Parsley.addValidator("restrictedCity", {
47
+ requirementType: "string",
48
+ validateString: function (value, requirement) {
49
+ value = (value || "").trim()
50
+ return value === "" || value.toLowerCase() === requirement.toLowerCase()
51
+ },
52
+ messages: {
53
+ en: 'You have to live in <a href="https://www.google.com/maps/place/Jakarta">Jakarta</a>.',
54
+ },
55
+ })
@@ -0,0 +1,27 @@
1
+ var snow = new Quill("#snow", {
2
+ theme: "snow",
3
+ })
4
+ var bubble = new Quill("#bubble", {
5
+ theme: "bubble",
6
+ })
7
+ new Quill("#full", {
8
+ bounds: "#full-container .editor",
9
+ modules: {
10
+ toolbar: [
11
+ [{ font: [] }, { size: [] }],
12
+ ["bold", "italic", "underline", "strike"],
13
+ [{ color: [] }, { background: [] }],
14
+ [{ script: "super" }, { script: "sub" }],
15
+ [
16
+ { list: "ordered" },
17
+ { list: "bullet" },
18
+ { indent: "-1" },
19
+ { indent: "+1" },
20
+ ],
21
+ ["direction", { align: [] }],
22
+ ["link", "image", "video"],
23
+ ["clean"],
24
+ ],
25
+ },
26
+ theme: "snow",
27
+ })
@@ -0,0 +1,38 @@
1
+ raterJs({
2
+ element: document.querySelector("#basic"),
3
+ starSize: 32,
4
+ rateCallback: function rateCallback(rating, done) {
5
+ this.setRating(rating)
6
+ done()
7
+ },
8
+ })
9
+
10
+ raterJs({
11
+ element: document.querySelector("#step"),
12
+ rateCallback: function rateCallback(rating, done) {
13
+ this.setRating(rating)
14
+ done()
15
+ },
16
+ starSize: 32,
17
+ step: 0.5,
18
+ })
19
+ raterJs({
20
+ element: document.querySelector("#unli1"),
21
+ rateCallback: function rateCallback(rating, done) {
22
+ this.setRating(rating)
23
+ done()
24
+ },
25
+ starSize: 32,
26
+ max: 10,
27
+ step: 0.5,
28
+ })
29
+ raterJs({
30
+ element: document.querySelector("#unli2"),
31
+ rateCallback: function rateCallback(rating, done) {
32
+ this.setRating(rating)
33
+ done()
34
+ },
35
+ starSize: 32,
36
+ max: 16,
37
+ step: 0.5,
38
+ })
@@ -0,0 +1,46 @@
1
+ let dataTable = new simpleDatatables.DataTable(
2
+ document.getElementById("table1")
3
+ )
4
+ // Move "per page dropdown" selector element out of label
5
+ // to make it work with bootstrap 5. Add bs5 classes.
6
+ function adaptPageDropdown() {
7
+ const selector = dataTable.wrapper.querySelector(".dataTable-selector")
8
+ selector.parentNode.parentNode.insertBefore(selector, selector.parentNode)
9
+ selector.classList.add("form-select")
10
+ }
11
+
12
+ // Add bs5 classes to pagination elements
13
+ function adaptPagination() {
14
+ const paginations = dataTable.wrapper.querySelectorAll(
15
+ "ul.dataTable-pagination-list"
16
+ )
17
+
18
+ for (const pagination of paginations) {
19
+ pagination.classList.add(...["pagination", "pagination-primary"])
20
+ }
21
+
22
+ const paginationLis = dataTable.wrapper.querySelectorAll(
23
+ "ul.dataTable-pagination-list li"
24
+ )
25
+
26
+ for (const paginationLi of paginationLis) {
27
+ paginationLi.classList.add("page-item")
28
+ }
29
+
30
+ const paginationLinks = dataTable.wrapper.querySelectorAll(
31
+ "ul.dataTable-pagination-list li a"
32
+ )
33
+
34
+ for (const paginationLink of paginationLinks) {
35
+ paginationLink.classList.add("page-link")
36
+ }
37
+ }
38
+
39
+ // Patch "per page dropdown" and pagination after table rendered
40
+ dataTable.on("datatable.init", function () {
41
+ adaptPageDropdown()
42
+ adaptPagination()
43
+ })
44
+
45
+ // Re-patch pagination after the page was changed
46
+ dataTable.on("datatable.page", adaptPagination)
@@ -0,0 +1,20 @@
1
+ $("#summernote").summernote({
2
+ tabsize: 2,
3
+ height: 120,
4
+ })
5
+ $("#hint").summernote({
6
+ height: 100,
7
+ toolbar: false,
8
+ placeholder: "type with apple, orange, watermelon and lemon",
9
+ hint: {
10
+ words: ["apple", "orange", "watermelon", "lemon"],
11
+ match: /\b(\w{1,})$/,
12
+ search: function (keyword, callback) {
13
+ callback(
14
+ $.grep(this.words, function (item) {
15
+ return item.indexOf(keyword) === 0
16
+ })
17
+ )
18
+ },
19
+ },
20
+ })
@@ -0,0 +1,142 @@
1
+ document.getElementById("basic").addEventListener("click", (e) => {
2
+ Swal.fire("Any fool can use a computer")
3
+ })
4
+ document.getElementById("footer").addEventListener("click", (e) => {
5
+ Swal.fire({
6
+ icon: "error",
7
+ title: "Oops...",
8
+ text: "Something went wrong!",
9
+ footer: "<a href>Why do I have this issue?</a>",
10
+ })
11
+ })
12
+ document.getElementById("title").addEventListener("click", (e) => {
13
+ Swal.fire("The Internet?", "That thing is still around?", "question")
14
+ })
15
+ document.getElementById("success").addEventListener("click", (e) => {
16
+ Swal.fire({
17
+ icon: "success",
18
+ title: "Success",
19
+ })
20
+ })
21
+ document.getElementById("error").addEventListener("click", (e) => {
22
+ Swal.fire({
23
+ icon: "error",
24
+ title: "Error",
25
+ })
26
+ })
27
+ document.getElementById("warning").addEventListener("click", (e) => {
28
+ Swal.fire({
29
+ icon: "warning",
30
+ title: "Warning",
31
+ })
32
+ })
33
+ document.getElementById("info").addEventListener("click", (e) => {
34
+ Swal.fire({
35
+ icon: "info",
36
+ title: "Info",
37
+ })
38
+ })
39
+ document.getElementById("question").addEventListener("click", (e) => {
40
+ Swal.fire({
41
+ icon: "question",
42
+ title: "Question",
43
+ })
44
+ })
45
+ document.getElementById("text").addEventListener("click", (e) => {
46
+ Swal.fire({
47
+ title: "Enter your IP address",
48
+ input: "text",
49
+ inputLabel: "Your IP address",
50
+ showCancelButton: true,
51
+ })
52
+ })
53
+ document.getElementById("email").addEventListener("click", async (e) => {
54
+ const { value: email } = await Swal.fire({
55
+ title: "Input email address",
56
+ input: "email",
57
+ inputLabel: "Your email address",
58
+ inputPlaceholder: "Enter your email address",
59
+ })
60
+
61
+ if (email) {
62
+ Swal.fire(`Entered email: ${email}`)
63
+ }
64
+ })
65
+ document.getElementById("url").addEventListener("click", async (e) => {
66
+ const { value: url } = await Swal.fire({
67
+ input: "url",
68
+ inputLabel: "URL address",
69
+ inputPlaceholder: "Enter the URL",
70
+ })
71
+
72
+ if (url) {
73
+ Swal.fire(`Entered URL: ${url}`)
74
+ }
75
+ })
76
+ document.getElementById("password").addEventListener("click", async (e) => {
77
+ const { value: password } = await Swal.fire({
78
+ title: "Enter your password",
79
+ input: "password",
80
+ inputLabel: "Password",
81
+ inputPlaceholder: "Enter your password",
82
+ inputAttributes: {
83
+ maxlength: 10,
84
+ autocapitalize: "off",
85
+ autocorrect: "off",
86
+ },
87
+ })
88
+
89
+ if (password) {
90
+ Swal.fire(`Entered password: ${password}`)
91
+ }
92
+ })
93
+ document.getElementById("textarea").addEventListener("click", async (e) => {
94
+ const { value: text } = await Swal.fire({
95
+ input: "textarea",
96
+ inputLabel: "Message",
97
+ inputPlaceholder: "Type your message here...",
98
+ inputAttributes: {
99
+ "aria-label": "Type your message here",
100
+ },
101
+ showCancelButton: true,
102
+ })
103
+
104
+ if (text) {
105
+ Swal.fire(text)
106
+ }
107
+ })
108
+ document.getElementById("select").addEventListener("click", async (e) => {
109
+ const { value: fruit } = await Swal.fire({
110
+ title: "Select field validation",
111
+ input: "select",
112
+ inputOptions: {
113
+ Fruits: {
114
+ apples: "Apples",
115
+ bananas: "Bananas",
116
+ grapes: "Grapes",
117
+ oranges: "Oranges",
118
+ },
119
+ Vegetables: {
120
+ potato: "Potato",
121
+ broccoli: "Broccoli",
122
+ carrot: "Carrot",
123
+ },
124
+ icecream: "Ice cream",
125
+ },
126
+ inputPlaceholder: "Select a fruit",
127
+ showCancelButton: true,
128
+ inputValidator: (value) => {
129
+ return new Promise((resolve) => {
130
+ if (value === "oranges") {
131
+ resolve()
132
+ } else {
133
+ resolve("You need to select oranges :)")
134
+ }
135
+ })
136
+ },
137
+ })
138
+
139
+ if (fruit) {
140
+ Swal.fire(`You selected: ${fruit}`)
141
+ }
142
+ })
@@ -0,0 +1,22 @@
1
+ document.addEventListener("DOMContentLoaded", () => {
2
+ console.log("initing", document.body.classList.contains("theme-dark"))
3
+
4
+ const themeOptions = document.body.classList.contains("theme-dark")
5
+ ? {
6
+ skin: "oxide-dark",
7
+ content_css: "dark",
8
+ }
9
+ : {
10
+ skin: "oxide",
11
+ content_css: "default",
12
+ }
13
+
14
+ tinymce.init({ selector: "#default", ...themeOptions })
15
+ tinymce.init({
16
+ selector: "#dark",
17
+ toolbar:
18
+ "undo redo styleselect bold italic alignleft aligncenter alignright bullist numlist outdent indent code",
19
+ plugins: "code",
20
+ ...themeOptions,
21
+ })
22
+ })
@@ -0,0 +1,81 @@
1
+ document.getElementById("basic").addEventListener("click", () => {
2
+ Toastify({
3
+ text: "This is a toast",
4
+ duration: 3000,
5
+ }).showToast()
6
+ })
7
+ document.getElementById("background").addEventListener("click", () => {
8
+ Toastify({
9
+ text: "This is a toast",
10
+ duration: 3000,
11
+ backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
12
+ }).showToast()
13
+ })
14
+ document.getElementById("close").addEventListener("click", () => {
15
+ Toastify({
16
+ text: "Click close button",
17
+ duration: 3000,
18
+ close: true,
19
+ backgroundColor: "#4fbe87",
20
+ }).showToast()
21
+ })
22
+ document.getElementById("top-left").addEventListener("click", () => {
23
+ Toastify({
24
+ text: "This is toast in top left",
25
+ duration: 3000,
26
+ close: true,
27
+ gravity: "top",
28
+ position: "left",
29
+ backgroundColor: "#4fbe87",
30
+ }).showToast()
31
+ })
32
+ document.getElementById("top-center").addEventListener("click", () => {
33
+ Toastify({
34
+ text: "This is toast in top center",
35
+ duration: 3000,
36
+ close: true,
37
+ gravity: "top",
38
+ position: "center",
39
+ backgroundColor: "#4fbe87",
40
+ }).showToast()
41
+ })
42
+ document.getElementById("top-right").addEventListener("click", () => {
43
+ Toastify({
44
+ text: "This is toast in top right",
45
+ duration: 3000,
46
+ close: true,
47
+ gravity: "top",
48
+ position: "right",
49
+ backgroundColor: "#4fbe87",
50
+ }).showToast()
51
+ })
52
+ document.getElementById("bottom-right").addEventListener("click", () => {
53
+ Toastify({
54
+ text: "This is toast in bottom right",
55
+ duration: 3000,
56
+ close: true,
57
+ gravity: "bottom",
58
+ position: "right",
59
+ backgroundColor: "#4fbe87",
60
+ }).showToast()
61
+ })
62
+ document.getElementById("bottom-center").addEventListener("click", () => {
63
+ Toastify({
64
+ text: "This is toast in bottom center",
65
+ duration: 3000,
66
+ close: true,
67
+ gravity: "bottom",
68
+ position: "center",
69
+ backgroundColor: "#4fbe87",
70
+ }).showToast()
71
+ })
72
+ document.getElementById("bottom-left").addEventListener("click", () => {
73
+ Toastify({
74
+ text: "This is toast in bottom left",
75
+ duration: 3000,
76
+ close: true,
77
+ gravity: "bottom",
78
+ position: "left",
79
+ backgroundColor: "#4fbe87",
80
+ }).showToast()
81
+ })