@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,29 +4,38 @@ onetype.AddonReady('elements', (elements) =>
4
4
  id: 'form-date',
5
5
  icon: 'calendar_today',
6
6
  name: 'Date',
7
- description: 'Date picker input with native calendar.',
7
+ description: 'Premium date picker with native input, min/max range, presets and clear 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
  min: {
20
- type: 'string',
21
- value: ''
18
+ type: 'string'
22
19
  },
23
20
  max: {
24
- type: 'string',
25
- value: ''
21
+ type: 'string'
22
+ },
23
+ placeholder: {
24
+ type: 'string'
25
+ },
26
+ presets: {
27
+ type: 'array',
28
+ value: [],
29
+ each: {
30
+ type: 'object',
31
+ config: {
32
+ label: { type: 'string' },
33
+ value: { type: 'string' }
34
+ }
35
+ }
26
36
  },
27
37
  disabled: {
28
- type: 'boolean',
29
- value: false
38
+ type: 'boolean'
30
39
  },
31
40
  variant: {
32
41
  type: 'array',
@@ -39,28 +48,103 @@ onetype.AddonReady('elements', (elements) =>
39
48
  },
40
49
  render: function()
41
50
  {
51
+ const today = new Date();
52
+ const todayIso = today.toISOString().slice(0, 10);
53
+
54
+ this.todayIso = todayIso;
55
+ this.hasPresets = this.presets && this.presets.length > 0;
56
+
57
+ this.inRange = (iso) =>
58
+ {
59
+ if(this.min && iso < this.min)
60
+ {
61
+ return false;
62
+ }
63
+
64
+ if(this.max && iso > this.max)
65
+ {
66
+ return false;
67
+ }
68
+
69
+ return true;
70
+ };
71
+
72
+ this.isToday = this.value === todayIso;
73
+
42
74
  this.handle = ({ event, value }) =>
43
75
  {
44
76
  this.value = value;
77
+ this.isToday = value === this.todayIso;
45
78
 
46
- if (this._change)
79
+ if(this._change)
47
80
  {
48
81
  this._change({ event, value });
49
82
  }
50
83
  };
51
84
 
52
- return `
53
- <div :class="'holder ' + variant.join(' ')">
54
- <input
55
- class="input"
56
- type="date"
57
- :value="value"
58
- :name="name"
59
- :min="min"
60
- :max="max"
61
- :disabled="disabled"
62
- ot-change="handle"
63
- />
85
+ this.clear = () =>
86
+ {
87
+ this.value = '';
88
+ this.isToday = false;
89
+
90
+ if(this._change)
91
+ {
92
+ this._change({ event: null, value: '' });
93
+ }
94
+ };
95
+
96
+ this.pickPreset = (event, iso) =>
97
+ {
98
+ if(this.disabled || !this.inRange(iso))
99
+ {
100
+ return;
101
+ }
102
+
103
+ this.value = iso;
104
+ this.isToday = iso === this.todayIso;
105
+
106
+ if(this._change)
107
+ {
108
+ this._change({ event, value: iso });
109
+ }
110
+ };
111
+
112
+ return /* html */ `
113
+ <div :class="'holder ' + variant.join(' ') + (disabled ? ' disabled' : '') + (isToday ? ' today' : '')">
114
+ <div class="field">
115
+ <i class="icon">calendar_today</i>
116
+ <input
117
+ class="input"
118
+ type="date"
119
+ :value="value"
120
+ :name="name"
121
+ :min="min"
122
+ :max="max"
123
+ :placeholder="placeholder"
124
+ :disabled="disabled"
125
+ ot-change="handle"
126
+ />
127
+ <button
128
+ ot-if="value && !disabled"
129
+ type="button"
130
+ class="action"
131
+ ot-click.stop="clear"
132
+ :ot-tooltip="{ text: 'Clear', position: { x: 'center', y: 'top' } }"
133
+ >
134
+ <i>close</i>
135
+ </button>
136
+ </div>
137
+ <div ot-if="hasPresets" class="presets">
138
+ <button
139
+ ot-for="preset in presets"
140
+ type="button"
141
+ :class="'preset' + (value === preset.value ? ' active' : '') + (!inRange(preset.value) ? ' disabled' : '')"
142
+ :disabled="!inRange(preset.value) || disabled"
143
+ ot-click="(event) => pickPreset(event, preset.value)"
144
+ >
145
+ {{ preset.label }}
146
+ </button>
147
+ </div>
64
148
  </div>
65
149
  `;
66
150
  }
@@ -0,0 +1,447 @@
1
+ /* Root */
2
+
3
+ .e-2248d40
4
+ {
5
+ display: block;
6
+ width: 100%;
7
+ }
8
+
9
+ /* Holder */
10
+
11
+ .e-2248d40 > .holder
12
+ {
13
+ display: flex;
14
+ flex-direction: column;
15
+ width: 100%;
16
+ border-radius: var(--ot-radius-m);
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);
19
+ }
20
+
21
+ .e-2248d40 > .holder:focus-within
22
+ {
23
+ box-shadow: 0 0 0 3px var(--ot-brand-opacity);
24
+ }
25
+
26
+ /* Toolbar */
27
+
28
+ .e-2248d40 > .holder > .toolbar
29
+ {
30
+ display: flex;
31
+ align-items: center;
32
+ gap: 2px;
33
+ padding: var(--ot-spacing-s) var(--ot-spacing-m);
34
+ border-bottom: 1px solid var(--ot-bg-2-border);
35
+ flex-wrap: wrap;
36
+ }
37
+
38
+ .e-2248d40 > .holder > .toolbar > div
39
+ {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ }
43
+
44
+ .e-2248d40 > .holder > .toolbar .btn
45
+ {
46
+ display: inline-flex;
47
+ align-items: center;
48
+ justify-content: center;
49
+ width: 30px;
50
+ height: 30px;
51
+ padding: 0;
52
+ background: transparent;
53
+ border: none;
54
+ border-radius: var(--ot-radius-s);
55
+ color: var(--ot-text-2);
56
+ cursor: pointer;
57
+ outline: none;
58
+ transition: background 0.15s cubic-bezier(0.22, 1, 0.36, 1), color 0.15s cubic-bezier(0.22, 1, 0.36, 1);
59
+ }
60
+
61
+ .e-2248d40 > .holder > .toolbar .btn:hover
62
+ {
63
+ background: var(--ot-bg-3);
64
+ color: var(--ot-text-1);
65
+ }
66
+
67
+ .e-2248d40 > .holder > .toolbar .btn.active
68
+ {
69
+ background: var(--ot-brand-opacity);
70
+ color: var(--ot-brand);
71
+ }
72
+
73
+ .e-2248d40 > .holder > .toolbar .btn > i
74
+ {
75
+ font-size: 18px;
76
+ }
77
+
78
+ .e-2248d40 > .holder > .toolbar .sep
79
+ {
80
+ width: 1px;
81
+ height: 20px;
82
+ background: var(--ot-bg-2-border);
83
+ margin: 0 6px;
84
+ }
85
+
86
+ /* Content */
87
+
88
+ .e-2248d40 > .holder > .content
89
+ {
90
+ padding: var(--ot-spacing-l);
91
+ width: 100%;
92
+ }
93
+
94
+ /* Body */
95
+
96
+ .e-2248d40 > .holder > .content > .body
97
+ {
98
+ font-family: var(--ot-font-primary);
99
+ font-size: var(--ot-size-m);
100
+ line-height: 1.75;
101
+ color: var(--ot-text-1);
102
+ outline: none;
103
+ min-height: 200px;
104
+ word-break: break-word;
105
+ overflow-wrap: break-word;
106
+ }
107
+
108
+ .e-2248d40 > .holder > .content > .body:empty::before,
109
+ .e-2248d40 > .holder > .content > .body > p:only-child:empty::before
110
+ {
111
+ content: attr(data-placeholder);
112
+ color: var(--ot-text-3);
113
+ pointer-events: none;
114
+ }
115
+
116
+ .e-2248d40 > .holder > .content > .body > *:first-child
117
+ {
118
+ margin-top: 0;
119
+ }
120
+
121
+ .e-2248d40 > .holder > .content > .body > *:last-child
122
+ {
123
+ margin-bottom: 0;
124
+ }
125
+
126
+ /* Headings */
127
+
128
+ .e-2248d40 > .holder > .content > .body :is(h2, h3, h4)
129
+ {
130
+ font-family: var(--ot-font-secondary);
131
+ font-weight: 600;
132
+ letter-spacing: -0.02em;
133
+ color: var(--ot-text-1);
134
+ line-height: 1.2;
135
+ }
136
+
137
+ .e-2248d40 > .holder > .content > .body h2 { font-size: 26px; margin: 1.2em 0 0.5em; }
138
+ .e-2248d40 > .holder > .content > .body h3 { font-size: 21px; margin: 1.1em 0 0.45em; }
139
+ .e-2248d40 > .holder > .content > .body h4 { font-size: 17px; margin: 1em 0 0.4em; }
140
+
141
+ .e-2248d40 > .holder > .content > .body :is(h2, h3, h4) + :is(h2, h3, h4)
142
+ {
143
+ margin-top: 0;
144
+ }
145
+
146
+ /* Paragraphs */
147
+
148
+ .e-2248d40 > .holder > .content > .body p
149
+ {
150
+ margin: 0 0 1em;
151
+ color: var(--ot-text-2);
152
+ }
153
+
154
+ /* Strong / em / s / u */
155
+
156
+ .e-2248d40 > .holder > .content > .body strong { font-weight: 700; color: var(--ot-text-1); }
157
+ .e-2248d40 > .holder > .content > .body em { font-style: italic; }
158
+ .e-2248d40 > .holder > .content > .body s { text-decoration: line-through; color: var(--ot-text-3); }
159
+ .e-2248d40 > .holder > .content > .body u { text-decoration: underline; }
160
+
161
+ /* Links */
162
+
163
+ .e-2248d40 > .holder > .content > .body a
164
+ {
165
+ color: var(--ot-brand);
166
+ text-decoration: underline;
167
+ text-decoration-color: var(--ot-brand-opacity);
168
+ text-underline-offset: 3px;
169
+ transition: text-decoration-color 0.15s;
170
+ }
171
+
172
+ .e-2248d40 > .holder > .content > .body a:hover
173
+ {
174
+ text-decoration-color: var(--ot-brand);
175
+ }
176
+
177
+ /* Lists */
178
+
179
+ .e-2248d40 > .holder > .content > .body :is(ul, ol)
180
+ {
181
+ margin: 0 0 1em;
182
+ padding-left: 1.6em;
183
+ }
184
+
185
+ .e-2248d40 > .holder > .content > .body ul { list-style: disc; }
186
+ .e-2248d40 > .holder > .content > .body ol { list-style: decimal; }
187
+
188
+ .e-2248d40 > .holder > .content > .body li
189
+ {
190
+ margin: 0 0 0.3em;
191
+ color: var(--ot-text-2);
192
+ }
193
+
194
+ .e-2248d40 > .holder > .content > .body li:last-child
195
+ {
196
+ margin-bottom: 0;
197
+ }
198
+
199
+ /* Blockquote */
200
+
201
+ .e-2248d40 > .holder > .content > .body blockquote
202
+ {
203
+ margin: 1.3em 0;
204
+ padding: 0.2em 0 0.2em 1em;
205
+ border-left: 3px solid var(--ot-brand);
206
+ font-family: var(--ot-font-secondary);
207
+ font-size: 1.15em;
208
+ font-style: italic;
209
+ line-height: 1.5;
210
+ color: var(--ot-text-1);
211
+ }
212
+
213
+ .e-2248d40 > .holder > .content > .body blockquote p
214
+ {
215
+ margin: 0;
216
+ color: inherit;
217
+ }
218
+
219
+ /* Inline code */
220
+
221
+ .e-2248d40 > .holder > .content > .body code
222
+ {
223
+ font-family: ui-monospace, 'SF Mono', Menlo, monospace;
224
+ font-size: 0.9em;
225
+ padding: 0.1em 0.35em;
226
+ border-radius: 4px;
227
+ background: var(--ot-bg-2);
228
+ border: 1px solid var(--ot-bg-2-border);
229
+ color: var(--ot-text-1);
230
+ }
231
+
232
+ /* Pre / code block */
233
+
234
+ .e-2248d40 > .holder > .content > .body pre
235
+ {
236
+ margin: 1.3em 0;
237
+ padding: 1em 1.2em;
238
+ border-radius: var(--ot-radius-m);
239
+ background: var(--ot-bg-2);
240
+ border: 1px solid var(--ot-bg-2-border);
241
+ overflow-x: auto;
242
+ font-family: ui-monospace, 'SF Mono', Menlo, monospace;
243
+ font-size: 0.9em;
244
+ line-height: 1.6;
245
+ }
246
+
247
+ .e-2248d40 > .holder > .content > .body pre > code
248
+ {
249
+ background: transparent;
250
+ border: none;
251
+ padding: 0;
252
+ }
253
+
254
+ /* Images */
255
+
256
+ .e-2248d40 > .holder > .content > .body img
257
+ {
258
+ display: block;
259
+ max-width: 100%;
260
+ height: auto;
261
+ border-radius: var(--ot-radius-m);
262
+ margin: 1.5em 0;
263
+ }
264
+
265
+ /* HR */
266
+
267
+ .e-2248d40 > .holder > .content > .body hr
268
+ {
269
+ border: none;
270
+ height: 1px;
271
+ background: var(--ot-bg-2-border);
272
+ margin: 2em 0;
273
+ }
274
+
275
+ /* Background variants */
276
+
277
+ .e-2248d40 > .holder.bg-1 { background: var(--ot-bg-1); }
278
+ .e-2248d40 > .holder.bg-1 > .toolbar { background: var(--ot-bg-1); }
279
+
280
+ .e-2248d40 > .holder.bg-2 { background: var(--ot-bg-2); }
281
+ .e-2248d40 > .holder.bg-2 > .toolbar { background: var(--ot-bg-2); border-bottom-color: var(--ot-bg-2-border); }
282
+ .e-2248d40 > .holder.bg-2 > .toolbar .btn:hover { background: var(--ot-bg-3); }
283
+ .e-2248d40 > .holder.bg-2 > .toolbar .sep { background: var(--ot-bg-2-border); }
284
+
285
+ .e-2248d40 > .holder.bg-3 { background: var(--ot-bg-3); }
286
+ .e-2248d40 > .holder.bg-3 > .toolbar { background: var(--ot-bg-3); border-bottom-color: var(--ot-bg-3-border); }
287
+ .e-2248d40 > .holder.bg-3 > .toolbar .btn:hover { background: var(--ot-bg-4); }
288
+ .e-2248d40 > .holder.bg-3 > .toolbar .sep { background: var(--ot-bg-3-border); }
289
+
290
+ .e-2248d40 > .holder.bg-4 { background: var(--ot-bg-4); }
291
+ .e-2248d40 > .holder.bg-4 > .toolbar { background: var(--ot-bg-4); border-bottom-color: var(--ot-bg-4-border); }
292
+ .e-2248d40 > .holder.bg-4 > .toolbar .btn:hover { background: var(--ot-bg-3); }
293
+ .e-2248d40 > .holder.bg-4 > .toolbar .sep { background: var(--ot-bg-4-border); }
294
+
295
+ /* Border variant */
296
+
297
+ .e-2248d40 > .holder.border { border: 1px solid var(--ot-bg-2-border); }
298
+ .e-2248d40 > .holder.bg-1.border { border-color: var(--ot-bg-1-border); }
299
+ .e-2248d40 > .holder.bg-2.border { border-color: var(--ot-bg-2-border); }
300
+ .e-2248d40 > .holder.bg-3.border { border-color: var(--ot-bg-3-border); }
301
+ .e-2248d40 > .holder.bg-4.border { border-color: var(--ot-bg-4-border); }
302
+
303
+ /* Size variants */
304
+
305
+ .e-2248d40 > .holder.size-s > .toolbar { padding: var(--ot-spacing-x) var(--ot-spacing-s); }
306
+ .e-2248d40 > .holder.size-s > .toolbar .btn { width: 26px; height: 26px; }
307
+ .e-2248d40 > .holder.size-s > .toolbar .btn > i { font-size: 16px; }
308
+ .e-2248d40 > .holder.size-s > .content { padding: var(--ot-spacing-m); }
309
+ .e-2248d40 > .holder.size-s > .content > .body { font-size: var(--ot-size-s); min-height: 140px; }
310
+
311
+ .e-2248d40 > .holder.size-m > .toolbar { padding: var(--ot-spacing-s) var(--ot-spacing-m); }
312
+ .e-2248d40 > .holder.size-m > .content { padding: var(--ot-spacing-l); }
313
+
314
+ .e-2248d40 > .holder.size-l > .toolbar { padding: var(--ot-spacing-m) var(--ot-spacing-l); }
315
+ .e-2248d40 > .holder.size-l > .toolbar .btn { width: 34px; height: 34px; }
316
+ .e-2248d40 > .holder.size-l > .toolbar .btn > i { font-size: 20px; }
317
+ .e-2248d40 > .holder.size-l > .content { padding: var(--ot-spacing-l); }
318
+ .e-2248d40 > .holder.size-l > .content > .body { min-height: 280px; }
319
+
320
+ /* Compact (legacy shortcut) */
321
+
322
+ .e-2248d40 > .holder.compact > .content { padding: var(--ot-spacing-m); }
323
+ .e-2248d40 > .holder.compact > .content > .body { min-height: 120px; }
324
+
325
+ /* ===== Floating selection toolbar ===== */
326
+
327
+ .e-2248d40-float
328
+ {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 2px;
332
+ padding: 4px;
333
+ background: var(--ot-bg-1);
334
+ border: 1px solid var(--ot-bg-2-border);
335
+ border-radius: var(--ot-radius-m);
336
+ box-shadow: 0 12px 32px -12px rgba(0, 0, 0, 0.25);
337
+ }
338
+
339
+ .e-2248d40-float > .btn
340
+ {
341
+ display: inline-flex;
342
+ align-items: center;
343
+ justify-content: center;
344
+ width: 30px;
345
+ height: 30px;
346
+ padding: 0;
347
+ background: transparent;
348
+ border: none;
349
+ border-radius: var(--ot-radius-s);
350
+ color: var(--ot-text-2);
351
+ cursor: pointer;
352
+ outline: none;
353
+ transition: background 0.15s cubic-bezier(0.22, 1, 0.36, 1), color 0.15s cubic-bezier(0.22, 1, 0.36, 1);
354
+ }
355
+
356
+ .e-2248d40-float > .btn:hover
357
+ {
358
+ background: var(--ot-bg-2);
359
+ color: var(--ot-text-1);
360
+ }
361
+
362
+ .e-2248d40-float > .btn > i
363
+ {
364
+ font-size: 18px;
365
+ }
366
+
367
+ /* ===== Slash menu ===== */
368
+
369
+ .e-2248d40-slash
370
+ {
371
+ display: flex;
372
+ flex-direction: column;
373
+ min-width: 280px;
374
+ max-width: 320px;
375
+ padding: var(--ot-spacing-x);
376
+ background: var(--ot-bg-1);
377
+ border: 1px solid var(--ot-bg-2-border);
378
+ border-radius: var(--ot-radius-m);
379
+ box-shadow: 0 16px 40px -16px rgba(0, 0, 0, 0.3);
380
+ max-height: 340px;
381
+ overflow-y: auto;
382
+ }
383
+
384
+ .e-2248d40-slash > .item
385
+ {
386
+ display: flex;
387
+ align-items: center;
388
+ gap: var(--ot-spacing-s);
389
+ width: 100%;
390
+ padding: var(--ot-spacing-s);
391
+ background: transparent;
392
+ border: none;
393
+ border-radius: var(--ot-radius-s);
394
+ text-align: left;
395
+ cursor: pointer;
396
+ outline: none;
397
+ transition: background 0.12s cubic-bezier(0.22, 1, 0.36, 1);
398
+ }
399
+
400
+ .e-2248d40-slash > .item:hover
401
+ {
402
+ background: var(--ot-bg-2);
403
+ }
404
+
405
+ .e-2248d40-slash > .item > .icon
406
+ {
407
+ display: flex;
408
+ align-items: center;
409
+ justify-content: center;
410
+ flex-shrink: 0;
411
+ width: 36px;
412
+ height: 36px;
413
+ background: var(--ot-bg-2);
414
+ border: 1px solid var(--ot-bg-2-border);
415
+ border-radius: var(--ot-radius-s);
416
+ color: var(--ot-text-1);
417
+ }
418
+
419
+ .e-2248d40-slash > .item > .icon > i
420
+ {
421
+ font-size: 18px;
422
+ }
423
+
424
+ .e-2248d40-slash > .item > .text
425
+ {
426
+ display: flex;
427
+ flex-direction: column;
428
+ gap: 2px;
429
+ min-width: 0;
430
+ flex: 1;
431
+ }
432
+
433
+ .e-2248d40-slash > .item > .text > .label
434
+ {
435
+ font-family: var(--ot-font-primary);
436
+ font-size: var(--ot-size-m);
437
+ font-weight: 600;
438
+ color: var(--ot-text-1);
439
+ }
440
+
441
+ .e-2248d40-slash > .item > .text > .description
442
+ {
443
+ font-family: var(--ot-font-primary);
444
+ font-size: var(--ot-size-s);
445
+ color: var(--ot-text-3);
446
+ line-height: 1.3;
447
+ }