@onetype/framework 2.0.53 → 2.0.54

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 +507 -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,25 +4,29 @@ onetype.AddonReady('elements', (elements) =>
4
4
  id: 'form-color',
5
5
  icon: 'palette',
6
6
  name: 'Color',
7
- description: 'Color picker with swatch preview and hex input.',
7
+ description: 'Premium color picker with native input, hex validation, presets and copy action.',
8
8
  category: 'Form',
9
9
  author: 'OneType',
10
10
  config: {
11
11
  value: {
12
- type: 'string',
13
- value: ''
12
+ type: 'string'
14
13
  },
15
14
  name: {
16
- type: 'string',
17
- value: ''
15
+ type: 'string'
18
16
  },
19
17
  placeholder: {
20
18
  type: 'string',
21
- value: 'transparent'
19
+ value: '#000000'
20
+ },
21
+ presets: {
22
+ type: 'array',
23
+ value: [],
24
+ each: {
25
+ type: 'string'
26
+ }
22
27
  },
23
28
  disabled: {
24
- type: 'boolean',
25
- value: false
29
+ type: 'boolean'
26
30
  },
27
31
  variant: {
28
32
  type: 'array',
@@ -38,10 +42,45 @@ onetype.AddonReady('elements', (elements) =>
38
42
  },
39
43
  render: function()
40
44
  {
45
+ this.copied = false;
46
+ this.hasPresets = this.presets && this.presets.length > 0;
47
+
48
+ this.normalize = (value) =>
49
+ {
50
+ if(!value)
51
+ {
52
+ return '';
53
+ }
54
+
55
+ let hex = String(value).trim().replace(/[^#0-9a-fA-F]/g, '');
56
+
57
+ if(hex && hex.charAt(0) !== '#')
58
+ {
59
+ hex = '#' + hex;
60
+ }
61
+
62
+ return hex.slice(0, 7);
63
+ };
64
+
65
+ this.isValid = (value) =>
66
+ {
67
+ return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(value);
68
+ };
69
+
41
70
  this.sync = () =>
42
71
  {
43
72
  const input = this.Element?.querySelector('input.input');
44
- if(input) input.value = this.value || '';
73
+ const native = this.Element?.querySelector('input.native');
74
+
75
+ if(input)
76
+ {
77
+ input.value = this.value || '';
78
+ }
79
+
80
+ if(native && this.isValid(this.value))
81
+ {
82
+ native.value = this.value;
83
+ }
45
84
  };
46
85
 
47
86
  this.pick = ({ event, value }) =>
@@ -53,11 +92,6 @@ onetype.AddonReady('elements', (elements) =>
53
92
  {
54
93
  this._input({ event, value });
55
94
  }
56
-
57
- if(this._change)
58
- {
59
- this._change({ event, value });
60
- }
61
95
  };
62
96
 
63
97
  this.commit = ({ event, value }) =>
@@ -73,12 +107,7 @@ onetype.AddonReady('elements', (elements) =>
73
107
 
74
108
  this.input = ({ event, value }) =>
75
109
  {
76
- let hex = value.trim();
77
-
78
- if(hex && hex.charAt(0) !== '#')
79
- {
80
- hex = '#' + hex;
81
- }
110
+ const hex = this.normalize(value);
82
111
 
83
112
  this.value = hex;
84
113
  this.sync();
@@ -91,12 +120,17 @@ onetype.AddonReady('elements', (elements) =>
91
120
 
92
121
  this.open = ({ event }) =>
93
122
  {
94
- if (this.disabled)
123
+ if(this.disabled)
95
124
  {
96
125
  return;
97
126
  }
98
127
 
99
- event.target.closest('.holder').querySelector('.native').click();
128
+ const native = event.target.closest('.holder').querySelector('.native');
129
+
130
+ if(native)
131
+ {
132
+ native.click();
133
+ }
100
134
  };
101
135
 
102
136
  this.clear = () =>
@@ -104,31 +138,91 @@ onetype.AddonReady('elements', (elements) =>
104
138
  this.value = '';
105
139
  this.sync();
106
140
 
107
- if (this._change)
141
+ if(this._change)
108
142
  {
109
143
  this._change({ event: null, value: '' });
110
144
  }
111
145
  };
112
146
 
113
- return `
114
- <div :class="'holder ' + variant.join(' ')">
115
- <div class="swatch" :style="'background: ' + (value || 'transparent')" ot-click="open" :disabled="disabled">
116
- <input class="native" type="color" :value="value" ot-input="pick" ot-change="commit" tabindex="-1" />
147
+ this.copy = () =>
148
+ {
149
+ if(!this.value || !navigator.clipboard)
150
+ {
151
+ return;
152
+ }
153
+
154
+ navigator.clipboard.writeText(this.value);
155
+ this.copied = true;
156
+
157
+ setTimeout(() =>
158
+ {
159
+ this.copied = false;
160
+ }, 1500);
161
+ };
162
+
163
+ this.pickPreset = (event, hex) =>
164
+ {
165
+ if(this.disabled)
166
+ {
167
+ return;
168
+ }
169
+
170
+ this.value = hex;
171
+ this.sync();
172
+
173
+ if(this._change)
174
+ {
175
+ this._change({ event, value: hex });
176
+ }
177
+ };
178
+
179
+ return /* html */ `
180
+ <div :class="'holder ' + variant.join(' ') + (disabled ? ' disabled' : '')">
181
+ <div class="field">
182
+ <div class="swatch" :style="value ? 'background: ' + value : ''" ot-click="open">
183
+ <input class="native" type="color" :value="value || '#000000'" ot-input="pick" ot-change="commit" tabindex="-1" :disabled="disabled" />
184
+ </div>
185
+ <input
186
+ class="input"
187
+ :name="name"
188
+ type="text"
189
+ :value="value"
190
+ :placeholder="placeholder"
191
+ :disabled="disabled"
192
+ maxlength="7"
193
+ autocomplete="off"
194
+ spellcheck="false"
195
+ ot-change="input"
196
+ />
197
+ <button
198
+ ot-if="value && !disabled"
199
+ type="button"
200
+ :class="'action' + (copied ? ' copied' : '')"
201
+ ot-click.stop="copy"
202
+ :ot-tooltip="{ text: copied ? 'Copied!' : 'Copy', position: { x: 'center', y: 'top' } }"
203
+ >
204
+ <i ot-if="!copied">content_copy</i>
205
+ <i ot-if="copied">check</i>
206
+ </button>
207
+ <button
208
+ ot-if="value && !disabled"
209
+ type="button"
210
+ class="action"
211
+ ot-click.stop="clear"
212
+ :ot-tooltip="{ text: 'Clear', position: { x: 'center', y: 'top' } }"
213
+ >
214
+ <i>close</i>
215
+ </button>
117
216
  </div>
118
- <input
119
- class="input"
120
- :name="name"
121
- type="text"
122
- :value="value"
123
- :placeholder="placeholder"
124
- :disabled="disabled"
125
- maxlength="7"
126
- autocomplete="off"
127
- spellcheck="false"
128
- ot-change="input"
129
- />
130
- <div ot-if="value && !disabled" class="clear" ot-click.stop="clear">
131
- <i>close</i>
217
+ <div ot-if="hasPresets" class="presets">
218
+ <button
219
+ ot-for="preset in presets"
220
+ type="button"
221
+ :class="'preset' + (value === preset ? ' active' : '')"
222
+ :style="'background: ' + preset"
223
+ :ot-tooltip="{ text: preset, position: { x: 'center', y: 'top' } }"
224
+ ot-click="(event) => pickPreset(event, preset)"
225
+ ></button>
132
226
  </div>
133
227
  </div>
134
228
  `;
@@ -11,74 +11,325 @@
11
11
  .e-283879c1 > .holder
12
12
  {
13
13
  display: flex;
14
+ flex-direction: column;
15
+ gap: var(--ot-spacing-s);
14
16
  width: 100%;
15
- border-radius: var(--ot-radius-m);
17
+ }
18
+
19
+ /* Field (input row) */
20
+
21
+ .e-283879c1 > .holder > .field
22
+ {
23
+ position: relative;
24
+ display: flex;
25
+ align-items: center;
26
+ gap: var(--ot-spacing-s);
27
+ width: 100%;
28
+ padding: 0 var(--ot-spacing-m);
16
29
  border: 1px solid transparent;
30
+ border-radius: var(--ot-radius-m);
17
31
  background: transparent;
18
- transition: background 0.15s ease, border-color 0.15s ease;
32
+ transition: background 0.2s cubic-bezier(0.22, 1, 0.36, 1), border-color 0.2s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.2s cubic-bezier(0.22, 1, 0.36, 1);
19
33
  }
20
34
 
21
- /* Input */
35
+ /* Icon */
22
36
 
23
- .e-283879c1 > .holder > .input
37
+ .e-283879c1 > .holder > .field > .icon
24
38
  {
25
- width: 100%;
39
+ flex-shrink: 0;
40
+ font-size: 18px;
41
+ color: var(--ot-text-3);
42
+ transition: color 0.2s cubic-bezier(0.22, 1, 0.36, 1);
43
+ }
44
+
45
+ .e-283879c1 > .holder.today > .field > .icon
46
+ {
47
+ color: var(--ot-brand);
48
+ }
49
+
50
+ /* Native input */
51
+
52
+ .e-283879c1 > .holder > .field > .input
53
+ {
54
+ flex: 1;
55
+ min-width: 0;
56
+ padding: 0;
26
57
  background: transparent;
27
58
  border: none;
28
59
  outline: none;
29
60
  color: var(--ot-text-1);
30
- font-family: inherit;
31
- padding: 0 var(--ot-spacing-m);
32
- color-scheme: dark;
61
+ font-family: var(--ot-font-primary);
62
+ font-size: var(--ot-size-m);
63
+ font-weight: 500;
33
64
  }
34
65
 
35
- .e-283879c1 > .holder > .input:disabled
66
+ .e-283879c1 > .holder > .field > .input::placeholder
36
67
  {
37
- opacity: 0.5;
38
- cursor: not-allowed;
68
+ color: var(--ot-text-3);
39
69
  }
40
70
 
41
- .e-283879c1 > .holder > .input::-webkit-calendar-picker-indicator
71
+ .e-283879c1 > .holder > .field > .input::-webkit-calendar-picker-indicator
42
72
  {
43
73
  cursor: pointer;
44
74
  opacity: 0.5;
45
- transition: opacity 0.15s ease;
75
+ filter: invert(0.45);
76
+ transition: opacity 0.2s cubic-bezier(0.22, 1, 0.36, 1);
46
77
  }
47
78
 
48
- .e-283879c1 > .holder > .input::-webkit-calendar-picker-indicator:hover
79
+ .e-283879c1 > .holder > .field > .input::-webkit-calendar-picker-indicator:hover
49
80
  {
50
81
  opacity: 1;
51
82
  }
52
83
 
53
- /* Background variants */
84
+ .e-283879c1 > .holder > .field > .input:disabled
85
+ {
86
+ cursor: not-allowed;
87
+ }
88
+
89
+ /* Clear button */
90
+
91
+ .e-283879c1 > .holder > .field > .action
92
+ {
93
+ display: inline-flex;
94
+ align-items: center;
95
+ justify-content: center;
96
+ flex-shrink: 0;
97
+ width: 22px;
98
+ height: 22px;
99
+ padding: 0;
100
+ border: none;
101
+ background: transparent;
102
+ border-radius: var(--ot-radius-s);
103
+ color: var(--ot-text-3);
104
+ cursor: pointer;
105
+ outline: none;
106
+ transition: background 0.2s cubic-bezier(0.22, 1, 0.36, 1), color 0.2s cubic-bezier(0.22, 1, 0.36, 1);
107
+ }
108
+
109
+ .e-283879c1 > .holder > .field > .action:hover
110
+ {
111
+ background: var(--ot-bg-2-hover);
112
+ color: var(--ot-text-1);
113
+ }
114
+
115
+ .e-283879c1 > .holder > .field > .action > i
116
+ {
117
+ font-size: 14px;
118
+ }
119
+
120
+ /* Focus ring */
121
+
122
+ .e-283879c1 > .holder > .field:focus-within
123
+ {
124
+ box-shadow: 0 0 0 3px var(--ot-brand-opacity);
125
+ }
126
+
127
+ /* Today state — subtle brand icon color (border handled in bg variants) */
128
+
129
+ /* Presets */
130
+
131
+ .e-283879c1 > .holder > .presets
132
+ {
133
+ display: flex;
134
+ flex-wrap: wrap;
135
+ gap: var(--ot-spacing-x);
136
+ }
137
+
138
+ .e-283879c1 > .holder > .presets > .preset
139
+ {
140
+ display: inline-flex;
141
+ align-items: center;
142
+ padding: 4px 10px;
143
+ background: var(--ot-bg-2);
144
+ border: 1px solid var(--ot-bg-2-border);
145
+ border-radius: 100px;
146
+ font-family: var(--ot-font-primary);
147
+ font-size: 11.5px;
148
+ font-weight: 500;
149
+ color: var(--ot-text-2);
150
+ cursor: pointer;
151
+ outline: none;
152
+ 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);
153
+ }
154
+
155
+ .e-283879c1 > .holder > .presets > .preset:hover:not(.disabled):not(.active)
156
+ {
157
+ background: var(--ot-bg-2-hover);
158
+ color: var(--ot-text-1);
159
+ transform: translateY(-1px);
160
+ }
161
+
162
+ .e-283879c1 > .holder > .presets > .preset.active
163
+ {
164
+ background: var(--ot-brand-opacity);
165
+ border-color: var(--ot-brand);
166
+ color: var(--ot-brand);
167
+ }
168
+
169
+ .e-283879c1 > .holder > .presets > .preset.disabled
170
+ {
171
+ opacity: 0.4;
172
+ cursor: not-allowed;
173
+ }
174
+
175
+ /* Disabled holder */
176
+
177
+ .e-283879c1 > .holder.disabled > .field
178
+ {
179
+ cursor: not-allowed;
180
+ opacity: 0.55;
181
+ }
54
182
 
55
- .e-283879c1 > .holder.bg-1 { background: var(--ot-bg-1); }
56
- .e-283879c1 > .holder.bg-1:hover { background: var(--ot-bg-1-hover); }
57
- .e-283879c1 > .holder.bg-1.border { border-color: var(--ot-bg-1-border); }
58
- .e-283879c1 > .holder.bg-2 { background: var(--ot-bg-2); }
59
- .e-283879c1 > .holder.bg-2:hover { background: var(--ot-bg-2-hover); }
60
- .e-283879c1 > .holder.bg-2.border { border-color: var(--ot-bg-2-border); }
61
- .e-283879c1 > .holder.bg-3 { background: var(--ot-bg-3); }
62
- .e-283879c1 > .holder.bg-3:hover { background: var(--ot-bg-3-hover); }
63
- .e-283879c1 > .holder.bg-3.border { border-color: var(--ot-bg-3-border); }
64
- .e-283879c1 > .holder.bg-4 { background: var(--ot-bg-4); }
65
- .e-283879c1 > .holder.bg-4:hover { background: var(--ot-bg-4-hover); }
66
- .e-283879c1 > .holder.bg-4.border { border-color: var(--ot-bg-4-border); }
183
+ /* ===== BACKGROUND VARIANTS ===== */
184
+
185
+ .e-283879c1 > .holder.bg-1 > .field
186
+ {
187
+ background: var(--ot-bg-1);
188
+ }
189
+ .e-283879c1 > .holder.bg-1 > .field:hover:not(:focus-within)
190
+ {
191
+ background: var(--ot-bg-1-hover);
192
+ }
193
+ .e-283879c1 > .holder.bg-1 > .field > .action:hover
194
+ {
195
+ background: var(--ot-bg-1-hover);
196
+ }
197
+
198
+ .e-283879c1 > .holder.bg-2 > .field
199
+ {
200
+ background: var(--ot-bg-2);
201
+ }
202
+ .e-283879c1 > .holder.bg-2 > .field:hover:not(:focus-within)
203
+ {
204
+ background: var(--ot-bg-2-hover);
205
+ }
206
+ .e-283879c1 > .holder.bg-2 > .field > .action:hover
207
+ {
208
+ background: var(--ot-bg-2-hover);
209
+ }
210
+
211
+ .e-283879c1 > .holder.bg-3 > .field
212
+ {
213
+ background: var(--ot-bg-3);
214
+ }
215
+ .e-283879c1 > .holder.bg-3 > .field:hover:not(:focus-within)
216
+ {
217
+ background: var(--ot-bg-3-hover);
218
+ }
219
+ .e-283879c1 > .holder.bg-3 > .field > .action:hover
220
+ {
221
+ background: var(--ot-bg-3-hover);
222
+ }
223
+
224
+ .e-283879c1 > .holder.bg-4 > .field
225
+ {
226
+ background: var(--ot-bg-4);
227
+ }
228
+ .e-283879c1 > .holder.bg-4 > .field:hover:not(:focus-within)
229
+ {
230
+ background: var(--ot-bg-4-hover);
231
+ }
232
+ .e-283879c1 > .holder.bg-4 > .field > .action:hover
233
+ {
234
+ background: var(--ot-bg-4-hover);
235
+ }
67
236
 
68
237
  /* Transparent variant */
69
238
 
70
- .e-283879c1 > .holder.transparent { background: transparent; }
239
+ .e-283879c1 > .holder.transparent > .field
240
+ {
241
+ background: transparent;
242
+ padding: 0;
243
+ }
244
+
245
+ /* Border variant — per bg level */
246
+
247
+ .e-283879c1 > .holder.border > .field { border-color: var(--ot-bg-2-border); }
248
+ .e-283879c1 > .holder.bg-1.border > .field { border-color: var(--ot-bg-1-border); }
249
+ .e-283879c1 > .holder.bg-2.border > .field { border-color: var(--ot-bg-2-border); }
250
+ .e-283879c1 > .holder.bg-3.border > .field { border-color: var(--ot-bg-3-border); }
251
+ .e-283879c1 > .holder.bg-4.border > .field { border-color: var(--ot-bg-4-border); }
252
+
253
+ /* Today state border override — brand border regardless of bg */
71
254
 
72
- /* Border variant */
255
+ .e-283879c1 > .holder.today > .field,
256
+ .e-283879c1 > .holder.bg-1.today > .field,
257
+ .e-283879c1 > .holder.bg-2.today > .field,
258
+ .e-283879c1 > .holder.bg-3.today > .field,
259
+ .e-283879c1 > .holder.bg-4.today > .field,
260
+ .e-283879c1 > .holder.border.today > .field
261
+ {
262
+ border-color: var(--ot-brand);
263
+ }
73
264
 
74
- .e-283879c1 > .holder.border { border: 1px solid var(--ot-bg-2-border); }
75
- .e-283879c1 > .holder.border:focus-within { border-color: var(--ot-brand); }
265
+ /* ===== SIZE VARIANTS ===== */
76
266
 
77
- /* Size variants */
267
+ .e-283879c1 > .holder.size-s > .field
268
+ {
269
+ height: var(--ot-height-s);
270
+ padding: 0 var(--ot-spacing-s);
271
+ }
272
+ .e-283879c1 > .holder.size-s > .field > .icon
273
+ {
274
+ font-size: 15px;
275
+ }
276
+ .e-283879c1 > .holder.size-s > .field > .input
277
+ {
278
+ font-size: var(--ot-size-s);
279
+ }
280
+ .e-283879c1 > .holder.size-s > .field > .action
281
+ {
282
+ width: 18px;
283
+ height: 18px;
284
+ }
285
+ .e-283879c1 > .holder.size-s > .field > .action > i
286
+ {
287
+ font-size: 13px;
288
+ }
289
+ .e-283879c1 > .holder.size-s > .presets > .preset
290
+ {
291
+ font-size: 10.5px;
292
+ padding: 3px 8px;
293
+ }
294
+
295
+ .e-283879c1 > .holder.size-m > .field
296
+ {
297
+ height: var(--ot-height-m);
298
+ padding: 0 var(--ot-spacing-m);
299
+ }
300
+ .e-283879c1 > .holder.size-m > .field > .icon
301
+ {
302
+ font-size: 18px;
303
+ }
304
+ .e-283879c1 > .holder.size-m > .field > .input
305
+ {
306
+ font-size: var(--ot-size-m);
307
+ }
78
308
 
79
- .e-283879c1 > .holder.size-s { height: var(--ot-height-s); }
80
- .e-283879c1 > .holder.size-s > .input { font-size: var(--ot-size-s); padding: 0 var(--ot-spacing-s); }
81
- .e-283879c1 > .holder.size-m { height: var(--ot-height-m); }
82
- .e-283879c1 > .holder.size-m > .input { font-size: var(--ot-size-m); }
83
- .e-283879c1 > .holder.size-l { height: var(--ot-height-l); }
84
- .e-283879c1 > .holder.size-l > .input { font-size: var(--ot-size-m); padding: 0 var(--ot-spacing-l); }
309
+ .e-283879c1 > .holder.size-l > .field
310
+ {
311
+ height: var(--ot-height-l);
312
+ padding: 0 var(--ot-spacing-l);
313
+ }
314
+ .e-283879c1 > .holder.size-l > .field > .icon
315
+ {
316
+ font-size: 20px;
317
+ }
318
+ .e-283879c1 > .holder.size-l > .field > .input
319
+ {
320
+ font-size: var(--ot-size-m);
321
+ }
322
+ .e-283879c1 > .holder.size-l > .field > .action
323
+ {
324
+ width: 26px;
325
+ height: 26px;
326
+ }
327
+ .e-283879c1 > .holder.size-l > .field > .action > i
328
+ {
329
+ font-size: 16px;
330
+ }
331
+ .e-283879c1 > .holder.size-l > .presets > .preset
332
+ {
333
+ font-size: 12.5px;
334
+ padding: 5px 12px;
335
+ }