@wpmoo/ui 1.0.0-rc.2 → 1.0.0-rc.4

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 (84) hide show
  1. package/ASSET_LICENSE.md +3 -1
  2. package/README.md +50 -107
  3. package/certification.json +20 -3
  4. package/dist/assets/css/moo-ui.css +8254 -7629
  5. package/dist/assets/css/moo-ui.min.css +3 -3
  6. package/dist/assets/css/moo.css +595 -71
  7. package/dist/assets/css/moo.min.css +3 -3
  8. package/dist/js/chart.js +15258 -0
  9. package/dist/js/chart.min.js +27 -0
  10. package/dist/js/combobox.js +98 -40
  11. package/dist/js/context-menu.js +5 -0
  12. package/dist/js/datatable.js +5 -0
  13. package/dist/js/datepicker.js +1154 -0
  14. package/dist/js/datepicker.min.js +6 -0
  15. package/dist/js/moo-ui.js +18950 -0
  16. package/dist/js/moo-ui.min.js +27 -0
  17. package/dist/js/sidebar.js +67 -25
  18. package/dist/js/slider.js +324 -0
  19. package/package.json +24 -4
  20. package/scss/_components.scss +73 -0
  21. package/scss/_config.scss +24 -0
  22. package/scss/_settings.scss +8 -0
  23. package/scss/components/_accordion.scss +59 -0
  24. package/scss/components/_alert.scss +94 -0
  25. package/scss/components/_avatar.scss +154 -0
  26. package/scss/components/_badge.scss +33 -0
  27. package/scss/components/_breadcrumb.scss +130 -0
  28. package/scss/components/_button.scss +228 -0
  29. package/scss/components/_button_group.scss +51 -0
  30. package/scss/components/_card.scss +142 -0
  31. package/scss/components/_checkbox.scss +115 -0
  32. package/scss/components/_close_button.scss +59 -0
  33. package/scss/components/_collapsible.scss +43 -0
  34. package/scss/components/_combobox.scss +258 -0
  35. package/scss/components/_context-menu.scss +28 -0
  36. package/scss/components/_datatable.scss +1082 -0
  37. package/scss/components/_datepicker.scss +236 -0
  38. package/scss/components/_dialog.scss +66 -0
  39. package/scss/components/_dropdown.scss +202 -0
  40. package/scss/components/_field.scss +125 -0
  41. package/scss/components/_input.scss +35 -0
  42. package/scss/components/_input_group.scss +201 -0
  43. package/scss/components/_kbd.scss +10 -0
  44. package/scss/components/_menubar.scss +16 -0
  45. package/scss/components/_navigation.scss +41 -0
  46. package/scss/components/_pagination.scss +70 -0
  47. package/scss/components/_popover.scss +47 -0
  48. package/scss/components/_progress.scss +7 -0
  49. package/scss/components/_radio_group.scss +9 -0
  50. package/scss/components/_select.scss +7 -0
  51. package/scss/components/_separator.scss +15 -0
  52. package/scss/components/_sheet.scss +32 -0
  53. package/scss/components/_sidebar.scss +7 -0
  54. package/scss/components/_skeleton.scss +17 -0
  55. package/scss/components/_slider.scss +214 -0
  56. package/scss/components/_spinner.scss +17 -0
  57. package/scss/components/_switch.scss +25 -0
  58. package/scss/components/_table.scss +7 -0
  59. package/scss/components/_tabs.scss +139 -0
  60. package/scss/components/_textarea.scss +7 -0
  61. package/scss/components/_toast.scss +119 -0
  62. package/scss/components/_toggle_group.scss +19 -0
  63. package/scss/components/_tooltip.scss +83 -0
  64. package/scss/components/sidebar/_collapsed.scss +187 -0
  65. package/scss/components/sidebar/_identity.scss +72 -0
  66. package/scss/components/sidebar/_inset.scss +59 -0
  67. package/scss/components/sidebar/_layout.scss +176 -0
  68. package/scss/components/sidebar/_menus.scss +236 -0
  69. package/scss/foundations/_core_global_primitives.scss +5 -0
  70. package/scss/foundations/_core_state_layer.scss +25 -0
  71. package/scss/foundations/_focus.scss +139 -0
  72. package/scss/foundations/_overlay_backdrop.scss +19 -0
  73. package/scss/moo-core.scss +47 -0
  74. package/scss/moo-ui.scss +50 -0
  75. package/scss/settings/_bootstrap_overrides.scss +11 -0
  76. package/scss/settings/_component_variables.scss +479 -0
  77. package/scss/settings/_forms.scss +65 -0
  78. package/scss/settings/_palette.scss +132 -0
  79. package/scss/themes/_scoped_core.scss +239 -0
  80. package/scss/themes/_standalone_root.scss +117 -0
  81. package/scss/utilities/_scroll_fade.scss +193 -0
  82. package/scss/utilities/_scroll_fade_primitives.scss +43 -0
  83. package/scss/_facade-settings.scss +0 -51
  84. package/scss/settings/_facade_public.scss +0 -23
@@ -0,0 +1,132 @@
1
+ $white: #fff !default;
2
+ $black: #0a0a0a !default;
3
+
4
+ $headings-font-weight: 600 !default;
5
+ $lead-font-size: 1.125rem !default;
6
+ $lead-font-weight: 400 !default;
7
+ // Bootstrap's stock display scale (5rem down to 2.5rem) at font-weight 300
8
+ // reads as oversized, airy marketing type -- far past this reference's
9
+ // headline sizing. Calmer sizes at $headings-font-weight keep Display
10
+ // headings feeling like the rest of the type scale instead of a jump to a
11
+ // different visual language.
12
+ $display-font-sizes: (
13
+ 1: 3.5rem,
14
+ 2: 3rem,
15
+ 3: 2.5rem,
16
+ 4: 2.25rem,
17
+ 5: 1.875rem,
18
+ 6: 1.5rem
19
+ ) !default;
20
+ $display-font-weight: $headings-font-weight !default;
21
+
22
+ // Moo's runtime palette is emitted by both the standalone :root build and the
23
+ // scoped Odoo core build. Keep values centralized here so the two entrypoints
24
+ // cannot drift while still using their own selector ownership.
25
+ $moo-surface: $body-bg !default;
26
+ $moo-muted-surface: $secondary !default;
27
+ $moo-border: $border-color !default;
28
+ $moo-primary: $primary !default;
29
+ $moo-primary-foreground: $light !default;
30
+ $moo-foreground: $body-color !default;
31
+ $moo-muted-foreground: #71717a !default;
32
+ // The reference derives --ring as a lighter tint of --primary (same hue,
33
+ // lightened toward the surface) instead of a fixed literal, so a
34
+ // brand-color change updates the ring automatically instead of needing a
35
+ // matching manual edit. $primary here is itself a near-neutral dark tone,
36
+ // so this naturally lands close to a neutral mid-gray -- the reference's
37
+ // own default Neutral theme's ring (#a1a1a1 light / #737373 dark) -- while
38
+ // staying derived rather than a hardcoded copy of those numbers.
39
+ $moo-ring: color-mix(in srgb, $white 60%, $primary) !default;
40
+ // The reference's --destructive token drives destructive text and alpha
41
+ // surfaces. The public $danger default matches the light token; dark mode uses
42
+ // the matching reference dark token below.
43
+ $moo-destructive: $danger !default;
44
+ $moo-destructive-surface: color-mix(in srgb, $moo-destructive 3%, transparent) !default;
45
+ $moo-destructive-surface-hover: color-mix(in srgb, $moo-destructive 6%, transparent) !default;
46
+ $moo-destructive-foreground: $moo-destructive !default;
47
+ $moo-form-invalid-border-color: $moo-destructive !default;
48
+ $moo-form-invalid-ring-color: color-mix(in srgb, $moo-destructive 20%, transparent) !default;
49
+ // Warning and success derive from Bootstrap's $warning/$success palette
50
+ // variables, following the same alpha-surface pattern as destructive.
51
+ $moo-warning: $warning !default;
52
+ $moo-warning-surface: color-mix(in srgb, $moo-warning 10%, transparent) !default;
53
+ $moo-warning-surface-hover: color-mix(in srgb, $moo-warning 20%, transparent) !default;
54
+ $moo-warning-foreground: $moo-warning !default;
55
+ $moo-success: $success !default;
56
+ $moo-success-surface: color-mix(in srgb, $moo-success 10%, transparent) !default;
57
+ $moo-success-surface-hover: color-mix(in srgb, $moo-success 20%, transparent) !default;
58
+ $moo-success-foreground: $moo-success !default;
59
+ $moo-info: $info !default;
60
+ $moo-info-surface: color-mix(in srgb, $moo-info 10%, transparent) !default;
61
+ $moo-info-surface-hover: color-mix(in srgb, $moo-info 20%, transparent) !default;
62
+ $moo-info-foreground: $moo-info !default;
63
+ $moo-sidebar: $light !default;
64
+ $moo-chart-1: #52525b !default;
65
+ $moo-chart-2: #71717a !default;
66
+ $moo-chart-3: #a1a1aa !default;
67
+ $moo-chart-4: #3f3f46 !default;
68
+ $moo-chart-5: #27272a !default;
69
+ // $black (#0a0a0a), not $dark (#18181b, zinc-900) -- the reference's own
70
+ // dark-mode --background is #0a0a0a exactly, and $black already carried
71
+ // that value without being wired to this token.
72
+ $moo-surface-dark: $black !default;
73
+ $moo-muted-surface-dark: #27272a !default;
74
+ $moo-border-dark: #3f3f46 !default;
75
+ $moo-primary-dark: $moo-border !default;
76
+ $moo-primary-foreground-dark: $dark !default;
77
+ $moo-foreground-dark: $light !default;
78
+ $moo-muted-foreground-dark: #a1a1aa !default;
79
+ // Same derivation as $moo-ring above, at a lower white weight -- dark
80
+ // surfaces need a darker-than-light-mode ring to read as mid-tone against a
81
+ // dark background instead of a near-white glow.
82
+ $moo-ring-dark: color-mix(in srgb, $white 40%, $primary) !default;
83
+ // Reference dark --destructive token.
84
+ $moo-destructive-dark: #ff6467 !default;
85
+ $moo-destructive-surface-dark: color-mix(in srgb, $moo-destructive-dark 20%, transparent) !default;
86
+ $moo-destructive-surface-hover-dark: color-mix(in srgb, $moo-destructive-dark 30%, transparent) !default;
87
+ $moo-destructive-foreground-dark: $moo-destructive-dark !default;
88
+ $moo-form-invalid-border-color-dark: color-mix(in srgb, $moo-destructive-dark 50%, transparent) !default;
89
+ $moo-form-invalid-ring-color-dark: color-mix(in srgb, $moo-destructive-dark 40%, transparent) !default;
90
+ // Dark-mode warning/success: lighter tints of the public config base hues,
91
+ // mixed toward $light so they stay readable on dark surfaces. Everything
92
+ // derives from public config variables only.
93
+ $moo-warning-dark: color-mix(in srgb, $light 60%, $warning) !default;
94
+ $moo-warning-surface-dark: color-mix(in srgb, $moo-warning-dark 20%, transparent) !default;
95
+ $moo-warning-surface-hover-dark: color-mix(in srgb, $moo-warning-dark 30%, transparent) !default;
96
+ $moo-warning-foreground-dark: $moo-warning-dark !default;
97
+ $moo-success-dark: color-mix(in srgb, $light 60%, $success) !default;
98
+ $moo-success-surface-dark: color-mix(in srgb, $moo-success-dark 20%, transparent) !default;
99
+ $moo-success-surface-hover-dark: color-mix(in srgb, $moo-success-dark 30%, transparent) !default;
100
+ $moo-success-foreground-dark: $moo-success-dark !default;
101
+ $moo-info-dark: color-mix(in srgb, $light 60%, $info) !default;
102
+ $moo-info-surface-dark: color-mix(in srgb, $moo-info-dark 20%, transparent) !default;
103
+ $moo-info-surface-hover-dark: color-mix(in srgb, $moo-info-dark 30%, transparent) !default;
104
+ $moo-info-foreground-dark: $moo-info-dark !default;
105
+ $moo-sidebar-dark: #1c1c1f !default;
106
+ // Dark-mode input background: a translucent tint that gives form controls a
107
+ // distinct surface against the page background. Light mode stays transparent
108
+ // (the default), but dark mode needs this subtle depth cue so inputs don't
109
+ // rely on border alone for definition. Mixed from muted-surface-dark toward
110
+ // the surface color so it reads as "slightly lighter than the page" without
111
+ // introducing a new hardcoded color.
112
+ $moo-input-bg-dark: color-mix(in srgb, $moo-muted-surface-dark 50%, $moo-surface-dark) !default;
113
+
114
+ // Bootstrap root variables consumed by the scoped core build. Define them
115
+ // here so themes/_scoped_core.scss can emit Bootstrap's root contract without
116
+ // hardcoded consumer-side literals.
117
+ $body-tertiary-color: #a1a1aa !default;
118
+ $body-tertiary-bg: $light !default;
119
+ $code-color: #d63384 !default;
120
+ $mark-bg: #fff3cd !default;
121
+ $border-color-translucent: rgba(24, 24, 27, 0.175) !default;
122
+ $body-tertiary-color-dark: $moo-muted-foreground !default;
123
+ $body-tertiary-bg-dark: #202024 !default;
124
+ $code-color-dark: #e685b5 !default;
125
+ $mark-bg-dark: #664d03 !default;
126
+ $border-color-translucent-dark: rgba(250, 250, 250, 0.15) !default;
127
+
128
+ // Disabled foregrounds need to read quieter than secondary prose and icons.
129
+ // Bootstrap's tertiary color is the closest native semantic for that state,
130
+ // so expose it through a Moo token for components without a Bootstrap knob.
131
+ $moo-disabled-foreground: $body-tertiary-color !default;
132
+ $moo-disabled-foreground-dark: $body-tertiary-color-dark !default;
@@ -0,0 +1,239 @@
1
+ $moo-theme-colors-text-dark: (
2
+ "primary": $primary-text-emphasis-dark,
3
+ "secondary": $secondary-text-emphasis-dark,
4
+ "success": $success-text-emphasis-dark,
5
+ "info": $info-text-emphasis-dark,
6
+ "warning": $warning-text-emphasis-dark,
7
+ "danger": $danger-text-emphasis-dark,
8
+ "light": $light-text-emphasis-dark,
9
+ "dark": $dark-text-emphasis-dark,
10
+ ) !default;
11
+
12
+ $moo-theme-colors-bg-subtle-dark: (
13
+ "primary": $primary-bg-subtle-dark,
14
+ "secondary": $secondary-bg-subtle-dark,
15
+ "success": $success-bg-subtle-dark,
16
+ "info": $info-bg-subtle-dark,
17
+ "warning": $warning-bg-subtle-dark,
18
+ "danger": $danger-bg-subtle-dark,
19
+ "light": $light-bg-subtle-dark,
20
+ "dark": $dark-bg-subtle-dark,
21
+ ) !default;
22
+
23
+ $moo-theme-colors-border-subtle-dark: (
24
+ "primary": $primary-border-subtle-dark,
25
+ "secondary": $secondary-border-subtle-dark,
26
+ "success": $success-border-subtle-dark,
27
+ "info": $info-border-subtle-dark,
28
+ "warning": $warning-border-subtle-dark,
29
+ "danger": $danger-border-subtle-dark,
30
+ "light": $light-border-subtle-dark,
31
+ "dark": $dark-border-subtle-dark,
32
+ ) !default;
33
+
34
+ @mixin moo-core-scales {
35
+ @each $color, $value in $colors {
36
+ --#{$prefix}#{$color}: #{$value};
37
+ }
38
+
39
+ @each $color, $value in $grays {
40
+ --#{$prefix}gray-#{$color}: #{$value};
41
+ }
42
+
43
+ @each $color, $value in $theme-colors {
44
+ --#{$prefix}#{$color}: #{$value};
45
+ }
46
+
47
+ @each $color, $value in $theme-colors-rgb {
48
+ --#{$prefix}#{$color}-rgb: #{$value};
49
+ }
50
+
51
+ --#{$prefix}white-rgb: #{to-rgb($white)};
52
+ --#{$prefix}black-rgb: #{to-rgb($black)};
53
+ --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};
54
+ --#{$prefix}font-monospace: #{inspect($font-family-monospace)};
55
+ --#{$prefix}gradient: #{$gradient};
56
+ --#{$prefix}body-font-family: #{inspect($font-family-base)};
57
+ @include rfs($font-size-base, --#{$prefix}body-font-size);
58
+ --#{$prefix}body-font-weight: #{$font-weight-base};
59
+ --#{$prefix}body-line-height: #{$line-height-base};
60
+ --#{$prefix}link-decoration: #{$link-decoration};
61
+ --#{$prefix}border-width: #{$border-width};
62
+ --#{$prefix}border-style: #{$border-style};
63
+ --#{$prefix}border-radius: #{$border-radius};
64
+ --#{$prefix}border-radius-sm: #{$border-radius-sm};
65
+ --#{$prefix}border-radius-lg: #{$border-radius-lg};
66
+ --#{$prefix}border-radius-xl: #{$border-radius-xl};
67
+ --#{$prefix}border-radius-xxl: #{$border-radius-xxl};
68
+ --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl);
69
+ --#{$prefix}border-radius-pill: #{$border-radius-pill};
70
+ --#{$prefix}box-shadow: #{$box-shadow};
71
+ --#{$prefix}box-shadow-sm: #{$box-shadow-sm};
72
+ --#{$prefix}box-shadow-lg: #{$box-shadow-lg};
73
+ --#{$prefix}box-shadow-inset: #{$box-shadow-inset};
74
+ --#{$prefix}focus-ring-width: #{$focus-ring-width};
75
+ --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};
76
+ --#{$prefix}focus-ring-color: var(--moo-ring);
77
+ }
78
+
79
+ @mixin moo-core-shared {
80
+ --moo-overlay-backdrop-opacity: #{$moo-overlay-backdrop-opacity};
81
+ --moo-overlay-backdrop-bg: #{$moo-overlay-backdrop-bg};
82
+ --moo-overlay-backdrop-filter: #{$moo-overlay-backdrop-filter};
83
+ --moo-input-group-border-radius: #{$moo-input-group-border-radius};
84
+ --moo-disabled-control-opacity: #{$moo-disabled-control-opacity};
85
+ --moo-sidebar-foreground: var(--moo-foreground);
86
+ --moo-sidebar-accent: var(--moo-muted-surface);
87
+ --moo-sidebar-border: var(--moo-border);
88
+ --moo-chart-1: #{$moo-chart-1};
89
+ --moo-chart-2: #{$moo-chart-2};
90
+ --moo-chart-3: #{$moo-chart-3};
91
+ --moo-chart-4: #{$moo-chart-4};
92
+ --moo-chart-5: #{$moo-chart-5};
93
+ }
94
+
95
+ @mixin moo-core-light {
96
+ color-scheme: light;
97
+ color: var(--#{$prefix}body-color);
98
+ background-color: var(--#{$prefix}body-bg);
99
+ --moo-surface: #{$moo-surface};
100
+ --moo-muted-surface: #{$moo-muted-surface};
101
+ --moo-border: #{$moo-border};
102
+ --moo-primary: #{$moo-primary};
103
+ --moo-primary-foreground: #{$moo-primary-foreground};
104
+ --moo-foreground: #{$moo-foreground};
105
+ --moo-muted-foreground: #{$moo-muted-foreground};
106
+ --moo-disabled-foreground: #{$moo-disabled-foreground};
107
+ --moo-ring: #{$moo-ring};
108
+ --moo-destructive: #{$moo-destructive};
109
+ --moo-destructive-surface: #{$moo-destructive-surface};
110
+ --moo-destructive-surface-hover: #{$moo-destructive-surface-hover};
111
+ --moo-destructive-foreground: #{$moo-destructive-foreground};
112
+ --moo-form-invalid-ring-color: #{$moo-form-invalid-ring-color};
113
+ --moo-warning: #{$moo-warning};
114
+ --moo-warning-surface: #{$moo-warning-surface};
115
+ --moo-warning-surface-hover: #{$moo-warning-surface-hover};
116
+ --moo-warning-foreground: #{$moo-warning-foreground};
117
+ --moo-success: #{$moo-success};
118
+ --moo-success-surface: #{$moo-success-surface};
119
+ --moo-success-surface-hover: #{$moo-success-surface-hover};
120
+ --moo-success-foreground: #{$moo-success-foreground};
121
+ --moo-info: #{$moo-info};
122
+ --moo-info-surface: #{$moo-info-surface};
123
+ --moo-info-surface-hover: #{$moo-info-surface-hover};
124
+ --moo-info-foreground: #{$moo-info-foreground};
125
+ --moo-sidebar: #{$moo-sidebar};
126
+ --#{$prefix}body-color: var(--moo-foreground);
127
+ --#{$prefix}body-color-rgb: #{to-rgb($moo-foreground)};
128
+ --#{$prefix}body-bg: var(--moo-surface);
129
+ --#{$prefix}body-bg-rgb: #{to-rgb($moo-surface)};
130
+ --#{$prefix}emphasis-color: var(--moo-foreground);
131
+ --#{$prefix}emphasis-color-rgb: #{to-rgb($moo-foreground)};
132
+ --#{$prefix}secondary-color: var(--moo-muted-foreground);
133
+ --#{$prefix}secondary-color-rgb: #{to-rgb($moo-muted-foreground)};
134
+ --#{$prefix}secondary-bg: var(--moo-muted-surface);
135
+ --#{$prefix}secondary-bg-rgb: #{to-rgb($moo-muted-surface)};
136
+ --#{$prefix}tertiary-color: #{$body-tertiary-color};
137
+ --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};
138
+ --#{$prefix}tertiary-bg: #{$body-tertiary-bg};
139
+ --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};
140
+ --#{$prefix}heading-color: var(--moo-foreground);
141
+ --#{$prefix}link-color: var(--moo-foreground);
142
+ --#{$prefix}link-color-rgb: #{to-rgb($moo-foreground)};
143
+ --#{$prefix}link-hover-color: var(--moo-muted-foreground);
144
+ --#{$prefix}link-hover-color-rgb: #{to-rgb($moo-muted-foreground)};
145
+ --#{$prefix}code-color: #{$code-color};
146
+ --#{$prefix}highlight-color: var(--moo-foreground);
147
+ --#{$prefix}highlight-bg: #{$mark-bg};
148
+ --#{$prefix}border-color: var(--moo-border);
149
+ --#{$prefix}border-color-translucent: #{$border-color-translucent};
150
+ --#{$prefix}form-valid-color: #{$form-valid-color};
151
+ --#{$prefix}form-valid-border-color: #{$form-valid-border-color};
152
+ --#{$prefix}form-invalid-color: var(--moo-destructive);
153
+ --#{$prefix}form-invalid-border-color: #{$moo-form-invalid-border-color};
154
+
155
+ @each $color, $value in $theme-colors-text {
156
+ --#{$prefix}#{$color}-text-emphasis: #{$value};
157
+ }
158
+
159
+ @each $color, $value in $theme-colors-bg-subtle {
160
+ --#{$prefix}#{$color}-bg-subtle: #{$value};
161
+ }
162
+
163
+ @each $color, $value in $theme-colors-border-subtle {
164
+ --#{$prefix}#{$color}-border-subtle: #{$value};
165
+ }
166
+ }
167
+
168
+ @mixin moo-core-dark {
169
+ color-scheme: dark;
170
+ color: var(--#{$prefix}body-color);
171
+ background-color: var(--#{$prefix}body-bg);
172
+ --moo-surface: #{$moo-surface-dark};
173
+ --moo-muted-surface: #{$moo-muted-surface-dark};
174
+ --moo-border: #{$moo-border-dark};
175
+ --moo-primary: #{$moo-primary-dark};
176
+ --moo-primary-foreground: #{$moo-primary-foreground-dark};
177
+ --moo-foreground: #{$moo-foreground-dark};
178
+ --moo-muted-foreground: #{$moo-muted-foreground-dark};
179
+ --moo-disabled-foreground: #{$moo-disabled-foreground-dark};
180
+ --moo-ring: #{$moo-ring-dark};
181
+ --moo-destructive: #{$moo-destructive-dark};
182
+ --moo-destructive-surface: #{$moo-destructive-surface-dark};
183
+ --moo-destructive-surface-hover: #{$moo-destructive-surface-hover-dark};
184
+ --moo-destructive-foreground: #{$moo-destructive-foreground-dark};
185
+ --moo-form-invalid-ring-color: #{$moo-form-invalid-ring-color-dark};
186
+ --moo-warning: #{$moo-warning-dark};
187
+ --moo-warning-surface: #{$moo-warning-surface-dark};
188
+ --moo-warning-surface-hover: #{$moo-warning-surface-hover-dark};
189
+ --moo-warning-foreground: #{$moo-warning-foreground-dark};
190
+ --moo-success: #{$moo-success-dark};
191
+ --moo-success-surface: #{$moo-success-surface-dark};
192
+ --moo-success-surface-hover: #{$moo-success-surface-hover-dark};
193
+ --moo-success-foreground: #{$moo-success-foreground-dark};
194
+ --moo-info: #{$moo-info-dark};
195
+ --moo-info-surface: #{$moo-info-surface-dark};
196
+ --moo-info-surface-hover: #{$moo-info-surface-hover-dark};
197
+ --moo-info-foreground: #{$moo-info-foreground-dark};
198
+ --moo-sidebar: #{$moo-sidebar-dark};
199
+ --#{$prefix}body-color: var(--moo-foreground);
200
+ --#{$prefix}body-color-rgb: #{to-rgb($moo-foreground-dark)};
201
+ --#{$prefix}body-bg: var(--moo-surface);
202
+ --#{$prefix}body-bg-rgb: #{to-rgb($moo-surface-dark)};
203
+ --#{$prefix}emphasis-color: var(--moo-foreground);
204
+ --#{$prefix}emphasis-color-rgb: #{to-rgb($moo-foreground-dark)};
205
+ --#{$prefix}secondary-color: var(--moo-muted-foreground);
206
+ --#{$prefix}secondary-color-rgb: #{to-rgb($moo-muted-foreground-dark)};
207
+ --#{$prefix}secondary-bg: var(--moo-muted-surface);
208
+ --#{$prefix}secondary-bg-rgb: #{to-rgb($moo-muted-surface-dark)};
209
+ --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};
210
+ --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};
211
+ --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};
212
+ --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};
213
+ --#{$prefix}heading-color: var(--moo-foreground);
214
+ --#{$prefix}link-color: var(--moo-foreground);
215
+ --#{$prefix}link-color-rgb: #{to-rgb($moo-foreground-dark)};
216
+ --#{$prefix}link-hover-color: var(--moo-muted-foreground);
217
+ --#{$prefix}link-hover-color-rgb: #{to-rgb($moo-muted-foreground-dark)};
218
+ --#{$prefix}code-color: #{$code-color-dark};
219
+ --#{$prefix}highlight-color: var(--moo-foreground);
220
+ --#{$prefix}highlight-bg: #{$mark-bg-dark};
221
+ --#{$prefix}border-color: var(--moo-border);
222
+ --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};
223
+ --#{$prefix}form-valid-color: #{$form-valid-color-dark};
224
+ --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};
225
+ --#{$prefix}form-invalid-color: var(--moo-destructive);
226
+ --#{$prefix}form-invalid-border-color: #{$moo-form-invalid-border-color-dark};
227
+
228
+ @each $color, $value in $moo-theme-colors-text-dark {
229
+ --#{$prefix}#{$color}-text-emphasis: #{$value};
230
+ }
231
+
232
+ @each $color, $value in $moo-theme-colors-bg-subtle-dark {
233
+ --#{$prefix}#{$color}-bg-subtle: #{$value};
234
+ }
235
+
236
+ @each $color, $value in $moo-theme-colors-border-subtle-dark {
237
+ --#{$prefix}#{$color}-border-subtle: #{$value};
238
+ }
239
+ }
@@ -0,0 +1,117 @@
1
+ :root {
2
+ --moo-overlay-backdrop-opacity: #{$moo-overlay-backdrop-opacity};
3
+ --moo-overlay-backdrop-bg: #{$moo-overlay-backdrop-bg};
4
+ --moo-overlay-backdrop-filter: #{$moo-overlay-backdrop-filter};
5
+ --moo-input-group-border-radius: #{$moo-input-group-border-radius};
6
+ --moo-disabled-control-opacity: #{$moo-disabled-control-opacity};
7
+ --moo-sidebar-foreground: var(--moo-foreground);
8
+ --moo-sidebar-accent: var(--moo-muted-surface);
9
+ --moo-sidebar-border: var(--moo-border);
10
+ --moo-chart-1: #{$moo-chart-1};
11
+ --moo-chart-2: #{$moo-chart-2};
12
+ --moo-chart-3: #{$moo-chart-3};
13
+ --moo-chart-4: #{$moo-chart-4};
14
+ --moo-chart-5: #{$moo-chart-5};
15
+ }
16
+
17
+ :root,
18
+ [data-bs-theme="light"] {
19
+ --moo-surface: #{$moo-surface};
20
+ --moo-muted-surface: #{$moo-muted-surface};
21
+ --moo-border: #{$moo-border};
22
+ --moo-primary: #{$moo-primary};
23
+ --moo-primary-foreground: #{$moo-primary-foreground};
24
+ --moo-foreground: #{$moo-foreground};
25
+ --moo-muted-foreground: #{$moo-muted-foreground};
26
+ --moo-disabled-foreground: #{$moo-disabled-foreground};
27
+ --moo-ring: #{$moo-ring};
28
+ --moo-destructive: #{$moo-destructive};
29
+ --moo-destructive-surface: #{$moo-destructive-surface};
30
+ --moo-destructive-surface-hover: #{$moo-destructive-surface-hover};
31
+ --moo-destructive-foreground: #{$moo-destructive-foreground};
32
+ --moo-form-invalid-ring-color: #{$moo-form-invalid-ring-color};
33
+ --moo-warning: #{$moo-warning};
34
+ --moo-warning-surface: #{$moo-warning-surface};
35
+ --moo-warning-surface-hover: #{$moo-warning-surface-hover};
36
+ --moo-warning-foreground: #{$moo-warning-foreground};
37
+ --moo-success: #{$moo-success};
38
+ --moo-success-surface: #{$moo-success-surface};
39
+ --moo-success-surface-hover: #{$moo-success-surface-hover};
40
+ --moo-success-foreground: #{$moo-success-foreground};
41
+ --moo-info: #{$moo-info};
42
+ --moo-info-surface: #{$moo-info-surface};
43
+ --moo-info-surface-hover: #{$moo-info-surface-hover};
44
+ --moo-info-foreground: #{$moo-info-foreground};
45
+ --moo-sidebar: #{$moo-sidebar};
46
+ --bs-body-color: var(--moo-foreground);
47
+ --bs-body-color-rgb: #{to-rgb($moo-foreground)};
48
+ --bs-heading-color: var(--moo-foreground);
49
+ --bs-secondary-color: var(--moo-muted-foreground);
50
+ // Bootstrap computes its own dark-mode --bs-body-bg/-secondary-bg/
51
+ // -tertiary-bg independently of this file (see vendor/bootstrap/scss/
52
+ // _root.scss's [data-bs-theme="dark"] block), the same way it did for the
53
+ // --bs-body-color trio above before this bridge existed. The scoped Odoo
54
+ // core build already ties every one of these to the shared --moo-*
55
+ // palette (scss/themes/_scoped_core.scss's moo-core-light/dark mixins);
56
+ // mirror that here so both entrypoints render the same background, not
57
+ // two independently-computed gray scales that happen to agree in light
58
+ // mode and diverge in dark (this is what caused the catalog shell's body
59
+ // background to sit only ~7 units of contrast from its own Kbd chips
60
+ // instead of the ~15 they're tuned for).
61
+ --bs-body-bg: var(--moo-surface);
62
+ --bs-body-bg-rgb: #{to-rgb($moo-surface)};
63
+ --bs-secondary-bg: var(--moo-muted-surface);
64
+ --bs-secondary-bg-rgb: #{to-rgb($moo-muted-surface)};
65
+ --bs-tertiary-bg: #{$body-tertiary-bg};
66
+ --bs-tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};
67
+ --bs-tertiary-color: #{$body-tertiary-color};
68
+ --bs-tertiary-color-rgb: #{to-rgb($body-tertiary-color)};
69
+ --bs-form-invalid-color: var(--moo-destructive);
70
+ --bs-form-invalid-border-color: #{$moo-form-invalid-border-color};
71
+ }
72
+
73
+ [data-bs-theme="dark"] {
74
+ --moo-surface: #{$moo-surface-dark};
75
+ --moo-muted-surface: #{$moo-muted-surface-dark};
76
+ --moo-border: #{$moo-border-dark};
77
+ --moo-primary: #{$moo-primary-dark};
78
+ --moo-primary-foreground: #{$moo-primary-foreground-dark};
79
+ --moo-foreground: #{$moo-foreground-dark};
80
+ --moo-muted-foreground: #{$moo-muted-foreground-dark};
81
+ --moo-disabled-foreground: #{$moo-disabled-foreground-dark};
82
+ --moo-ring: #{$moo-ring-dark};
83
+ --moo-destructive: #{$moo-destructive-dark};
84
+ --moo-destructive-surface: #{$moo-destructive-surface-dark};
85
+ --moo-destructive-surface-hover: #{$moo-destructive-surface-hover-dark};
86
+ --moo-destructive-foreground: #{$moo-destructive-foreground-dark};
87
+ --moo-form-invalid-ring-color: #{$moo-form-invalid-ring-color-dark};
88
+ --moo-warning: #{$moo-warning-dark};
89
+ --moo-warning-surface: #{$moo-warning-surface-dark};
90
+ --moo-warning-surface-hover: #{$moo-warning-surface-hover-dark};
91
+ --moo-warning-foreground: #{$moo-warning-foreground-dark};
92
+ --moo-success: #{$moo-success-dark};
93
+ --moo-success-surface: #{$moo-success-surface-dark};
94
+ --moo-success-surface-hover: #{$moo-success-surface-hover-dark};
95
+ --moo-success-foreground: #{$moo-success-foreground-dark};
96
+ --moo-info: #{$moo-info-dark};
97
+ --moo-info-surface: #{$moo-info-surface-dark};
98
+ --moo-info-surface-hover: #{$moo-info-surface-hover-dark};
99
+ --moo-info-foreground: #{$moo-info-foreground-dark};
100
+ --moo-sidebar: #{$moo-sidebar-dark};
101
+ --moo-input-bg: #{$moo-input-bg-dark};
102
+ --bs-body-color: var(--moo-foreground);
103
+ --bs-body-color-rgb: #{to-rgb($moo-foreground-dark)};
104
+ --bs-heading-color: var(--moo-foreground);
105
+ --bs-secondary-color: var(--moo-muted-foreground);
106
+ // See the light block's matching comment above.
107
+ --bs-body-bg: var(--moo-surface);
108
+ --bs-body-bg-rgb: #{to-rgb($moo-surface-dark)};
109
+ --bs-secondary-bg: var(--moo-muted-surface);
110
+ --bs-secondary-bg-rgb: #{to-rgb($moo-muted-surface-dark)};
111
+ --bs-tertiary-bg: #{$body-tertiary-bg-dark};
112
+ --bs-tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};
113
+ --bs-tertiary-color: #{$body-tertiary-color-dark};
114
+ --bs-tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};
115
+ --bs-form-invalid-color: var(--moo-destructive);
116
+ --bs-form-invalid-border-color: #{$moo-form-invalid-border-color-dark};
117
+ }
@@ -0,0 +1,193 @@
1
+ :where(
2
+ .scroll-fade,
3
+ .scroll-fade-y,
4
+ .scroll-fade-x,
5
+ .scroll-fade-t,
6
+ .scroll-fade-b,
7
+ .scroll-fade-l,
8
+ .scroll-fade-r,
9
+ .scroll-fade-s,
10
+ .scroll-fade-e
11
+ ) {
12
+ --scroll-fade-size: min(12%, 2.5rem);
13
+ --scroll-fade-reveal: 6rem;
14
+ --moo-scroll-fade-t-size: var(--scroll-fade-size);
15
+ --moo-scroll-fade-b-size: var(--scroll-fade-size);
16
+ --moo-scroll-fade-s-size: var(--scroll-fade-size);
17
+ --moo-scroll-fade-e-size: var(--scroll-fade-size);
18
+ --moo-scroll-fade-mask: linear-gradient(
19
+ to bottom,
20
+ transparent 0,
21
+ #000 var(--moo-scroll-fade-t),
22
+ #000 calc(100% - var(--moo-scroll-fade-b)),
23
+ transparent 100%
24
+ );
25
+ mask-image: var(--moo-scroll-fade-mask);
26
+ }
27
+
28
+ .scroll-fade,
29
+ .scroll-fade-y {
30
+ animation-name: moo-scroll-fade-reveal-t, moo-scroll-fade-reveal-b;
31
+ animation-duration: 1ms, 1ms;
32
+ animation-fill-mode: both, both;
33
+ animation-timing-function: linear, linear;
34
+ animation-timeline: scroll(self y), scroll(self y);
35
+ animation-range: 0 var(--scroll-fade-reveal), calc(100% - var(--scroll-fade-reveal)) 100%;
36
+ }
37
+
38
+ .scroll-fade-t {
39
+ animation-name: moo-scroll-fade-reveal-t;
40
+ animation-duration: 1ms;
41
+ animation-fill-mode: both;
42
+ animation-timing-function: linear;
43
+ animation-timeline: scroll(self y);
44
+ animation-range: 0 var(--scroll-fade-reveal);
45
+ }
46
+
47
+ .scroll-fade-b {
48
+ animation-name: moo-scroll-fade-reveal-b;
49
+ animation-duration: 1ms;
50
+ animation-fill-mode: both;
51
+ animation-timing-function: linear;
52
+ animation-timeline: scroll(self y);
53
+ animation-range: calc(100% - var(--scroll-fade-reveal)) 100%;
54
+ }
55
+
56
+ .scroll-fade-x,
57
+ .scroll-fade-s,
58
+ .scroll-fade-e {
59
+ --moo-scroll-fade-mask: linear-gradient(
60
+ to right,
61
+ transparent 0,
62
+ #000 var(--moo-scroll-fade-s),
63
+ #000 calc(100% - var(--moo-scroll-fade-e)),
64
+ transparent 100%
65
+ );
66
+ }
67
+
68
+ .scroll-fade-x {
69
+ animation-name: moo-scroll-fade-reveal-s, moo-scroll-fade-reveal-e;
70
+ animation-duration: 1ms, 1ms;
71
+ animation-fill-mode: both, both;
72
+ animation-timing-function: linear, linear;
73
+ animation-timeline: scroll(self inline), scroll(self inline);
74
+ animation-range: 0 var(--scroll-fade-reveal), calc(100% - var(--scroll-fade-reveal)) 100%;
75
+ }
76
+
77
+ .scroll-fade-s {
78
+ animation-name: moo-scroll-fade-reveal-s;
79
+ animation-duration: 1ms;
80
+ animation-fill-mode: both;
81
+ animation-timing-function: linear;
82
+ animation-timeline: scroll(self inline);
83
+ animation-range: 0 var(--scroll-fade-reveal);
84
+ }
85
+
86
+ .scroll-fade-e {
87
+ animation-name: moo-scroll-fade-reveal-e;
88
+ animation-duration: 1ms;
89
+ animation-fill-mode: both;
90
+ animation-timing-function: linear;
91
+ animation-timeline: scroll(self inline);
92
+ animation-range: calc(100% - var(--scroll-fade-reveal)) 100%;
93
+ }
94
+
95
+ .scroll-fade-x:where([dir="rtl"], [dir="rtl"] *),
96
+ .scroll-fade-s:where([dir="rtl"], [dir="rtl"] *),
97
+ .scroll-fade-e:where([dir="rtl"], [dir="rtl"] *) {
98
+ --moo-scroll-fade-mask: linear-gradient(
99
+ to left,
100
+ transparent 0,
101
+ #000 var(--moo-scroll-fade-s),
102
+ #000 calc(100% - var(--moo-scroll-fade-e)),
103
+ transparent 100%
104
+ );
105
+ }
106
+
107
+ .scroll-fade-l,
108
+ .scroll-fade-r {
109
+ --moo-scroll-fade-mask: linear-gradient(
110
+ to right,
111
+ transparent 0,
112
+ #000 var(--moo-scroll-fade-s),
113
+ #000 calc(100% - var(--moo-scroll-fade-e)),
114
+ transparent 100%
115
+ );
116
+ }
117
+
118
+ .scroll-fade-l {
119
+ animation-name: moo-scroll-fade-reveal-s;
120
+ animation-duration: 1ms;
121
+ animation-fill-mode: both;
122
+ animation-timing-function: linear;
123
+ animation-timeline: scroll(self x);
124
+ animation-range: 0 var(--scroll-fade-reveal);
125
+ }
126
+
127
+ .scroll-fade-r {
128
+ animation-name: moo-scroll-fade-reveal-e;
129
+ animation-duration: 1ms;
130
+ animation-fill-mode: both;
131
+ animation-timing-function: linear;
132
+ animation-timeline: scroll(self x);
133
+ animation-range: calc(100% - var(--scroll-fade-reveal)) 100%;
134
+ }
135
+
136
+ .scroll-fade-none {
137
+ --moo-scroll-fade-mask: none;
138
+ }
139
+
140
+ .no-scrollbar {
141
+ scrollbar-width: none;
142
+ }
143
+
144
+ .no-scrollbar::-webkit-scrollbar {
145
+ display: none;
146
+ }
147
+
148
+ .scrollbar-thin {
149
+ --moo-scrollbar-thin-size: #{$moo-scrollbar-thin-size};
150
+ --moo-scrollbar-thin-thumb-bg: color-mix(in srgb, var(--bs-secondary-color) 28%, transparent);
151
+ --moo-scrollbar-thin-thumb-hover-bg: color-mix(in srgb, var(--bs-secondary-color) 45%, transparent);
152
+
153
+ scrollbar-color: var(--moo-scrollbar-thin-thumb-bg) transparent;
154
+ scrollbar-width: thin;
155
+ }
156
+
157
+ .scrollbar-thin::-webkit-scrollbar {
158
+ width: var(--moo-scrollbar-thin-size);
159
+ height: var(--moo-scrollbar-thin-size);
160
+ }
161
+
162
+ .scrollbar-thin::-webkit-scrollbar-track {
163
+ background: transparent;
164
+ }
165
+
166
+ .scrollbar-thin::-webkit-scrollbar-thumb {
167
+ border-radius: var(--bs-border-radius-pill);
168
+ background-color: var(--moo-scrollbar-thin-thumb-bg);
169
+ }
170
+
171
+ .scrollbar-thin::-webkit-scrollbar-thumb:hover {
172
+ background-color: var(--moo-scrollbar-thin-thumb-hover-bg);
173
+ }
174
+
175
+ @supports not (animation-timeline: scroll()) {
176
+ .scroll-fade,
177
+ .scroll-fade-y {
178
+ --moo-scroll-fade-t: var(--moo-scroll-fade-t-size);
179
+ --moo-scroll-fade-b: var(--moo-scroll-fade-b-size);
180
+ }
181
+
182
+ .scroll-fade-x {
183
+ --moo-scroll-fade-s: var(--moo-scroll-fade-s-size);
184
+ --moo-scroll-fade-e: var(--moo-scroll-fade-e-size);
185
+ }
186
+
187
+ .scroll-fade-t { --moo-scroll-fade-t: var(--moo-scroll-fade-t-size); }
188
+ .scroll-fade-b { --moo-scroll-fade-b: var(--moo-scroll-fade-b-size); }
189
+ .scroll-fade-l,
190
+ .scroll-fade-s { --moo-scroll-fade-s: var(--moo-scroll-fade-s-size); }
191
+ .scroll-fade-r,
192
+ .scroll-fade-e { --moo-scroll-fade-e: var(--moo-scroll-fade-e-size); }
193
+ }