@onetype/framework 2.0.53 → 2.0.55

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 (150) hide show
  1. package/addons/float/popup/css/popup.css +2 -2
  2. package/addons/render/directives/front/functions/process.js +3 -1
  3. package/addons/render/directives/front/items/self/160-slot.js +9 -1
  4. package/addons/render/editor/addon.js +13 -0
  5. package/addons/render/editor/functions/block/add.js +57 -0
  6. package/addons/render/editor/functions/block/delete.js +32 -0
  7. package/addons/render/editor/functions/block/find.js +30 -0
  8. package/addons/render/editor/functions/render/block.js +114 -0
  9. package/addons/render/editor/functions/render/blocks.js +31 -0
  10. package/addons/render/editor/items/elements/editor.js +69 -0
  11. package/addons/render/editor/items/self/paragraph.js +21 -0
  12. package/addons/render/editor/styles/editor.css +252 -0
  13. package/addons/render/elements/front/functions/types/colors/badge.js +19 -0
  14. package/addons/render/elements/front/functions/types/colors/status.js +24 -0
  15. package/addons/render/elements/front/functions/types/escape.js +8 -0
  16. package/addons/render/elements/front/functions/types/format/currency.js +16 -0
  17. package/addons/render/elements/front/functions/types/format/date.js +16 -0
  18. package/addons/render/elements/front/functions/types/format/number.js +24 -0
  19. package/addons/render/elements/front/functions/types/format/timeago.js +43 -0
  20. package/addons/render/elements/front/functions/types/render/avatar.js +10 -0
  21. package/addons/render/elements/front/functions/types/render/badge.js +17 -0
  22. package/addons/render/elements/front/functions/types/render/boolean.js +8 -0
  23. package/addons/render/elements/front/functions/types/render/chip.js +6 -0
  24. package/addons/render/elements/front/functions/types/render/currency.js +7 -0
  25. package/addons/render/elements/front/functions/types/render/date.js +6 -0
  26. package/addons/render/elements/front/functions/types/render/description.js +12 -0
  27. package/addons/render/elements/front/functions/types/render/group.js +11 -0
  28. package/addons/render/elements/front/functions/types/render/icon.js +8 -0
  29. package/addons/render/elements/front/functions/types/render/image.js +9 -0
  30. package/addons/render/elements/front/functions/types/render/link.js +8 -0
  31. package/addons/render/elements/front/functions/types/render/media.js +16 -0
  32. package/addons/render/elements/front/functions/types/render/metric.js +13 -0
  33. package/addons/render/elements/front/functions/types/render/number.js +6 -0
  34. package/addons/render/elements/front/functions/types/render/progress.js +13 -0
  35. package/addons/render/elements/front/functions/types/render/status.js +12 -0
  36. package/addons/render/elements/front/functions/types/render/tag.js +6 -0
  37. package/addons/render/elements/front/functions/types/render/tags.js +11 -0
  38. package/addons/render/elements/front/functions/types/render/text.js +8 -0
  39. package/addons/render/elements/front/functions/types/render/timeago.js +6 -0
  40. package/addons/render/elements/front/functions/types/render.js +16 -0
  41. package/addons/render/elements/front/items/directives/element.js +8 -3
  42. package/addons/render/elements/front/items/self/cards/info/info.css +499 -0
  43. package/addons/render/elements/front/items/self/cards/info/info.js +224 -0
  44. package/addons/render/elements/front/items/self/cards/item/item.css +614 -0
  45. package/addons/render/elements/front/items/self/cards/item/item.js +200 -0
  46. package/addons/render/elements/front/items/self/cards/pricing/pricing.css +318 -46
  47. package/addons/render/elements/front/items/self/cards/pricing/pricing.js +81 -30
  48. package/addons/render/elements/front/items/self/cards/profile/profile.css +446 -0
  49. package/addons/render/elements/front/items/self/cards/profile/profile.js +186 -0
  50. package/addons/render/elements/front/items/self/cards/share/share.css +445 -0
  51. package/addons/render/elements/front/items/self/cards/share/share.js +316 -0
  52. package/addons/render/elements/front/items/self/cards/stat/stat.css +356 -0
  53. package/addons/render/elements/front/items/self/cards/stat/stat.js +146 -0
  54. package/addons/render/elements/front/items/self/charts/bar/bar.css +263 -0
  55. package/addons/render/elements/front/items/self/charts/bar/bar.js +156 -0
  56. package/addons/render/elements/front/items/self/charts/donut/donut.css +222 -0
  57. package/addons/render/elements/front/items/self/charts/donut/donut.js +164 -0
  58. package/addons/render/elements/front/items/self/charts/line/line.css +229 -0
  59. package/addons/render/elements/front/items/self/charts/line/line.js +249 -0
  60. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.css +102 -0
  61. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.js +164 -0
  62. package/addons/render/elements/front/items/self/core/builder/builder.css +71 -116
  63. package/addons/render/elements/front/items/self/core/builder/builder.js +212 -127
  64. package/addons/render/elements/front/items/self/core/repeater/repeater.css +338 -71
  65. package/addons/render/elements/front/items/self/core/repeater/repeater.js +191 -44
  66. package/addons/render/elements/front/items/self/data/filters/filters.css +541 -0
  67. package/addons/render/elements/front/items/self/data/filters/filters.js +504 -0
  68. package/addons/render/elements/front/items/self/data/table/table.css +588 -0
  69. package/addons/render/elements/front/items/self/data/table/table.js +589 -0
  70. package/addons/render/elements/front/items/self/form/button/button.css +430 -103
  71. package/addons/render/elements/front/items/self/form/button/button.js +109 -101
  72. package/addons/render/elements/front/items/self/form/checkbox/checkbox.css +356 -39
  73. package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +109 -75
  74. package/addons/render/elements/front/items/self/form/color/color.css +255 -61
  75. package/addons/render/elements/front/items/self/form/color/color.js +135 -41
  76. package/addons/render/elements/front/items/self/form/date/date.css +289 -38
  77. package/addons/render/elements/front/items/self/form/date/date.js +108 -24
  78. package/addons/render/elements/front/items/self/form/editor/editor.css +447 -0
  79. package/addons/render/elements/front/items/self/form/editor/editor.js +794 -0
  80. package/addons/render/elements/front/items/self/form/field/field.css +160 -29
  81. package/addons/render/elements/front/items/self/form/field/field.js +36 -16
  82. package/addons/render/elements/front/items/self/form/input/input.css +272 -32
  83. package/addons/render/elements/front/items/self/form/input/input.js +324 -124
  84. package/addons/render/elements/front/items/self/form/radio/radio.css +310 -45
  85. package/addons/render/elements/front/items/self/form/radio/radio.js +99 -80
  86. package/addons/render/elements/front/items/self/form/rating/rating.css +234 -57
  87. package/addons/render/elements/front/items/self/form/rating/rating.js +216 -86
  88. package/addons/render/elements/front/items/self/form/section/section.css +247 -32
  89. package/addons/render/elements/front/items/self/form/section/section.js +53 -16
  90. package/addons/render/elements/front/items/self/form/select/select.css +362 -64
  91. package/addons/render/elements/front/items/self/form/select/select.js +156 -30
  92. package/addons/render/elements/front/items/self/form/slider/slider.css +331 -123
  93. package/addons/render/elements/front/items/self/form/slider/slider.js +124 -26
  94. package/addons/render/elements/front/items/self/form/tags/tags.css +328 -53
  95. package/addons/render/elements/front/items/self/form/tags/tags.js +155 -28
  96. package/addons/render/elements/front/items/self/form/textarea/textarea.css +128 -27
  97. package/addons/render/elements/front/items/self/form/textarea/textarea.js +172 -113
  98. package/addons/render/elements/front/items/self/form/toggle/toggle.css +239 -39
  99. package/addons/render/elements/front/items/self/form/toggle/toggle.js +32 -17
  100. package/addons/render/elements/front/items/self/form/transfer/transfer.css +377 -0
  101. package/addons/render/elements/front/items/self/form/transfer/transfer.js +453 -0
  102. package/addons/render/elements/front/items/self/form/upload/upload.css +408 -0
  103. package/addons/render/elements/front/items/self/form/upload/upload.js +469 -0
  104. package/addons/render/elements/front/items/self/global/accordion/accordion.css +377 -0
  105. package/addons/render/elements/front/items/self/global/accordion/accordion.js +135 -0
  106. package/addons/render/elements/front/items/self/global/code/code.css +207 -44
  107. package/addons/render/elements/front/items/self/global/code/code.js +327 -19
  108. package/addons/render/elements/front/items/self/global/gallery/gallery.css +521 -0
  109. package/addons/render/elements/front/items/self/global/gallery/gallery.js +291 -0
  110. package/addons/render/elements/front/items/self/global/heading/heading.css +151 -49
  111. package/addons/render/elements/front/items/self/global/heading/heading.js +30 -15
  112. package/addons/render/elements/front/items/self/global/markdown/markdown.css +284 -135
  113. package/addons/render/elements/front/items/self/global/markdown/markdown.js +35 -5
  114. package/addons/render/elements/front/items/self/global/menu/menu.css +311 -56
  115. package/addons/render/elements/front/items/self/global/menu/menu.js +95 -47
  116. package/addons/render/elements/front/items/self/global/notice/notice.css +263 -23
  117. package/addons/render/elements/front/items/self/global/notice/notice.js +51 -11
  118. package/addons/render/elements/front/items/self/global/parameters/parameters.css +276 -33
  119. package/addons/render/elements/front/items/self/global/parameters/parameters.js +86 -16
  120. package/addons/render/elements/front/items/self/global/tags/tags.css +215 -29
  121. package/addons/render/elements/front/items/self/global/tags/tags.js +91 -17
  122. package/addons/render/elements/front/items/self/navigation/dock/dock.css +221 -0
  123. package/addons/render/elements/front/items/self/navigation/dock/dock.js +134 -0
  124. package/addons/render/elements/front/items/self/navigation/footer/footer.css +356 -0
  125. package/addons/render/elements/front/items/self/navigation/footer/footer.js +219 -0
  126. package/addons/render/elements/front/items/self/navigation/navbar/navbar.css +736 -76
  127. package/addons/render/elements/front/items/self/navigation/navbar/navbar.js +437 -29
  128. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.css +327 -196
  129. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.js +115 -62
  130. package/addons/render/elements/front/items/self/navigation/steps/steps.css +345 -0
  131. package/addons/render/elements/front/items/self/navigation/steps/steps.js +113 -0
  132. package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +362 -33
  133. package/addons/render/elements/front/items/self/navigation/tabs/tabs.js +62 -19
  134. package/addons/render/elements/front/items/self/status/code/code.css +83 -12
  135. package/addons/render/elements/front/items/self/status/code/code.js +15 -4
  136. package/addons/render/elements/front/items/self/status/empty/empty.css +95 -15
  137. package/addons/render/elements/front/items/self/status/empty/empty.js +17 -12
  138. package/addons/render/elements/front/items/self/status/error/error.css +99 -14
  139. package/addons/render/elements/front/items/self/status/error/error.js +21 -11
  140. package/addons/render/elements/front/items/self/status/loading/loading.css +85 -14
  141. package/addons/render/elements/front/items/self/status/loading/loading.js +5 -6
  142. package/addons/render/elements/front/styles/types.css +363 -0
  143. package/instructions.txt +28 -0
  144. package/lib/load.js +1 -0
  145. package/lib/styles/reset.css +89 -76
  146. package/package.json +1 -1
  147. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.css +0 -410
  148. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.js +0 -191
  149. package/addons/render/elements/front/items/self/global/faq/faq.css +0 -98
  150. package/addons/render/elements/front/items/self/global/faq/faq.js +0 -56
@@ -4,33 +4,41 @@ onetype.AddonReady('elements', (elements) =>
4
4
  id: 'cards-pricing',
5
5
  icon: 'payments',
6
6
  name: 'Pricing Card',
7
- description: 'Pricing plan card with name, price, features list, and CTA button.',
7
+ description: 'Premium pricing plan card with icon, badge, ribbon, highlighted state and flexible CTA.',
8
8
  category: 'Cards',
9
9
  author: 'OneType',
10
10
  config: {
11
+ icon: {
12
+ type: 'string'
13
+ },
11
14
  name: {
15
+ type: 'string'
16
+ },
17
+ description: {
18
+ type: 'string'
19
+ },
20
+ badge: {
21
+ type: 'string'
22
+ },
23
+ ribbon: {
24
+ type: 'string'
25
+ },
26
+ currency: {
12
27
  type: 'string',
13
- value: ''
28
+ value: '$'
14
29
  },
15
30
  price: {
16
- type: 'number',
17
- value: 0
31
+ type: 'string|number'
32
+ },
33
+ originalPrice: {
34
+ type: 'string|number'
18
35
  },
19
36
  period: {
20
37
  type: 'string',
21
38
  value: '/mo'
22
39
  },
23
40
  yearly: {
24
- type: 'string',
25
- value: ''
26
- },
27
- badge: {
28
- type: 'string',
29
- value: ''
30
- },
31
- description: {
32
- type: 'string',
33
- value: ''
41
+ type: 'string'
34
42
  },
35
43
  features: {
36
44
  type: 'array',
@@ -38,19 +46,28 @@ onetype.AddonReady('elements', (elements) =>
38
46
  each: {
39
47
  type: 'object',
40
48
  config: {
41
- text: { type: 'string', value: '' },
42
- included: { type: 'boolean', value: true }
49
+ text: { type: 'string' },
50
+ icon: { type: 'string' },
51
+ included: { type: 'boolean', value: true },
52
+ highlight: { type: 'boolean' }
43
53
  }
44
54
  }
45
55
  },
46
- href: {
56
+ cta: {
57
+ type: 'string',
58
+ value: 'Get started'
59
+ },
60
+ ctaIcon: {
47
61
  type: 'string',
48
- value: ''
62
+ value: 'arrow_forward'
63
+ },
64
+ href: {
65
+ type: 'string'
49
66
  },
50
67
  variant: {
51
68
  type: 'array',
52
- value: ['bg-2'],
53
- options: ['bg-1', 'bg-2', 'bg-3', 'bg-4', 'border', 'highlighted']
69
+ value: ['bg-1', 'border', 'size-m'],
70
+ options: ['bg-1', 'bg-2', 'bg-3', 'bg-4', 'featured', 'border', 'highlighted', 'size-s', 'size-m', 'size-l']
54
71
  },
55
72
  _click: {
56
73
  type: 'function'
@@ -58,35 +75,69 @@ onetype.AddonReady('elements', (elements) =>
58
75
  },
59
76
  render: function()
60
77
  {
61
- this.handle = ({ event }) =>
78
+ this.isHighlighted = this.variant.includes('highlighted');
79
+ this.isFeatured = this.variant.includes('featured');
80
+ this.hasRibbon = !!this.ribbon;
81
+
82
+ this.handle = (event) =>
62
83
  {
63
- if (this._click)
84
+ if(this._click)
64
85
  {
65
86
  this._click({ event });
66
87
  }
67
88
  };
68
89
 
69
- return `
90
+ this.ctaButtonVariant = () =>
91
+ {
92
+ if(this.isFeatured || this.isHighlighted)
93
+ {
94
+ return ['brand', 'size-m', 'full'];
95
+ }
96
+
97
+ return ['bg-2', 'border', 'size-m', 'full'];
98
+ };
99
+
100
+ return /* html */ `
70
101
  <div :class="'holder ' + variant.join(' ')">
102
+ <div ot-if="hasRibbon" class="ribbon">{{ ribbon }}</div>
103
+
71
104
  <div class="header">
72
- <span ot-if="badge" class="badge">{{ badge }}</span>
105
+ <div ot-if="icon || badge" class="top">
106
+ <div ot-if="icon" class="icon"><i>{{ icon }}</i></div>
107
+ <span ot-if="badge" class="badge">{{ badge }}</span>
108
+ </div>
109
+
73
110
  <h3 class="name">{{ name }}</h3>
74
111
  <p ot-if="description" class="description">{{ description }}</p>
112
+
75
113
  <div class="price">
76
- <span class="currency">$</span>
114
+ <span ot-if="currency" class="currency">{{ currency }}</span>
77
115
  <span class="amount">{{ price }}</span>
78
116
  <span ot-if="period" class="period">{{ period }}</span>
79
117
  </div>
118
+
119
+ <span ot-if="originalPrice" class="original"><span class="strike">{{ currency }}{{ originalPrice }}</span></span>
80
120
  <span ot-if="yearly" class="yearly">{{ yearly }}</span>
81
121
  </div>
82
- <div class="features">
83
- <div ot-for="feature in features" :class="'feature' + (feature.included ? '' : ' disabled')">
84
- <i class="icon">{{ feature.included ? 'check_circle' : 'remove' }}</i>
122
+
123
+ <div ot-if="features.length" class="features">
124
+ <div
125
+ ot-for="feature in features"
126
+ :class="'feature' + (feature.included === false ? ' disabled' : '') + (feature.highlight ? ' highlight' : '')"
127
+ >
128
+ <i class="icon">{{ feature.icon || (feature.included === false ? 'remove' : 'check_circle') }}</i>
85
129
  <span class="text">{{ feature.text }}</span>
86
130
  </div>
87
131
  </div>
88
- <div ot-if="href" class="action">
89
- <e-form-button text="Get Started" icon="arrow_forward" :href="href" :variant="variant.includes('highlighted') ? ['brand', 'size-m', 'full'] : ['bg-2', 'border', 'size-m', 'full']" ot-click="handle"></e-form-button>
132
+
133
+ <div ot-if="cta" class="action">
134
+ <e-form-button
135
+ :text="cta"
136
+ :icon="ctaIcon"
137
+ :href="href"
138
+ :variant="ctaButtonVariant()"
139
+ :_click="handle"
140
+ ></e-form-button>
90
141
  </div>
91
142
  </div>
92
143
  `;
@@ -0,0 +1,446 @@
1
+ /* Root */
2
+
3
+ .e-7dbb0917
4
+ {
5
+ display: flex;
6
+ width: 100%;
7
+ }
8
+
9
+ /* Holder */
10
+
11
+ .e-7dbb0917 > .holder
12
+ {
13
+ position: relative;
14
+ display: flex;
15
+ width: 100%;
16
+ border-radius: var(--ot-radius-l);
17
+ overflow: hidden;
18
+ transition: border-color 0.2s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.2s cubic-bezier(0.22, 1, 0.36, 1), transform 0.2s cubic-bezier(0.22, 1, 0.36, 1);
19
+ }
20
+
21
+ .e-7dbb0917 > .holder.vertical
22
+ {
23
+ flex-direction: column;
24
+ }
25
+
26
+ .e-7dbb0917 > .holder.horizontal
27
+ {
28
+ flex-direction: row;
29
+ align-items: center;
30
+ gap: var(--ot-spacing-m);
31
+ }
32
+
33
+ /* Clickable link overlay */
34
+
35
+ .e-7dbb0917 > .holder > .link
36
+ {
37
+ position: absolute;
38
+ inset: 0;
39
+ z-index: 1;
40
+ }
41
+
42
+ .e-7dbb0917 > .holder:has(> .link):hover
43
+ {
44
+ transform: translateY(-2px);
45
+ box-shadow: 0 12px 28px -14px rgba(20, 20, 30, 0.18);
46
+ }
47
+
48
+ /* Cover */
49
+
50
+ .e-7dbb0917 > .holder > .cover
51
+ {
52
+ height: 120px;
53
+ background-size: cover;
54
+ background-position: center;
55
+ background-color: var(--ot-bg-3);
56
+ }
57
+
58
+ .e-7dbb0917 > .holder.horizontal > .cover
59
+ {
60
+ display: none;
61
+ }
62
+
63
+ /* Body */
64
+
65
+ .e-7dbb0917 > .holder > .body
66
+ {
67
+ position: relative;
68
+ z-index: 2;
69
+ display: flex;
70
+ flex-direction: column;
71
+ gap: var(--ot-spacing-m);
72
+ padding: var(--ot-spacing-l);
73
+ flex: 1;
74
+ min-width: 0;
75
+ }
76
+
77
+ .e-7dbb0917 > .holder.horizontal > .body
78
+ {
79
+ padding: var(--ot-spacing-m);
80
+ }
81
+
82
+ /* When cover is present pull avatar up */
83
+
84
+ .e-7dbb0917 > .holder.vertical:has(> .cover) > .body
85
+ {
86
+ margin-top: -36px;
87
+ }
88
+
89
+ /* Head */
90
+
91
+ .e-7dbb0917 > .holder > .body > .head
92
+ {
93
+ display: flex;
94
+ align-items: center;
95
+ gap: var(--ot-spacing-m);
96
+ min-width: 0;
97
+ }
98
+
99
+ /* Avatar */
100
+
101
+ .e-7dbb0917 > .holder > .body > .head > .avatar
102
+ {
103
+ position: relative;
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: center;
107
+ width: 56px;
108
+ height: 56px;
109
+ border-radius: 50%;
110
+ background-color: var(--ot-bg-3);
111
+ background-size: cover;
112
+ background-position: center;
113
+ border: 3px solid var(--ot-bg-1);
114
+ box-shadow: 0 2px 6px rgba(20, 20, 30, 0.08);
115
+ flex-shrink: 0;
116
+ }
117
+
118
+ .e-7dbb0917 > .holder > .body > .head > .avatar > i
119
+ {
120
+ font-size: 28px;
121
+ color: var(--ot-text-3);
122
+ }
123
+
124
+ /* Identity */
125
+
126
+ .e-7dbb0917 > .holder > .body > .head > .identity
127
+ {
128
+ display: flex;
129
+ flex-direction: column;
130
+ gap: 2px;
131
+ min-width: 0;
132
+ flex: 1;
133
+ }
134
+
135
+ .e-7dbb0917 > .holder > .body > .head > .identity > .name
136
+ {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 5px;
140
+ font-family: var(--ot-font-secondary);
141
+ font-weight: 500;
142
+ letter-spacing: -0.01em;
143
+ color: var(--ot-text-1);
144
+ line-height: 1.2;
145
+ font-variation-settings: 'opsz' 144;
146
+ }
147
+
148
+ .e-7dbb0917 > .holder > .body > .head > .identity > .name > .verified
149
+ {
150
+ font-size: 15px;
151
+ color: var(--ot-blue);
152
+ font-variation-settings: 'FILL' 1;
153
+ }
154
+
155
+ .e-7dbb0917 > .holder > .body > .head > .identity > .role
156
+ {
157
+ font-size: 12px;
158
+ color: var(--ot-text-2);
159
+ font-family: var(--ot-font-primary);
160
+ }
161
+
162
+ /* Description */
163
+
164
+ .e-7dbb0917 > .holder > .body > .description
165
+ {
166
+ margin: 0;
167
+ font-size: 13px;
168
+ line-height: 1.55;
169
+ color: var(--ot-text-2);
170
+ font-family: var(--ot-font-primary);
171
+ }
172
+
173
+ /* Tags */
174
+
175
+ .e-7dbb0917 > .holder > .body > .tags
176
+ {
177
+ display: flex;
178
+ flex-wrap: wrap;
179
+ gap: var(--ot-spacing-x);
180
+ }
181
+
182
+ .e-7dbb0917 > .holder > .body > .tags > .tag
183
+ {
184
+ display: inline-flex;
185
+ align-items: center;
186
+ gap: 4px;
187
+ padding: 4px 9px;
188
+ background: var(--ot-bg-2);
189
+ border: 1px solid var(--ot-bg-2-border);
190
+ border-radius: 100px;
191
+ font-size: 10.5px;
192
+ font-weight: 600;
193
+ color: var(--ot-text-2);
194
+ font-family: var(--ot-font-primary);
195
+ text-transform: uppercase;
196
+ letter-spacing: 0.04em;
197
+ }
198
+
199
+ .e-7dbb0917 > .holder > .body > .tags > .tag > i
200
+ {
201
+ font-size: 13px;
202
+ }
203
+
204
+ /* Meta */
205
+
206
+ .e-7dbb0917 > .holder > .body > .meta
207
+ {
208
+ font-size: 11.5px;
209
+ color: var(--ot-text-3);
210
+ font-family: var(--ot-font-primary);
211
+ }
212
+
213
+ /* Stats */
214
+
215
+ .e-7dbb0917 > .holder > .body > .stats
216
+ {
217
+ display: flex;
218
+ gap: var(--ot-spacing-l);
219
+ padding: var(--ot-spacing-m) 0;
220
+ border-top: 1px solid var(--ot-bg-2-border);
221
+ border-bottom: 1px solid var(--ot-bg-2-border);
222
+ }
223
+
224
+ .e-7dbb0917 > .holder > .body > .stats > .stat > .num
225
+ {
226
+ font-family: var(--ot-font-secondary);
227
+ font-size: 18px;
228
+ font-weight: 600;
229
+ color: var(--ot-text-1);
230
+ line-height: 1;
231
+ font-variation-settings: 'opsz' 144;
232
+ margin-bottom: 3px;
233
+ }
234
+
235
+ .e-7dbb0917 > .holder > .body > .stats > .stat > .label
236
+ {
237
+ font-size: 10px;
238
+ font-weight: 600;
239
+ color: var(--ot-text-3);
240
+ text-transform: uppercase;
241
+ letter-spacing: 0.05em;
242
+ font-family: var(--ot-font-primary);
243
+ }
244
+
245
+ /* Socials */
246
+
247
+ .e-7dbb0917 > .holder > .body > .socials
248
+ {
249
+ display: flex;
250
+ gap: var(--ot-spacing-s);
251
+ }
252
+
253
+ .e-7dbb0917 > .holder > .body > .socials > .social
254
+ {
255
+ position: relative;
256
+ z-index: 3;
257
+ display: inline-flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ width: 34px;
261
+ height: 34px;
262
+ border-radius: var(--ot-radius-m);
263
+ background: var(--ot-bg-2);
264
+ border: 1px solid var(--ot-bg-2-border);
265
+ color: var(--ot-text-2);
266
+ text-decoration: none;
267
+ transition: background 0.15s cubic-bezier(0.22, 1, 0.36, 1), color 0.15s cubic-bezier(0.22, 1, 0.36, 1), border-color 0.15s cubic-bezier(0.22, 1, 0.36, 1), transform 0.15s cubic-bezier(0.22, 1, 0.36, 1);
268
+ }
269
+
270
+ .e-7dbb0917 > .holder > .body > .socials > .social:hover
271
+ {
272
+ background: var(--ot-brand-opacity);
273
+ color: var(--ot-brand);
274
+ border-color: var(--ot-brand);
275
+ transform: translateY(-1px);
276
+ }
277
+
278
+ .e-7dbb0917 > .holder > .body > .socials > .social > i
279
+ {
280
+ font-size: 16px;
281
+ }
282
+
283
+ /* Actions slot */
284
+
285
+ .e-7dbb0917 > .holder > .body > .actions
286
+ {
287
+ position: relative;
288
+ z-index: 3;
289
+ display: flex;
290
+ gap: var(--ot-spacing-s);
291
+ }
292
+
293
+ /* Default follow button */
294
+
295
+ .e-7dbb0917 > .holder > .body > .follow
296
+ {
297
+ position: relative;
298
+ z-index: 3;
299
+ display: inline-flex;
300
+ align-items: center;
301
+ justify-content: center;
302
+ gap: var(--ot-spacing-x);
303
+ height: var(--ot-height-m);
304
+ padding: 0 var(--ot-spacing-m);
305
+ background: var(--ot-bg-2);
306
+ border: 1px solid var(--ot-bg-2-border);
307
+ border-radius: 100px;
308
+ font-size: 13px;
309
+ font-weight: 600;
310
+ color: var(--ot-text-1);
311
+ cursor: pointer;
312
+ font-family: var(--ot-font-primary);
313
+ transition: background 0.2s cubic-bezier(0.22, 1, 0.36, 1), border-color 0.2s cubic-bezier(0.22, 1, 0.36, 1), color 0.2s cubic-bezier(0.22, 1, 0.36, 1), transform 0.2s cubic-bezier(0.22, 1, 0.36, 1);
314
+ align-self: flex-start;
315
+ }
316
+
317
+ .e-7dbb0917 > .holder > .body > .follow:hover
318
+ {
319
+ border-color: var(--ot-text-1);
320
+ transform: translateY(-1px);
321
+ }
322
+
323
+ .e-7dbb0917 > .holder > .body > .follow > i
324
+ {
325
+ font-size: 16px;
326
+ }
327
+
328
+ .e-7dbb0917 > .holder > .body > .follow.active
329
+ {
330
+ background: var(--ot-text-1);
331
+ border-color: var(--ot-text-1);
332
+ color: var(--ot-bg-1);
333
+ }
334
+
335
+ /* ===== HORIZONTAL MODE ===== */
336
+
337
+ .e-7dbb0917 > .holder.horizontal > .body
338
+ {
339
+ gap: var(--ot-spacing-s);
340
+ }
341
+
342
+ .e-7dbb0917 > .holder.horizontal > .body > .stats
343
+ {
344
+ padding: 0;
345
+ border: none;
346
+ gap: var(--ot-spacing-m);
347
+ }
348
+
349
+ /* ===== BACKGROUNDS ===== */
350
+
351
+ .e-7dbb0917 > .holder.bg-1 { background: var(--ot-bg-1); }
352
+ .e-7dbb0917 > .holder.bg-1 .avatar { border-color: var(--ot-bg-1); }
353
+ .e-7dbb0917 > .holder.bg-1 .tag { background: var(--ot-bg-2); border-color: var(--ot-bg-1-border); }
354
+ .e-7dbb0917 > .holder.bg-1 .social { background: var(--ot-bg-2); border-color: var(--ot-bg-1-border); }
355
+ .e-7dbb0917 > .holder.bg-1 .stats { border-color: var(--ot-bg-1-border); }
356
+
357
+ .e-7dbb0917 > .holder.bg-2 { background: var(--ot-bg-2); }
358
+ .e-7dbb0917 > .holder.bg-2 .avatar { border-color: var(--ot-bg-2); }
359
+ .e-7dbb0917 > .holder.bg-2 .tag { background: var(--ot-bg-1); border-color: var(--ot-bg-2-border); }
360
+ .e-7dbb0917 > .holder.bg-2 .social { background: var(--ot-bg-1); border-color: var(--ot-bg-2-border); }
361
+ .e-7dbb0917 > .holder.bg-2 .stats { border-color: var(--ot-bg-2-border); }
362
+
363
+ .e-7dbb0917 > .holder.bg-3 { background: var(--ot-bg-3); }
364
+ .e-7dbb0917 > .holder.bg-3 .avatar { border-color: var(--ot-bg-3); }
365
+ .e-7dbb0917 > .holder.bg-3 .tag { background: var(--ot-bg-2); border-color: var(--ot-bg-3-border); }
366
+ .e-7dbb0917 > .holder.bg-3 .social { background: var(--ot-bg-2); border-color: var(--ot-bg-3-border); }
367
+ .e-7dbb0917 > .holder.bg-3 .stats { border-color: var(--ot-bg-3-border); }
368
+
369
+ .e-7dbb0917 > .holder.bg-4 { background: var(--ot-bg-4); }
370
+ .e-7dbb0917 > .holder.bg-4 .avatar { border-color: var(--ot-bg-4); }
371
+ .e-7dbb0917 > .holder.bg-4 .tag { background: var(--ot-bg-3); border-color: var(--ot-bg-4-border); }
372
+ .e-7dbb0917 > .holder.bg-4 .social { background: var(--ot-bg-3); border-color: var(--ot-bg-4-border); }
373
+ .e-7dbb0917 > .holder.bg-4 .stats { border-color: var(--ot-bg-4-border); }
374
+
375
+ /* Borders */
376
+
377
+ .e-7dbb0917 > .holder.border { border: 1px solid var(--ot-bg-2-border); }
378
+ .e-7dbb0917 > .holder.border-top { border-top: 1px solid var(--ot-bg-2-border); }
379
+ .e-7dbb0917 > .holder.border-right { border-right: 1px solid var(--ot-bg-2-border); }
380
+ .e-7dbb0917 > .holder.border-bottom { border-bottom: 1px solid var(--ot-bg-2-border); }
381
+ .e-7dbb0917 > .holder.border-left { border-left: 1px solid var(--ot-bg-2-border); }
382
+
383
+ .e-7dbb0917 > .holder.bg-1.border,
384
+ .e-7dbb0917 > .holder.bg-1.border-top,
385
+ .e-7dbb0917 > .holder.bg-1.border-right,
386
+ .e-7dbb0917 > .holder.bg-1.border-bottom,
387
+ .e-7dbb0917 > .holder.bg-1.border-left { border-color: var(--ot-bg-1-border); }
388
+
389
+ .e-7dbb0917 > .holder.bg-2.border,
390
+ .e-7dbb0917 > .holder.bg-2.border-top,
391
+ .e-7dbb0917 > .holder.bg-2.border-right,
392
+ .e-7dbb0917 > .holder.bg-2.border-bottom,
393
+ .e-7dbb0917 > .holder.bg-2.border-left { border-color: var(--ot-bg-2-border); }
394
+
395
+ .e-7dbb0917 > .holder.bg-3.border,
396
+ .e-7dbb0917 > .holder.bg-3.border-top,
397
+ .e-7dbb0917 > .holder.bg-3.border-right,
398
+ .e-7dbb0917 > .holder.bg-3.border-bottom,
399
+ .e-7dbb0917 > .holder.bg-3.border-left { border-color: var(--ot-bg-3-border); }
400
+
401
+ .e-7dbb0917 > .holder.bg-4.border,
402
+ .e-7dbb0917 > .holder.bg-4.border-top,
403
+ .e-7dbb0917 > .holder.bg-4.border-right,
404
+ .e-7dbb0917 > .holder.bg-4.border-bottom,
405
+ .e-7dbb0917 > .holder.bg-4.border-left { border-color: var(--ot-bg-4-border); }
406
+
407
+ /* ===== SIZES ===== */
408
+
409
+ .e-7dbb0917 > .holder.size-s > .body
410
+ {
411
+ padding: var(--ot-spacing-m);
412
+ gap: var(--ot-spacing-s);
413
+ }
414
+
415
+ .e-7dbb0917 > .holder.size-s .avatar { width: 44px; height: 44px; }
416
+ .e-7dbb0917 > .holder.size-s .avatar > i { font-size: 22px; }
417
+ .e-7dbb0917 > .holder.size-s .identity > .name { font-size: 15px; }
418
+ .e-7dbb0917 > .holder.size-s .identity > .role { font-size: 11px; }
419
+ .e-7dbb0917 > .holder.size-s .description { font-size: 12px; }
420
+ .e-7dbb0917 > .holder.size-s .stats > .stat > .num { font-size: 16px; }
421
+ .e-7dbb0917 > .holder.size-s:has(> .cover) > .body { margin-top: -28px; }
422
+
423
+ .e-7dbb0917 > .holder.size-m > .body
424
+ {
425
+ padding: var(--ot-spacing-l);
426
+ gap: var(--ot-spacing-m);
427
+ }
428
+
429
+ .e-7dbb0917 > .holder.size-m .avatar { width: 56px; height: 56px; }
430
+ .e-7dbb0917 > .holder.size-m .avatar > i { font-size: 28px; }
431
+ .e-7dbb0917 > .holder.size-m .identity > .name { font-size: 17px; }
432
+
433
+ .e-7dbb0917 > .holder.size-l > .body
434
+ {
435
+ padding: var(--ot-spacing-l);
436
+ gap: var(--ot-spacing-m);
437
+ }
438
+
439
+ .e-7dbb0917 > .holder.size-l .avatar { width: 72px; height: 72px; }
440
+ .e-7dbb0917 > .holder.size-l .avatar > i { font-size: 36px; }
441
+ .e-7dbb0917 > .holder.size-l .identity > .name { font-size: 20px; }
442
+ .e-7dbb0917 > .holder.size-l .identity > .role { font-size: 13px; }
443
+ .e-7dbb0917 > .holder.size-l .description { font-size: 14px; }
444
+ .e-7dbb0917 > .holder.size-l .stats > .stat > .num { font-size: 22px; }
445
+ .e-7dbb0917 > .holder.size-l:has(> .cover) > .body { margin-top: -44px; }
446
+ .e-7dbb0917 > .holder.size-l > .cover { height: 140px; }