@wpmoo/ui 1.0.0-rc.9 → 1.1.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/ASSET_LICENSE.md +1 -1
  2. package/LICENSE +28 -0
  3. package/README.md +38 -3
  4. package/certification.json +3 -1
  5. package/dist/assets/css/moo-ui.css +436 -25
  6. package/dist/assets/css/moo-ui.min.css +10 -31
  7. package/dist/assets/css/moo.css +428 -24
  8. package/dist/assets/css/moo.min.css +10 -32
  9. package/dist/js/chart.js +23 -21
  10. package/dist/js/chart.min.js +5 -5
  11. package/dist/js/combobox.js +18 -65
  12. package/dist/js/context-menu.js +16 -68
  13. package/dist/js/datatable.js +38 -21
  14. package/dist/js/datepicker.js +5 -4
  15. package/dist/js/datepicker.min.js +4 -3
  16. package/dist/js/moo-ui.js +350 -15402
  17. package/dist/js/moo-ui.min.js +3 -23
  18. package/dist/js/sheet.js +46 -0
  19. package/dist/js/sidebar.js +3 -2
  20. package/dist/js/slider.js +12 -47
  21. package/dist/js/state.js +15 -41
  22. package/dist/js/table-of-contents.js +195 -0
  23. package/dist/release-manifest.json +4 -4
  24. package/package.json +5 -1
  25. package/scss/_components.scss +3 -2
  26. package/scss/_config.scss +15 -21
  27. package/scss/_settings.scss +0 -3
  28. package/scss/components/_accordion.scss +1 -12
  29. package/scss/components/_alert.scss +1 -12
  30. package/scss/components/_avatar.scss +1 -16
  31. package/scss/components/_badge.scss +1 -0
  32. package/scss/components/_breadcrumb.scss +1 -12
  33. package/scss/components/_button.scss +1 -29
  34. package/scss/components/_button_group.scss +1 -25
  35. package/scss/components/_card.scss +1 -29
  36. package/scss/components/_checkbox.scss +1 -38
  37. package/scss/components/_close_button.scss +1 -9
  38. package/scss/components/_collapsible.scss +1 -0
  39. package/scss/components/_combobox.scss +1 -6
  40. package/scss/components/_context-menu.scss +1 -11
  41. package/scss/components/_datatable.scss +46 -85
  42. package/scss/components/_datepicker.scss +1 -0
  43. package/scss/components/_dialog.scss +1 -14
  44. package/scss/components/_dropdown.scss +5 -51
  45. package/scss/components/_field.scss +1 -40
  46. package/scss/components/_input.scss +1 -5
  47. package/scss/components/_input_group.scss +1 -51
  48. package/scss/components/_kbd.scss +1 -0
  49. package/scss/components/_menubar.scss +1 -0
  50. package/scss/components/_navigation.scss +76 -6
  51. package/scss/components/_pagination.scss +1 -13
  52. package/scss/components/_popover.scss +1 -22
  53. package/scss/components/_progress.scss +1 -3
  54. package/scss/components/_radio_group.scss +105 -6
  55. package/scss/components/_search_trigger.scss +1 -2
  56. package/scss/components/_select.scss +1 -0
  57. package/scss/components/_separator.scss +1 -6
  58. package/scss/components/_sheet.scss +1 -17
  59. package/scss/components/_sidebar.scss +1 -2
  60. package/scss/components/_skeleton.scss +1 -8
  61. package/scss/components/_slider.scss +1 -2
  62. package/scss/components/_spinner.scss +1 -7
  63. package/scss/components/_switch.scss +1 -4
  64. package/scss/components/_table.scss +1 -2
  65. package/scss/components/_tabs.scss +1 -24
  66. package/scss/components/_textarea.scss +1 -0
  67. package/scss/components/_toast.scss +1 -4
  68. package/scss/components/_toc.scss +48 -0
  69. package/scss/components/_toggle_group.scss +1 -3
  70. package/scss/components/_tooltip.scss +1 -20
  71. package/scss/components/sidebar/_base.scss +0 -7
  72. package/scss/components/sidebar/_collapsed.scss +0 -6
  73. package/scss/components/sidebar/_identity.scss +0 -1
  74. package/scss/components/sidebar/_menus.scss +0 -17
  75. package/scss/foundations/_backdrop.scss +0 -26
  76. package/scss/foundations/_focus.scss +0 -56
  77. package/scss/foundations/_scope.scss +15 -0
  78. package/scss/layouts/_app.scss +0 -6
  79. package/scss/layouts/_page_grid.scss +0 -3
  80. package/scss/layouts/app/sidebar/_base.scss +0 -37
  81. package/scss/layouts/app/sidebar/_default.scss +0 -6
  82. package/scss/layouts/app/sidebar/_floating.scss +0 -11
  83. package/scss/layouts/app/sidebar/_inset.scss +0 -2
  84. package/scss/mixins/_banner.scss +9 -3
  85. package/scss/moo-core.scss +3 -6
  86. package/scss/moo-ui.scss +9 -5
  87. package/scss/settings/_bootstrap_overrides.scss +0 -8
  88. package/scss/settings/_component_variables.scss +4 -266
  89. package/scss/settings/_forms.scss +0 -37
  90. package/scss/settings/_palette.scss +0 -42
  91. package/scss/themes/_root.scss +3 -0
  92. package/scss/themes/_standalone.scss +0 -2
  93. package/scss/themes/_theme.scss +3 -2
  94. package/scss/utilities/_background_color.scss +18 -0
  95. package/scss/utilities/_border.scss +4 -0
  96. package/scss/utilities/_scroll_smooth.scss +9 -0
@@ -1,9 +1,14 @@
1
1
  /*!
2
- * Moo UI core
3
- * Copyright (c) 2026 WPMoo (wpmoo.org)
4
- * Includes Bootstrap 5.3.3 component output
5
- * SPDX-License-Identifier: MIT
2
+ * Moo UI v1.1.0-dev.1 (https://wpmoo.org/)
3
+ * Copyright 2026 WPMoo Authors
4
+ * Licensed under MIT (https://github.com/wpmoo-org/ui/blob/main/LICENSE)
5
+ *
6
+ * Bootstrap v5.3.3 (https://getbootstrap.com/)
7
+ * Copyright 2011-2024 The Bootstrap Authors
8
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6
9
  */
10
+
11
+ /* Global styles */
7
12
  @property --moo-scroll-fade-t {
8
13
  syntax: "<length-percentage>";
9
14
  inherits: false;
@@ -149,6 +154,7 @@
149
154
  }
150
155
  }
151
156
 
157
+ /* Theme tokens */
152
158
  .moo-ui[data-bs-theme] {
153
159
  --bs-blue: #0d6efd;
154
160
  --bs-indigo: #6610f2;
@@ -230,7 +236,13 @@
230
236
  --moo-chart-4: #3f3f46;
231
237
  --moo-chart-5: #27272a;
232
238
  --moo-heading-font-family: var(--bs-body-font-family);
239
+ --moo-small-font-size: 0.75rem;
240
+ --moo-paragraph-margin-top: 0;
241
+ --moo-paragraph-margin-bottom: 1rem;
233
242
  font-family: var(--bs-body-font-family);
243
+ font-size: var(--bs-body-font-size);
244
+ font-weight: var(--bs-body-font-weight);
245
+ line-height: var(--bs-body-line-height);
234
246
  }
235
247
 
236
248
  .moo-ui[data-bs-theme="light"] {
@@ -408,6 +420,8 @@
408
420
  }
409
421
 
410
422
  @scope (.moo-ui) to (:where(.moo-ui[data-bs-theme="light"], .moo-ui[data-bs-theme="dark"])) {
423
+
424
+ /* Bootstrap Components */
411
425
  .table {
412
426
  --bs-table-color-type: initial;
413
427
  --bs-table-bg-type: initial;
@@ -3059,6 +3073,7 @@
3059
3073
  border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;
3060
3074
  border-top-color: var(--bs-tooltip-bg);
3061
3075
  }
3076
+
3062
3077
  /* rtl:begin:ignore */
3063
3078
  .bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow {
3064
3079
  left: calc(-1 * var(--bs-tooltip-arrow-height));
@@ -3070,6 +3085,7 @@
3070
3085
  border-width: calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;
3071
3086
  border-right-color: var(--bs-tooltip-bg);
3072
3087
  }
3088
+
3073
3089
  /* rtl:end:ignore */
3074
3090
  .bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow {
3075
3091
  top: calc(-1 * var(--bs-tooltip-arrow-height));
@@ -3079,6 +3095,7 @@
3079
3095
  border-width: 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);
3080
3096
  border-bottom-color: var(--bs-tooltip-bg);
3081
3097
  }
3098
+
3082
3099
  /* rtl:begin:ignore */
3083
3100
  .bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow {
3084
3101
  right: calc(-1 * var(--bs-tooltip-arrow-height));
@@ -3090,6 +3107,7 @@
3090
3107
  border-width: calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);
3091
3108
  border-left-color: var(--bs-tooltip-bg);
3092
3109
  }
3110
+
3093
3111
  /* rtl:end:ignore */
3094
3112
  .tooltip-inner {
3095
3113
  max-width: var(--bs-tooltip-max-width);
@@ -3176,6 +3194,7 @@
3176
3194
  bottom: var(--bs-popover-border-width);
3177
3195
  border-top-color: var(--bs-popover-bg);
3178
3196
  }
3197
+
3179
3198
  /* rtl:begin:ignore */
3180
3199
  .bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow {
3181
3200
  left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
@@ -3193,6 +3212,7 @@
3193
3212
  left: var(--bs-popover-border-width);
3194
3213
  border-right-color: var(--bs-popover-bg);
3195
3214
  }
3215
+
3196
3216
  /* rtl:end:ignore */
3197
3217
  .bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow {
3198
3218
  top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
@@ -3218,6 +3238,7 @@
3218
3238
  content: "";
3219
3239
  border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);
3220
3240
  }
3241
+
3221
3242
  /* rtl:begin:ignore */
3222
3243
  .bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow {
3223
3244
  right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
@@ -3235,6 +3256,7 @@
3235
3256
  right: var(--bs-popover-border-width);
3236
3257
  border-left-color: var(--bs-popover-bg);
3237
3258
  }
3259
+
3238
3260
  /* rtl:end:ignore */
3239
3261
  .popover-header {
3240
3262
  padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);
@@ -3773,6 +3795,10 @@
3773
3795
  color: #fff !important;
3774
3796
  background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;
3775
3797
  }
3798
+
3799
+ /* Moo Components */
3800
+
3801
+ /* Keyboard keys */
3776
3802
  kbd {
3777
3803
  display: inline-flex;
3778
3804
  height: 1.25rem;
@@ -3783,6 +3809,8 @@
3783
3809
  line-height: 1rem;
3784
3810
  font-weight: 500;
3785
3811
  }
3812
+
3813
+ /* Input */
3786
3814
  .form-control {
3787
3815
  min-height: 2rem;
3788
3816
  }
@@ -3808,17 +3836,23 @@
3808
3836
  .form-select:disabled {
3809
3837
  opacity: var(--moo-disabled-control-opacity);
3810
3838
  }
3839
+
3840
+ /* Textarea */
3811
3841
  textarea.form-control:not(.form-control-sm, .form-control-lg) {
3812
3842
  padding: 0.5rem 0.75rem;
3813
3843
  }
3814
3844
  textarea.form-control:disabled {
3815
3845
  resize: none;
3816
3846
  }
3847
+
3848
+ /* Select */
3817
3849
  .form-select option,
3818
3850
  .form-select optgroup {
3819
3851
  color: var(--bs-body-color);
3820
3852
  background-color: var(--bs-body-bg);
3821
3853
  }
3854
+
3855
+ /* Input Group */
3822
3856
  .input-group:not(:has(> .form-control[type="file"])) {
3823
3857
  border: var(--bs-border-width) solid var(--moo-border);
3824
3858
  border-radius: var(--moo-input-group-border-radius);
@@ -3939,6 +3973,8 @@
3939
3973
  outline: 0;
3940
3974
  box-shadow: none;
3941
3975
  }
3976
+
3977
+ /* Buttons */
3942
3978
  .btn {
3943
3979
  display: inline-flex;
3944
3980
  align-items: center;
@@ -4113,6 +4149,8 @@ label.btn {
4113
4149
  --bs-btn-hover-color: var(--moo-muted-foreground);
4114
4150
  text-underline-offset: 0.25rem;
4115
4151
  }
4152
+
4153
+ /* Search Trigger */
4116
4154
  .search-trigger {
4117
4155
  width: 10rem;
4118
4156
  max-width: 100%;
@@ -4167,6 +4205,8 @@ label.btn {
4167
4205
  flex-basis: 16rem;
4168
4206
  }
4169
4207
  }
4208
+
4209
+ /* Close Button */
4170
4210
  .btn-close {
4171
4211
  --bs-btn-close-color: var(--moo-foreground);
4172
4212
  --bs-btn-hover-color: var(--bs-btn-close-color);
@@ -4215,6 +4255,8 @@ label.btn {
4215
4255
  pointer-events: none;
4216
4256
  opacity: var(--moo-disabled-control-opacity);
4217
4257
  }
4258
+
4259
+ /* Button Group */
4218
4260
  [dir="rtl"] .btn-group,
4219
4261
  [dir="rtl"] .btn-toolbar {
4220
4262
  direction: ltr;
@@ -4264,6 +4306,8 @@ label.btn {
4264
4306
  min-width: calc(1.875rem + 1rem);
4265
4307
  padding-inline-end: 1.875rem;
4266
4308
  }
4309
+
4310
+ /* Toggle Group */
4267
4311
  .toggle-group > .btn:not(:disabled):not(.disabled):not([aria-disabled="true"]):active {
4268
4312
  transform: none;
4269
4313
  }
@@ -4278,6 +4322,8 @@ label.btn {
4278
4322
  outline: 0;
4279
4323
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--moo-ring) 50%, transparent);
4280
4324
  }
4325
+
4326
+ /* Card */
4281
4327
  .card {
4282
4328
  --bs-card-bg: color-mix(in srgb, var(--bs-secondary-bg) 5%, var(--bs-body-bg));
4283
4329
  --bs-card-color: var(--moo-foreground);
@@ -4373,6 +4419,8 @@ label.btn {
4373
4419
  font-size: 0.875rem;
4374
4420
  color: var(--moo-muted-foreground);
4375
4421
  }
4422
+
4423
+ /* Table */
4376
4424
  .card .table {
4377
4425
  --bs-table-bg: transparent;
4378
4426
  }
@@ -4382,6 +4430,8 @@ label.btn {
4382
4430
  .table-row-actions:has(> [aria-expanded="true"]) {
4383
4431
  z-index: 1000;
4384
4432
  }
4433
+
4434
+ /* Dropdown */
4385
4435
  .dropdown-menu {
4386
4436
  --bs-dropdown-bg: var(--moo-surface);
4387
4437
  --bs-dropdown-border-color: var(--moo-border);
@@ -4406,6 +4456,9 @@ label.btn {
4406
4456
  color: var(--bs-dropdown-link-color);
4407
4457
  background-color: transparent;
4408
4458
  }
4459
+ .dropdown-menu:has(.dropdown-item:hover) .dropdown-item.active:not(:hover) {
4460
+ background-color: transparent;
4461
+ }
4409
4462
  .dropdown-item > [data-icon] {
4410
4463
  width: 1rem;
4411
4464
  height: 1rem;
@@ -4545,6 +4598,8 @@ label.btn {
4545
4598
  inset-block-end: var(--moo-sidebar-dropdown-block-end) !important;
4546
4599
  }
4547
4600
  }
4601
+
4602
+ /* Menubar */
4548
4603
  .menubar {
4549
4604
  gap: 0.125rem;
4550
4605
  padding: 0.1875rem;
@@ -4558,6 +4613,8 @@ label.btn {
4558
4613
  color: var(--bs-btn-color);
4559
4614
  font-weight: 500;
4560
4615
  }
4616
+
4617
+ /* Avatar */
4561
4618
  .avatar {
4562
4619
  position: relative;
4563
4620
  display: inline-flex;
@@ -4680,10 +4737,19 @@ label.btn {
4680
4737
  content: "+";
4681
4738
  margin-inline-end: -0.1rem;
4682
4739
  }
4740
+
4741
+ /* Navigation */
4683
4742
  .nav {
4684
4743
  --bs-nav-link-color: var(--moo-foreground);
4685
4744
  --bs-nav-link-hover-color: var(--moo-foreground);
4686
4745
  --bs-nav-link-disabled-color: var(--moo-disabled-foreground);
4746
+ --bs-nav-link-description-color: color-mix(in srgb, var(--moo-muted-foreground) 95%, var(--moo-foreground));
4747
+ }
4748
+ .nav-link-description {
4749
+ color: var(--bs-nav-link-description-color);
4750
+ }
4751
+ .nav-link.disabled .nav-link-description {
4752
+ color: var(--bs-nav-link-disabled-color);
4687
4753
  }
4688
4754
  .nav-pills {
4689
4755
  --bs-nav-pills-border-radius: var(--bs-border-radius);
@@ -4709,6 +4775,105 @@ label.btn {
4709
4775
  height: 1rem;
4710
4776
  flex: 0 0 auto;
4711
4777
  }
4778
+ .nav-link-icon {
4779
+ display: inline-flex;
4780
+ align-items: center;
4781
+ flex: 0 0 auto;
4782
+ }
4783
+ .nav-steps {
4784
+ --bs-nav-step-icon-size: 2rem;
4785
+ --bs-nav-step-gap: 0.25rem;
4786
+ gap: var(--bs-nav-step-gap);
4787
+ }
4788
+ .nav-steps .nav-item {
4789
+ position: relative;
4790
+ }
4791
+ .nav-steps .nav-item:not(:only-child)::before {
4792
+ position: absolute;
4793
+ z-index: 1;
4794
+ inset-inline-start: calc(var(--bs-nav-link-padding-x) + var(--bs-nav-step-icon-size) / 2);
4795
+ inset-block: calc(var(--bs-nav-step-gap) / -2);
4796
+ border-inline-start: var(--bs-border-width) solid var(--bs-border-color);
4797
+ content: "";
4798
+ pointer-events: none;
4799
+ }
4800
+ .nav-steps .nav-item:first-child::before {
4801
+ inset-block-start: 50%;
4802
+ }
4803
+ .nav-steps .nav-item:last-child::before {
4804
+ inset-block-end: 50%;
4805
+ }
4806
+ .nav-steps .nav-link-icon {
4807
+ position: relative;
4808
+ z-index: 2;
4809
+ display: inline-flex;
4810
+ align-items: center;
4811
+ justify-content: center;
4812
+ flex: 0 0 var(--bs-nav-step-icon-size);
4813
+ inline-size: var(--bs-nav-step-icon-size);
4814
+ block-size: var(--bs-nav-step-icon-size);
4815
+ color: var(--moo-foreground);
4816
+ background-color: var(--moo-muted-surface);
4817
+ border: var(--bs-border-width) solid var(--bs-border-color);
4818
+ border-radius: var(--bs-border-radius);
4819
+ }
4820
+ .nav-steps .nav-link.disabled .nav-link-icon {
4821
+ color: var(--moo-disabled-foreground);
4822
+ }
4823
+ .nav-steps .nav-item[data-nav-completed="true"] .nav-link-icon {
4824
+ color: var(--moo-primary-foreground);
4825
+ background-color: var(--moo-primary);
4826
+ border-color: var(--moo-primary);
4827
+ }
4828
+
4829
+ /* Table of contents */
4830
+ [data-toc] > .fw-semibold {
4831
+ padding-inline-start: calc(0.75rem - var(--bs-border-width));
4832
+ }
4833
+ [data-toc]:has(> .nav) {
4834
+ position: relative;
4835
+ border-inline-start: calc(var(--bs-border-width) * 0.5) solid var(--bs-border-color);
4836
+ }
4837
+ [data-toc][data-toc-marker]::after {
4838
+ content: "";
4839
+ position: absolute;
4840
+ inset-block-start: 0;
4841
+ inset-inline-start: calc(var(--bs-border-width) * -1);
4842
+ block-size: var(--moo-toc-marker-height);
4843
+ border-inline-start: calc(var(--bs-border-width) * 3) solid var(--moo-primary);
4844
+ transform: translateY(var(--moo-toc-marker-offset));
4845
+ pointer-events: none;
4846
+ transition: all 0.2s ease-in-out;
4847
+ }
4848
+ @media (prefers-reduced-motion: reduce) {
4849
+ [data-toc][data-toc-marker]::after {
4850
+ transition: none;
4851
+ }
4852
+ }
4853
+ [data-toc] > .nav .nav-link {
4854
+ display: flex;
4855
+ position: relative;
4856
+ margin-inline-start: calc(var(--bs-border-width) * -1);
4857
+ color: var(--moo-muted-foreground);
4858
+ }
4859
+ [data-toc] > .nav .nav-link::before {
4860
+ content: "";
4861
+ position: absolute;
4862
+ inset-block: var(--bs-nav-link-padding-y);
4863
+ inset-inline-start: 0;
4864
+ border-inline-start: calc(var(--bs-border-width) * 3) solid transparent;
4865
+ }
4866
+ [data-toc] > .nav .nav-link.active {
4867
+ color: var(--moo-foreground);
4868
+ }
4869
+ [data-toc] > .nav .nav-link.active::before {
4870
+ border-inline-start-color: var(--moo-primary);
4871
+ }
4872
+ [data-toc][data-toc-marker] > .nav .nav-link.active::before {
4873
+ border-inline-start-color: transparent;
4874
+ }
4875
+
4876
+ /* Skeleton */
4712
4877
  .skeleton {
4713
4878
  color: var(--moo-border);
4714
4879
  border-radius: var(--bs-border-radius);
@@ -4717,6 +4882,8 @@ label.btn {
4717
4882
  .skeleton > .placeholder {
4718
4883
  display: block;
4719
4884
  }
4885
+
4886
+ /* Sidebar */
4720
4887
  .sidebar-inner {
4721
4888
  position: sticky;
4722
4889
  top: 0;
@@ -5126,6 +5293,8 @@ label.btn {
5126
5293
  display: none;
5127
5294
  }
5128
5295
  }
5296
+
5297
+ /* Alert */
5129
5298
  .alert {
5130
5299
  --bs-alert-border-color: var(--moo-border);
5131
5300
  --bs-alert-color: var(--moo-foreground);
@@ -5192,6 +5361,8 @@ label.btn {
5192
5361
  .alert-action {
5193
5362
  flex: 0 0 auto;
5194
5363
  }
5364
+
5365
+ /* Breadcrumb */
5195
5366
  .breadcrumb {
5196
5367
  --bs-breadcrumb-item-active-color: var(--moo-foreground);
5197
5368
  --bs-breadcrumb-item-padding-x: 0.375rem;
@@ -5291,6 +5462,8 @@ label.btn {
5291
5462
  width: 0.875rem;
5292
5463
  height: 0.875rem;
5293
5464
  }
5465
+
5466
+ /* Pagination */
5294
5467
  .page-link {
5295
5468
  display: inline-flex;
5296
5469
  align-items: center;
@@ -5336,6 +5509,8 @@ label.btn {
5336
5509
  .page-item.disabled {
5337
5510
  opacity: var(--moo-disabled-control-opacity);
5338
5511
  }
5512
+
5513
+ /* Badge */
5339
5514
  .badge {
5340
5515
  display: inline-flex;
5341
5516
  height: 1.25rem;
@@ -5364,10 +5539,14 @@ label.btn {
5364
5539
  .badge[class~="text-body-secondary"] {
5365
5540
  color: var(--moo-foreground) !important;
5366
5541
  }
5542
+
5543
+ /* Progress */
5367
5544
  .progress {
5368
5545
  --bs-progress-bar-color: var(--moo-primary-foreground);
5369
5546
  --bs-progress-bar-bg: var(--moo-primary);
5370
5547
  }
5548
+
5549
+ /* Slider */
5371
5550
  .slider {
5372
5551
  display: grid;
5373
5552
  gap: 0.5rem;
@@ -5546,6 +5725,8 @@ label.btn {
5546
5725
  writing-mode: vertical-lr;
5547
5726
  direction: rtl;
5548
5727
  }
5728
+
5729
+ /* Separator */
5549
5730
  hr {
5550
5731
  opacity: 1;
5551
5732
  border-top: var(--bs-border-width) solid var(--moo-border);
@@ -5554,6 +5735,8 @@ label.btn {
5554
5735
  opacity: 1;
5555
5736
  background-color: var(--moo-border);
5556
5737
  }
5738
+
5739
+ /* Checkbox */
5557
5740
  .form-check-input {
5558
5741
  margin-top: 0.125rem;
5559
5742
  }
@@ -5617,9 +5800,100 @@ label.btn {
5617
5800
  border-color: var(--moo-primary);
5618
5801
  background-color: var(--moo-primary);
5619
5802
  }
5803
+
5804
+ /* Radio Group */
5620
5805
  .radio-group legend.form-label {
5621
5806
  font-size: inherit;
5622
5807
  }
5808
+ .form-check-card {
5809
+ position: relative;
5810
+ padding: 0;
5811
+ margin-bottom: 0;
5812
+ }
5813
+ .form-check-card + .form-check-card {
5814
+ margin-block-start: 0.5rem;
5815
+ }
5816
+ .form-check-card > .form-check-input:not(.visually-hidden) {
5817
+ position: absolute;
5818
+ inset-block-start: 0.75rem;
5819
+ inset-inline-end: 0.75rem;
5820
+ float: none;
5821
+ margin: 0;
5822
+ }
5823
+ .form-check-card > .form-check-label {
5824
+ display: flex;
5825
+ align-items: center;
5826
+ gap: 0.75rem;
5827
+ padding: 0.75rem;
5828
+ padding-inline-end: 2.5rem;
5829
+ border: var(--bs-border-width) solid var(--moo-border);
5830
+ border-radius: var(--bs-border-radius);
5831
+ color: var(--moo-foreground);
5832
+ cursor: pointer;
5833
+ }
5834
+ .form-check-card.form-check-card--no-control > .form-check-label {
5835
+ padding-inline-end: 0.75rem;
5836
+ }
5837
+ .form-check-card > .form-check-input:not(:disabled) ~ .form-check-label:hover,
5838
+ .form-check-card > .form-check-input:checked ~ .form-check-label {
5839
+ background-color: var(--moo-muted-surface);
5840
+ }
5841
+ .form-check-card > .form-check-input:checked ~ .form-check-label {
5842
+ border-color: var(--moo-foreground);
5843
+ }
5844
+ .form-check-card > .form-check-input:checked ~ .form-check-label .form-check-card-media {
5845
+ border-color: var(--moo-primary);
5846
+ background-color: var(--moo-primary);
5847
+ color: var(--moo-primary-foreground);
5848
+ }
5849
+ .form-check-card > .form-check-input:focus-visible ~ .form-check-label {
5850
+ border-color: var(--moo-ring);
5851
+ box-shadow: 0 0 0 var(--bs-focus-ring-width) color-mix(in srgb, var(--moo-ring) 50%, transparent);
5852
+ }
5853
+ .form-check-card > .form-check-input.is-invalid ~ .form-check-label {
5854
+ border-color: var(--bs-form-invalid-border-color);
5855
+ }
5856
+ .form-check-card > .form-check-input.is-invalid:focus-visible ~ .form-check-label {
5857
+ box-shadow: 0 0 0 var(--bs-focus-ring-width) var(--moo-form-invalid-ring-color);
5858
+ }
5859
+ .form-check-card-content {
5860
+ display: flex;
5861
+ flex-direction: column;
5862
+ gap: 0.25rem;
5863
+ min-width: 0;
5864
+ line-height: 1.25;
5865
+ overflow-wrap: anywhere;
5866
+ }
5867
+ .form-check-card-content > .form-text {
5868
+ margin: 0;
5869
+ font-size: 0.76562rem;
5870
+ line-height: inherit;
5871
+ color: color-mix(in srgb, var(--moo-muted-foreground) 95%, var(--moo-foreground));
5872
+ }
5873
+ .form-check-card-title {
5874
+ font-weight: 500;
5875
+ }
5876
+ .form-check-card-media {
5877
+ display: grid;
5878
+ place-items: center;
5879
+ flex: 0 0 auto;
5880
+ inline-size: 2.30078rem;
5881
+ aspect-ratio: 1;
5882
+ border: var(--bs-border-width) solid var(--moo-border);
5883
+ border-radius: var(--bs-border-radius-sm);
5884
+ background-color: var(--moo-muted-surface);
5885
+ color: var(--moo-foreground);
5886
+ }
5887
+ .form-check-card-media > span {
5888
+ font-size: 0.76562rem;
5889
+ font-weight: 600;
5890
+ }
5891
+ .form-check-card-media > [data-icon] {
5892
+ width: 0.875rem;
5893
+ height: 0.875rem;
5894
+ }
5895
+
5896
+ /* Switch */
5623
5897
  .form-switch .form-check-input {
5624
5898
  height: 1.15rem;
5625
5899
  }
@@ -5643,6 +5917,8 @@ label.btn {
5643
5917
  :scope[data-bs-theme="dark"] .form-switch .form-check-input:focus:not(:focus-visible):not(:checked) {
5644
5918
  --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e");
5645
5919
  }
5920
+
5921
+ /* Spinner */
5646
5922
  .spinner [data-icon] {
5647
5923
  width: 1rem;
5648
5924
  height: 1rem;
@@ -5652,6 +5928,8 @@ label.btn {
5652
5928
  width: 0.75rem;
5653
5929
  height: 0.75rem;
5654
5930
  }
5931
+
5932
+ /* Accordion */
5655
5933
  .accordion-button::after {
5656
5934
  content: none;
5657
5935
  }
@@ -5696,6 +5974,8 @@ label.btn {
5696
5974
  .card .accordion {
5697
5975
  --bs-accordion-bg: transparent;
5698
5976
  }
5977
+
5978
+ /* Tabs */
5699
5979
  .tabs-list {
5700
5980
  display: inline-flex;
5701
5981
  gap: 0.125rem;
@@ -5799,6 +6079,8 @@ label.btn {
5799
6079
  pointer-events: auto;
5800
6080
  transition-delay: 0s;
5801
6081
  }
6082
+
6083
+ /* Collapsible */
5802
6084
  .collapsible {
5803
6085
  display: flex;
5804
6086
  flex-direction: column;
@@ -5836,6 +6118,8 @@ label.btn {
5836
6118
  color: var(--moo-muted-foreground);
5837
6119
  width: 100%;
5838
6120
  }
6121
+
6122
+ /* Tooltip */
5839
6123
  .tooltip {
5840
6124
  --bs-tooltip-max-width: 20rem;
5841
6125
  --bs-tooltip-padding-x: 0.75rem;
@@ -5890,6 +6174,8 @@ label.btn {
5890
6174
  .tooltip-inner kbd {
5891
6175
  margin-inline-start: 0.25rem;
5892
6176
  }
6177
+
6178
+ /* Popover */
5893
6179
  .popover {
5894
6180
  --bs-popover-border-radius: var(--bs-border-radius-lg);
5895
6181
  --bs-popover-border-color: var(--moo-border);
@@ -5913,6 +6199,8 @@ label.btn {
5913
6199
  .popover .popover-arrow {
5914
6200
  display: none;
5915
6201
  }
6202
+
6203
+ /* Dialog */
5916
6204
  .modal {
5917
6205
  --bs-modal-border-radius: var(--bs-border-radius-xl);
5918
6206
  --bs-modal-border-color: var(--moo-border);
@@ -5967,6 +6255,8 @@ label.btn {
5967
6255
  .modal-footer {
5968
6256
  padding: 1rem;
5969
6257
  }
6258
+
6259
+ /* Sheet */
5970
6260
  .offcanvas.sheet {
5971
6261
  --bs-offcanvas-width: 24rem;
5972
6262
  --bs-offcanvas-border-color: var(--moo-border);
@@ -5980,6 +6270,8 @@ label.btn {
5980
6270
  font-size: 1rem;
5981
6271
  font-weight: 500;
5982
6272
  }
6273
+
6274
+ /* Toast */
5983
6275
  .toast {
5984
6276
  --bs-toast-border-radius: var(--bs-border-radius-lg);
5985
6277
  --bs-toast-border-color: var(--moo-border);
@@ -6071,6 +6363,8 @@ label.btn {
6071
6363
  transition: none;
6072
6364
  }
6073
6365
  }
6366
+
6367
+ /* Field */
6074
6368
  .field {
6075
6369
  display: flex;
6076
6370
  flex-direction: column;
@@ -6146,6 +6440,8 @@ label.btn {
6146
6440
  .field-fieldset + hr {
6147
6441
  opacity: 0.1;
6148
6442
  }
6443
+
6444
+ /* Date Picker */
6149
6445
  .moo-datepicker {
6150
6446
  --moo-datepicker-width: 17.5rem;
6151
6447
  --moo-datepicker-popover-offset: 0.375rem;
@@ -6345,6 +6641,8 @@ label.btn {
6345
6641
  .moo-calendar__preset {
6346
6642
  flex: 0 0 auto;
6347
6643
  }
6644
+
6645
+ /* Combobox */
6348
6646
  .combobox {
6349
6647
  --moo-combobox-width: 12.5rem;
6350
6648
  --moo-combobox-multiple-width: 20rem;
@@ -6560,6 +6858,8 @@ label.btn {
6560
6858
  color: var(--bs-secondary-color);
6561
6859
  text-align: center;
6562
6860
  }
6861
+
6862
+ /* Context Menu */
6563
6863
  .context-menu {
6564
6864
  position: relative;
6565
6865
  }
@@ -6574,6 +6874,8 @@ label.btn {
6574
6874
  ul.context-menu-menu:focus-visible {
6575
6875
  outline: 0;
6576
6876
  }
6877
+
6878
+ /* Data Table */
6577
6879
  .datatable {
6578
6880
  --moo-datatable-min-width: 48rem;
6579
6881
  --moo-datatable-actions-cell-bg: var(--bs-body-bg);
@@ -6595,15 +6897,88 @@ label.btn {
6595
6897
  table-layout: fixed;
6596
6898
  }
6597
6899
  .datatable--responsive-scroll .datatable-table,
6598
- .datatable--responsive-toggle .datatable-table {
6900
+ .datatable--responsive-toggle .datatable-table,
6901
+ .datatable--responsive-auto .datatable-table {
6599
6902
  min-width: var(--moo-datatable-min-width);
6600
6903
  }
6601
- .datatable--responsive-toggle[data-datatable-view="table"] .datatable-card-frame {
6904
+ .datatable--responsive-toggle[data-datatable-view="table"] .datatable-card-frame,
6905
+ .datatable--responsive-auto[data-datatable-view="table"] .datatable-card-frame {
6906
+ display: none;
6907
+ }
6908
+ .datatable--responsive-toggle[data-datatable-view="cards"] .datatable-frame,
6909
+ .datatable--responsive-auto[data-datatable-view="cards"] .datatable-frame {
6910
+ display: none;
6911
+ }
6912
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="sm"] {
6913
+ --moo-datatable-responsive-breakpoint: 576px;
6914
+ }
6915
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="sm"][data-datatable-view="auto"] .datatable-card-frame {
6916
+ display: none;
6917
+ }
6918
+ @media (max-width: 575.98px) {
6919
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="sm"][data-datatable-view="auto"] .datatable-frame {
6920
+ display: none;
6921
+ }
6922
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="sm"][data-datatable-view="auto"] .datatable-card-frame {
6923
+ display: block;
6924
+ }
6925
+ }
6926
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="md"] {
6927
+ --moo-datatable-responsive-breakpoint: 768px;
6928
+ }
6929
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="md"][data-datatable-view="auto"] .datatable-card-frame {
6602
6930
  display: none;
6603
6931
  }
6604
- .datatable--responsive-toggle[data-datatable-view="cards"] .datatable-frame {
6932
+ @media (max-width: 767.98px) {
6933
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="md"][data-datatable-view="auto"] .datatable-frame {
6934
+ display: none;
6935
+ }
6936
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="md"][data-datatable-view="auto"] .datatable-card-frame {
6937
+ display: block;
6938
+ }
6939
+ }
6940
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="lg"] {
6941
+ --moo-datatable-responsive-breakpoint: 992px;
6942
+ }
6943
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="lg"][data-datatable-view="auto"] .datatable-card-frame {
6605
6944
  display: none;
6606
6945
  }
6946
+ @media (max-width: 991.98px) {
6947
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="lg"][data-datatable-view="auto"] .datatable-frame {
6948
+ display: none;
6949
+ }
6950
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="lg"][data-datatable-view="auto"] .datatable-card-frame {
6951
+ display: block;
6952
+ }
6953
+ }
6954
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xl"] {
6955
+ --moo-datatable-responsive-breakpoint: 1200px;
6956
+ }
6957
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xl"][data-datatable-view="auto"] .datatable-card-frame {
6958
+ display: none;
6959
+ }
6960
+ @media (max-width: 1199.98px) {
6961
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xl"][data-datatable-view="auto"] .datatable-frame {
6962
+ display: none;
6963
+ }
6964
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xl"][data-datatable-view="auto"] .datatable-card-frame {
6965
+ display: block;
6966
+ }
6967
+ }
6968
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xxl"] {
6969
+ --moo-datatable-responsive-breakpoint: 1400px;
6970
+ }
6971
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xxl"][data-datatable-view="auto"] .datatable-card-frame {
6972
+ display: none;
6973
+ }
6974
+ @media (max-width: 1399.98px) {
6975
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xxl"][data-datatable-view="auto"] .datatable-frame {
6976
+ display: none;
6977
+ }
6978
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xxl"][data-datatable-view="auto"] .datatable-card-frame {
6979
+ display: block;
6980
+ }
6981
+ }
6607
6982
  .datatable-frame {
6608
6983
  border: var(--bs-border-width) solid var(--bs-border-color);
6609
6984
  border-radius: var(--bs-border-radius);
@@ -6651,6 +7026,16 @@ label.btn {
6651
7026
  .datatable-table > :not(caption) > * > * {
6652
7027
  vertical-align: middle;
6653
7028
  }
7029
+ .datatable-col > .btn-link,
7030
+ .datatable-card-title > .btn-link {
7031
+ max-inline-size: 100%;
7032
+ white-space: normal;
7033
+ overflow-wrap: anywhere;
7034
+ text-align: inherit;
7035
+ }
7036
+ .datatable-table > :not(caption) > * > .datatable-col:nth-child(1 of :not(.datatable-col-hidden)) {
7037
+ padding-inline-start: 1rem;
7038
+ }
6654
7039
  .datatable-toolbar {
6655
7040
  display: flex;
6656
7041
  flex-wrap: wrap;
@@ -7071,7 +7456,10 @@ label.btn {
7071
7456
  align-items: center;
7072
7457
  padding: 0.5rem 0.75rem;
7073
7458
  border-bottom: var(--bs-border-width) solid var(--bs-border-color);
7074
- background-color: var(--bs-tertiary-bg);
7459
+ background-color: color-mix(in srgb, var(--moo-surface) 50%, var(--moo-muted-surface));
7460
+ }
7461
+ .datatable-card-header:not(:has(> .datatable-card-select)) {
7462
+ grid-template-columns: minmax(0, 1fr) auto;
7075
7463
  }
7076
7464
  .datatable-card-select {
7077
7465
  display: inline-flex;
@@ -7436,6 +7824,8 @@ label.btn {
7436
7824
  .datatable--release-review {
7437
7825
  --moo-datatable-min-width: 64rem;
7438
7826
  }
7827
+
7828
+ /* Focus and keyboard navigation */
7439
7829
  .form-label,
7440
7830
  .form-check-label {
7441
7831
  user-select: none;
@@ -7506,6 +7896,13 @@ label.btn {
7506
7896
  .was-validated .input-group.has-validation:not(:has(> :is(.valid-feedback, .invalid-feedback, .valid-tooltip, .invalid-tooltip))) > :is(.form-control, .form-select):invalid {
7507
7897
  box-shadow: none;
7508
7898
  }
7899
+
7900
+ /* Utilities */
7901
+
7902
+ /* Border utilities */
7903
+ .border-dashed {
7904
+ border-style: dashed !important;
7905
+ }
7509
7906
  :where( .scroll-fade, .scroll-fade-y, .scroll-fade-x, .scroll-fade-t, .scroll-fade-b, .scroll-fade-l, .scroll-fade-r, .scroll-fade-s, .scroll-fade-e ) {
7510
7907
  --scroll-fade-size: min(12%, 2.5rem);
7511
7908
  --scroll-fade-reveal: 6rem;
@@ -7674,6 +8071,16 @@ label.btn {
7674
8071
  --moo-scroll-fade-e: var(--moo-scroll-fade-e-size);
7675
8072
  }
7676
8073
  }
8074
+ .scroll-smooth {
8075
+ scroll-behavior: smooth;
8076
+ }
8077
+ @media (prefers-reduced-motion: reduce) {
8078
+ .scroll-smooth {
8079
+ scroll-behavior: auto;
8080
+ }
8081
+ }
8082
+
8083
+ /* Application layout */
7677
8084
  .sidebar {
7678
8085
  --moo-sidebar-width: 16rem;
7679
8086
  --moo-sidebar-width-icon: 3rem;
@@ -7706,9 +8113,6 @@ label.btn {
7706
8113
  background: transparent;
7707
8114
  transition: background 0.15s ease;
7708
8115
  }
7709
- .sidebar-rail:hover::after {
7710
- background: var(--moo-sidebar-border);
7711
- }
7712
8116
  .wrapper[data-layout="app"][data-shell-mode="contained"] .sidebar-inner {
7713
8117
  position: relative;
7714
8118
  height: 100%;
@@ -7744,19 +8148,6 @@ label.btn {
7744
8148
  .sidebar-rail {
7745
8149
  display: none;
7746
8150
  }
7747
- .wrapper[data-layout="app"][data-shell-mode="contained"] .sidebar {
7748
- position: relative;
7749
- inset: auto;
7750
- flex: 0 0 auto;
7751
- width: 100%;
7752
- height: auto;
7753
- visibility: visible;
7754
- transform: none;
7755
- }
7756
- .wrapper[data-layout="app"][data-shell-mode="contained"] .sidebar-inner {
7757
- height: auto;
7758
- max-height: none;
7759
- }
7760
8151
  }
7761
8152
  .sidebar[data-side="left"]:not([data-variant="inset"]) .sidebar-inner {
7762
8153
  border-right: var(--bs-border-width) solid var(--moo-sidebar-border);
@@ -8108,6 +8499,8 @@ label.btn {
8108
8499
  display: none !important;
8109
8500
  }
8110
8501
  }
8502
+
8503
+ /* Form themes */
8111
8504
  :scope[data-bs-theme="light"] .form-select {
8112
8505
  --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
8113
8506
  }
@@ -8120,6 +8513,8 @@ label.btn {
8120
8513
  :scope[data-bs-theme="dark"] .form-switch .form-check-input:not(:checked):not(:focus) {
8121
8514
  --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e");
8122
8515
  }
8516
+
8517
+ /* Overlay backdrops */
8123
8518
  .modal-backdrop,
8124
8519
  .offcanvas-backdrop {
8125
8520
  --bs-backdrop-opacity: var(--moo-overlay-backdrop-opacity, 1);
@@ -8156,7 +8551,16 @@ label.btn {
8156
8551
  .offcanvas-backdrop.show::before {
8157
8552
  animation: moo-overlay-backdrop-enter var(--moo-overlay-motion-duration, 0.3s) ease-out both;
8158
8553
  }
8554
+
8555
+ /* Typography */
8159
8556
  :where(h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6, .display-1, .display-2, .display-3, .display-4, .display-5, .display-6) {
8160
8557
  font-family: var(--moo-heading-font-family, var(--bs-body-font-family));
8161
8558
  }
8559
+ :is(small, .small) {
8560
+ font-size: var(--moo-small-font-size);
8561
+ }
8562
+ p {
8563
+ margin-top: var(--moo-paragraph-margin-top);
8564
+ margin-bottom: var(--moo-paragraph-margin-bottom);
8565
+ }
8162
8566
  }