odt-ui-rails 2.2.4 → 2.2.5

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.
@@ -137,91 +137,120 @@
137
137
  .odt-btn--filled {
138
138
  box-shadow: var(--shadow-card);
139
139
  }
140
- .odt-btn--filled-primary {
140
+ .odt-btn--filled-primary,
141
+ .odt-btn--capsule-primary {
141
142
  background-color: var(--color-primary-500);
142
143
  color: var(--color-btn-primary-fg, #ffffff);
143
144
  }
144
- .odt-btn--filled-primary:hover:not(:disabled) {
145
+ .odt-btn--filled-primary:hover:not(:disabled),
146
+ .odt-btn--capsule-primary:hover:not(:disabled) {
145
147
  background-color: var(--color-primary-600);
146
148
  }
147
- .odt-btn--filled-primary:active:not(:disabled) {
149
+ .odt-btn--filled-primary:active:not(:disabled),
150
+ .odt-btn--capsule-primary:active:not(:disabled) {
148
151
  background-color: var(--color-primary-700);
149
152
  }
150
153
 
151
- .odt-btn--filled-secondary {
154
+ .odt-btn--filled-secondary,
155
+ .odt-btn--capsule-secondary {
152
156
  background-color: var(--color-secondary-500);
153
157
  color: var(--color-btn-secondary-fg, hsl(224 25% 6%));
154
158
  }
155
- .odt-btn--filled-secondary:hover:not(:disabled) {
159
+ .odt-btn--filled-secondary:hover:not(:disabled),
160
+ .odt-btn--capsule-secondary:hover:not(:disabled) {
156
161
  background-color: var(--color-secondary-400);
157
162
  }
158
- .odt-btn--filled-secondary:active:not(:disabled) {
163
+ .odt-btn--filled-secondary:active:not(:disabled),
164
+ .odt-btn--capsule-secondary:active:not(:disabled) {
159
165
  background-color: var(--color-secondary-600);
160
166
  }
161
167
 
162
- .odt-btn--filled-surface {
168
+ .odt-btn--filled-surface,
169
+ .odt-btn--capsule-surface {
163
170
  background-color: var(--color-surface);
164
171
  color: var(--color-btn-surface-fg, var(--color-fg-strong));
165
172
  }
166
- .odt-btn--filled-surface:hover:not(:disabled) {
173
+ .odt-btn--filled-surface:hover:not(:disabled),
174
+ .odt-btn--capsule-surface:hover:not(:disabled) {
167
175
  background-color: var(--color-surface-muted);
168
176
  }
169
- .odt-btn--filled-surface:active:not(:disabled) {
177
+ .odt-btn--filled-surface:active:not(:disabled),
178
+ .odt-btn--capsule-surface:active:not(:disabled) {
170
179
  background-color: var(--color-surface-subtle);
171
180
  }
172
181
 
173
- .odt-btn--filled-muted {
182
+ .odt-btn--filled-muted,
183
+ .odt-btn--capsule-muted {
174
184
  background-color: var(--color-surface-muted);
175
185
  color: var(--color-btn-muted-fg, var(--color-fg));
176
186
  }
177
- .odt-btn--filled-muted:hover:not(:disabled) {
187
+ .odt-btn--filled-muted:hover:not(:disabled),
188
+ .odt-btn--capsule-muted:hover:not(:disabled) {
178
189
  background-color: var(--color-surface-subtle);
179
190
  color: var(--color-fg-strong);
180
191
  }
181
- .odt-btn--filled-muted:active:not(:disabled) {
192
+ .odt-btn--filled-muted:active:not(:disabled),
193
+ .odt-btn--capsule-muted:active:not(:disabled) {
182
194
  background-color: var(--color-surface);
183
195
  }
184
196
 
185
- .odt-btn--filled-inverse {
197
+ .odt-btn--filled-inverse,
198
+ .odt-btn--capsule-inverse {
186
199
  background-color: var(--color-fg-strong);
187
200
  color: var(--color-btn-inverse-fg, var(--color-surface));
188
201
  }
189
- .odt-btn--filled-inverse:hover:not(:disabled) { opacity: 0.9; }
190
- .odt-btn--filled-inverse:active:not(:disabled) { opacity: 0.8; }
202
+ .odt-btn--filled-inverse:hover:not(:disabled),
203
+ .odt-btn--capsule-inverse:hover:not(:disabled) { opacity: 0.9; }
204
+ .odt-btn--filled-inverse:active:not(:disabled),
205
+ .odt-btn--capsule-inverse:active:not(:disabled) { opacity: 0.8; }
191
206
 
192
- .odt-btn--filled-success {
207
+ .odt-btn--filled-success,
208
+ .odt-btn--capsule-success {
193
209
  background-color: var(--color-success);
194
210
  color: var(--color-btn-success-fg, #ffffff);
195
211
  }
196
- .odt-btn--filled-success:hover:not(:disabled) { opacity: 0.9; }
197
- .odt-btn--filled-success:active:not(:disabled) { opacity: 0.8; }
212
+ .odt-btn--filled-success:hover:not(:disabled),
213
+ .odt-btn--capsule-success:hover:not(:disabled) { opacity: 0.9; }
214
+ .odt-btn--filled-success:active:not(:disabled),
215
+ .odt-btn--capsule-success:active:not(:disabled) { opacity: 0.8; }
198
216
 
199
- .odt-btn--filled-warning {
217
+ .odt-btn--filled-warning,
218
+ .odt-btn--capsule-warning {
200
219
  background-color: var(--color-warning);
201
220
  color: var(--color-btn-warning-fg, var(--color-fg-strong));
202
221
  }
203
- .odt-btn--filled-warning:hover:not(:disabled) { opacity: 0.9; }
204
- .odt-btn--filled-warning:active:not(:disabled) { opacity: 0.8; }
222
+ .odt-btn--filled-warning:hover:not(:disabled),
223
+ .odt-btn--capsule-warning:hover:not(:disabled) { opacity: 0.9; }
224
+ .odt-btn--filled-warning:active:not(:disabled),
225
+ .odt-btn--capsule-warning:active:not(:disabled) { opacity: 0.8; }
205
226
 
206
- .odt-btn--filled-danger {
227
+ .odt-btn--filled-danger,
228
+ .odt-btn--capsule-danger {
207
229
  background-color: var(--color-danger);
208
230
  color: var(--color-btn-danger-fg, #ffffff);
209
231
  }
210
- .odt-btn--filled-danger:hover:not(:disabled) { opacity: 0.9; }
211
- .odt-btn--filled-danger:active:not(:disabled) { opacity: 0.8; }
232
+ .odt-btn--filled-danger:hover:not(:disabled),
233
+ .odt-btn--capsule-danger:hover:not(:disabled) { opacity: 0.9; }
234
+ .odt-btn--filled-danger:active:not(:disabled),
235
+ .odt-btn--capsule-danger:active:not(:disabled) { opacity: 0.8; }
212
236
 
213
- .odt-btn--filled-info {
237
+ .odt-btn--filled-info,
238
+ .odt-btn--capsule-info {
214
239
  background-color: var(--color-info);
215
240
  color: var(--color-btn-info-fg, #ffffff);
216
241
  }
217
- .odt-btn--filled-info:hover:not(:disabled) { opacity: 0.9; }
218
- .odt-btn--filled-info:active:not(:disabled) { opacity: 0.8; }
242
+ .odt-btn--filled-info:hover:not(:disabled),
243
+ .odt-btn--capsule-info:hover:not(:disabled) { opacity: 0.9; }
244
+ .odt-btn--filled-info:active:not(:disabled),
245
+ .odt-btn--capsule-info:active:not(:disabled) { opacity: 0.8; }
219
246
 
220
- .odt-btn--filled-neutral {
247
+ .odt-btn--filled-neutral,
248
+ .odt-btn--capsule-neutral {
221
249
  background-color: var(--color-neutral-800);
222
250
  color: #ffffff;
223
251
  }
224
- .odt-btn--filled-neutral:hover:not(:disabled) {
252
+ .odt-btn--filled-neutral:hover:not(:disabled),
253
+ .odt-btn--capsule-neutral:hover:not(:disabled) {
225
254
  background-color: var(--color-neutral-900);
226
255
  }
227
256
 
@@ -648,6 +677,11 @@
648
677
  .odt-color-muted { color: var(--color-fg-muted); }
649
678
  .odt-color-subtle { color: var(--color-fg-subtle); }
650
679
  .odt-color-disabled { color: var(--color-fg-disabled); }
680
+ .odt-color-inverse-strong { color: var(--color-fg-inverse-strong); }
681
+ .odt-color-inverse { color: var(--color-fg-inverse); }
682
+ .odt-color-inverse-muted { color: var(--color-fg-inverse-muted); }
683
+ .odt-color-inverse-subtle { color: var(--color-fg-inverse-subtle); }
684
+ .odt-color-inverse-disabled { color: var(--color-fg-inverse-disabled); }
651
685
  .odt-color-primary { color: var(--color-fg-primary); }
652
686
  .odt-color-secondary { color: var(--color-fg-secondary); }
653
687
  .odt-color-success { color: var(--color-fg-success); }
@@ -801,6 +835,14 @@
801
835
  border-color: var(--color-ring);
802
836
  }
803
837
 
838
+ .odt-input--unstyled,
839
+ .odt-textarea--unstyled {
840
+ background: transparent;
841
+ border: none;
842
+ padding: 0;
843
+ box-shadow: none;
844
+ }
845
+
804
846
  /* Form Sizes */
805
847
  .odt-input--sm, .odt-select--sm {
806
848
  height: 2rem;
@@ -1208,134 +1250,135 @@
1208
1250
  left: 0;
1209
1251
  }
1210
1252
 
1253
+ .odt-toaster {
1254
+ position: fixed;
1255
+ z-index: 9999;
1256
+ box-sizing: border-box;
1257
+ font-family: inherit;
1258
+ width: 100%;
1259
+ max-width: 24rem; /* 384px */
1260
+ padding: var(--spacing-4, 1rem);
1261
+ pointer-events: none;
1262
+ min-height: 5rem;
1263
+ }
1264
+
1265
+ /* Positions */
1266
+ .odt-toaster--top-right {
1267
+ top: 0;
1268
+ right: 0;
1269
+ }
1270
+
1271
+ .odt-toaster--top-center {
1272
+ top: 0;
1273
+ left: 50%;
1274
+ transform: translateX(-50%);
1275
+ }
1276
+
1277
+ .odt-toaster--top-left {
1278
+ top: 0;
1279
+ left: 0;
1280
+ }
1281
+
1211
1282
  .odt-toaster--bottom-right {
1212
1283
  bottom: 0;
1213
1284
  right: 0;
1214
- flex-direction: column-reverse;
1215
1285
  }
1216
1286
 
1217
1287
  .odt-toaster--bottom-center {
1218
1288
  bottom: 0;
1219
1289
  left: 50%;
1220
1290
  transform: translateX(-50%);
1221
- flex-direction: column-reverse;
1222
1291
  }
1223
1292
 
1224
1293
  .odt-toaster--bottom-left {
1225
1294
  bottom: 0;
1226
1295
  left: 0;
1227
- flex-direction: column-reverse;
1228
1296
  }
1229
1297
 
1230
- /* Toast Item */
1298
+ /* Toast Item Card (Absolute within Toaster for 3D stacking) */
1231
1299
  .odt-toast {
1232
- position: relative;
1233
- width: 100%;
1300
+ position: absolute;
1301
+ left: var(--spacing-4, 1rem);
1302
+ right: var(--spacing-4, 1rem);
1234
1303
  box-sizing: border-box;
1235
1304
  display: flex;
1236
1305
  align-items: flex-start;
1237
1306
  gap: var(--spacing-3, 0.75rem);
1238
- padding: var(--spacing-3-5, 0.875rem) var(--spacing-4, 1rem);
1307
+ padding: var(--spacing-4, 1rem) var(--spacing-4-5, 1.125rem);
1239
1308
  background-color: var(--color-surface-elevated, #ffffff);
1240
1309
  color: var(--color-fg);
1241
1310
  border-radius: var(--radius-2xl, 1rem);
1242
- box-shadow: 0 8px 24px -4px rgba(0, 0, 0, 0.08), 0 2px 6px -2px rgba(0, 0, 0, 0.04);
1243
- border: 1px solid var(--color-line-muted, #f4f4f5);
1311
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.08), 0 8px 10px -6px rgba(0, 0, 0, 0.04);
1244
1312
  pointer-events: auto;
1245
1313
  user-select: none;
1246
1314
  font-family: inherit;
1247
1315
  overflow: hidden;
1248
- animation: odt-toast-enter 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1249
- transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.25s ease, margin 0.25s ease;
1250
- }
1251
-
1252
- .odt-toast--exiting {
1253
- animation: odt-toast-exit 0.25s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1254
- }
1255
-
1256
- @keyframes odt-toast-enter {
1257
- 0% {
1258
- opacity: 0;
1259
- transform: translateY(-12px) scale(0.96);
1260
- }
1261
- 100% {
1262
- opacity: 1;
1263
- transform: translateY(0) scale(1);
1264
- }
1316
+ transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1),
1317
+ opacity 0.28s cubic-bezier(0.16, 1, 0.3, 1),
1318
+ box-shadow 0.25s ease;
1319
+ will-change: transform, opacity;
1265
1320
  }
1266
1321
 
1267
- @keyframes odt-toast-exit {
1268
- 0% {
1269
- opacity: 1;
1270
- transform: translateY(0) scale(1);
1271
- }
1272
- 100% {
1273
- opacity: 0;
1274
- transform: translateY(-8px) scale(0.94);
1275
- }
1322
+ .odt-toaster--top-right .odt-toast,
1323
+ .odt-toaster--top-center .odt-toast,
1324
+ .odt-toaster--top-left .odt-toast {
1325
+ top: var(--spacing-4, 1rem);
1326
+ bottom: auto;
1327
+ transform-origin: top center;
1276
1328
  }
1277
1329
 
1278
1330
  .odt-toaster--bottom-right .odt-toast,
1279
1331
  .odt-toaster--bottom-center .odt-toast,
1280
1332
  .odt-toaster--bottom-left .odt-toast {
1281
- animation-name: odt-toast-enter-bottom;
1333
+ bottom: var(--spacing-4, 1rem);
1334
+ top: auto;
1335
+ transform-origin: bottom center;
1336
+ }
1337
+
1338
+ .odt-toast--exiting {
1339
+ opacity: 0 !important;
1340
+ transform: scale(0.92) translateY(-12px) !important;
1341
+ pointer-events: none !important;
1342
+ transition: transform 0.24s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.24s ease !important;
1282
1343
  }
1283
1344
 
1284
1345
  .odt-toaster--bottom-right .odt-toast--exiting,
1285
1346
  .odt-toaster--bottom-center .odt-toast--exiting,
1286
1347
  .odt-toaster--bottom-left .odt-toast--exiting {
1287
- animation-name: odt-toast-exit-bottom;
1348
+ transform: scale(0.92) translateY(12px) !important;
1288
1349
  }
1289
1350
 
1290
- @keyframes odt-toast-enter-bottom {
1291
- 0% {
1292
- opacity: 0;
1293
- transform: translateY(12px) scale(0.96);
1294
- }
1295
- 100% {
1296
- opacity: 1;
1297
- transform: translateY(0) scale(1);
1298
- }
1351
+ /* Surface Variants */
1352
+ .odt-toast--variant-frosted {
1353
+ background-color: var(--frosted-surface-bg, rgba(255, 255, 255, 0.70));
1354
+ backdrop-filter: blur(16px);
1355
+ -webkit-backdrop-filter: blur(16px);
1299
1356
  }
1300
1357
 
1301
- @keyframes odt-toast-exit-bottom {
1302
- 0% {
1303
- opacity: 1;
1304
- transform: translateY(0) scale(1);
1305
- }
1306
- 100% {
1307
- opacity: 0;
1308
- transform: translateY(8px) scale(0.94);
1309
- }
1358
+ .odt-toast--variant-subtle {
1359
+ background-color: var(--color-surface-subtle);
1360
+ }
1361
+
1362
+ .odt-toast--variant-outlined {
1363
+ background-color: var(--color-surface);
1310
1364
  }
1311
1365
 
1312
- /* Toast Variants / Semantic Themes */
1313
- .odt-toast--success {
1366
+ /* Rich Color Tints (Optional) */
1367
+ .odt-toast--rich-success {
1314
1368
  background-color: var(--color-surface-success, hsl(142 71% 96%));
1315
- border-color: var(--color-line-success, hsl(142 71% 85%));
1316
1369
  }
1317
1370
 
1318
- .odt-toast--warning {
1371
+ .odt-toast--rich-warning {
1319
1372
  background-color: var(--color-surface-warning, hsl(38 92% 96%));
1320
- border-color: var(--color-line-warning, hsl(38 92% 85%));
1321
1373
  }
1322
1374
 
1323
- .odt-toast--danger,
1324
- .odt-toast--error {
1375
+ .odt-toast--rich-danger,
1376
+ .odt-toast--rich-error {
1325
1377
  background-color: var(--color-surface-danger, hsl(0 84% 97%));
1326
- border-color: var(--color-line-danger, hsl(0 84% 88%));
1327
1378
  }
1328
1379
 
1329
- .odt-toast--info {
1380
+ .odt-toast--rich-info {
1330
1381
  background-color: var(--color-surface-info, hsl(217 91% 97%));
1331
- border-color: var(--color-info, hsl(217 91% 88%));
1332
- }
1333
-
1334
- .odt-toast--frosted {
1335
- background-color: var(--frosted-surface-bg, rgba(255, 255, 255, 0.70));
1336
- backdrop-filter: blur(16px);
1337
- -webkit-backdrop-filter: blur(16px);
1338
- border: 1px solid var(--frosted-surface-border, rgba(255, 255, 255, 0.80));
1339
1382
  }
1340
1383
 
1341
1384
  /* Toast Sub-elements */
@@ -1346,10 +1389,13 @@
1346
1389
  width: 1.375rem;
1347
1390
  height: 1.375rem;
1348
1391
  flex-shrink: 0;
1349
- font-size: 1.125rem;
1350
1392
  margin-top: 0.0625rem;
1351
1393
  }
1352
1394
 
1395
+ .odt-toast__icon svg {
1396
+ display: block;
1397
+ }
1398
+
1353
1399
  .odt-toast__icon--success { color: var(--color-success, #16a34a); }
1354
1400
  .odt-toast__icon--warning { color: var(--color-warning, #d97706); }
1355
1401
  .odt-toast__icon--danger,
@@ -1369,18 +1415,18 @@
1369
1415
  }
1370
1416
 
1371
1417
  .odt-toast__title {
1372
- font-size: var(--font-size-sm, 0.875rem);
1418
+ font-size: var(--font-size-base, 0.9375rem);
1373
1419
  font-weight: var(--font-weight-semibold, 600);
1374
1420
  color: var(--color-fg-strong);
1375
1421
  line-height: 1.35;
1376
1422
  margin: 0;
1377
1423
  }
1378
1424
 
1379
- .odt-toast__message,
1380
- .odt-toast__description {
1381
- font-size: var(--font-size-xs, 0.75rem);
1425
+ .odt-toast__description,
1426
+ .odt-toast__message {
1427
+ font-size: var(--font-size-sm, 0.8125rem);
1382
1428
  color: var(--color-fg-muted);
1383
- line-height: 1.4;
1429
+ line-height: 1.45;
1384
1430
  margin: 0;
1385
1431
  }
1386
1432
 
@@ -1398,9 +1444,8 @@
1398
1444
  cursor: pointer;
1399
1445
  flex-shrink: 0;
1400
1446
  margin-left: auto;
1447
+ margin-top: -0.125rem;
1401
1448
  transition: background-color 0.15s ease, color 0.15s ease;
1402
- font-size: 1.125rem;
1403
- line-height: 1;
1404
1449
  }
1405
1450
 
1406
1451
  .odt-toast__close:hover {
@@ -1408,6 +1453,10 @@
1408
1453
  color: var(--color-fg-strong);
1409
1454
  }
1410
1455
 
1456
+ .odt-toast__close svg {
1457
+ display: block;
1458
+ }
1459
+
1411
1460
  /* ==========================================================================
1412
1461
  * 11. Modal Component (.odt-modal-overlay, .odt-modal)
1413
1462
  * ========================================================================== */
@@ -1592,4 +1641,335 @@
1592
1641
  transform: scale(0.94);
1593
1642
  }
1594
1643
 
1644
+ /* ==========================================================================
1645
+ * 12. DropdownMenu Component (.odt-dropdown)
1646
+ * ========================================================================== */
1647
+ .odt-dropdown {
1648
+ position: relative;
1649
+ display: inline-block;
1650
+ }
1651
+
1652
+ .odt-dropdown--full-width {
1653
+ width: 100%;
1654
+ }
1655
+
1656
+ .odt-dropdown__container {
1657
+ display: inline-flex;
1658
+ flex-direction: column;
1659
+ gap: var(--spacing-1-5, 0.375rem);
1660
+ box-sizing: border-box;
1661
+ font-family: inherit;
1662
+ }
1663
+
1664
+ .odt-dropdown__container--full-width {
1665
+ width: 100%;
1666
+ }
1667
+
1668
+ .odt-dropdown__label {
1669
+ font-size: var(--font-size-sm, 0.875rem);
1670
+ font-weight: 500;
1671
+ color: var(--color-fg-strong);
1672
+ line-height: 1.25rem;
1673
+ user-select: none;
1674
+ cursor: default;
1675
+ }
1676
+
1677
+ .odt-dropdown__trigger {
1678
+ display: inline-flex;
1679
+ align-items: center;
1680
+ justify-content: space-between;
1681
+ box-sizing: border-box;
1682
+ background-color: var(--color-surface, #ffffff);
1683
+ color: var(--color-fg);
1684
+ font-family: inherit;
1685
+ font-weight: 500;
1686
+ outline: none;
1687
+ border: 1px solid transparent;
1688
+ cursor: pointer;
1689
+ user-select: none;
1690
+ gap: 0.5rem;
1691
+ transition: border-color 140ms ease, box-shadow 140ms ease, background-color 140ms ease;
1692
+ }
1693
+
1694
+ .odt-dropdown__trigger--outlined {
1695
+ background-color: var(--color-surface, #ffffff);
1696
+ border: 1px solid var(--color-line, #e4e4e9);
1697
+ }
1698
+ .odt-dropdown__trigger--outlined:hover:not(:disabled):not(:focus):not(.odt-dropdown__trigger--open) {
1699
+ border-color: var(--color-line-strong, #d4d4db);
1700
+ }
1701
+ .odt-dropdown__trigger--outlined:focus,
1702
+ .odt-dropdown__trigger--outlined.odt-dropdown__trigger--open {
1703
+ border-color: var(--color-ring);
1704
+ }
1705
+
1706
+ .odt-dropdown__trigger--filled {
1707
+ background-color: var(--color-surface, #ffffff);
1708
+ border: 1px solid transparent;
1709
+ }
1710
+ .odt-dropdown__trigger--filled:focus,
1711
+ .odt-dropdown__trigger--filled.odt-dropdown__trigger--open {
1712
+ border-color: var(--color-ring);
1713
+ }
1714
+
1715
+ .odt-dropdown__trigger--frosted {
1716
+ background-color: hsl(from var(--color-surface) h s l / 0.85);
1717
+ backdrop-filter: blur(16px);
1718
+ -webkit-backdrop-filter: blur(16px);
1719
+ border: 1px solid transparent;
1720
+ box-shadow: var(--shadow-card);
1721
+ }
1722
+ .odt-dropdown__trigger--frosted:focus,
1723
+ .odt-dropdown__trigger--frosted.odt-dropdown__trigger--open {
1724
+ border-color: var(--color-ring);
1725
+ }
1726
+
1727
+ .odt-dropdown__trigger--sm {
1728
+ height: 2rem;
1729
+ padding: 0 var(--spacing-3, 0.75rem);
1730
+ font-size: var(--font-size-xs, 0.75rem);
1731
+ }
1732
+ .odt-dropdown__trigger--md {
1733
+ height: 2.625rem;
1734
+ padding: 0 var(--spacing-4, 1rem);
1735
+ font-size: var(--font-size-sm, 0.875rem);
1736
+ }
1737
+ .odt-dropdown__trigger--lg {
1738
+ height: 3.125rem;
1739
+ padding: 0 var(--spacing-5, 1.25rem);
1740
+ font-size: var(--font-size-base, 1rem);
1741
+ }
1742
+
1743
+ .odt-dropdown__trigger-text {
1744
+ flex: 1 1 auto;
1745
+ text-align: left;
1746
+ overflow: hidden;
1747
+ text-overflow: ellipsis;
1748
+ white-space: nowrap;
1749
+ }
1750
+
1751
+ .odt-dropdown__placeholder {
1752
+ color: var(--color-fg-subtle);
1753
+ font-weight: 400;
1754
+ }
1755
+
1756
+ .odt-dropdown__chevron {
1757
+ display: inline-flex;
1758
+ align-items: center;
1759
+ justify-content: center;
1760
+ color: var(--color-fg-muted);
1761
+ flex-shrink: 0;
1762
+ transition: transform 180ms cubic-bezier(0.16, 1, 0.3, 1), color 140ms ease;
1763
+ }
1764
+
1765
+ .odt-dropdown__chevron--open {
1766
+ transform: rotate(180deg);
1767
+ color: var(--color-fg-strong);
1768
+ }
1769
+
1770
+ .odt-dropdown__trigger--error {
1771
+ border-color: var(--color-danger) !important;
1772
+ }
1773
+
1774
+ .odt-dropdown__trigger:disabled {
1775
+ background-color: var(--color-surface-subtle);
1776
+ color: var(--color-fg-disabled);
1777
+ cursor: not-allowed;
1778
+ opacity: 0.7;
1779
+ }
1780
+
1781
+ .odt-dropdown__content {
1782
+ position: absolute;
1783
+ z-index: 1000;
1784
+ display: flex;
1785
+ flex-direction: column;
1786
+ box-sizing: border-box;
1787
+ padding: 0.3125rem;
1788
+ background-color: var(--color-surface, #ffffff);
1789
+ border: 1px solid var(--color-line-muted, rgba(226, 232, 240, 0.8));
1790
+ border-radius: var(--radius-xl, 0.75rem);
1791
+ color: var(--color-neutral-900);
1792
+ outline: none;
1793
+ min-width: 12rem;
1794
+ box-shadow: 0 10px 28px -4px rgba(0, 0, 0, 0.08), 0 4px 10px -2px rgba(0, 0, 0, 0.03);
1795
+ transform-origin: top center;
1796
+ animation: odt-dropdown-enter 150ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
1797
+ }
1798
+
1799
+ .odt-dropdown__content.hidden {
1800
+ display: none !important;
1801
+ }
1802
+
1803
+ .odt-dropdown__content--align-start { left: 0; }
1804
+ .odt-dropdown__content--align-end { right: 0; }
1805
+ .odt-dropdown__content--align-center { left: 50%; transform: translateX(-50%); }
1806
+
1807
+ .odt-dropdown__content--side-bottom { top: calc(100% + 6px); }
1808
+ .odt-dropdown__content--side-top { bottom: calc(100% + 6px); }
1809
+
1810
+ .odt-dropdown__content--exiting {
1811
+ animation: odt-dropdown-exit 110ms cubic-bezier(0.4, 0, 1, 1) forwards;
1812
+ pointer-events: none;
1813
+ }
1814
+
1815
+ @keyframes odt-dropdown-enter {
1816
+ from {
1817
+ opacity: 0;
1818
+ transform: scale(0.97) translateY(-4px);
1819
+ }
1820
+ to {
1821
+ opacity: 1;
1822
+ transform: scale(1) translateY(0);
1823
+ }
1824
+ }
1825
+
1826
+ @keyframes odt-dropdown-exit {
1827
+ from {
1828
+ opacity: 1;
1829
+ transform: scale(1) translateY(0);
1830
+ }
1831
+ to {
1832
+ opacity: 0;
1833
+ transform: scale(0.97) translateY(-4px);
1834
+ }
1835
+ }
1836
+
1837
+ .odt-dropdown__item {
1838
+ position: relative;
1839
+ display: flex;
1840
+ align-items: center;
1841
+ width: 100%;
1842
+ box-sizing: border-box;
1843
+ padding: 0.4375rem 0.625rem;
1844
+ border-radius: var(--radius-lg, 0.5rem);
1845
+ font-size: 0.8125rem;
1846
+ font-weight: 500;
1847
+ line-height: 1.25rem;
1848
+ letter-spacing: -0.01em;
1849
+ color: var(--color-neutral-700);
1850
+ background: transparent;
1851
+ border: none;
1852
+ cursor: pointer;
1853
+ user-select: none;
1854
+ text-decoration: none;
1855
+ transition: background-color 120ms ease, color 120ms ease, transform 100ms ease;
1856
+ outline: none;
1857
+ gap: 0.5rem;
1858
+ }
1859
+
1860
+ .odt-dropdown__item:hover,
1861
+ .odt-dropdown__item:focus-visible,
1862
+ .odt-dropdown__item[data-highlighted="true"] {
1863
+ background-color: var(--color-surface-subtle);
1864
+ color: var(--color-neutral-950);
1865
+ }
1866
+
1867
+ .odt-dropdown__item:active {
1868
+ background-color: var(--color-neutral-200);
1869
+ transform: scale(0.99);
1870
+ }
1871
+
1872
+ .odt-dropdown__item--inset {
1873
+ padding-left: 2.125rem;
1874
+ }
1875
+
1876
+ .odt-dropdown__item:disabled,
1877
+ .odt-dropdown__item--disabled {
1878
+ opacity: 0.4;
1879
+ cursor: not-allowed;
1880
+ pointer-events: none;
1881
+ }
1882
+
1883
+ .odt-dropdown__item--destructive {
1884
+ color: var(--color-danger);
1885
+ }
1886
+
1887
+ .odt-dropdown__item--destructive:hover,
1888
+ .odt-dropdown__item--destructive:focus-visible,
1889
+ .odt-dropdown__item--destructive[data-highlighted="true"] {
1890
+ background-color: var(--color-surface-danger);
1891
+ color: var(--color-danger);
1892
+ }
1893
+
1894
+ .odt-dropdown__item-content {
1895
+ flex: 1 1 auto;
1896
+ display: flex;
1897
+ align-items: center;
1898
+ overflow: hidden;
1899
+ text-overflow: ellipsis;
1900
+ white-space: nowrap;
1901
+ }
1902
+
1903
+ .odt-dropdown__item-icon {
1904
+ display: inline-flex;
1905
+ align-items: center;
1906
+ justify-content: center;
1907
+ flex-shrink: 0;
1908
+ width: 1rem;
1909
+ height: 1rem;
1910
+ color: var(--color-neutral-400);
1911
+ transition: color 120ms ease;
1912
+ }
1913
+
1914
+ .odt-dropdown__item:hover .odt-dropdown__item-icon,
1915
+ .odt-dropdown__item:focus-visible .odt-dropdown__item-icon {
1916
+ color: var(--color-neutral-800);
1917
+ }
1918
+
1919
+ .odt-dropdown__item--destructive .odt-dropdown__item-icon {
1920
+ color: var(--color-danger);
1921
+ }
1922
+
1923
+ .odt-dropdown__item-right-icon {
1924
+ display: inline-flex;
1925
+ align-items: center;
1926
+ justify-content: center;
1927
+ flex-shrink: 0;
1928
+ margin-left: auto;
1929
+ color: var(--color-neutral-400);
1930
+ }
1931
+
1932
+ .odt-dropdown__shortcut {
1933
+ margin-left: auto;
1934
+ font-size: 0.6875rem;
1935
+ font-weight: 500;
1936
+ letter-spacing: 0.04em;
1937
+ font-family: var(--font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);
1938
+ color: var(--color-neutral-400);
1939
+ background: none;
1940
+ border: none;
1941
+ padding: 0;
1942
+ line-height: 1rem;
1943
+ display: inline-flex;
1944
+ align-items: center;
1945
+ }
1946
+
1947
+ .odt-dropdown__label-heading {
1948
+ padding: 0.375rem 0.625rem 0.25rem;
1949
+ font-size: 0.6875rem;
1950
+ font-weight: 600;
1951
+ text-transform: uppercase;
1952
+ letter-spacing: 0.05em;
1953
+ color: var(--color-neutral-400);
1954
+ user-select: none;
1955
+ }
1956
+
1957
+ .odt-dropdown__label-heading--inset {
1958
+ padding-left: 2.125rem;
1959
+ }
1960
+
1961
+ .odt-dropdown__separator {
1962
+ height: 1px;
1963
+ margin: 0.25rem 0.25rem;
1964
+ background-color: var(--color-line-muted, rgba(226, 232, 240, 0.8));
1965
+ border: none;
1966
+ }
1967
+
1968
+ .odt-dropdown__group {
1969
+ display: flex;
1970
+ flex-direction: column;
1971
+ width: 100%;
1972
+ }
1973
+
1974
+
1595
1975