@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.
package/dist/index.css CHANGED
@@ -5057,7 +5057,8 @@ html {
5057
5057
  border-color: var(--color-on-surface);
5058
5058
  }
5059
5059
 
5060
- .checkbox:checked:hover:not(:disabled) {
5060
+ .checkbox:checked:hover:not(:disabled),
5061
+ .checkbox:indeterminate:hover:not(:disabled) {
5061
5062
  background-color: color-mix(in oklch, var(--checkbox-color), black 10%);
5062
5063
  border-color: color-mix(in oklch, var(--checkbox-color), black 10%);
5063
5064
  }
@@ -8842,7 +8843,84 @@ html {
8842
8843
  */
8843
8844
 
8844
8845
  @layer components {
8845
- /* Base Textarea */
8846
+ /* ============================================
8847
+ * TEXTAREA CONTAINER
8848
+ * ============================================ */
8849
+
8850
+ .textarea-container {
8851
+ position: relative;
8852
+ display: flex;
8853
+ flex-direction: column;
8854
+ gap: 0.25rem;
8855
+ width: 100%;
8856
+ }
8857
+
8858
+ /* ============================================
8859
+ * TEXTAREA LABEL
8860
+ * ============================================ */
8861
+
8862
+ .textarea-label {
8863
+ display: block;
8864
+ font-size: 0.875rem;
8865
+ font-weight: 500;
8866
+ line-height: 1.25rem;
8867
+ color: var(--color-on-surface);
8868
+ margin-bottom: 0.25rem;
8869
+ }
8870
+
8871
+ /* Floating Label */
8872
+ .textarea-label-floating {
8873
+ position: absolute;
8874
+ top: 0.75rem;
8875
+ left: 1rem;
8876
+ font-size: 1rem;
8877
+ font-weight: 400;
8878
+ color: var(--color-on-surface-variant);
8879
+ pointer-events: none;
8880
+ transition: all 150ms ease-in-out;
8881
+ transform-origin: left top;
8882
+ z-index: 1;
8883
+ }
8884
+
8885
+ /* Floating label active state - when textarea has content or focus */
8886
+ .textarea:focus ~ .textarea-label-floating,
8887
+ .textarea:not(:placeholder-shown) ~ .textarea-label-floating {
8888
+ top: -0.5rem;
8889
+ left: 0.75rem;
8890
+ font-size: 0.75rem;
8891
+ font-weight: 500;
8892
+ color: var(--color-primary);
8893
+ background-color: var(--color-surface);
8894
+ padding: 0 0.25rem;
8895
+ }
8896
+
8897
+ /* Floating label for filled variant */
8898
+ .textarea-filled ~ .textarea-label-floating {
8899
+ background-color: transparent;
8900
+ }
8901
+
8902
+ .textarea-filled:focus ~ .textarea-label-floating,
8903
+ .textarea-filled:not(:placeholder-shown) ~ .textarea-label-floating {
8904
+ top: 0.25rem;
8905
+ left: 0.75rem;
8906
+ background-color: transparent;
8907
+ }
8908
+
8909
+ /* ============================================
8910
+ * HELPER TEXT
8911
+ * ============================================ */
8912
+
8913
+ .textarea-helper {
8914
+ font-size: 0.75rem;
8915
+ line-height: 1rem;
8916
+ color: var(--color-on-surface-variant);
8917
+ margin-top: 0.25rem;
8918
+ }
8919
+
8920
+ /* ============================================
8921
+ * BASE TEXTAREA
8922
+ * ============================================ */
8923
+
8846
8924
  .textarea {
8847
8925
  display: block;
8848
8926
  width: 100%;
@@ -8890,6 +8968,15 @@ html {
8890
8968
  cursor: default;
8891
8969
  }
8892
8970
 
8971
+ /* Full Width */
8972
+ .textarea-full {
8973
+ width: 100%;
8974
+ }
8975
+
8976
+ /* ============================================
8977
+ * VARIANTS
8978
+ * ============================================ */
8979
+
8893
8980
  /* Filled Variant */
8894
8981
  .textarea-filled {
8895
8982
  background-color: var(--color-surface-container);
@@ -8932,23 +9019,68 @@ html {
8932
9019
  box-shadow: none;
8933
9020
  }
8934
9021
 
8935
- /* Color Variants */
9022
+ /* ============================================
9023
+ * COLOR VARIANTS
9024
+ * ============================================ */
9025
+
9026
+ /* Primary */
9027
+ .textarea-primary {
9028
+ border-color: var(--color-primary);
9029
+ }
9030
+
8936
9031
  .textarea-primary:focus-visible {
8937
9032
  border-color: var(--color-primary);
8938
9033
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
8939
9034
  }
8940
9035
 
9036
+ .textarea-filled.textarea-primary {
9037
+ border-bottom-color: var(--color-primary);
9038
+ }
9039
+
9040
+ .textarea-filled.textarea-primary:focus-visible {
9041
+ border-bottom-color: var(--color-primary);
9042
+ }
9043
+
9044
+ /* Secondary */
9045
+ .textarea-secondary {
9046
+ border-color: var(--color-secondary);
9047
+ }
9048
+
8941
9049
  .textarea-secondary:focus-visible {
8942
9050
  border-color: var(--color-secondary);
8943
9051
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-secondary) 10%, transparent);
8944
9052
  }
8945
9053
 
9054
+ .textarea-filled.textarea-secondary {
9055
+ border-bottom-color: var(--color-secondary);
9056
+ }
9057
+
9058
+ .textarea-filled.textarea-secondary:focus-visible {
9059
+ border-bottom-color: var(--color-secondary);
9060
+ }
9061
+
9062
+ /* Tertiary */
9063
+ .textarea-tertiary {
9064
+ border-color: var(--color-tertiary);
9065
+ }
9066
+
8946
9067
  .textarea-tertiary:focus-visible {
8947
9068
  border-color: var(--color-tertiary);
8948
9069
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-tertiary) 10%, transparent);
8949
9070
  }
8950
9071
 
8951
- /* Semantic Colors */
9072
+ .textarea-filled.textarea-tertiary {
9073
+ border-bottom-color: var(--color-tertiary);
9074
+ }
9075
+
9076
+ .textarea-filled.textarea-tertiary:focus-visible {
9077
+ border-bottom-color: var(--color-tertiary);
9078
+ }
9079
+
9080
+ /* ============================================
9081
+ * SEMANTIC COLORS
9082
+ * ============================================ */
9083
+
8952
9084
  .textarea-error {
8953
9085
  border-color: var(--color-error);
8954
9086
  }
@@ -8958,6 +9090,10 @@ html {
8958
9090
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
8959
9091
  }
8960
9092
 
9093
+ .textarea-filled.textarea-error {
9094
+ border-bottom-color: var(--color-error);
9095
+ }
9096
+
8961
9097
  .textarea-success {
8962
9098
  border-color: var(--color-success);
8963
9099
  }
@@ -8967,6 +9103,10 @@ html {
8967
9103
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
8968
9104
  }
8969
9105
 
9106
+ .textarea-filled.textarea-success {
9107
+ border-bottom-color: var(--color-success);
9108
+ }
9109
+
8970
9110
  .textarea-warning {
8971
9111
  border-color: var(--color-warning);
8972
9112
  }
@@ -8976,7 +9116,14 @@ html {
8976
9116
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
8977
9117
  }
8978
9118
 
8979
- /* Size Variants */
9119
+ .textarea-filled.textarea-warning {
9120
+ border-bottom-color: var(--color-warning);
9121
+ }
9122
+
9123
+ /* ============================================
9124
+ * SIZE VARIANTS
9125
+ * ============================================ */
9126
+
8980
9127
  .textarea-sm {
8981
9128
  min-height: 4rem;
8982
9129
  padding: 0.5rem 0.75rem;
@@ -8993,11 +9140,18 @@ html {
8993
9140
  border-radius: 0.625rem;
8994
9141
  }
8995
9142
 
8996
- /* Resize Options */
9143
+ /* ============================================
9144
+ * RESIZE OPTIONS
9145
+ * ============================================ */
9146
+
8997
9147
  .textarea-resize-none {
8998
9148
  resize: none;
8999
9149
  }
9000
9150
 
9151
+ .textarea-resize-vertical {
9152
+ resize: vertical;
9153
+ }
9154
+
9001
9155
  .textarea-resize-horizontal {
9002
9156
  resize: horizontal;
9003
9157
  }
@@ -9006,19 +9160,21 @@ html {
9006
9160
  resize: both;
9007
9161
  }
9008
9162
 
9009
- /* Auto-resize (requires JS) */
9163
+ /* ============================================
9164
+ * AUTO-RESIZE (requires JS)
9165
+ * ============================================ */
9166
+
9167
+ .textarea-auto-resize,
9010
9168
  .textarea-autosize {
9011
9169
  resize: none;
9012
9170
  overflow: hidden;
9171
+ min-height: 3rem;
9172
+ field-sizing: content; /* Modern CSS - auto-grows without JS in supported browsers */
9013
9173
  }
9014
9174
 
9015
- /* Character Counter */
9016
- .textarea-wrapper {
9017
- position: relative;
9018
- display: flex;
9019
- flex-direction: column;
9020
- gap: 0.25rem;
9021
- }
9175
+ /* ============================================
9176
+ * CHARACTER COUNTER
9177
+ * ============================================ */
9022
9178
 
9023
9179
  .textarea-counter {
9024
9180
  font-size: 0.75rem;
@@ -9027,15 +9183,331 @@ html {
9027
9183
  text-align: right;
9028
9184
  }
9029
9185
 
9030
- .textarea-counter-error {
9186
+ .textarea-counter-error,
9187
+ .textarea-counter-exceeded {
9188
+ color: var(--color-error);
9189
+ }
9190
+
9191
+ /* ============================================
9192
+ * CONTAINER STATES
9193
+ * ============================================ */
9194
+
9195
+ .textarea-container-error .textarea-label {
9196
+ color: var(--color-error);
9197
+ }
9198
+
9199
+ .textarea-container-error .textarea-helper {
9031
9200
  color: var(--color-error);
9032
9201
  }
9033
9202
 
9203
+ .textarea-container-error .textarea-label-floating {
9204
+ color: var(--color-error);
9205
+ }
9206
+
9207
+ .textarea-container-error .textarea:focus ~ .textarea-label-floating {
9208
+ color: var(--color-error);
9209
+ }
9210
+
9211
+ .textarea-container-success .textarea-label {
9212
+ color: var(--color-success);
9213
+ }
9214
+
9215
+ .textarea-container-success .textarea-helper {
9216
+ color: var(--color-success);
9217
+ }
9218
+
9219
+ .textarea-container-success .textarea-label-floating {
9220
+ color: var(--color-success);
9221
+ }
9222
+
9223
+ .textarea-container-success .textarea:focus ~ .textarea-label-floating {
9224
+ color: var(--color-success);
9225
+ }
9226
+
9227
+ /* ============================================
9228
+ * REDUCE MOTION
9229
+ * ============================================ */
9230
+
9231
+ @media (prefers-reduced-motion: reduce) {
9232
+ .textarea,
9233
+ .textarea-label-floating {
9234
+ transition: none;
9235
+ }
9236
+ }
9237
+ }
9238
+
9239
+ /**
9240
+ * Toggle Button Component Styles
9241
+ * DuskMoonUI - Material Design 3 inspired toggle button
9242
+ * Used for selecting between multiple options or toggling states
9243
+ */
9244
+
9245
+ @layer components {
9246
+ /* Base toggle button */
9247
+ .toggle-btn {
9248
+ display: inline-flex;
9249
+ align-items: center;
9250
+ justify-content: center;
9251
+ gap: 0.5rem;
9252
+ padding: 0.625rem 1rem;
9253
+ font-size: 0.875rem;
9254
+ font-weight: 500;
9255
+ line-height: 1.25rem;
9256
+ color: var(--color-on-surface-variant);
9257
+ background-color: transparent;
9258
+ border: 1px solid var(--color-outline);
9259
+ border-radius: 0.5rem;
9260
+ cursor: pointer;
9261
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
9262
+ user-select: none;
9263
+ }
9264
+
9265
+ /* Hover state */
9266
+ .toggle-btn:hover:not(:disabled) {
9267
+ background-color: color-mix(in oklch, var(--color-surface-variant) 50%, transparent);
9268
+ border-color: var(--color-outline-variant);
9269
+ }
9270
+
9271
+ /* Active/Selected state */
9272
+ .toggle-btn-active,
9273
+ .toggle-btn.active {
9274
+ color: var(--color-on-primary-container);
9275
+ background-color: var(--color-primary-container);
9276
+ border-color: var(--color-primary);
9277
+ }
9278
+
9279
+ .toggle-btn-active:hover:not(:disabled),
9280
+ .toggle-btn.active:hover:not(:disabled) {
9281
+ background-color: color-mix(in oklch, var(--color-primary-container) 90%, transparent);
9282
+ }
9283
+
9284
+ /* Secondary variant */
9285
+ .toggle-btn-secondary.toggle-btn-active,
9286
+ .toggle-btn-secondary.active {
9287
+ color: var(--color-on-secondary-container);
9288
+ background-color: var(--color-secondary-container);
9289
+ border-color: var(--color-secondary);
9290
+ }
9291
+
9292
+ /* Tertiary variant */
9293
+ .toggle-btn-tertiary.toggle-btn-active,
9294
+ .toggle-btn-tertiary.active {
9295
+ color: var(--color-on-tertiary-container);
9296
+ background-color: var(--color-tertiary-container);
9297
+ border-color: var(--color-tertiary);
9298
+ }
9299
+
9300
+ /* Focus state */
9301
+ .toggle-btn:focus-visible {
9302
+ outline: 2px solid var(--color-primary);
9303
+ outline-offset: 2px;
9304
+ }
9305
+
9306
+ /* Disabled state */
9307
+ .toggle-btn:disabled,
9308
+ .toggle-btn-disabled {
9309
+ opacity: 0.38;
9310
+ cursor: not-allowed;
9311
+ pointer-events: none;
9312
+ }
9313
+
9314
+ /* Size variants */
9315
+ .toggle-btn-sm {
9316
+ padding: 0.375rem 0.75rem;
9317
+ font-size: 0.8125rem;
9318
+ gap: 0.375rem;
9319
+ }
9320
+
9321
+ .toggle-btn-lg {
9322
+ padding: 0.75rem 1.25rem;
9323
+ font-size: 1rem;
9324
+ gap: 0.625rem;
9325
+ }
9326
+
9327
+ /* Toggle button group */
9328
+ .toggle-group {
9329
+ display: inline-flex;
9330
+ align-items: center;
9331
+ gap: 0;
9332
+ border: 1px solid var(--color-outline);
9333
+ border-radius: 0.5rem;
9334
+ padding: 0.25rem;
9335
+ background-color: color-mix(in oklch, var(--color-surface-variant) 30%, transparent);
9336
+ }
9337
+
9338
+ /* Toggle buttons in group */
9339
+ .toggle-group .toggle-btn {
9340
+ border: none;
9341
+ border-radius: 0.375rem;
9342
+ margin: 0;
9343
+ }
9344
+
9345
+ .toggle-group .toggle-btn:not(:last-child) {
9346
+ margin-right: 0.125rem;
9347
+ }
9348
+
9349
+ /* Vertical group */
9350
+ .toggle-group-vertical {
9351
+ flex-direction: column;
9352
+ }
9353
+
9354
+ .toggle-group-vertical .toggle-btn:not(:last-child) {
9355
+ margin-right: 0;
9356
+ margin-bottom: 0.125rem;
9357
+ }
9358
+
9359
+ /* Exclusive selection (radio-like behavior) */
9360
+ .toggle-group-exclusive .toggle-btn {
9361
+ flex: 1;
9362
+ }
9363
+
9364
+ /* Icon-only toggle */
9365
+ .toggle-btn-icon-only {
9366
+ padding: 0.625rem;
9367
+ aspect-ratio: 1;
9368
+ }
9369
+
9370
+ .toggle-btn-icon-only.toggle-btn-sm {
9371
+ padding: 0.5rem;
9372
+ }
9373
+
9374
+ .toggle-btn-icon-only.toggle-btn-lg {
9375
+ padding: 0.875rem;
9376
+ }
9377
+
9378
+ /* With icon */
9379
+ .toggle-icon {
9380
+ width: 1.125rem;
9381
+ height: 1.125rem;
9382
+ flex-shrink: 0;
9383
+ }
9384
+
9385
+ /* Segmented control style */
9386
+ .toggle-segmented {
9387
+ display: inline-flex;
9388
+ align-items: center;
9389
+ gap: 0;
9390
+ background-color: var(--color-surface);
9391
+ border: 1px solid var(--color-outline-variant);
9392
+ border-radius: 0.5rem;
9393
+ padding: 0.25rem;
9394
+ }
9395
+
9396
+ .toggle-segmented .toggle-btn {
9397
+ border: none;
9398
+ background-color: transparent;
9399
+ border-radius: 0.375rem;
9400
+ }
9401
+
9402
+ .toggle-segmented .toggle-btn.toggle-btn-active,
9403
+ .toggle-segmented .toggle-btn.active {
9404
+ background-color: var(--color-surface-variant);
9405
+ border-color: transparent;
9406
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
9407
+ }
9408
+
9409
+ /* Chip-like toggle */
9410
+ .toggle-chip {
9411
+ border-radius: 1rem;
9412
+ padding: 0.5rem 1rem;
9413
+ }
9414
+
9415
+ .toggle-chip.toggle-btn-active,
9416
+ .toggle-chip.active {
9417
+ background-color: var(--color-primary-container);
9418
+ border-color: var(--color-primary-container);
9419
+ }
9420
+
9421
+ /* Outlined variant */
9422
+ .toggle-outlined {
9423
+ background-color: transparent;
9424
+ }
9425
+
9426
+ .toggle-outlined.toggle-btn-active,
9427
+ .toggle-outlined.active {
9428
+ background-color: color-mix(in oklch, var(--color-primary) 10%, transparent);
9429
+ }
9430
+
9431
+ /* Filled variant */
9432
+ .toggle-filled {
9433
+ background-color: var(--color-surface-variant);
9434
+ border: none;
9435
+ }
9436
+
9437
+ .toggle-filled.toggle-btn-active,
9438
+ .toggle-filled.active {
9439
+ background-color: var(--color-primary);
9440
+ color: var(--color-on-primary);
9441
+ }
9442
+
9443
+ /* With badge/indicator */
9444
+ .toggle-badge {
9445
+ position: relative;
9446
+ }
9447
+
9448
+ .toggle-badge::after {
9449
+ content: "";
9450
+ position: absolute;
9451
+ top: 0.25rem;
9452
+ right: 0.25rem;
9453
+ width: 0.5rem;
9454
+ height: 0.5rem;
9455
+ background-color: var(--color-error);
9456
+ border-radius: 50%;
9457
+ border: 2px solid var(--color-surface);
9458
+ }
9459
+
9460
+ /* Full width */
9461
+ .toggle-full {
9462
+ width: 100%;
9463
+ }
9464
+
9465
+ .toggle-group-full {
9466
+ width: 100%;
9467
+ }
9468
+
9469
+ .toggle-group-full .toggle-btn {
9470
+ flex: 1;
9471
+ }
9472
+
9473
+ /* Loading state */
9474
+ .toggle-loading {
9475
+ position: relative;
9476
+ pointer-events: none;
9477
+ }
9478
+
9479
+ .toggle-loading::after {
9480
+ content: "";
9481
+ position: absolute;
9482
+ top: 50%;
9483
+ left: 50%;
9484
+ width: 1rem;
9485
+ height: 1rem;
9486
+ margin-top: -0.5rem;
9487
+ margin-left: -0.5rem;
9488
+ border: 2px solid currentColor;
9489
+ border-top-color: transparent;
9490
+ border-radius: 50%;
9491
+ animation: toggle-spin 0.6s linear infinite;
9492
+ }
9493
+
9494
+ @keyframes toggle-spin {
9495
+ 0% {
9496
+ transform: rotate(0deg);
9497
+ }
9498
+ 100% {
9499
+ transform: rotate(360deg);
9500
+ }
9501
+ }
9502
+
9034
9503
  /* Reduce Motion */
9035
9504
  @media (prefers-reduced-motion: reduce) {
9036
- .textarea {
9505
+ .toggle-btn {
9037
9506
  transition: none;
9038
9507
  }
9508
+ .toggle-loading::after {
9509
+ animation: none;
9510
+ }
9039
9511
  }
9040
9512
  }
9041
9513
 
@@ -9333,12 +9805,24 @@ html {
9333
9805
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
9334
9806
  }
9335
9807
 
9336
- .tree-select-trigger:disabled {
9808
+ .tree-select-trigger:disabled,
9809
+ .tree-select-trigger[aria-disabled="true"] {
9337
9810
  cursor: not-allowed;
9338
9811
  opacity: 0.5;
9339
9812
  background-color: var(--color-surface-container);
9340
9813
  }
9341
9814
 
9815
+ /* Support for div-based trigger (when using clear button) */
9816
+ div.tree-select-trigger {
9817
+ user-select: none;
9818
+ }
9819
+
9820
+ div.tree-select-trigger:focus-visible {
9821
+ outline: none;
9822
+ border-color: var(--color-primary);
9823
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
9824
+ }
9825
+
9342
9826
  /* Value Display */
9343
9827
  .tree-select-value {
9344
9828
  flex: 1;
@@ -9399,6 +9883,11 @@ html {
9399
9883
  background-color: var(--color-surface-container-high);
9400
9884
  }
9401
9885
 
9886
+ .tree-select-clear svg {
9887
+ width: 1rem;
9888
+ height: 1rem;
9889
+ }
9890
+
9402
9891
  /* Tree Select Dropdown */
9403
9892
  .tree-select-dropdown {
9404
9893
  position: absolute;
@@ -9421,9 +9910,10 @@ html {
9421
9910
  display: block;
9422
9911
  }
9423
9912
 
9424
- /* Popover API Support - Browser handles visibility, JS handles positioning */
9913
+ /* Popover API Support */
9425
9914
  .tree-select-dropdown[popover] {
9426
- /* Reset browser defaults - positioning handled by JavaScript */
9915
+ /* Reset browser defaults for proper positioning */
9916
+ position: absolute;
9427
9917
  inset: unset;
9428
9918
  margin: 0;
9429
9919
  border: 1px solid var(--color-outline-variant);
@@ -9433,6 +9923,21 @@ html {
9433
9923
  display: block;
9434
9924
  }
9435
9925
 
9926
+ /* CSS Anchor Positioning for modern browsers */
9927
+ @supports (anchor-name: --tree-select) {
9928
+ .tree-select {
9929
+ anchor-name: --tree-select;
9930
+ }
9931
+
9932
+ .tree-select-dropdown[popover] {
9933
+ position-anchor: --tree-select;
9934
+ top: anchor(bottom);
9935
+ left: anchor(left);
9936
+ right: anchor(right);
9937
+ position-try-fallbacks: flip-block;
9938
+ }
9939
+ }
9940
+
9436
9941
  /* Search Input in Dropdown */
9437
9942
  .tree-select-search {
9438
9943
  display: flex;
@@ -11437,6 +11942,12 @@ html {
11437
11942
  padding: 0 1rem;
11438
11943
  background-color: var(--color-surface);
11439
11944
  color: var(--color-on-surface);
11945
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
11946
+ }
11947
+
11948
+ /* Static App Bar (default) */
11949
+ .appbar-static {
11950
+ position: static;
11440
11951
  }
11441
11952
 
11442
11953
  /* Fixed App Bar */
@@ -11455,19 +11966,47 @@ html {
11455
11966
  z-index: 1000;
11456
11967
  }
11457
11968
 
11458
- /* App Bar with Shadow */
11969
+ /* Top App Bar (default) */
11970
+ .appbar-top {
11971
+ top: 0;
11972
+ }
11973
+
11974
+ /* Bottom App Bar */
11975
+ .appbar-bottom {
11976
+ position: fixed;
11977
+ bottom: 0;
11978
+ left: 0;
11979
+ right: 0;
11980
+ top: auto;
11981
+ z-index: 1000;
11982
+ }
11983
+
11984
+ /* App Bar with Shadow (elevated) */
11459
11985
  .appbar-elevated {
11460
11986
  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
11461
11987
  }
11462
11988
 
11989
+ /* Flat App Bar (no shadow) */
11990
+ .appbar-flat {
11991
+ box-shadow: none;
11992
+ }
11993
+
11463
11994
  /* App Bar with Border */
11464
11995
  .appbar-bordered {
11465
11996
  border-bottom: 1px solid var(--color-outline-variant);
11997
+ box-shadow: none;
11466
11998
  }
11467
11999
 
11468
12000
  /* Transparent App Bar */
11469
12001
  .appbar-transparent {
11470
12002
  background-color: transparent;
12003
+ box-shadow: none;
12004
+ }
12005
+
12006
+ /* Backdrop Blur */
12007
+ .appbar-blur {
12008
+ backdrop-filter: blur(8px);
12009
+ -webkit-backdrop-filter: blur(8px);
11471
12010
  }
11472
12011
 
11473
12012
  /* App Bar Navigation Icon */
@@ -11577,17 +12116,125 @@ html {
11577
12116
  padding: 0 0.75rem;
11578
12117
  }
11579
12118
 
11580
- .appbar-sm .appbar-title {
11581
- font-size: 1rem;
12119
+ .appbar-sm .appbar-title {
12120
+ font-size: 1rem;
12121
+ }
12122
+
12123
+ .appbar-lg {
12124
+ min-height: 5rem;
12125
+ padding: 0 1.5rem;
12126
+ }
12127
+
12128
+ .appbar-lg .appbar-title {
12129
+ font-size: 1.5rem;
12130
+ }
12131
+
12132
+ /* Compact Size */
12133
+ .appbar-compact {
12134
+ min-height: 3rem;
12135
+ padding: 0 0.75rem;
12136
+ }
12137
+
12138
+ .appbar-compact .appbar-title,
12139
+ .appbar-compact .appbar-heading {
12140
+ font-size: 1rem;
12141
+ line-height: 1.5rem;
12142
+ }
12143
+
12144
+ .appbar-compact .appbar-nav,
12145
+ .appbar-compact .appbar-action,
12146
+ .appbar-compact .appbar-back {
12147
+ width: 2rem;
12148
+ height: 2rem;
12149
+ }
12150
+
12151
+ /* Comfortable Size */
12152
+ .appbar-comfortable {
12153
+ min-height: 5rem;
12154
+ padding: 0 1.5rem;
12155
+ }
12156
+
12157
+ .appbar-comfortable .appbar-title,
12158
+ .appbar-comfortable .appbar-heading {
12159
+ font-size: 1.5rem;
12160
+ line-height: 2rem;
12161
+ }
12162
+
12163
+ /* Section Classes */
12164
+ .appbar-leading {
12165
+ display: flex;
12166
+ align-items: center;
12167
+ gap: 0.25rem;
12168
+ flex-shrink: 0;
12169
+ }
12170
+
12171
+ .appbar-trailing {
12172
+ display: flex;
12173
+ align-items: center;
12174
+ gap: 0.25rem;
12175
+ flex-shrink: 0;
12176
+ margin-left: auto;
12177
+ }
12178
+
12179
+ /* Heading Text */
12180
+ .appbar-heading {
12181
+ font-size: 1.25rem;
12182
+ font-weight: 500;
12183
+ line-height: 1.75rem;
12184
+ margin: 0;
12185
+ overflow: hidden;
12186
+ text-overflow: ellipsis;
12187
+ white-space: nowrap;
12188
+ }
12189
+
12190
+ /* Back Button */
12191
+ .appbar-back {
12192
+ display: flex;
12193
+ align-items: center;
12194
+ justify-content: center;
12195
+ width: 2.5rem;
12196
+ height: 2.5rem;
12197
+ color: var(--color-on-surface);
12198
+ background-color: transparent;
12199
+ border: none;
12200
+ border-radius: 50%;
12201
+ cursor: pointer;
12202
+ transition: background-color 150ms ease-in-out;
12203
+ flex-shrink: 0;
12204
+ }
12205
+
12206
+ .appbar-back:hover {
12207
+ background-color: var(--color-surface-container);
12208
+ }
12209
+
12210
+ .appbar-back:focus-visible {
12211
+ outline: 2px solid var(--color-primary);
12212
+ outline-offset: 2px;
12213
+ }
12214
+
12215
+ /* Search Input (direct on element) */
12216
+ .appbar .appbar-search,
12217
+ input.appbar-search {
12218
+ flex: 1;
12219
+ max-width: 32rem;
12220
+ padding: 0.5rem 1rem;
12221
+ font-size: 0.875rem;
12222
+ color: var(--color-on-surface);
12223
+ background-color: var(--color-surface-container);
12224
+ border: none;
12225
+ border-radius: 9999px;
12226
+ transition: background-color 150ms ease-in-out;
11582
12227
  }
11583
12228
 
11584
- .appbar-lg {
11585
- min-height: 5rem;
11586
- padding: 0 1.5rem;
12229
+ .appbar .appbar-search:focus,
12230
+ input.appbar-search:focus {
12231
+ outline: none;
12232
+ background-color: var(--color-surface-container-high);
11587
12233
  }
11588
12234
 
11589
- .appbar-lg .appbar-title {
11590
- font-size: 1.5rem;
12235
+ .appbar .appbar-search::placeholder,
12236
+ input.appbar-search::placeholder {
12237
+ color: var(--color-on-surface-variant);
11591
12238
  }
11592
12239
 
11593
12240
  /* Color Variants */
@@ -11628,10 +12275,53 @@ html {
11628
12275
  color: var(--color-on-secondary-container);
11629
12276
  }
11630
12277
 
12278
+ .appbar-secondary .appbar-subtitle {
12279
+ color: var(--color-on-secondary);
12280
+ opacity: 0.8;
12281
+ }
12282
+
12283
+ .appbar-tertiary {
12284
+ background-color: var(--color-tertiary);
12285
+ color: var(--color-on-tertiary);
12286
+ }
12287
+
12288
+ .appbar-tertiary .appbar-nav,
12289
+ .appbar-tertiary .appbar-action {
12290
+ color: var(--color-on-tertiary);
12291
+ }
12292
+
12293
+ .appbar-tertiary .appbar-nav:hover,
12294
+ .appbar-tertiary .appbar-action:hover {
12295
+ background-color: var(--color-tertiary-container);
12296
+ color: var(--color-on-tertiary-container);
12297
+ }
12298
+
12299
+ .appbar-tertiary .appbar-subtitle {
12300
+ color: var(--color-on-tertiary);
12301
+ opacity: 0.8;
12302
+ }
12303
+
12304
+ /* Surface Variants */
11631
12305
  .appbar-surface {
12306
+ background-color: var(--color-surface);
12307
+ }
12308
+
12309
+ .appbar-surface-container {
11632
12310
  background-color: var(--color-surface-container);
11633
12311
  }
11634
12312
 
12313
+ .appbar-surface-container-low {
12314
+ background-color: var(--color-surface-container-low);
12315
+ }
12316
+
12317
+ .appbar-surface-container-high {
12318
+ background-color: var(--color-surface-container-high);
12319
+ }
12320
+
12321
+ .appbar-surface-container-highest {
12322
+ background-color: var(--color-surface-container-highest);
12323
+ }
12324
+
11635
12325
  /* Center Title */
11636
12326
  .appbar-center {
11637
12327
  justify-content: space-between;
@@ -14047,6 +14737,72 @@ html {
14047
14737
  transform: scale(1);
14048
14738
  }
14049
14739
 
14740
+ /* Direct popover structure (without .popover-content wrapper) */
14741
+ .popover.popover-show,
14742
+ .popover.show {
14743
+ opacity: 1;
14744
+ visibility: visible;
14745
+ }
14746
+
14747
+ /* Popover as direct overlay (simpler structure) */
14748
+ .popover[class*="popover-top"],
14749
+ .popover[class*="popover-bottom"],
14750
+ .popover[class*="popover-left"],
14751
+ .popover[class*="popover-right"] {
14752
+ position: absolute;
14753
+ z-index: 1050;
14754
+ min-width: 12rem;
14755
+ max-width: 20rem;
14756
+ padding: 1rem;
14757
+ background-color: var(--color-surface);
14758
+ border: 1px solid var(--color-outline-variant);
14759
+ border-radius: 0.75rem;
14760
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
14761
+ opacity: 0;
14762
+ visibility: hidden;
14763
+ transition: opacity 150ms ease-out, visibility 150ms ease-out;
14764
+ }
14765
+
14766
+ .popover[class*="popover-top"].popover-show,
14767
+ .popover[class*="popover-bottom"].popover-show,
14768
+ .popover[class*="popover-left"].popover-show,
14769
+ .popover[class*="popover-right"].popover-show {
14770
+ opacity: 1;
14771
+ visibility: visible;
14772
+ }
14773
+
14774
+ /* Direct position: Top */
14775
+ .popover.popover-top:not(:has(.popover-content)) {
14776
+ bottom: 100%;
14777
+ left: 50%;
14778
+ transform: translateX(-50%);
14779
+ margin-bottom: 0.75rem;
14780
+ }
14781
+
14782
+ /* Direct position: Bottom */
14783
+ .popover.popover-bottom:not(:has(.popover-content)) {
14784
+ top: 100%;
14785
+ left: 50%;
14786
+ transform: translateX(-50%);
14787
+ margin-top: 0.75rem;
14788
+ }
14789
+
14790
+ /* Direct position: Left */
14791
+ .popover.popover-left:not(:has(.popover-content)) {
14792
+ right: 100%;
14793
+ top: 50%;
14794
+ transform: translateY(-50%);
14795
+ margin-right: 0.75rem;
14796
+ }
14797
+
14798
+ /* Direct position: Right */
14799
+ .popover.popover-right:not(:has(.popover-content)) {
14800
+ left: 100%;
14801
+ top: 50%;
14802
+ transform: translateY(-50%);
14803
+ margin-left: 0.75rem;
14804
+ }
14805
+
14050
14806
  /* Popover Arrow */
14051
14807
  .popover-arrow {
14052
14808
  position: absolute;
@@ -14223,12 +14979,33 @@ html {
14223
14979
  }
14224
14980
 
14225
14981
  /* Color Variants */
14982
+ /*
14983
+ * Color intensity for themed popovers.
14984
+ * Override this variable to adjust how strongly colors appear:
14985
+ * - 20% = subtle tint
14986
+ * - 30% = moderate (default)
14987
+ * - 40% = bold/prominent
14988
+ */
14989
+ .popover {
14990
+ --popover-color-intensity: 30%;
14991
+ }
14992
+
14993
+ /* Dark variant */
14226
14994
  .popover-dark .popover-content {
14227
14995
  background-color: var(--color-on-surface);
14228
14996
  color: var(--color-surface);
14229
14997
  border-color: transparent;
14230
14998
  }
14231
14999
 
15000
+ .popover-dark[class*="popover-top"],
15001
+ .popover-dark[class*="popover-bottom"],
15002
+ .popover-dark[class*="popover-left"],
15003
+ .popover-dark[class*="popover-right"] {
15004
+ background-color: var(--color-on-surface);
15005
+ color: var(--color-surface);
15006
+ border-color: transparent;
15007
+ }
15008
+
14232
15009
  .popover-dark .popover-arrow {
14233
15010
  background-color: var(--color-on-surface);
14234
15011
  border-color: transparent;
@@ -14243,16 +15020,106 @@ html {
14243
15020
  opacity: 0.9;
14244
15021
  }
14245
15022
 
15023
+ /* Primary variant */
14246
15024
  .popover-primary .popover-content {
14247
- background-color: var(--color-primary-container);
15025
+ background-color: color-mix(in oklch, var(--color-primary) var(--popover-color-intensity), var(--color-surface));
15026
+ border-color: var(--color-primary);
15027
+ }
15028
+
15029
+ .popover-primary[class*="popover-top"],
15030
+ .popover-primary[class*="popover-bottom"],
15031
+ .popover-primary[class*="popover-left"],
15032
+ .popover-primary[class*="popover-right"] {
15033
+ background-color: color-mix(in oklch, var(--color-primary) var(--popover-color-intensity), var(--color-surface));
14248
15034
  border-color: var(--color-primary);
14249
15035
  }
14250
15036
 
14251
15037
  .popover-primary .popover-arrow {
14252
- background-color: var(--color-primary-container);
15038
+ background-color: color-mix(in oklch, var(--color-primary) var(--popover-color-intensity), var(--color-surface));
14253
15039
  border-color: var(--color-primary);
14254
15040
  }
14255
15041
 
15042
+ .popover-primary .popover-body {
15043
+ color: var(--color-on-surface);
15044
+ }
15045
+
15046
+ .popover-primary .popover-title {
15047
+ color: var(--color-on-surface);
15048
+ }
15049
+
15050
+ /* Secondary variant */
15051
+ .popover-secondary .popover-content {
15052
+ background-color: color-mix(in oklch, var(--color-secondary) var(--popover-color-intensity), var(--color-surface));
15053
+ border-color: var(--color-secondary);
15054
+ }
15055
+
15056
+ .popover-secondary[class*="popover-top"],
15057
+ .popover-secondary[class*="popover-bottom"],
15058
+ .popover-secondary[class*="popover-left"],
15059
+ .popover-secondary[class*="popover-right"] {
15060
+ background-color: color-mix(in oklch, var(--color-secondary) var(--popover-color-intensity), var(--color-surface));
15061
+ border-color: var(--color-secondary);
15062
+ }
15063
+
15064
+ .popover-secondary .popover-arrow {
15065
+ background-color: color-mix(in oklch, var(--color-secondary) var(--popover-color-intensity), var(--color-surface));
15066
+ border-color: var(--color-secondary);
15067
+ }
15068
+
15069
+ .popover-secondary .popover-body {
15070
+ color: var(--color-on-surface);
15071
+ }
15072
+
15073
+ .popover-secondary .popover-title {
15074
+ color: var(--color-on-surface);
15075
+ }
15076
+
15077
+ /* Tertiary variant */
15078
+ .popover-tertiary .popover-content {
15079
+ background-color: color-mix(in oklch, var(--color-tertiary) var(--popover-color-intensity), var(--color-surface));
15080
+ border-color: var(--color-tertiary);
15081
+ }
15082
+
15083
+ .popover-tertiary[class*="popover-top"],
15084
+ .popover-tertiary[class*="popover-bottom"],
15085
+ .popover-tertiary[class*="popover-left"],
15086
+ .popover-tertiary[class*="popover-right"] {
15087
+ background-color: color-mix(in oklch, var(--color-tertiary) var(--popover-color-intensity), var(--color-surface));
15088
+ border-color: var(--color-tertiary);
15089
+ }
15090
+
15091
+ .popover-tertiary .popover-arrow {
15092
+ background-color: color-mix(in oklch, var(--color-tertiary) var(--popover-color-intensity), var(--color-surface));
15093
+ border-color: var(--color-tertiary);
15094
+ }
15095
+
15096
+ .popover-tertiary .popover-body {
15097
+ color: var(--color-on-surface);
15098
+ }
15099
+
15100
+ .popover-tertiary .popover-title {
15101
+ color: var(--color-on-surface);
15102
+ }
15103
+
15104
+ /* Surface highest variant */
15105
+ .popover-surface-highest .popover-content {
15106
+ background-color: var(--color-surface-container-highest);
15107
+ border-color: var(--color-outline-variant);
15108
+ }
15109
+
15110
+ .popover-surface-highest[class*="popover-top"],
15111
+ .popover-surface-highest[class*="popover-bottom"],
15112
+ .popover-surface-highest[class*="popover-left"],
15113
+ .popover-surface-highest[class*="popover-right"] {
15114
+ background-color: var(--color-surface-container-highest);
15115
+ border-color: var(--color-outline-variant);
15116
+ }
15117
+
15118
+ .popover-surface-highest .popover-arrow {
15119
+ background-color: var(--color-surface-container-highest);
15120
+ border-color: var(--color-outline-variant);
15121
+ }
15122
+
14256
15123
  /* Hover Trigger */
14257
15124
  .popover-hover:hover .popover-content,
14258
15125
  .popover-hover:focus-within .popover-content {
@@ -14327,11 +15194,160 @@ html {
14327
15194
  justify-content: center;
14328
15195
  }
14329
15196
 
15197
+ /* ========================================
15198
+ * HTML Popover API Support
15199
+ * Uses native [popover] attribute with :popover-open pseudo-class
15200
+ * ======================================== */
15201
+
15202
+ /* Native popover base styles */
15203
+ .popover[popover] {
15204
+ position: fixed;
15205
+ inset: unset;
15206
+ z-index: 1050;
15207
+ min-width: 12rem;
15208
+ max-width: 20rem;
15209
+ padding: 1rem;
15210
+ margin: 0;
15211
+ background-color: var(--color-surface);
15212
+ border: 1px solid var(--color-outline-variant);
15213
+ border-radius: 0.75rem;
15214
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
15215
+ opacity: 0;
15216
+ transform: scale(0.95);
15217
+ transition: opacity 150ms ease-out, transform 150ms ease-out, overlay 150ms ease-out allow-discrete, display 150ms ease-out allow-discrete;
15218
+ }
15219
+
15220
+ /* Popover open state */
15221
+ .popover[popover]:popover-open {
15222
+ opacity: 1;
15223
+ transform: scale(1);
15224
+ }
15225
+
15226
+ /* Starting state for entry animation */
15227
+ @starting-style {
15228
+ .popover[popover]:popover-open {
15229
+ opacity: 0;
15230
+ transform: scale(0.95);
15231
+ }
15232
+ }
15233
+
15234
+ /* Native popover backdrop */
15235
+ .popover[popover]::backdrop {
15236
+ background-color: rgb(0 0 0 / 0);
15237
+ transition: background-color 150ms ease-out, overlay 150ms ease-out allow-discrete, display 150ms ease-out allow-discrete;
15238
+ }
15239
+
15240
+ .popover[popover]:popover-open::backdrop {
15241
+ background-color: rgb(0 0 0 / 0.1);
15242
+ }
15243
+
15244
+ @starting-style {
15245
+ .popover[popover]:popover-open::backdrop {
15246
+ background-color: rgb(0 0 0 / 0);
15247
+ }
15248
+ }
15249
+
15250
+ /* Native popover with modal backdrop */
15251
+ .popover-modal[popover]::backdrop {
15252
+ background-color: rgb(0 0 0 / 0);
15253
+ transition: background-color 150ms ease-out, overlay 150ms ease-out allow-discrete, display 150ms ease-out allow-discrete;
15254
+ }
15255
+
15256
+ .popover-modal[popover]:popover-open::backdrop {
15257
+ background-color: rgb(0 0 0 / 0.3);
15258
+ }
15259
+
15260
+ @starting-style {
15261
+ .popover-modal[popover]:popover-open::backdrop {
15262
+ background-color: rgb(0 0 0 / 0);
15263
+ }
15264
+ }
15265
+
15266
+ /* Native popover color variants */
15267
+ .popover-primary[popover] {
15268
+ background-color: color-mix(in oklch, var(--color-primary) var(--popover-color-intensity), var(--color-surface));
15269
+ border-color: var(--color-primary);
15270
+ }
15271
+
15272
+ .popover-primary[popover] .popover-body {
15273
+ color: var(--color-on-surface);
15274
+ }
15275
+
15276
+ .popover-primary[popover] .popover-title {
15277
+ color: var(--color-on-surface);
15278
+ }
15279
+
15280
+ .popover-secondary[popover] {
15281
+ background-color: color-mix(in oklch, var(--color-secondary) var(--popover-color-intensity), var(--color-surface));
15282
+ border-color: var(--color-secondary);
15283
+ }
15284
+
15285
+ .popover-secondary[popover] .popover-body {
15286
+ color: var(--color-on-surface);
15287
+ }
15288
+
15289
+ .popover-secondary[popover] .popover-title {
15290
+ color: var(--color-on-surface);
15291
+ }
15292
+
15293
+ .popover-tertiary[popover] {
15294
+ background-color: color-mix(in oklch, var(--color-tertiary) var(--popover-color-intensity), var(--color-surface));
15295
+ border-color: var(--color-tertiary);
15296
+ }
15297
+
15298
+ .popover-tertiary[popover] .popover-body {
15299
+ color: var(--color-on-surface);
15300
+ }
15301
+
15302
+ .popover-tertiary[popover] .popover-title {
15303
+ color: var(--color-on-surface);
15304
+ }
15305
+
15306
+ .popover-dark[popover] {
15307
+ background-color: var(--color-on-surface);
15308
+ border-color: transparent;
15309
+ }
15310
+
15311
+ .popover-dark[popover] .popover-body {
15312
+ color: var(--color-surface);
15313
+ opacity: 0.9;
15314
+ }
15315
+
15316
+ .popover-dark[popover] .popover-title {
15317
+ color: var(--color-surface);
15318
+ }
15319
+
15320
+ .popover-surface-highest[popover] {
15321
+ background-color: var(--color-surface-container-highest);
15322
+ border-color: var(--color-outline-variant);
15323
+ }
15324
+
15325
+ /* Native popover size variants */
15326
+ .popover-sm[popover] {
15327
+ min-width: 8rem;
15328
+ max-width: 14rem;
15329
+ padding: 0.75rem;
15330
+ }
15331
+
15332
+ .popover-lg[popover] {
15333
+ min-width: 16rem;
15334
+ max-width: 28rem;
15335
+ padding: 1.25rem;
15336
+ }
15337
+
15338
+ .popover-full[popover] {
15339
+ min-width: 0;
15340
+ max-width: none;
15341
+ width: max-content;
15342
+ }
15343
+
14330
15344
  /* Reduce Motion */
14331
15345
  @media (prefers-reduced-motion: reduce) {
14332
15346
  .popover-content,
14333
15347
  .popover-close,
14334
- .popover-menu-item {
15348
+ .popover-menu-item,
15349
+ .popover[popover],
15350
+ .popover[popover]::backdrop {
14335
15351
  transition: none;
14336
15352
  }
14337
15353
  }