@wpmoo/ui 1.0.0-rc.9 → 1.0.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.
Files changed (93) hide show
  1. package/ASSET_LICENSE.md +1 -1
  2. package/LICENSE +28 -0
  3. package/README.md +31 -3
  4. package/certification.json +2 -1
  5. package/dist/assets/css/moo-ui.css +381 -22
  6. package/dist/assets/css/moo-ui.min.css +10 -31
  7. package/dist/assets/css/moo.css +373 -21
  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 +3 -2
  15. package/dist/js/datepicker.min.js +4 -3
  16. package/dist/js/moo-ui.js +158 -15400
  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/release-manifest.json +4 -4
  23. package/package.json +3 -1
  24. package/scss/_components.scss +2 -2
  25. package/scss/_config.scss +15 -21
  26. package/scss/_settings.scss +0 -3
  27. package/scss/components/_accordion.scss +1 -12
  28. package/scss/components/_alert.scss +1 -12
  29. package/scss/components/_avatar.scss +1 -16
  30. package/scss/components/_badge.scss +1 -0
  31. package/scss/components/_breadcrumb.scss +1 -12
  32. package/scss/components/_button.scss +1 -29
  33. package/scss/components/_button_group.scss +1 -25
  34. package/scss/components/_card.scss +1 -29
  35. package/scss/components/_checkbox.scss +1 -38
  36. package/scss/components/_close_button.scss +1 -9
  37. package/scss/components/_collapsible.scss +1 -0
  38. package/scss/components/_combobox.scss +1 -6
  39. package/scss/components/_context-menu.scss +1 -11
  40. package/scss/components/_datatable.scss +46 -85
  41. package/scss/components/_datepicker.scss +1 -0
  42. package/scss/components/_dialog.scss +1 -14
  43. package/scss/components/_dropdown.scss +5 -51
  44. package/scss/components/_field.scss +1 -40
  45. package/scss/components/_input.scss +1 -5
  46. package/scss/components/_input_group.scss +1 -51
  47. package/scss/components/_kbd.scss +1 -0
  48. package/scss/components/_menubar.scss +1 -0
  49. package/scss/components/_navigation.scss +76 -6
  50. package/scss/components/_pagination.scss +1 -13
  51. package/scss/components/_popover.scss +1 -22
  52. package/scss/components/_progress.scss +1 -3
  53. package/scss/components/_radio_group.scss +105 -6
  54. package/scss/components/_search_trigger.scss +1 -2
  55. package/scss/components/_select.scss +1 -0
  56. package/scss/components/_separator.scss +1 -6
  57. package/scss/components/_sheet.scss +1 -17
  58. package/scss/components/_sidebar.scss +1 -2
  59. package/scss/components/_skeleton.scss +1 -8
  60. package/scss/components/_slider.scss +1 -2
  61. package/scss/components/_spinner.scss +1 -7
  62. package/scss/components/_switch.scss +1 -4
  63. package/scss/components/_table.scss +1 -2
  64. package/scss/components/_tabs.scss +1 -24
  65. package/scss/components/_textarea.scss +1 -0
  66. package/scss/components/_toast.scss +1 -4
  67. package/scss/components/_toggle_group.scss +1 -3
  68. package/scss/components/_tooltip.scss +1 -20
  69. package/scss/components/sidebar/_base.scss +0 -7
  70. package/scss/components/sidebar/_collapsed.scss +0 -6
  71. package/scss/components/sidebar/_identity.scss +0 -1
  72. package/scss/components/sidebar/_menus.scss +0 -17
  73. package/scss/foundations/_backdrop.scss +0 -26
  74. package/scss/foundations/_focus.scss +0 -56
  75. package/scss/foundations/_scope.scss +14 -0
  76. package/scss/layouts/_app.scss +0 -6
  77. package/scss/layouts/_page_grid.scss +0 -3
  78. package/scss/layouts/app/sidebar/_base.scss +0 -33
  79. package/scss/layouts/app/sidebar/_default.scss +0 -6
  80. package/scss/layouts/app/sidebar/_floating.scss +0 -11
  81. package/scss/layouts/app/sidebar/_inset.scss +0 -2
  82. package/scss/mixins/_banner.scss +9 -3
  83. package/scss/moo-core.scss +3 -6
  84. package/scss/moo-ui.scss +9 -5
  85. package/scss/settings/_bootstrap_overrides.scss +0 -8
  86. package/scss/settings/_component_variables.scss +4 -266
  87. package/scss/settings/_forms.scss +0 -37
  88. package/scss/settings/_palette.scss +0 -42
  89. package/scss/themes/_root.scss +3 -0
  90. package/scss/themes/_standalone.scss +0 -2
  91. package/scss/themes/_theme.scss +3 -2
  92. package/scss/utilities/_background_color.scss +18 -0
  93. package/scss/utilities/_border.scss +4 -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.0.0 (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,58 @@ 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
+ /* Skeleton */
4712
4830
  .skeleton {
4713
4831
  color: var(--moo-border);
4714
4832
  border-radius: var(--bs-border-radius);
@@ -4717,6 +4835,8 @@ label.btn {
4717
4835
  .skeleton > .placeholder {
4718
4836
  display: block;
4719
4837
  }
4838
+
4839
+ /* Sidebar */
4720
4840
  .sidebar-inner {
4721
4841
  position: sticky;
4722
4842
  top: 0;
@@ -5126,6 +5246,8 @@ label.btn {
5126
5246
  display: none;
5127
5247
  }
5128
5248
  }
5249
+
5250
+ /* Alert */
5129
5251
  .alert {
5130
5252
  --bs-alert-border-color: var(--moo-border);
5131
5253
  --bs-alert-color: var(--moo-foreground);
@@ -5192,6 +5314,8 @@ label.btn {
5192
5314
  .alert-action {
5193
5315
  flex: 0 0 auto;
5194
5316
  }
5317
+
5318
+ /* Breadcrumb */
5195
5319
  .breadcrumb {
5196
5320
  --bs-breadcrumb-item-active-color: var(--moo-foreground);
5197
5321
  --bs-breadcrumb-item-padding-x: 0.375rem;
@@ -5291,6 +5415,8 @@ label.btn {
5291
5415
  width: 0.875rem;
5292
5416
  height: 0.875rem;
5293
5417
  }
5418
+
5419
+ /* Pagination */
5294
5420
  .page-link {
5295
5421
  display: inline-flex;
5296
5422
  align-items: center;
@@ -5336,6 +5462,8 @@ label.btn {
5336
5462
  .page-item.disabled {
5337
5463
  opacity: var(--moo-disabled-control-opacity);
5338
5464
  }
5465
+
5466
+ /* Badge */
5339
5467
  .badge {
5340
5468
  display: inline-flex;
5341
5469
  height: 1.25rem;
@@ -5364,10 +5492,14 @@ label.btn {
5364
5492
  .badge[class~="text-body-secondary"] {
5365
5493
  color: var(--moo-foreground) !important;
5366
5494
  }
5495
+
5496
+ /* Progress */
5367
5497
  .progress {
5368
5498
  --bs-progress-bar-color: var(--moo-primary-foreground);
5369
5499
  --bs-progress-bar-bg: var(--moo-primary);
5370
5500
  }
5501
+
5502
+ /* Slider */
5371
5503
  .slider {
5372
5504
  display: grid;
5373
5505
  gap: 0.5rem;
@@ -5546,6 +5678,8 @@ label.btn {
5546
5678
  writing-mode: vertical-lr;
5547
5679
  direction: rtl;
5548
5680
  }
5681
+
5682
+ /* Separator */
5549
5683
  hr {
5550
5684
  opacity: 1;
5551
5685
  border-top: var(--bs-border-width) solid var(--moo-border);
@@ -5554,6 +5688,8 @@ label.btn {
5554
5688
  opacity: 1;
5555
5689
  background-color: var(--moo-border);
5556
5690
  }
5691
+
5692
+ /* Checkbox */
5557
5693
  .form-check-input {
5558
5694
  margin-top: 0.125rem;
5559
5695
  }
@@ -5617,9 +5753,100 @@ label.btn {
5617
5753
  border-color: var(--moo-primary);
5618
5754
  background-color: var(--moo-primary);
5619
5755
  }
5756
+
5757
+ /* Radio Group */
5620
5758
  .radio-group legend.form-label {
5621
5759
  font-size: inherit;
5622
5760
  }
5761
+ .form-check-card {
5762
+ position: relative;
5763
+ padding: 0;
5764
+ margin-bottom: 0;
5765
+ }
5766
+ .form-check-card + .form-check-card {
5767
+ margin-block-start: 0.5rem;
5768
+ }
5769
+ .form-check-card > .form-check-input:not(.visually-hidden) {
5770
+ position: absolute;
5771
+ inset-block-start: 0.75rem;
5772
+ inset-inline-end: 0.75rem;
5773
+ float: none;
5774
+ margin: 0;
5775
+ }
5776
+ .form-check-card > .form-check-label {
5777
+ display: flex;
5778
+ align-items: center;
5779
+ gap: 0.75rem;
5780
+ padding: 0.75rem;
5781
+ padding-inline-end: 2.5rem;
5782
+ border: var(--bs-border-width) solid var(--moo-border);
5783
+ border-radius: var(--bs-border-radius);
5784
+ color: var(--moo-foreground);
5785
+ cursor: pointer;
5786
+ }
5787
+ .form-check-card.form-check-card--no-control > .form-check-label {
5788
+ padding-inline-end: 0.75rem;
5789
+ }
5790
+ .form-check-card > .form-check-input:not(:disabled) ~ .form-check-label:hover,
5791
+ .form-check-card > .form-check-input:checked ~ .form-check-label {
5792
+ background-color: var(--moo-muted-surface);
5793
+ }
5794
+ .form-check-card > .form-check-input:checked ~ .form-check-label {
5795
+ border-color: var(--moo-foreground);
5796
+ }
5797
+ .form-check-card > .form-check-input:checked ~ .form-check-label .form-check-card-media {
5798
+ border-color: var(--moo-primary);
5799
+ background-color: var(--moo-primary);
5800
+ color: var(--moo-primary-foreground);
5801
+ }
5802
+ .form-check-card > .form-check-input:focus-visible ~ .form-check-label {
5803
+ border-color: var(--moo-ring);
5804
+ box-shadow: 0 0 0 var(--bs-focus-ring-width) color-mix(in srgb, var(--moo-ring) 50%, transparent);
5805
+ }
5806
+ .form-check-card > .form-check-input.is-invalid ~ .form-check-label {
5807
+ border-color: var(--bs-form-invalid-border-color);
5808
+ }
5809
+ .form-check-card > .form-check-input.is-invalid:focus-visible ~ .form-check-label {
5810
+ box-shadow: 0 0 0 var(--bs-focus-ring-width) var(--moo-form-invalid-ring-color);
5811
+ }
5812
+ .form-check-card-content {
5813
+ display: flex;
5814
+ flex-direction: column;
5815
+ gap: 0.25rem;
5816
+ min-width: 0;
5817
+ line-height: 1.25;
5818
+ overflow-wrap: anywhere;
5819
+ }
5820
+ .form-check-card-content > .form-text {
5821
+ margin: 0;
5822
+ font-size: 0.76562rem;
5823
+ line-height: inherit;
5824
+ color: color-mix(in srgb, var(--moo-muted-foreground) 95%, var(--moo-foreground));
5825
+ }
5826
+ .form-check-card-title {
5827
+ font-weight: 500;
5828
+ }
5829
+ .form-check-card-media {
5830
+ display: grid;
5831
+ place-items: center;
5832
+ flex: 0 0 auto;
5833
+ inline-size: 2.30078rem;
5834
+ aspect-ratio: 1;
5835
+ border: var(--bs-border-width) solid var(--moo-border);
5836
+ border-radius: var(--bs-border-radius-sm);
5837
+ background-color: var(--moo-muted-surface);
5838
+ color: var(--moo-foreground);
5839
+ }
5840
+ .form-check-card-media > span {
5841
+ font-size: 0.76562rem;
5842
+ font-weight: 600;
5843
+ }
5844
+ .form-check-card-media > [data-icon] {
5845
+ width: 0.875rem;
5846
+ height: 0.875rem;
5847
+ }
5848
+
5849
+ /* Switch */
5623
5850
  .form-switch .form-check-input {
5624
5851
  height: 1.15rem;
5625
5852
  }
@@ -5643,6 +5870,8 @@ label.btn {
5643
5870
  :scope[data-bs-theme="dark"] .form-switch .form-check-input:focus:not(:focus-visible):not(:checked) {
5644
5871
  --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
5872
  }
5873
+
5874
+ /* Spinner */
5646
5875
  .spinner [data-icon] {
5647
5876
  width: 1rem;
5648
5877
  height: 1rem;
@@ -5652,6 +5881,8 @@ label.btn {
5652
5881
  width: 0.75rem;
5653
5882
  height: 0.75rem;
5654
5883
  }
5884
+
5885
+ /* Accordion */
5655
5886
  .accordion-button::after {
5656
5887
  content: none;
5657
5888
  }
@@ -5696,6 +5927,8 @@ label.btn {
5696
5927
  .card .accordion {
5697
5928
  --bs-accordion-bg: transparent;
5698
5929
  }
5930
+
5931
+ /* Tabs */
5699
5932
  .tabs-list {
5700
5933
  display: inline-flex;
5701
5934
  gap: 0.125rem;
@@ -5799,6 +6032,8 @@ label.btn {
5799
6032
  pointer-events: auto;
5800
6033
  transition-delay: 0s;
5801
6034
  }
6035
+
6036
+ /* Collapsible */
5802
6037
  .collapsible {
5803
6038
  display: flex;
5804
6039
  flex-direction: column;
@@ -5836,6 +6071,8 @@ label.btn {
5836
6071
  color: var(--moo-muted-foreground);
5837
6072
  width: 100%;
5838
6073
  }
6074
+
6075
+ /* Tooltip */
5839
6076
  .tooltip {
5840
6077
  --bs-tooltip-max-width: 20rem;
5841
6078
  --bs-tooltip-padding-x: 0.75rem;
@@ -5890,6 +6127,8 @@ label.btn {
5890
6127
  .tooltip-inner kbd {
5891
6128
  margin-inline-start: 0.25rem;
5892
6129
  }
6130
+
6131
+ /* Popover */
5893
6132
  .popover {
5894
6133
  --bs-popover-border-radius: var(--bs-border-radius-lg);
5895
6134
  --bs-popover-border-color: var(--moo-border);
@@ -5913,6 +6152,8 @@ label.btn {
5913
6152
  .popover .popover-arrow {
5914
6153
  display: none;
5915
6154
  }
6155
+
6156
+ /* Dialog */
5916
6157
  .modal {
5917
6158
  --bs-modal-border-radius: var(--bs-border-radius-xl);
5918
6159
  --bs-modal-border-color: var(--moo-border);
@@ -5967,6 +6208,8 @@ label.btn {
5967
6208
  .modal-footer {
5968
6209
  padding: 1rem;
5969
6210
  }
6211
+
6212
+ /* Sheet */
5970
6213
  .offcanvas.sheet {
5971
6214
  --bs-offcanvas-width: 24rem;
5972
6215
  --bs-offcanvas-border-color: var(--moo-border);
@@ -5980,6 +6223,8 @@ label.btn {
5980
6223
  font-size: 1rem;
5981
6224
  font-weight: 500;
5982
6225
  }
6226
+
6227
+ /* Toast */
5983
6228
  .toast {
5984
6229
  --bs-toast-border-radius: var(--bs-border-radius-lg);
5985
6230
  --bs-toast-border-color: var(--moo-border);
@@ -6071,6 +6316,8 @@ label.btn {
6071
6316
  transition: none;
6072
6317
  }
6073
6318
  }
6319
+
6320
+ /* Field */
6074
6321
  .field {
6075
6322
  display: flex;
6076
6323
  flex-direction: column;
@@ -6146,6 +6393,8 @@ label.btn {
6146
6393
  .field-fieldset + hr {
6147
6394
  opacity: 0.1;
6148
6395
  }
6396
+
6397
+ /* Date Picker */
6149
6398
  .moo-datepicker {
6150
6399
  --moo-datepicker-width: 17.5rem;
6151
6400
  --moo-datepicker-popover-offset: 0.375rem;
@@ -6345,6 +6594,8 @@ label.btn {
6345
6594
  .moo-calendar__preset {
6346
6595
  flex: 0 0 auto;
6347
6596
  }
6597
+
6598
+ /* Combobox */
6348
6599
  .combobox {
6349
6600
  --moo-combobox-width: 12.5rem;
6350
6601
  --moo-combobox-multiple-width: 20rem;
@@ -6560,6 +6811,8 @@ label.btn {
6560
6811
  color: var(--bs-secondary-color);
6561
6812
  text-align: center;
6562
6813
  }
6814
+
6815
+ /* Context Menu */
6563
6816
  .context-menu {
6564
6817
  position: relative;
6565
6818
  }
@@ -6574,6 +6827,8 @@ label.btn {
6574
6827
  ul.context-menu-menu:focus-visible {
6575
6828
  outline: 0;
6576
6829
  }
6830
+
6831
+ /* Data Table */
6577
6832
  .datatable {
6578
6833
  --moo-datatable-min-width: 48rem;
6579
6834
  --moo-datatable-actions-cell-bg: var(--bs-body-bg);
@@ -6595,15 +6850,88 @@ label.btn {
6595
6850
  table-layout: fixed;
6596
6851
  }
6597
6852
  .datatable--responsive-scroll .datatable-table,
6598
- .datatable--responsive-toggle .datatable-table {
6853
+ .datatable--responsive-toggle .datatable-table,
6854
+ .datatable--responsive-auto .datatable-table {
6599
6855
  min-width: var(--moo-datatable-min-width);
6600
6856
  }
6601
- .datatable--responsive-toggle[data-datatable-view="table"] .datatable-card-frame {
6857
+ .datatable--responsive-toggle[data-datatable-view="table"] .datatable-card-frame,
6858
+ .datatable--responsive-auto[data-datatable-view="table"] .datatable-card-frame {
6859
+ display: none;
6860
+ }
6861
+ .datatable--responsive-toggle[data-datatable-view="cards"] .datatable-frame,
6862
+ .datatable--responsive-auto[data-datatable-view="cards"] .datatable-frame {
6602
6863
  display: none;
6603
6864
  }
6604
- .datatable--responsive-toggle[data-datatable-view="cards"] .datatable-frame {
6865
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="sm"] {
6866
+ --moo-datatable-responsive-breakpoint: 576px;
6867
+ }
6868
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="sm"][data-datatable-view="auto"] .datatable-card-frame {
6605
6869
  display: none;
6606
6870
  }
6871
+ @media (max-width: 575.98px) {
6872
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="sm"][data-datatable-view="auto"] .datatable-frame {
6873
+ display: none;
6874
+ }
6875
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="sm"][data-datatable-view="auto"] .datatable-card-frame {
6876
+ display: block;
6877
+ }
6878
+ }
6879
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="md"] {
6880
+ --moo-datatable-responsive-breakpoint: 768px;
6881
+ }
6882
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="md"][data-datatable-view="auto"] .datatable-card-frame {
6883
+ display: none;
6884
+ }
6885
+ @media (max-width: 767.98px) {
6886
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="md"][data-datatable-view="auto"] .datatable-frame {
6887
+ display: none;
6888
+ }
6889
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="md"][data-datatable-view="auto"] .datatable-card-frame {
6890
+ display: block;
6891
+ }
6892
+ }
6893
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="lg"] {
6894
+ --moo-datatable-responsive-breakpoint: 992px;
6895
+ }
6896
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="lg"][data-datatable-view="auto"] .datatable-card-frame {
6897
+ display: none;
6898
+ }
6899
+ @media (max-width: 991.98px) {
6900
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="lg"][data-datatable-view="auto"] .datatable-frame {
6901
+ display: none;
6902
+ }
6903
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="lg"][data-datatable-view="auto"] .datatable-card-frame {
6904
+ display: block;
6905
+ }
6906
+ }
6907
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xl"] {
6908
+ --moo-datatable-responsive-breakpoint: 1200px;
6909
+ }
6910
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xl"][data-datatable-view="auto"] .datatable-card-frame {
6911
+ display: none;
6912
+ }
6913
+ @media (max-width: 1199.98px) {
6914
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xl"][data-datatable-view="auto"] .datatable-frame {
6915
+ display: none;
6916
+ }
6917
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xl"][data-datatable-view="auto"] .datatable-card-frame {
6918
+ display: block;
6919
+ }
6920
+ }
6921
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xxl"] {
6922
+ --moo-datatable-responsive-breakpoint: 1400px;
6923
+ }
6924
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xxl"][data-datatable-view="auto"] .datatable-card-frame {
6925
+ display: none;
6926
+ }
6927
+ @media (max-width: 1399.98px) {
6928
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xxl"][data-datatable-view="auto"] .datatable-frame {
6929
+ display: none;
6930
+ }
6931
+ .datatable--responsive-auto[data-datatable-responsive-breakpoint="xxl"][data-datatable-view="auto"] .datatable-card-frame {
6932
+ display: block;
6933
+ }
6934
+ }
6607
6935
  .datatable-frame {
6608
6936
  border: var(--bs-border-width) solid var(--bs-border-color);
6609
6937
  border-radius: var(--bs-border-radius);
@@ -6651,6 +6979,16 @@ label.btn {
6651
6979
  .datatable-table > :not(caption) > * > * {
6652
6980
  vertical-align: middle;
6653
6981
  }
6982
+ .datatable-col > .btn-link,
6983
+ .datatable-card-title > .btn-link {
6984
+ max-inline-size: 100%;
6985
+ white-space: normal;
6986
+ overflow-wrap: anywhere;
6987
+ text-align: inherit;
6988
+ }
6989
+ .datatable-table > :not(caption) > * > .datatable-col:nth-child(1 of :not(.datatable-col-hidden)) {
6990
+ padding-inline-start: 1rem;
6991
+ }
6654
6992
  .datatable-toolbar {
6655
6993
  display: flex;
6656
6994
  flex-wrap: wrap;
@@ -7071,7 +7409,10 @@ label.btn {
7071
7409
  align-items: center;
7072
7410
  padding: 0.5rem 0.75rem;
7073
7411
  border-bottom: var(--bs-border-width) solid var(--bs-border-color);
7074
- background-color: var(--bs-tertiary-bg);
7412
+ background-color: color-mix(in srgb, var(--moo-surface) 50%, var(--moo-muted-surface));
7413
+ }
7414
+ .datatable-card-header:not(:has(> .datatable-card-select)) {
7415
+ grid-template-columns: minmax(0, 1fr) auto;
7075
7416
  }
7076
7417
  .datatable-card-select {
7077
7418
  display: inline-flex;
@@ -7436,6 +7777,8 @@ label.btn {
7436
7777
  .datatable--release-review {
7437
7778
  --moo-datatable-min-width: 64rem;
7438
7779
  }
7780
+
7781
+ /* Focus and keyboard navigation */
7439
7782
  .form-label,
7440
7783
  .form-check-label {
7441
7784
  user-select: none;
@@ -7506,6 +7849,13 @@ label.btn {
7506
7849
  .was-validated .input-group.has-validation:not(:has(> :is(.valid-feedback, .invalid-feedback, .valid-tooltip, .invalid-tooltip))) > :is(.form-control, .form-select):invalid {
7507
7850
  box-shadow: none;
7508
7851
  }
7852
+
7853
+ /* Utilities */
7854
+
7855
+ /* Border utilities */
7856
+ .border-dashed {
7857
+ border-style: dashed !important;
7858
+ }
7509
7859
  :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
7860
  --scroll-fade-size: min(12%, 2.5rem);
7511
7861
  --scroll-fade-reveal: 6rem;
@@ -7674,6 +8024,8 @@ label.btn {
7674
8024
  --moo-scroll-fade-e: var(--moo-scroll-fade-e-size);
7675
8025
  }
7676
8026
  }
8027
+
8028
+ /* Application layout */
7677
8029
  .sidebar {
7678
8030
  --moo-sidebar-width: 16rem;
7679
8031
  --moo-sidebar-width-icon: 3rem;
@@ -7744,19 +8096,6 @@ label.btn {
7744
8096
  .sidebar-rail {
7745
8097
  display: none;
7746
8098
  }
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
8099
  }
7761
8100
  .sidebar[data-side="left"]:not([data-variant="inset"]) .sidebar-inner {
7762
8101
  border-right: var(--bs-border-width) solid var(--moo-sidebar-border);
@@ -8108,6 +8447,8 @@ label.btn {
8108
8447
  display: none !important;
8109
8448
  }
8110
8449
  }
8450
+
8451
+ /* Form themes */
8111
8452
  :scope[data-bs-theme="light"] .form-select {
8112
8453
  --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
8454
  }
@@ -8120,6 +8461,8 @@ label.btn {
8120
8461
  :scope[data-bs-theme="dark"] .form-switch .form-check-input:not(:checked):not(:focus) {
8121
8462
  --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
8463
  }
8464
+
8465
+ /* Overlay backdrops */
8123
8466
  .modal-backdrop,
8124
8467
  .offcanvas-backdrop {
8125
8468
  --bs-backdrop-opacity: var(--moo-overlay-backdrop-opacity, 1);
@@ -8156,7 +8499,16 @@ label.btn {
8156
8499
  .offcanvas-backdrop.show::before {
8157
8500
  animation: moo-overlay-backdrop-enter var(--moo-overlay-motion-duration, 0.3s) ease-out both;
8158
8501
  }
8502
+
8503
+ /* Typography */
8159
8504
  :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
8505
  font-family: var(--moo-heading-font-family, var(--bs-body-font-family));
8161
8506
  }
8507
+ :is(small, .small) {
8508
+ font-size: var(--moo-small-font-size);
8509
+ }
8510
+ p {
8511
+ margin-top: var(--moo-paragraph-margin-top);
8512
+ margin-bottom: var(--moo-paragraph-margin-bottom);
8513
+ }
8162
8514
  }