@onetype/framework 2.0.22 → 2.0.25

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 (128) hide show
  1. package/addons/core/assets/back/functions/import.js +24 -0
  2. package/docs/architecture.md +58 -10
  3. package/docs/frontend.md +29 -12
  4. package/lib/items/elements/form/button/button.js +106 -0
  5. package/lib/items/elements/form/button/styles/base.css +176 -0
  6. package/lib/items/elements/form/button/styles/sizes.css +78 -0
  7. package/lib/items/elements/form/button/styles/variants.css +421 -0
  8. package/lib/items/elements/form/checkbox/checkbox.js +58 -0
  9. package/lib/items/elements/form/checkbox/styles/base.css +52 -0
  10. package/lib/items/elements/form/checkbox/styles/sizes.css +39 -0
  11. package/lib/items/elements/form/checkbox/styles/variants.css +121 -0
  12. package/lib/items/elements/form/field/field.css +96 -0
  13. package/lib/items/elements/form/field/field.js +40 -0
  14. package/lib/items/elements/form/input/input.css +111 -0
  15. package/lib/items/elements/form/input/input.js +79 -0
  16. package/lib/items/elements/form/input/styles/base.css +26 -0
  17. package/lib/items/elements/form/input/styles/sizes.css +15 -0
  18. package/lib/items/elements/form/input/styles/variants.css +98 -0
  19. package/lib/items/elements/form/radio/radio.js +58 -0
  20. package/lib/items/elements/form/radio/styles/base.css +48 -0
  21. package/lib/items/elements/form/radio/styles/sizes.css +36 -0
  22. package/lib/items/elements/form/radio/styles/variants.css +121 -0
  23. package/lib/items/elements/form/rating/rating.css +95 -0
  24. package/lib/items/elements/form/rating/rating.js +89 -0
  25. package/lib/items/elements/form/section/section.css +129 -0
  26. package/lib/items/elements/form/section/section.js +40 -0
  27. package/lib/items/elements/form/slider/slider.css +244 -0
  28. package/lib/items/elements/form/slider/slider.js +70 -0
  29. package/lib/items/elements/form/textarea/textarea.css +117 -0
  30. package/lib/items/elements/form/textarea/textarea.js +70 -0
  31. package/lib/items/elements/global/card/card.css +57 -0
  32. package/lib/items/elements/global/card/card.js +48 -0
  33. package/lib/items/elements/global/code/code.css +66 -0
  34. package/lib/items/elements/global/code/code.js +40 -0
  35. package/lib/items/elements/global/faq/faq.css +76 -0
  36. package/lib/items/elements/global/faq/faq.js +44 -0
  37. package/lib/items/elements/global/heading/heading.css +106 -0
  38. package/lib/items/elements/global/heading/heading.js +52 -0
  39. package/lib/items/elements/global/markdown/markdown.css +248 -0
  40. package/lib/items/elements/global/markdown/markdown.js +23 -0
  41. package/lib/items/elements/global/notice/notice.css +91 -0
  42. package/lib/items/elements/global/notice/notice.js +35 -0
  43. package/lib/items/elements/global/parameters/params.css +69 -0
  44. package/lib/items/elements/global/parameters/params.js +32 -0
  45. package/lib/items/elements/global/tabs/tabs.css +47 -0
  46. package/lib/items/elements/global/tabs/tabs.js +32 -0
  47. package/lib/items/elements/global/tags/tags.css +42 -0
  48. package/lib/items/elements/global/tags/tags.js +46 -0
  49. package/lib/items/elements/sections/footer/footer.css +205 -0
  50. package/lib/items/elements/sections/footer/footer.js +109 -0
  51. package/lib/items/elements/sections/hero/hero.css +100 -0
  52. package/lib/items/elements/sections/hero/hero.js +54 -0
  53. package/lib/items/elements/sections/navbar/navbar.css +80 -0
  54. package/lib/items/elements/sections/navbar/navbar.js +42 -0
  55. package/lib/items/elements/sections/stats/stats.css +34 -0
  56. package/lib/items/elements/sections/stats/stats.js +74 -0
  57. package/lib/items/elements/status/code/code.css +48 -0
  58. package/lib/items/elements/status/code/code.js +44 -0
  59. package/lib/items/elements/status/empty/empty.css +59 -0
  60. package/lib/items/elements/status/empty/empty.js +43 -0
  61. package/lib/items/elements/status/error/error.css +55 -0
  62. package/lib/items/elements/status/error/error.js +55 -0
  63. package/lib/items/elements/status/loading/loading.css +62 -0
  64. package/lib/items/elements/status/loading/loading.js +31 -0
  65. package/lib/load.js +83 -5
  66. package/lib/src/classes/addon/class.js +1 -1
  67. package/lib/src/classes/addon/mixins/store.js +8 -8
  68. package/lib/src/mixins/assets.js +65 -0
  69. package/lib/src/onetype.js +4 -0
  70. package/lib/styles/classes/layout.css +36 -0
  71. package/lib/styles/classes/spacing.css +96 -0
  72. package/lib/styles/queries.css +6 -0
  73. package/lib/styles/reset.css +169 -0
  74. package/lib/styles/variables.css +71 -0
  75. package/package.json +3 -3
  76. package/addons/core/clients/LICENSE.txt +0 -40
  77. package/addons/core/clients/README.md +0 -123
  78. package/addons/core/database/README.md +0 -276
  79. package/addons/render/assets/back/README.md +0 -1
  80. package/addons/render/assets/back/functions/import.js +0 -45
  81. package/addons/render/items/js/#register/addon.js +0 -14
  82. package/addons/render/items/js/functions/count.js +0 -9
  83. package/addons/render/items/js/functions/get.js +0 -34
  84. package/addons/render/items/js/functions/groups.js +0 -16
  85. package/addons/render/items/js/functions/render.js +0 -44
  86. package/addons/render/items/js/item/catch/add.js +0 -18
  87. package/test/front/test.js +0 -56
  88. package/test.js +0 -55
  89. /package/addons/{render → core}/assets/back/addon.js +0 -0
  90. /package/addons/{render → core}/assets/back/functions/css.js +0 -0
  91. /package/addons/{render → core}/assets/back/functions/js.js +0 -0
  92. /package/addons/{render → core}/assets/back/functions/scan/directories.js +0 -0
  93. /package/addons/{render → core}/assets/back/functions/scan/files.js +0 -0
  94. /package/addons/{render → core}/assets/back/functions/utils/read.js +0 -0
  95. /package/addons/{render → core}/assets/back/functions/utils/transform.js +0 -0
  96. /package/addons/{render → core}/assets/back/items/commands/css.js +0 -0
  97. /package/addons/{render → core}/assets/back/items/commands/js.js +0 -0
  98. /package/addons/{render → core}/assets/back/items/html/css.js +0 -0
  99. /package/addons/{render → core}/assets/back/items/html/js.js +0 -0
  100. /package/addons/{render → core}/assets/back/load.js +0 -0
  101. /package/addons/core/database/front/{#register/addon.js → addon.js} +0 -0
  102. /package/addons/float/modals/front/js/{#register/addon.js → addon.js} +0 -0
  103. /package/addons/float/overlays/front/js/{#register/addon.js → addon.js} +0 -0
  104. /package/addons/float/popups/js/{#register/addon.js → addon.js} +0 -0
  105. /package/addons/float/toasts/{#register/addon.js → addon.js} +0 -0
  106. /package/addons/float/tooltips/{#register/addon.js → addon.js} +0 -0
  107. /package/addons/render/transforms/{front/js/#register/addon.js → addon.js} +0 -0
  108. /package/addons/render/transforms/{front/js/functions → functions}/load/assets.js +0 -0
  109. /package/addons/render/transforms/{front/js/items → items}/directives/transform.js +0 -0
  110. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/accordion}/accordion.js +0 -0
  111. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms}/chart/area.js +0 -0
  112. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms}/chart/bar.js +0 -0
  113. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms}/chart/bubble.js +0 -0
  114. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms}/chart/doughnut.js +0 -0
  115. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms}/chart/line.js +0 -0
  116. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms}/chart/pie.js +0 -0
  117. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms}/chart/radar.js +0 -0
  118. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms}/chart/scatter.js +0 -0
  119. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/codeflask}/codeflask.js +0 -0
  120. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/codemirror}/codemirror.js +0 -0
  121. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/comparison}/comparison.js +0 -0
  122. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/heatmap}/heatmap.js +0 -0
  123. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/interact}/interact.js +0 -0
  124. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/particles}/particles.js +0 -0
  125. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/sparkline}/sparkline.js +0 -0
  126. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/swiper}/swiper.js +0 -0
  127. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/tabs}/tabs.js +0 -0
  128. /package/{addons/render/transforms/front/js/items/self → lib/items/transforms/typed}/typed.js +0 -0
@@ -0,0 +1,205 @@
1
+ .e-71d10544
2
+ {
3
+ display: flex;
4
+ width: 100%;
5
+ }
6
+
7
+ .e-71d10544 > .holder
8
+ {
9
+ display: flex;
10
+ flex-direction: column;
11
+ width: 100%;
12
+ border-top: 1px solid var(--ot-bg-2-border);
13
+ }
14
+
15
+ /* Inner */
16
+
17
+ .e-71d10544 > .holder > .inner
18
+ {
19
+ display: flex;
20
+ justify-content: space-between;
21
+ gap: var(--ot-spacing-l);
22
+ max-width: 1200px;
23
+ width: 100%;
24
+ margin: 0 auto;
25
+ padding: 60px 32px 40px;
26
+ }
27
+
28
+ /* Brand */
29
+
30
+ .e-71d10544 > .holder > .inner > .brand
31
+ {
32
+ display: flex;
33
+ flex-direction: column;
34
+ gap: var(--ot-spacing-s);
35
+ max-width: 320px;
36
+ }
37
+
38
+ .e-71d10544 > .holder > .inner > .brand > .logo
39
+ {
40
+ display: flex;
41
+ align-items: center;
42
+ text-decoration: none;
43
+ }
44
+
45
+ .e-71d10544 > .holder > .inner > .brand > .logo > .logo-icon
46
+ {
47
+ height: 20px;
48
+ }
49
+
50
+ .e-71d10544 > .holder > .inner > .brand > .tagline
51
+ {
52
+ font-size: var(--ot-size-m);
53
+ color: var(--ot-text-2);
54
+ line-height: 1.6;
55
+ margin: var(--ot-spacing-x) 0 0;
56
+ }
57
+
58
+ /* Columns */
59
+
60
+ .e-71d10544 > .holder > .inner > .columns
61
+ {
62
+ display: flex;
63
+ gap: 80px;
64
+ }
65
+
66
+ .e-71d10544 > .holder > .inner > .columns > .column
67
+ {
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: var(--ot-spacing-s);
71
+ }
72
+
73
+ .e-71d10544 > .holder > .inner > .columns > .column > .column-title
74
+ {
75
+ font-size: var(--ot-size-s);
76
+ font-weight: 600;
77
+ color: var(--ot-text-1);
78
+ text-transform: uppercase;
79
+ letter-spacing: 0.5px;
80
+ margin: 0 0 var(--ot-spacing-x) 0;
81
+ }
82
+
83
+ .e-71d10544 > .holder > .inner > .columns > .column > .link
84
+ {
85
+ font-size: var(--ot-size-m);
86
+ color: var(--ot-text-2);
87
+ text-decoration: none;
88
+ transition: color 0.15s ease;
89
+ }
90
+
91
+ .e-71d10544 > .holder > .inner > .columns > .column > .link:hover
92
+ {
93
+ color: var(--ot-text-1);
94
+ }
95
+
96
+ /* Integrations */
97
+
98
+ .e-71d10544 > .holder > .inner > .brand > .integrations
99
+ {
100
+ display: flex;
101
+ flex-direction: column;
102
+ gap: var(--ot-spacing-s);
103
+ margin-top: var(--ot-spacing-s);
104
+ }
105
+
106
+ .e-71d10544 > .holder > .inner > .brand > .integrations > .integrations-label
107
+ {
108
+ font-size: var(--ot-size-s);
109
+ font-weight: 600;
110
+ color: var(--ot-text-2);
111
+ text-transform: uppercase;
112
+ letter-spacing: 0.5px;
113
+ }
114
+
115
+ .e-71d10544 > .holder > .inner > .brand > .integrations > .integrations-list
116
+ {
117
+ display: flex;
118
+ align-items: center;
119
+ flex-wrap: wrap;
120
+ gap: 6px;
121
+ }
122
+
123
+ .e-71d10544 > .holder > .inner > .brand > .integrations > .integrations-list > .integration
124
+ {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: 6px;
128
+ padding: 4px 10px;
129
+ border-radius: 6px;
130
+ background: var(--ot-bg-2);
131
+ border: 1px solid var(--ot-bg-2-border);
132
+ font-size: var(--ot-size-s);
133
+ color: var(--ot-text-2);
134
+ text-decoration: none;
135
+ transition: color 0.15s ease, border-color 0.15s ease;
136
+ }
137
+
138
+ .e-71d10544 > .holder > .inner > .brand > .integrations > .integrations-list > .integration > i
139
+ {
140
+ font-size: 14px;
141
+ color: var(--ot-text-2);
142
+ }
143
+
144
+ .e-71d10544 > .holder > .inner > .brand > .integrations > .integrations-list > .integration.more
145
+ {
146
+ color: var(--ot-brand);
147
+ cursor: pointer;
148
+ }
149
+
150
+ .e-71d10544 > .holder > .inner > .brand > .integrations > .integrations-list > .integration.more > i
151
+ {
152
+ color: var(--ot-brand);
153
+ }
154
+
155
+ .e-71d10544 > .holder > .inner > .brand > .integrations > .integrations-list > .integration.more:hover
156
+ {
157
+ border-color: var(--ot-brand);
158
+ }
159
+
160
+ /* Badges */
161
+
162
+ .e-71d10544 > .holder > .badges
163
+ {
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ flex-wrap: wrap;
168
+ gap: var(--ot-spacing-m);
169
+ width: 100%;
170
+ padding: var(--ot-spacing-m) 32px;
171
+ border-top: 1px solid var(--ot-bg-2-border);
172
+ }
173
+
174
+ .e-71d10544 > .holder > .badges > .badge
175
+ {
176
+ display: flex;
177
+ align-items: center;
178
+ gap: 6px;
179
+ font-size: var(--ot-size-s);
180
+ color: var(--ot-text-2);
181
+ }
182
+
183
+ .e-71d10544 > .holder > .badges > .badge > i
184
+ {
185
+ font-size: 16px;
186
+ color: var(--ot-brand);
187
+ }
188
+
189
+ /* Bottom */
190
+
191
+ .e-71d10544 > .holder > .bottom
192
+ {
193
+ display: flex;
194
+ align-items: center;
195
+ justify-content: center;
196
+ width: 100%;
197
+ padding: var(--ot-spacing-m) 32px;
198
+ border-top: 1px solid var(--ot-bg-2-border);
199
+ }
200
+
201
+ .e-71d10544 > .holder > .bottom > .copyright
202
+ {
203
+ font-size: var(--ot-size-s);
204
+ color: var(--ot-text-2);
205
+ }
@@ -0,0 +1,109 @@
1
+ onetype.AddonReady('elements', (elements) =>
2
+ {
3
+ elements.ItemAdd({
4
+ id: 'sections-footer',
5
+ icon: 'dock_to_bottom',
6
+ name: 'Footer',
7
+ description: 'Site footer with logo, link columns, integrations, trust badges, and copyright.',
8
+ category: 'Section',
9
+ author: 'OneType',
10
+ config: {
11
+ columns: {
12
+ type: 'array',
13
+ value: [
14
+ {
15
+ title: 'Product',
16
+ links: [
17
+ { label: 'Transforms', href: '/#transforms' },
18
+ { label: 'Features', href: '/#features' },
19
+ { label: 'Pricing', href: '/pricing' },
20
+ { label: 'Changelog', href: '/changelog' }
21
+ ]
22
+ },
23
+ {
24
+ title: 'Resources',
25
+ links: [
26
+ { label: 'Documentation', href: 'https://docs.onetype.ai/transforms' },
27
+ { label: 'GitHub', href: 'https://github.com/nicely-gg/transforms' },
28
+ { label: 'npm', href: 'https://www.npmjs.com/package/@nicely-gg/transforms' },
29
+ { label: 'Contact', href: 'https://onetype.ai/contact' }
30
+ ]
31
+ },
32
+ {
33
+ title: 'Legal',
34
+ links: [
35
+ { label: 'Terms of Service', href: 'https://onetype.ai/legal/terms' },
36
+ { label: 'Privacy Policy', href: 'https://onetype.ai/legal/privacy' },
37
+ { label: 'Cookie Policy', href: 'https://onetype.ai/legal/cookies' },
38
+ { label: 'Developer Agreement', href: 'https://onetype.ai/legal/developer' },
39
+ { label: 'Data Processing', href: 'https://onetype.ai/legal/dpa' },
40
+ { label: 'Acceptable Use', href: 'https://onetype.ai/legal/aup' },
41
+ { label: 'Subprocessors', href: 'https://onetype.ai/legal/subprocessors' }
42
+ ]
43
+ }
44
+ ]
45
+ },
46
+ platforms: {
47
+ type: 'array',
48
+ value: [
49
+ { icon: 'language', label: 'Any HTML' },
50
+ { icon: 'web', label: 'Webflow' },
51
+ { icon: 'design_services', label: 'Framer' },
52
+ { icon: 'article', label: 'WordPress' },
53
+ { icon: 'shopping_cart', label: 'Shopify' },
54
+ { icon: 'storefront', label: 'Squarespace' }
55
+ ]
56
+ },
57
+ badges: {
58
+ type: 'array',
59
+ value: [
60
+ { icon: 'code_off', label: 'Zero Dependencies' },
61
+ { icon: 'speed', label: 'Lazy Loaded' },
62
+ { icon: 'devices', label: 'All Platforms' },
63
+ { icon: 'open_in_new', label: 'Open Source Core' },
64
+ { icon: 'verified', label: 'Web Components' }
65
+ ]
66
+ }
67
+ },
68
+ render: function()
69
+ {
70
+ this.year = new Date().getFullYear();
71
+
72
+ return `
73
+ <footer class="holder">
74
+ <div class="inner">
75
+ <div class="brand">
76
+ <a class="logo" href="/">
77
+ <img class="logo-icon" src="https://global.divhunt.com/bd8ffd2fc9cf3a7e81b3326ac63a7cfe_4406.svg" alt="OneType" />
78
+ </a>
79
+ <p class="tagline">Custom HTML tags that become interactive components. One script, one tag — works on any platform.</p>
80
+ <div class="integrations">
81
+ <div class="integrations-list">
82
+ <div ot-for="item in platforms" class="integration">
83
+ <i>{{ item.icon }}</i>
84
+ <span>{{ item.label }}</span>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ <div class="columns">
90
+ <div ot-for="col in columns" class="column">
91
+ <h4 class="column-title">{{ col.title }}</h4>
92
+ <a ot-for="link in col.links" class="link" :href="link.href">{{ link.label }}</a>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ <div class="badges">
97
+ <div ot-for="badge in badges" class="badge">
98
+ <i>{{ badge.icon }}</i>
99
+ <span>{{ badge.label }}</span>
100
+ </div>
101
+ </div>
102
+ <div class="bottom">
103
+ <span class="copyright">&copy; {{ year }} OneType. All rights reserved.</span>
104
+ </div>
105
+ </footer>
106
+ `;
107
+ }
108
+ });
109
+ });
@@ -0,0 +1,100 @@
1
+ .e-59eb0a1d
2
+ {
3
+ display: flex;
4
+ }
5
+
6
+ .e-59eb0a1d > .holder
7
+ {
8
+ display: flex;
9
+ flex-direction: column;
10
+ align-items: center;
11
+ width: 100%;
12
+ padding: 80px var(--ot-spacing-m) 60px;
13
+ text-align: center;
14
+ gap: var(--ot-spacing-m);
15
+ }
16
+
17
+ /* Badge */
18
+
19
+ .e-59eb0a1d > .holder > .badge
20
+ {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ gap: 6px;
24
+ padding: 6px 14px;
25
+ border-radius: 100px;
26
+ border: 1px solid var(--ot-bg-2-border);
27
+ background: var(--ot-bg-2);
28
+ font-size: var(--ot-size-s);
29
+ font-weight: 500;
30
+ color: var(--ot-text-2);
31
+ }
32
+
33
+ .e-59eb0a1d > .holder > .badge > i
34
+ {
35
+ font-size: 14px;
36
+ color: var(--ot-brand);
37
+ }
38
+
39
+ /* Title */
40
+
41
+ .e-59eb0a1d > .holder > .title
42
+ {
43
+ font-size: 52px;
44
+ font-weight: 800;
45
+ line-height: 1.1;
46
+ color: var(--ot-text-1);
47
+ letter-spacing: -1px;
48
+ margin: 0;
49
+ }
50
+
51
+ .e-59eb0a1d > .holder > .title > .highlight
52
+ {
53
+ color: var(--ot-brand);
54
+ }
55
+
56
+ /* Description */
57
+
58
+ .e-59eb0a1d > .holder > .description
59
+ {
60
+ max-width: 480px;
61
+ font-size: var(--ot-size-m);
62
+ line-height: 1.6;
63
+ color: var(--ot-text-2);
64
+ margin: 0;
65
+ }
66
+
67
+ /* Buttons */
68
+
69
+ .e-59eb0a1d > .holder > .buttons
70
+ {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: var(--ot-spacing-s);
74
+ margin-top: var(--ot-spacing-s);
75
+ }
76
+
77
+ /* Trust */
78
+
79
+ .e-59eb0a1d > .holder > .trust
80
+ {
81
+ display: flex;
82
+ align-items: center;
83
+ gap: var(--ot-spacing-m);
84
+ margin-top: var(--ot-spacing-x);
85
+ }
86
+
87
+ .e-59eb0a1d > .holder > .trust > .trust-item
88
+ {
89
+ display: flex;
90
+ align-items: center;
91
+ gap: 4px;
92
+ font-size: var(--ot-size-s);
93
+ color: var(--ot-text-2);
94
+ }
95
+
96
+ .e-59eb0a1d > .holder > .trust > .trust-item > i
97
+ {
98
+ font-size: 14px;
99
+ color: var(--ot-green);
100
+ }
@@ -0,0 +1,54 @@
1
+ onetype.AddonReady('elements', (elements) =>
2
+ {
3
+ elements.ItemAdd({
4
+ id: 'sections-hero',
5
+ icon: 'star',
6
+ name: 'Hero',
7
+ description: 'Hero section with badge, heading, description, and CTA buttons.',
8
+ category: 'Component',
9
+ author: 'OneType',
10
+ config: {
11
+ badge: {
12
+ type: 'string',
13
+ value: 'Interactive HTML Components'
14
+ },
15
+ title: {
16
+ type: 'string',
17
+ value: 'One tag.'
18
+ },
19
+ highlight: {
20
+ type: 'string',
21
+ value: 'Zero config.'
22
+ },
23
+ description: {
24
+ type: 'string',
25
+ value: 'Drop a custom HTML tag, get an interactive component. Swiper, tabs, accordion, modal — works on any platform. No build tools, no JavaScript required.'
26
+ },
27
+ buttons: {
28
+ type: 'array',
29
+ value: [
30
+ { text: 'Get Started', icon: 'arrow_forward', href: '#get-started', variant: 'brand' },
31
+ { text: 'View on GitHub', icon: 'code', href: 'https://github.com/nicely-gg/transforms', variant: 'ghost border' }
32
+ ]
33
+ }
34
+ },
35
+ render: function()
36
+ {
37
+ return `
38
+ <div class="holder">
39
+ <div ot-if="badge" class="badge"><i>widgets</i> {{ badge }}</div>
40
+ <h1 class="title">{{ title }}<br><span class="highlight">{{ highlight }}</span></h1>
41
+ <p ot-if="description" class="description">{{ description }}</p>
42
+ <div ot-if="buttons.length" class="buttons">
43
+ <e-button ot-for="btn in buttons" :text="btn.text" :icon="btn.icon" :href="btn.href" :variant="[btn.variant, 'size-m']"></e-button>
44
+ </div>
45
+ <div class="trust">
46
+ <span class="trust-item"><i>check_circle</i> Works everywhere</span>
47
+ <span class="trust-item"><i>check_circle</i> Zero dependencies</span>
48
+ <span class="trust-item"><i>check_circle</i> Free tier available</span>
49
+ </div>
50
+ </div>
51
+ `;
52
+ }
53
+ });
54
+ });
@@ -0,0 +1,80 @@
1
+ .e-7eb56bb9
2
+ {
3
+ display: flex;
4
+ }
5
+
6
+ .e-7eb56bb9 > .holder
7
+ {
8
+ display: flex;
9
+ align-items: center;
10
+ width: 100%;
11
+ height: 48px;
12
+ padding: 0 var(--ot-spacing-m);
13
+ background: var(--ot-bg-1);
14
+ border-bottom: 1px solid var(--ot-bg-2-border);
15
+ }
16
+
17
+ /* Logo */
18
+
19
+ .e-7eb56bb9 > .holder > .logo
20
+ {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: var(--ot-spacing-s);
24
+ text-decoration: none;
25
+ color: var(--ot-text-1);
26
+ flex-shrink: 0;
27
+ }
28
+
29
+ .e-7eb56bb9 > .holder > .logo > .logo-icon
30
+ {
31
+ height: 16px;
32
+ }
33
+
34
+
35
+ /* Tabs */
36
+
37
+ .e-7eb56bb9 > .holder > .tabs
38
+ {
39
+ display: flex;
40
+ align-items: center;
41
+ gap: var(--ot-spacing-x);
42
+ margin-left: var(--ot-spacing-l);
43
+ height: 100%;
44
+ }
45
+
46
+ .e-7eb56bb9 > .holder .tab
47
+ {
48
+ display: flex;
49
+ align-items: center;
50
+ height: 100%;
51
+ gap: 6px;
52
+ padding: 0 var(--ot-spacing-s);
53
+ text-decoration: none;
54
+ white-space: nowrap;
55
+ transition: color 0.2s ease, background 0.2s ease;
56
+ font-weight: 500;
57
+ color: var(--ot-text-2);
58
+ }
59
+
60
+ .e-7eb56bb9 > .holder .tab > i
61
+ {
62
+ font-size: 16px;
63
+ }
64
+
65
+ .e-7eb56bb9 > .holder .tab:hover
66
+ {
67
+ color: var(--ot-text-1);
68
+ background: var(--ot-bg-2);
69
+ }
70
+
71
+ /* Right */
72
+
73
+ .e-7eb56bb9 > .holder > .right
74
+ {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: var(--ot-spacing-s);
78
+ margin-left: auto;
79
+ height: 100%;
80
+ }
@@ -0,0 +1,42 @@
1
+ onetype.AddonReady('elements', (elements) =>
2
+ {
3
+ elements.ItemAdd({
4
+ id: 'sections-navbar',
5
+ icon: 'menu',
6
+ name: 'Navbar',
7
+ description: 'Top navigation bar with logo and links.',
8
+ category: 'Section',
9
+ author: 'OneType',
10
+ config: {
11
+ items: {
12
+ type: 'array',
13
+ value: [
14
+ { icon: 'widgets', label: 'Transforms', href: '/transforms', position: 'left' },
15
+ { icon: 'payments', label: 'Pricing', href: '/pricing', position: 'left' },
16
+ { icon: 'menu_book', label: 'Docs', href: 'https://docs.onetype.ai/transforms', position: 'left' },
17
+ { icon: 'code', label: 'GitHub', href: 'https://github.com/nicely-gg/transforms', position: 'right' },
18
+ { icon: 'arrow_forward', label: 'Get Started', href: '/get-started', position: 'right' }
19
+ ]
20
+ }
21
+ },
22
+ render: function()
23
+ {
24
+ this.left = this.items.filter(i => i.position === 'left');
25
+ this.right = this.items.filter(i => i.position === 'right');
26
+
27
+ return `
28
+ <nav class="holder">
29
+ <a class="logo" href="/">
30
+ <img class="logo-icon" src="https://global.divhunt.com/bd8ffd2fc9cf3a7e81b3326ac63a7cfe_4406.svg" alt="OneType" />
31
+ </a>
32
+ <div class="tabs">
33
+ <a ot-for="item in left" class="tab" :href="item.href"><i>{{ item.icon }}</i> {{ item.label }}</a>
34
+ </div>
35
+ <div class="right">
36
+ <a ot-for="item in right" class="tab" :href="item.href"><i>{{ item.icon }}</i> {{ item.label }}</a>
37
+ </div>
38
+ </nav>
39
+ `;
40
+ }
41
+ });
42
+ });
@@ -0,0 +1,34 @@
1
+ .e-1d2b5bd6
2
+ {
3
+ display: flex;
4
+ }
5
+
6
+ .e-1d2b5bd6 > .holder
7
+ {
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ gap: var(--ot-spacing-l);
12
+ width: 100%;
13
+ }
14
+
15
+ .e-1d2b5bd6 > .holder > .item
16
+ {
17
+ display: flex;
18
+ flex-direction: column;
19
+ align-items: center;
20
+ gap: var(--ot-spacing-x);
21
+ }
22
+
23
+ .e-1d2b5bd6 > .holder > .item > .value
24
+ {
25
+ font-size: var(--ot-size-l);
26
+ font-weight: 700;
27
+ color: var(--ot-brand);
28
+ }
29
+
30
+ .e-1d2b5bd6 > .holder > .item > .label
31
+ {
32
+ font-size: var(--ot-size-s);
33
+ color: var(--ot-text-2);
34
+ }
@@ -0,0 +1,74 @@
1
+ onetype.AddonReady('elements', (elements) =>
2
+ {
3
+ elements.ItemAdd({
4
+ id: 'sections-stats',
5
+ icon: 'bar_chart',
6
+ name: 'Stats',
7
+ description: 'Animated statistics row.',
8
+ category: 'Component',
9
+ author: 'OneType',
10
+ config: {
11
+ items: {
12
+ type: 'array',
13
+ value: [
14
+ { value: 30, suffix: '+', label: 'Actions' },
15
+ { value: 8, suffix: '+', label: 'Integrations' },
16
+ { value: 100000, suffix: '+', label: 'Executions' },
17
+ { value: 1500, suffix: '+', label: 'Users' }
18
+ ]
19
+ }
20
+ },
21
+ render: function()
22
+ {
23
+ this.counts = this.items.map(() => 0);
24
+
25
+ this.animate = () =>
26
+ {
27
+ const duration = 1500;
28
+ const start = performance.now();
29
+
30
+ const step = (now) =>
31
+ {
32
+ const progress = Math.min((now - start) / duration, 1);
33
+ const ease = 1 - Math.pow(1 - progress, 3);
34
+
35
+ this.items.forEach((item, i) =>
36
+ {
37
+ this.counts[i] = Math.round(ease * item.value);
38
+ });
39
+
40
+ this.Update();
41
+
42
+ if(progress < 1)
43
+ {
44
+ requestAnimationFrame(step);
45
+ }
46
+ };
47
+
48
+ requestAnimationFrame(step);
49
+ };
50
+
51
+ this.format = (num) =>
52
+ {
53
+ return num.toLocaleString('en-US');
54
+ };
55
+
56
+ this.display = (index) =>
57
+ {
58
+ const item = this.items[index];
59
+ return (item.prefix || '') + this.format(this.counts[index]) + (item.suffix || '');
60
+ };
61
+
62
+ setTimeout(() => this.animate(), 200);
63
+
64
+ return `
65
+ <div class="holder">
66
+ <div ot-for="item, index in items" class="item">
67
+ <span class="value">{{ display(index) }}</span>
68
+ <span class="label">{{ item.label }}</span>
69
+ </div>
70
+ </div>
71
+ `;
72
+ }
73
+ });
74
+ });