@duskmoon-dev/core 1.3.2 → 1.5.0

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.
@@ -4144,7 +4144,8 @@
4144
4144
  border-color: var(--color-on-surface);
4145
4145
  }
4146
4146
 
4147
- .checkbox:checked:hover:not(:disabled) {
4147
+ .checkbox:checked:hover:not(:disabled),
4148
+ .checkbox:indeterminate:hover:not(:disabled) {
4148
4149
  background-color: color-mix(in oklch, var(--checkbox-color), black 10%);
4149
4150
  border-color: color-mix(in oklch, var(--checkbox-color), black 10%);
4150
4151
  }
@@ -7929,7 +7930,84 @@
7929
7930
  */
7930
7931
 
7931
7932
  @layer components {
7932
- /* Base Textarea */
7933
+ /* ============================================
7934
+ * TEXTAREA CONTAINER
7935
+ * ============================================ */
7936
+
7937
+ .textarea-container {
7938
+ position: relative;
7939
+ display: flex;
7940
+ flex-direction: column;
7941
+ gap: 0.25rem;
7942
+ width: 100%;
7943
+ }
7944
+
7945
+ /* ============================================
7946
+ * TEXTAREA LABEL
7947
+ * ============================================ */
7948
+
7949
+ .textarea-label {
7950
+ display: block;
7951
+ font-size: 0.875rem;
7952
+ font-weight: 500;
7953
+ line-height: 1.25rem;
7954
+ color: var(--color-on-surface);
7955
+ margin-bottom: 0.25rem;
7956
+ }
7957
+
7958
+ /* Floating Label */
7959
+ .textarea-label-floating {
7960
+ position: absolute;
7961
+ top: 0.75rem;
7962
+ left: 1rem;
7963
+ font-size: 1rem;
7964
+ font-weight: 400;
7965
+ color: var(--color-on-surface-variant);
7966
+ pointer-events: none;
7967
+ transition: all 150ms ease-in-out;
7968
+ transform-origin: left top;
7969
+ z-index: 1;
7970
+ }
7971
+
7972
+ /* Floating label active state - when textarea has content or focus */
7973
+ .textarea:focus ~ .textarea-label-floating,
7974
+ .textarea:not(:placeholder-shown) ~ .textarea-label-floating {
7975
+ top: -0.5rem;
7976
+ left: 0.75rem;
7977
+ font-size: 0.75rem;
7978
+ font-weight: 500;
7979
+ color: var(--color-primary);
7980
+ background-color: var(--color-surface);
7981
+ padding: 0 0.25rem;
7982
+ }
7983
+
7984
+ /* Floating label for filled variant */
7985
+ .textarea-filled ~ .textarea-label-floating {
7986
+ background-color: transparent;
7987
+ }
7988
+
7989
+ .textarea-filled:focus ~ .textarea-label-floating,
7990
+ .textarea-filled:not(:placeholder-shown) ~ .textarea-label-floating {
7991
+ top: 0.25rem;
7992
+ left: 0.75rem;
7993
+ background-color: transparent;
7994
+ }
7995
+
7996
+ /* ============================================
7997
+ * HELPER TEXT
7998
+ * ============================================ */
7999
+
8000
+ .textarea-helper {
8001
+ font-size: 0.75rem;
8002
+ line-height: 1rem;
8003
+ color: var(--color-on-surface-variant);
8004
+ margin-top: 0.25rem;
8005
+ }
8006
+
8007
+ /* ============================================
8008
+ * BASE TEXTAREA
8009
+ * ============================================ */
8010
+
7933
8011
  .textarea {
7934
8012
  display: block;
7935
8013
  width: 100%;
@@ -7977,6 +8055,15 @@
7977
8055
  cursor: default;
7978
8056
  }
7979
8057
 
8058
+ /* Full Width */
8059
+ .textarea-full {
8060
+ width: 100%;
8061
+ }
8062
+
8063
+ /* ============================================
8064
+ * VARIANTS
8065
+ * ============================================ */
8066
+
7980
8067
  /* Filled Variant */
7981
8068
  .textarea-filled {
7982
8069
  background-color: var(--color-surface-container);
@@ -8019,23 +8106,68 @@
8019
8106
  box-shadow: none;
8020
8107
  }
8021
8108
 
8022
- /* Color Variants */
8109
+ /* ============================================
8110
+ * COLOR VARIANTS
8111
+ * ============================================ */
8112
+
8113
+ /* Primary */
8114
+ .textarea-primary {
8115
+ border-color: var(--color-primary);
8116
+ }
8117
+
8023
8118
  .textarea-primary:focus-visible {
8024
8119
  border-color: var(--color-primary);
8025
8120
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
8026
8121
  }
8027
8122
 
8123
+ .textarea-filled.textarea-primary {
8124
+ border-bottom-color: var(--color-primary);
8125
+ }
8126
+
8127
+ .textarea-filled.textarea-primary:focus-visible {
8128
+ border-bottom-color: var(--color-primary);
8129
+ }
8130
+
8131
+ /* Secondary */
8132
+ .textarea-secondary {
8133
+ border-color: var(--color-secondary);
8134
+ }
8135
+
8028
8136
  .textarea-secondary:focus-visible {
8029
8137
  border-color: var(--color-secondary);
8030
8138
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-secondary) 10%, transparent);
8031
8139
  }
8032
8140
 
8141
+ .textarea-filled.textarea-secondary {
8142
+ border-bottom-color: var(--color-secondary);
8143
+ }
8144
+
8145
+ .textarea-filled.textarea-secondary:focus-visible {
8146
+ border-bottom-color: var(--color-secondary);
8147
+ }
8148
+
8149
+ /* Tertiary */
8150
+ .textarea-tertiary {
8151
+ border-color: var(--color-tertiary);
8152
+ }
8153
+
8033
8154
  .textarea-tertiary:focus-visible {
8034
8155
  border-color: var(--color-tertiary);
8035
8156
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-tertiary) 10%, transparent);
8036
8157
  }
8037
8158
 
8038
- /* Semantic Colors */
8159
+ .textarea-filled.textarea-tertiary {
8160
+ border-bottom-color: var(--color-tertiary);
8161
+ }
8162
+
8163
+ .textarea-filled.textarea-tertiary:focus-visible {
8164
+ border-bottom-color: var(--color-tertiary);
8165
+ }
8166
+
8167
+ /* ============================================
8168
+ * SEMANTIC COLORS
8169
+ * ============================================ */
8170
+
8039
8171
  .textarea-error {
8040
8172
  border-color: var(--color-error);
8041
8173
  }
@@ -8045,6 +8177,10 @@
8045
8177
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
8046
8178
  }
8047
8179
 
8180
+ .textarea-filled.textarea-error {
8181
+ border-bottom-color: var(--color-error);
8182
+ }
8183
+
8048
8184
  .textarea-success {
8049
8185
  border-color: var(--color-success);
8050
8186
  }
@@ -8054,6 +8190,10 @@
8054
8190
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
8055
8191
  }
8056
8192
 
8193
+ .textarea-filled.textarea-success {
8194
+ border-bottom-color: var(--color-success);
8195
+ }
8196
+
8057
8197
  .textarea-warning {
8058
8198
  border-color: var(--color-warning);
8059
8199
  }
@@ -8063,7 +8203,14 @@
8063
8203
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
8064
8204
  }
8065
8205
 
8066
- /* Size Variants */
8206
+ .textarea-filled.textarea-warning {
8207
+ border-bottom-color: var(--color-warning);
8208
+ }
8209
+
8210
+ /* ============================================
8211
+ * SIZE VARIANTS
8212
+ * ============================================ */
8213
+
8067
8214
  .textarea-sm {
8068
8215
  min-height: 4rem;
8069
8216
  padding: 0.5rem 0.75rem;
@@ -8080,11 +8227,18 @@
8080
8227
  border-radius: 0.625rem;
8081
8228
  }
8082
8229
 
8083
- /* Resize Options */
8230
+ /* ============================================
8231
+ * RESIZE OPTIONS
8232
+ * ============================================ */
8233
+
8084
8234
  .textarea-resize-none {
8085
8235
  resize: none;
8086
8236
  }
8087
8237
 
8238
+ .textarea-resize-vertical {
8239
+ resize: vertical;
8240
+ }
8241
+
8088
8242
  .textarea-resize-horizontal {
8089
8243
  resize: horizontal;
8090
8244
  }
@@ -8093,19 +8247,21 @@
8093
8247
  resize: both;
8094
8248
  }
8095
8249
 
8096
- /* Auto-resize (requires JS) */
8250
+ /* ============================================
8251
+ * AUTO-RESIZE (requires JS)
8252
+ * ============================================ */
8253
+
8254
+ .textarea-auto-resize,
8097
8255
  .textarea-autosize {
8098
8256
  resize: none;
8099
8257
  overflow: hidden;
8258
+ min-height: 3rem;
8259
+ field-sizing: content; /* Modern CSS - auto-grows without JS in supported browsers */
8100
8260
  }
8101
8261
 
8102
- /* Character Counter */
8103
- .textarea-wrapper {
8104
- position: relative;
8105
- display: flex;
8106
- flex-direction: column;
8107
- gap: 0.25rem;
8108
- }
8262
+ /* ============================================
8263
+ * CHARACTER COUNTER
8264
+ * ============================================ */
8109
8265
 
8110
8266
  .textarea-counter {
8111
8267
  font-size: 0.75rem;
@@ -8114,15 +8270,331 @@
8114
8270
  text-align: right;
8115
8271
  }
8116
8272
 
8117
- .textarea-counter-error {
8273
+ .textarea-counter-error,
8274
+ .textarea-counter-exceeded {
8275
+ color: var(--color-error);
8276
+ }
8277
+
8278
+ /* ============================================
8279
+ * CONTAINER STATES
8280
+ * ============================================ */
8281
+
8282
+ .textarea-container-error .textarea-label {
8283
+ color: var(--color-error);
8284
+ }
8285
+
8286
+ .textarea-container-error .textarea-helper {
8118
8287
  color: var(--color-error);
8119
8288
  }
8120
8289
 
8290
+ .textarea-container-error .textarea-label-floating {
8291
+ color: var(--color-error);
8292
+ }
8293
+
8294
+ .textarea-container-error .textarea:focus ~ .textarea-label-floating {
8295
+ color: var(--color-error);
8296
+ }
8297
+
8298
+ .textarea-container-success .textarea-label {
8299
+ color: var(--color-success);
8300
+ }
8301
+
8302
+ .textarea-container-success .textarea-helper {
8303
+ color: var(--color-success);
8304
+ }
8305
+
8306
+ .textarea-container-success .textarea-label-floating {
8307
+ color: var(--color-success);
8308
+ }
8309
+
8310
+ .textarea-container-success .textarea:focus ~ .textarea-label-floating {
8311
+ color: var(--color-success);
8312
+ }
8313
+
8314
+ /* ============================================
8315
+ * REDUCE MOTION
8316
+ * ============================================ */
8317
+
8318
+ @media (prefers-reduced-motion: reduce) {
8319
+ .textarea,
8320
+ .textarea-label-floating {
8321
+ transition: none;
8322
+ }
8323
+ }
8324
+ }
8325
+
8326
+ /**
8327
+ * Toggle Button Component Styles
8328
+ * DuskMoonUI - Material Design 3 inspired toggle button
8329
+ * Used for selecting between multiple options or toggling states
8330
+ */
8331
+
8332
+ @layer components {
8333
+ /* Base toggle button */
8334
+ .toggle-btn {
8335
+ display: inline-flex;
8336
+ align-items: center;
8337
+ justify-content: center;
8338
+ gap: 0.5rem;
8339
+ padding: 0.625rem 1rem;
8340
+ font-size: 0.875rem;
8341
+ font-weight: 500;
8342
+ line-height: 1.25rem;
8343
+ color: var(--color-on-surface-variant);
8344
+ background-color: transparent;
8345
+ border: 1px solid var(--color-outline);
8346
+ border-radius: 0.5rem;
8347
+ cursor: pointer;
8348
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
8349
+ user-select: none;
8350
+ }
8351
+
8352
+ /* Hover state */
8353
+ .toggle-btn:hover:not(:disabled) {
8354
+ background-color: color-mix(in oklch, var(--color-surface-variant) 50%, transparent);
8355
+ border-color: var(--color-outline-variant);
8356
+ }
8357
+
8358
+ /* Active/Selected state */
8359
+ .toggle-btn-active,
8360
+ .toggle-btn.active {
8361
+ color: var(--color-on-primary-container);
8362
+ background-color: var(--color-primary-container);
8363
+ border-color: var(--color-primary);
8364
+ }
8365
+
8366
+ .toggle-btn-active:hover:not(:disabled),
8367
+ .toggle-btn.active:hover:not(:disabled) {
8368
+ background-color: color-mix(in oklch, var(--color-primary-container) 90%, transparent);
8369
+ }
8370
+
8371
+ /* Secondary variant */
8372
+ .toggle-btn-secondary.toggle-btn-active,
8373
+ .toggle-btn-secondary.active {
8374
+ color: var(--color-on-secondary-container);
8375
+ background-color: var(--color-secondary-container);
8376
+ border-color: var(--color-secondary);
8377
+ }
8378
+
8379
+ /* Tertiary variant */
8380
+ .toggle-btn-tertiary.toggle-btn-active,
8381
+ .toggle-btn-tertiary.active {
8382
+ color: var(--color-on-tertiary-container);
8383
+ background-color: var(--color-tertiary-container);
8384
+ border-color: var(--color-tertiary);
8385
+ }
8386
+
8387
+ /* Focus state */
8388
+ .toggle-btn:focus-visible {
8389
+ outline: 2px solid var(--color-primary);
8390
+ outline-offset: 2px;
8391
+ }
8392
+
8393
+ /* Disabled state */
8394
+ .toggle-btn:disabled,
8395
+ .toggle-btn-disabled {
8396
+ opacity: 0.38;
8397
+ cursor: not-allowed;
8398
+ pointer-events: none;
8399
+ }
8400
+
8401
+ /* Size variants */
8402
+ .toggle-btn-sm {
8403
+ padding: 0.375rem 0.75rem;
8404
+ font-size: 0.8125rem;
8405
+ gap: 0.375rem;
8406
+ }
8407
+
8408
+ .toggle-btn-lg {
8409
+ padding: 0.75rem 1.25rem;
8410
+ font-size: 1rem;
8411
+ gap: 0.625rem;
8412
+ }
8413
+
8414
+ /* Toggle button group */
8415
+ .toggle-group {
8416
+ display: inline-flex;
8417
+ align-items: center;
8418
+ gap: 0;
8419
+ border: 1px solid var(--color-outline);
8420
+ border-radius: 0.5rem;
8421
+ padding: 0.25rem;
8422
+ background-color: color-mix(in oklch, var(--color-surface-variant) 30%, transparent);
8423
+ }
8424
+
8425
+ /* Toggle buttons in group */
8426
+ .toggle-group .toggle-btn {
8427
+ border: none;
8428
+ border-radius: 0.375rem;
8429
+ margin: 0;
8430
+ }
8431
+
8432
+ .toggle-group .toggle-btn:not(:last-child) {
8433
+ margin-right: 0.125rem;
8434
+ }
8435
+
8436
+ /* Vertical group */
8437
+ .toggle-group-vertical {
8438
+ flex-direction: column;
8439
+ }
8440
+
8441
+ .toggle-group-vertical .toggle-btn:not(:last-child) {
8442
+ margin-right: 0;
8443
+ margin-bottom: 0.125rem;
8444
+ }
8445
+
8446
+ /* Exclusive selection (radio-like behavior) */
8447
+ .toggle-group-exclusive .toggle-btn {
8448
+ flex: 1;
8449
+ }
8450
+
8451
+ /* Icon-only toggle */
8452
+ .toggle-btn-icon-only {
8453
+ padding: 0.625rem;
8454
+ aspect-ratio: 1;
8455
+ }
8456
+
8457
+ .toggle-btn-icon-only.toggle-btn-sm {
8458
+ padding: 0.5rem;
8459
+ }
8460
+
8461
+ .toggle-btn-icon-only.toggle-btn-lg {
8462
+ padding: 0.875rem;
8463
+ }
8464
+
8465
+ /* With icon */
8466
+ .toggle-icon {
8467
+ width: 1.125rem;
8468
+ height: 1.125rem;
8469
+ flex-shrink: 0;
8470
+ }
8471
+
8472
+ /* Segmented control style */
8473
+ .toggle-segmented {
8474
+ display: inline-flex;
8475
+ align-items: center;
8476
+ gap: 0;
8477
+ background-color: var(--color-surface);
8478
+ border: 1px solid var(--color-outline-variant);
8479
+ border-radius: 0.5rem;
8480
+ padding: 0.25rem;
8481
+ }
8482
+
8483
+ .toggle-segmented .toggle-btn {
8484
+ border: none;
8485
+ background-color: transparent;
8486
+ border-radius: 0.375rem;
8487
+ }
8488
+
8489
+ .toggle-segmented .toggle-btn.toggle-btn-active,
8490
+ .toggle-segmented .toggle-btn.active {
8491
+ background-color: var(--color-surface-variant);
8492
+ border-color: transparent;
8493
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
8494
+ }
8495
+
8496
+ /* Chip-like toggle */
8497
+ .toggle-chip {
8498
+ border-radius: 1rem;
8499
+ padding: 0.5rem 1rem;
8500
+ }
8501
+
8502
+ .toggle-chip.toggle-btn-active,
8503
+ .toggle-chip.active {
8504
+ background-color: var(--color-primary-container);
8505
+ border-color: var(--color-primary-container);
8506
+ }
8507
+
8508
+ /* Outlined variant */
8509
+ .toggle-outlined {
8510
+ background-color: transparent;
8511
+ }
8512
+
8513
+ .toggle-outlined.toggle-btn-active,
8514
+ .toggle-outlined.active {
8515
+ background-color: color-mix(in oklch, var(--color-primary) 10%, transparent);
8516
+ }
8517
+
8518
+ /* Filled variant */
8519
+ .toggle-filled {
8520
+ background-color: var(--color-surface-variant);
8521
+ border: none;
8522
+ }
8523
+
8524
+ .toggle-filled.toggle-btn-active,
8525
+ .toggle-filled.active {
8526
+ background-color: var(--color-primary);
8527
+ color: var(--color-on-primary);
8528
+ }
8529
+
8530
+ /* With badge/indicator */
8531
+ .toggle-badge {
8532
+ position: relative;
8533
+ }
8534
+
8535
+ .toggle-badge::after {
8536
+ content: "";
8537
+ position: absolute;
8538
+ top: 0.25rem;
8539
+ right: 0.25rem;
8540
+ width: 0.5rem;
8541
+ height: 0.5rem;
8542
+ background-color: var(--color-error);
8543
+ border-radius: 50%;
8544
+ border: 2px solid var(--color-surface);
8545
+ }
8546
+
8547
+ /* Full width */
8548
+ .toggle-full {
8549
+ width: 100%;
8550
+ }
8551
+
8552
+ .toggle-group-full {
8553
+ width: 100%;
8554
+ }
8555
+
8556
+ .toggle-group-full .toggle-btn {
8557
+ flex: 1;
8558
+ }
8559
+
8560
+ /* Loading state */
8561
+ .toggle-loading {
8562
+ position: relative;
8563
+ pointer-events: none;
8564
+ }
8565
+
8566
+ .toggle-loading::after {
8567
+ content: "";
8568
+ position: absolute;
8569
+ top: 50%;
8570
+ left: 50%;
8571
+ width: 1rem;
8572
+ height: 1rem;
8573
+ margin-top: -0.5rem;
8574
+ margin-left: -0.5rem;
8575
+ border: 2px solid currentColor;
8576
+ border-top-color: transparent;
8577
+ border-radius: 50%;
8578
+ animation: toggle-spin 0.6s linear infinite;
8579
+ }
8580
+
8581
+ @keyframes toggle-spin {
8582
+ 0% {
8583
+ transform: rotate(0deg);
8584
+ }
8585
+ 100% {
8586
+ transform: rotate(360deg);
8587
+ }
8588
+ }
8589
+
8121
8590
  /* Reduce Motion */
8122
8591
  @media (prefers-reduced-motion: reduce) {
8123
- .textarea {
8592
+ .toggle-btn {
8124
8593
  transition: none;
8125
8594
  }
8595
+ .toggle-loading::after {
8596
+ animation: none;
8597
+ }
8126
8598
  }
8127
8599
  }
8128
8600
 
@@ -8420,12 +8892,24 @@
8420
8892
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
8421
8893
  }
8422
8894
 
8423
- .tree-select-trigger:disabled {
8895
+ .tree-select-trigger:disabled,
8896
+ .tree-select-trigger[aria-disabled="true"] {
8424
8897
  cursor: not-allowed;
8425
8898
  opacity: 0.5;
8426
8899
  background-color: var(--color-surface-container);
8427
8900
  }
8428
8901
 
8902
+ /* Support for div-based trigger (when using clear button) */
8903
+ div.tree-select-trigger {
8904
+ user-select: none;
8905
+ }
8906
+
8907
+ div.tree-select-trigger:focus-visible {
8908
+ outline: none;
8909
+ border-color: var(--color-primary);
8910
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
8911
+ }
8912
+
8429
8913
  /* Value Display */
8430
8914
  .tree-select-value {
8431
8915
  flex: 1;
@@ -8486,6 +8970,11 @@
8486
8970
  background-color: var(--color-surface-container-high);
8487
8971
  }
8488
8972
 
8973
+ .tree-select-clear svg {
8974
+ width: 1rem;
8975
+ height: 1rem;
8976
+ }
8977
+
8489
8978
  /* Tree Select Dropdown */
8490
8979
  .tree-select-dropdown {
8491
8980
  position: absolute;
@@ -8508,9 +8997,10 @@
8508
8997
  display: block;
8509
8998
  }
8510
8999
 
8511
- /* Popover API Support - Browser handles visibility, JS handles positioning */
9000
+ /* Popover API Support */
8512
9001
  .tree-select-dropdown[popover] {
8513
- /* Reset browser defaults - positioning handled by JavaScript */
9002
+ /* Reset browser defaults for proper positioning */
9003
+ position: absolute;
8514
9004
  inset: unset;
8515
9005
  margin: 0;
8516
9006
  border: 1px solid var(--color-outline-variant);
@@ -8520,6 +9010,21 @@
8520
9010
  display: block;
8521
9011
  }
8522
9012
 
9013
+ /* CSS Anchor Positioning for modern browsers */
9014
+ @supports (anchor-name: --tree-select) {
9015
+ .tree-select {
9016
+ anchor-name: --tree-select;
9017
+ }
9018
+
9019
+ .tree-select-dropdown[popover] {
9020
+ position-anchor: --tree-select;
9021
+ top: anchor(bottom);
9022
+ left: anchor(left);
9023
+ right: anchor(right);
9024
+ position-try-fallbacks: flip-block;
9025
+ }
9026
+ }
9027
+
8523
9028
  /* Search Input in Dropdown */
8524
9029
  .tree-select-search {
8525
9030
  display: flex;
@@ -10524,6 +11029,12 @@
10524
11029
  padding: 0 1rem;
10525
11030
  background-color: var(--color-surface);
10526
11031
  color: var(--color-on-surface);
11032
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
11033
+ }
11034
+
11035
+ /* Static App Bar (default) */
11036
+ .appbar-static {
11037
+ position: static;
10527
11038
  }
10528
11039
 
10529
11040
  /* Fixed App Bar */
@@ -10542,19 +11053,47 @@
10542
11053
  z-index: 1000;
10543
11054
  }
10544
11055
 
10545
- /* App Bar with Shadow */
11056
+ /* Top App Bar (default) */
11057
+ .appbar-top {
11058
+ top: 0;
11059
+ }
11060
+
11061
+ /* Bottom App Bar */
11062
+ .appbar-bottom {
11063
+ position: fixed;
11064
+ bottom: 0;
11065
+ left: 0;
11066
+ right: 0;
11067
+ top: auto;
11068
+ z-index: 1000;
11069
+ }
11070
+
11071
+ /* App Bar with Shadow (elevated) */
10546
11072
  .appbar-elevated {
10547
11073
  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
10548
11074
  }
10549
11075
 
11076
+ /* Flat App Bar (no shadow) */
11077
+ .appbar-flat {
11078
+ box-shadow: none;
11079
+ }
11080
+
10550
11081
  /* App Bar with Border */
10551
11082
  .appbar-bordered {
10552
11083
  border-bottom: 1px solid var(--color-outline-variant);
11084
+ box-shadow: none;
10553
11085
  }
10554
11086
 
10555
11087
  /* Transparent App Bar */
10556
11088
  .appbar-transparent {
10557
11089
  background-color: transparent;
11090
+ box-shadow: none;
11091
+ }
11092
+
11093
+ /* Backdrop Blur */
11094
+ .appbar-blur {
11095
+ backdrop-filter: blur(8px);
11096
+ -webkit-backdrop-filter: blur(8px);
10558
11097
  }
10559
11098
 
10560
11099
  /* App Bar Navigation Icon */
@@ -10664,17 +11203,125 @@
10664
11203
  padding: 0 0.75rem;
10665
11204
  }
10666
11205
 
10667
- .appbar-sm .appbar-title {
10668
- font-size: 1rem;
11206
+ .appbar-sm .appbar-title {
11207
+ font-size: 1rem;
11208
+ }
11209
+
11210
+ .appbar-lg {
11211
+ min-height: 5rem;
11212
+ padding: 0 1.5rem;
11213
+ }
11214
+
11215
+ .appbar-lg .appbar-title {
11216
+ font-size: 1.5rem;
11217
+ }
11218
+
11219
+ /* Compact Size */
11220
+ .appbar-compact {
11221
+ min-height: 3rem;
11222
+ padding: 0 0.75rem;
11223
+ }
11224
+
11225
+ .appbar-compact .appbar-title,
11226
+ .appbar-compact .appbar-heading {
11227
+ font-size: 1rem;
11228
+ line-height: 1.5rem;
11229
+ }
11230
+
11231
+ .appbar-compact .appbar-nav,
11232
+ .appbar-compact .appbar-action,
11233
+ .appbar-compact .appbar-back {
11234
+ width: 2rem;
11235
+ height: 2rem;
11236
+ }
11237
+
11238
+ /* Comfortable Size */
11239
+ .appbar-comfortable {
11240
+ min-height: 5rem;
11241
+ padding: 0 1.5rem;
11242
+ }
11243
+
11244
+ .appbar-comfortable .appbar-title,
11245
+ .appbar-comfortable .appbar-heading {
11246
+ font-size: 1.5rem;
11247
+ line-height: 2rem;
11248
+ }
11249
+
11250
+ /* Section Classes */
11251
+ .appbar-leading {
11252
+ display: flex;
11253
+ align-items: center;
11254
+ gap: 0.25rem;
11255
+ flex-shrink: 0;
11256
+ }
11257
+
11258
+ .appbar-trailing {
11259
+ display: flex;
11260
+ align-items: center;
11261
+ gap: 0.25rem;
11262
+ flex-shrink: 0;
11263
+ margin-left: auto;
11264
+ }
11265
+
11266
+ /* Heading Text */
11267
+ .appbar-heading {
11268
+ font-size: 1.25rem;
11269
+ font-weight: 500;
11270
+ line-height: 1.75rem;
11271
+ margin: 0;
11272
+ overflow: hidden;
11273
+ text-overflow: ellipsis;
11274
+ white-space: nowrap;
11275
+ }
11276
+
11277
+ /* Back Button */
11278
+ .appbar-back {
11279
+ display: flex;
11280
+ align-items: center;
11281
+ justify-content: center;
11282
+ width: 2.5rem;
11283
+ height: 2.5rem;
11284
+ color: var(--color-on-surface);
11285
+ background-color: transparent;
11286
+ border: none;
11287
+ border-radius: 50%;
11288
+ cursor: pointer;
11289
+ transition: background-color 150ms ease-in-out;
11290
+ flex-shrink: 0;
11291
+ }
11292
+
11293
+ .appbar-back:hover {
11294
+ background-color: var(--color-surface-container);
11295
+ }
11296
+
11297
+ .appbar-back:focus-visible {
11298
+ outline: 2px solid var(--color-primary);
11299
+ outline-offset: 2px;
11300
+ }
11301
+
11302
+ /* Search Input (direct on element) */
11303
+ .appbar .appbar-search,
11304
+ input.appbar-search {
11305
+ flex: 1;
11306
+ max-width: 32rem;
11307
+ padding: 0.5rem 1rem;
11308
+ font-size: 0.875rem;
11309
+ color: var(--color-on-surface);
11310
+ background-color: var(--color-surface-container);
11311
+ border: none;
11312
+ border-radius: 9999px;
11313
+ transition: background-color 150ms ease-in-out;
10669
11314
  }
10670
11315
 
10671
- .appbar-lg {
10672
- min-height: 5rem;
10673
- padding: 0 1.5rem;
11316
+ .appbar .appbar-search:focus,
11317
+ input.appbar-search:focus {
11318
+ outline: none;
11319
+ background-color: var(--color-surface-container-high);
10674
11320
  }
10675
11321
 
10676
- .appbar-lg .appbar-title {
10677
- font-size: 1.5rem;
11322
+ .appbar .appbar-search::placeholder,
11323
+ input.appbar-search::placeholder {
11324
+ color: var(--color-on-surface-variant);
10678
11325
  }
10679
11326
 
10680
11327
  /* Color Variants */
@@ -10715,10 +11362,53 @@
10715
11362
  color: var(--color-on-secondary-container);
10716
11363
  }
10717
11364
 
11365
+ .appbar-secondary .appbar-subtitle {
11366
+ color: var(--color-on-secondary);
11367
+ opacity: 0.8;
11368
+ }
11369
+
11370
+ .appbar-tertiary {
11371
+ background-color: var(--color-tertiary);
11372
+ color: var(--color-on-tertiary);
11373
+ }
11374
+
11375
+ .appbar-tertiary .appbar-nav,
11376
+ .appbar-tertiary .appbar-action {
11377
+ color: var(--color-on-tertiary);
11378
+ }
11379
+
11380
+ .appbar-tertiary .appbar-nav:hover,
11381
+ .appbar-tertiary .appbar-action:hover {
11382
+ background-color: var(--color-tertiary-container);
11383
+ color: var(--color-on-tertiary-container);
11384
+ }
11385
+
11386
+ .appbar-tertiary .appbar-subtitle {
11387
+ color: var(--color-on-tertiary);
11388
+ opacity: 0.8;
11389
+ }
11390
+
11391
+ /* Surface Variants */
10718
11392
  .appbar-surface {
11393
+ background-color: var(--color-surface);
11394
+ }
11395
+
11396
+ .appbar-surface-container {
10719
11397
  background-color: var(--color-surface-container);
10720
11398
  }
10721
11399
 
11400
+ .appbar-surface-container-low {
11401
+ background-color: var(--color-surface-container-low);
11402
+ }
11403
+
11404
+ .appbar-surface-container-high {
11405
+ background-color: var(--color-surface-container-high);
11406
+ }
11407
+
11408
+ .appbar-surface-container-highest {
11409
+ background-color: var(--color-surface-container-highest);
11410
+ }
11411
+
10722
11412
  /* Center Title */
10723
11413
  .appbar-center {
10724
11414
  justify-content: space-between;
@@ -13134,6 +13824,72 @@
13134
13824
  transform: scale(1);
13135
13825
  }
13136
13826
 
13827
+ /* Direct popover structure (without .popover-content wrapper) */
13828
+ .popover.popover-show,
13829
+ .popover.show {
13830
+ opacity: 1;
13831
+ visibility: visible;
13832
+ }
13833
+
13834
+ /* Popover as direct overlay (simpler structure) */
13835
+ .popover[class*="popover-top"],
13836
+ .popover[class*="popover-bottom"],
13837
+ .popover[class*="popover-left"],
13838
+ .popover[class*="popover-right"] {
13839
+ position: absolute;
13840
+ z-index: 1050;
13841
+ min-width: 12rem;
13842
+ max-width: 20rem;
13843
+ padding: 1rem;
13844
+ background-color: var(--color-surface);
13845
+ border: 1px solid var(--color-outline-variant);
13846
+ border-radius: 0.75rem;
13847
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
13848
+ opacity: 0;
13849
+ visibility: hidden;
13850
+ transition: opacity 150ms ease-out, visibility 150ms ease-out;
13851
+ }
13852
+
13853
+ .popover[class*="popover-top"].popover-show,
13854
+ .popover[class*="popover-bottom"].popover-show,
13855
+ .popover[class*="popover-left"].popover-show,
13856
+ .popover[class*="popover-right"].popover-show {
13857
+ opacity: 1;
13858
+ visibility: visible;
13859
+ }
13860
+
13861
+ /* Direct position: Top */
13862
+ .popover.popover-top:not(:has(.popover-content)) {
13863
+ bottom: 100%;
13864
+ left: 50%;
13865
+ transform: translateX(-50%);
13866
+ margin-bottom: 0.75rem;
13867
+ }
13868
+
13869
+ /* Direct position: Bottom */
13870
+ .popover.popover-bottom:not(:has(.popover-content)) {
13871
+ top: 100%;
13872
+ left: 50%;
13873
+ transform: translateX(-50%);
13874
+ margin-top: 0.75rem;
13875
+ }
13876
+
13877
+ /* Direct position: Left */
13878
+ .popover.popover-left:not(:has(.popover-content)) {
13879
+ right: 100%;
13880
+ top: 50%;
13881
+ transform: translateY(-50%);
13882
+ margin-right: 0.75rem;
13883
+ }
13884
+
13885
+ /* Direct position: Right */
13886
+ .popover.popover-right:not(:has(.popover-content)) {
13887
+ left: 100%;
13888
+ top: 50%;
13889
+ transform: translateY(-50%);
13890
+ margin-left: 0.75rem;
13891
+ }
13892
+
13137
13893
  /* Popover Arrow */
13138
13894
  .popover-arrow {
13139
13895
  position: absolute;
@@ -13310,12 +14066,33 @@
13310
14066
  }
13311
14067
 
13312
14068
  /* Color Variants */
14069
+ /*
14070
+ * Color intensity for themed popovers.
14071
+ * Override this variable to adjust how strongly colors appear:
14072
+ * - 20% = subtle tint
14073
+ * - 30% = moderate (default)
14074
+ * - 40% = bold/prominent
14075
+ */
14076
+ .popover {
14077
+ --popover-color-intensity: 30%;
14078
+ }
14079
+
14080
+ /* Dark variant */
13313
14081
  .popover-dark .popover-content {
13314
14082
  background-color: var(--color-on-surface);
13315
14083
  color: var(--color-surface);
13316
14084
  border-color: transparent;
13317
14085
  }
13318
14086
 
14087
+ .popover-dark[class*="popover-top"],
14088
+ .popover-dark[class*="popover-bottom"],
14089
+ .popover-dark[class*="popover-left"],
14090
+ .popover-dark[class*="popover-right"] {
14091
+ background-color: var(--color-on-surface);
14092
+ color: var(--color-surface);
14093
+ border-color: transparent;
14094
+ }
14095
+
13319
14096
  .popover-dark .popover-arrow {
13320
14097
  background-color: var(--color-on-surface);
13321
14098
  border-color: transparent;
@@ -13330,16 +14107,106 @@
13330
14107
  opacity: 0.9;
13331
14108
  }
13332
14109
 
14110
+ /* Primary variant */
13333
14111
  .popover-primary .popover-content {
13334
- background-color: var(--color-primary-container);
14112
+ background-color: color-mix(in oklch, var(--color-primary) var(--popover-color-intensity), var(--color-surface));
14113
+ border-color: var(--color-primary);
14114
+ }
14115
+
14116
+ .popover-primary[class*="popover-top"],
14117
+ .popover-primary[class*="popover-bottom"],
14118
+ .popover-primary[class*="popover-left"],
14119
+ .popover-primary[class*="popover-right"] {
14120
+ background-color: color-mix(in oklch, var(--color-primary) var(--popover-color-intensity), var(--color-surface));
13335
14121
  border-color: var(--color-primary);
13336
14122
  }
13337
14123
 
13338
14124
  .popover-primary .popover-arrow {
13339
- background-color: var(--color-primary-container);
14125
+ background-color: color-mix(in oklch, var(--color-primary) var(--popover-color-intensity), var(--color-surface));
13340
14126
  border-color: var(--color-primary);
13341
14127
  }
13342
14128
 
14129
+ .popover-primary .popover-body {
14130
+ color: var(--color-on-surface);
14131
+ }
14132
+
14133
+ .popover-primary .popover-title {
14134
+ color: var(--color-on-surface);
14135
+ }
14136
+
14137
+ /* Secondary variant */
14138
+ .popover-secondary .popover-content {
14139
+ background-color: color-mix(in oklch, var(--color-secondary) var(--popover-color-intensity), var(--color-surface));
14140
+ border-color: var(--color-secondary);
14141
+ }
14142
+
14143
+ .popover-secondary[class*="popover-top"],
14144
+ .popover-secondary[class*="popover-bottom"],
14145
+ .popover-secondary[class*="popover-left"],
14146
+ .popover-secondary[class*="popover-right"] {
14147
+ background-color: color-mix(in oklch, var(--color-secondary) var(--popover-color-intensity), var(--color-surface));
14148
+ border-color: var(--color-secondary);
14149
+ }
14150
+
14151
+ .popover-secondary .popover-arrow {
14152
+ background-color: color-mix(in oklch, var(--color-secondary) var(--popover-color-intensity), var(--color-surface));
14153
+ border-color: var(--color-secondary);
14154
+ }
14155
+
14156
+ .popover-secondary .popover-body {
14157
+ color: var(--color-on-surface);
14158
+ }
14159
+
14160
+ .popover-secondary .popover-title {
14161
+ color: var(--color-on-surface);
14162
+ }
14163
+
14164
+ /* Tertiary variant */
14165
+ .popover-tertiary .popover-content {
14166
+ background-color: color-mix(in oklch, var(--color-tertiary) var(--popover-color-intensity), var(--color-surface));
14167
+ border-color: var(--color-tertiary);
14168
+ }
14169
+
14170
+ .popover-tertiary[class*="popover-top"],
14171
+ .popover-tertiary[class*="popover-bottom"],
14172
+ .popover-tertiary[class*="popover-left"],
14173
+ .popover-tertiary[class*="popover-right"] {
14174
+ background-color: color-mix(in oklch, var(--color-tertiary) var(--popover-color-intensity), var(--color-surface));
14175
+ border-color: var(--color-tertiary);
14176
+ }
14177
+
14178
+ .popover-tertiary .popover-arrow {
14179
+ background-color: color-mix(in oklch, var(--color-tertiary) var(--popover-color-intensity), var(--color-surface));
14180
+ border-color: var(--color-tertiary);
14181
+ }
14182
+
14183
+ .popover-tertiary .popover-body {
14184
+ color: var(--color-on-surface);
14185
+ }
14186
+
14187
+ .popover-tertiary .popover-title {
14188
+ color: var(--color-on-surface);
14189
+ }
14190
+
14191
+ /* Surface highest variant */
14192
+ .popover-surface-highest .popover-content {
14193
+ background-color: var(--color-surface-container-highest);
14194
+ border-color: var(--color-outline-variant);
14195
+ }
14196
+
14197
+ .popover-surface-highest[class*="popover-top"],
14198
+ .popover-surface-highest[class*="popover-bottom"],
14199
+ .popover-surface-highest[class*="popover-left"],
14200
+ .popover-surface-highest[class*="popover-right"] {
14201
+ background-color: var(--color-surface-container-highest);
14202
+ border-color: var(--color-outline-variant);
14203
+ }
14204
+
14205
+ .popover-surface-highest .popover-arrow {
14206
+ background-color: var(--color-surface-container-highest);
14207
+ border-color: var(--color-outline-variant);
14208
+ }
14209
+
13343
14210
  /* Hover Trigger */
13344
14211
  .popover-hover:hover .popover-content,
13345
14212
  .popover-hover:focus-within .popover-content {
@@ -13414,11 +14281,160 @@
13414
14281
  justify-content: center;
13415
14282
  }
13416
14283
 
14284
+ /* ========================================
14285
+ * HTML Popover API Support
14286
+ * Uses native [popover] attribute with :popover-open pseudo-class
14287
+ * ======================================== */
14288
+
14289
+ /* Native popover base styles */
14290
+ .popover[popover] {
14291
+ position: fixed;
14292
+ inset: unset;
14293
+ z-index: 1050;
14294
+ min-width: 12rem;
14295
+ max-width: 20rem;
14296
+ padding: 1rem;
14297
+ margin: 0;
14298
+ background-color: var(--color-surface);
14299
+ border: 1px solid var(--color-outline-variant);
14300
+ border-radius: 0.75rem;
14301
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
14302
+ opacity: 0;
14303
+ transform: scale(0.95);
14304
+ transition: opacity 150ms ease-out, transform 150ms ease-out, overlay 150ms ease-out allow-discrete, display 150ms ease-out allow-discrete;
14305
+ }
14306
+
14307
+ /* Popover open state */
14308
+ .popover[popover]:popover-open {
14309
+ opacity: 1;
14310
+ transform: scale(1);
14311
+ }
14312
+
14313
+ /* Starting state for entry animation */
14314
+ @starting-style {
14315
+ .popover[popover]:popover-open {
14316
+ opacity: 0;
14317
+ transform: scale(0.95);
14318
+ }
14319
+ }
14320
+
14321
+ /* Native popover backdrop */
14322
+ .popover[popover]::backdrop {
14323
+ background-color: rgb(0 0 0 / 0);
14324
+ transition: background-color 150ms ease-out, overlay 150ms ease-out allow-discrete, display 150ms ease-out allow-discrete;
14325
+ }
14326
+
14327
+ .popover[popover]:popover-open::backdrop {
14328
+ background-color: rgb(0 0 0 / 0.1);
14329
+ }
14330
+
14331
+ @starting-style {
14332
+ .popover[popover]:popover-open::backdrop {
14333
+ background-color: rgb(0 0 0 / 0);
14334
+ }
14335
+ }
14336
+
14337
+ /* Native popover with modal backdrop */
14338
+ .popover-modal[popover]::backdrop {
14339
+ background-color: rgb(0 0 0 / 0);
14340
+ transition: background-color 150ms ease-out, overlay 150ms ease-out allow-discrete, display 150ms ease-out allow-discrete;
14341
+ }
14342
+
14343
+ .popover-modal[popover]:popover-open::backdrop {
14344
+ background-color: rgb(0 0 0 / 0.3);
14345
+ }
14346
+
14347
+ @starting-style {
14348
+ .popover-modal[popover]:popover-open::backdrop {
14349
+ background-color: rgb(0 0 0 / 0);
14350
+ }
14351
+ }
14352
+
14353
+ /* Native popover color variants */
14354
+ .popover-primary[popover] {
14355
+ background-color: color-mix(in oklch, var(--color-primary) var(--popover-color-intensity), var(--color-surface));
14356
+ border-color: var(--color-primary);
14357
+ }
14358
+
14359
+ .popover-primary[popover] .popover-body {
14360
+ color: var(--color-on-surface);
14361
+ }
14362
+
14363
+ .popover-primary[popover] .popover-title {
14364
+ color: var(--color-on-surface);
14365
+ }
14366
+
14367
+ .popover-secondary[popover] {
14368
+ background-color: color-mix(in oklch, var(--color-secondary) var(--popover-color-intensity), var(--color-surface));
14369
+ border-color: var(--color-secondary);
14370
+ }
14371
+
14372
+ .popover-secondary[popover] .popover-body {
14373
+ color: var(--color-on-surface);
14374
+ }
14375
+
14376
+ .popover-secondary[popover] .popover-title {
14377
+ color: var(--color-on-surface);
14378
+ }
14379
+
14380
+ .popover-tertiary[popover] {
14381
+ background-color: color-mix(in oklch, var(--color-tertiary) var(--popover-color-intensity), var(--color-surface));
14382
+ border-color: var(--color-tertiary);
14383
+ }
14384
+
14385
+ .popover-tertiary[popover] .popover-body {
14386
+ color: var(--color-on-surface);
14387
+ }
14388
+
14389
+ .popover-tertiary[popover] .popover-title {
14390
+ color: var(--color-on-surface);
14391
+ }
14392
+
14393
+ .popover-dark[popover] {
14394
+ background-color: var(--color-on-surface);
14395
+ border-color: transparent;
14396
+ }
14397
+
14398
+ .popover-dark[popover] .popover-body {
14399
+ color: var(--color-surface);
14400
+ opacity: 0.9;
14401
+ }
14402
+
14403
+ .popover-dark[popover] .popover-title {
14404
+ color: var(--color-surface);
14405
+ }
14406
+
14407
+ .popover-surface-highest[popover] {
14408
+ background-color: var(--color-surface-container-highest);
14409
+ border-color: var(--color-outline-variant);
14410
+ }
14411
+
14412
+ /* Native popover size variants */
14413
+ .popover-sm[popover] {
14414
+ min-width: 8rem;
14415
+ max-width: 14rem;
14416
+ padding: 0.75rem;
14417
+ }
14418
+
14419
+ .popover-lg[popover] {
14420
+ min-width: 16rem;
14421
+ max-width: 28rem;
14422
+ padding: 1.25rem;
14423
+ }
14424
+
14425
+ .popover-full[popover] {
14426
+ min-width: 0;
14427
+ max-width: none;
14428
+ width: max-content;
14429
+ }
14430
+
13417
14431
  /* Reduce Motion */
13418
14432
  @media (prefers-reduced-motion: reduce) {
13419
14433
  .popover-content,
13420
14434
  .popover-close,
13421
- .popover-menu-item {
14435
+ .popover-menu-item,
14436
+ .popover[popover],
14437
+ .popover[popover]::backdrop {
13422
14438
  transition: none;
13423
14439
  }
13424
14440
  }