@limetech/lime-elements 38.21.2 → 38.21.3

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 (53) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/{checkbox.template-882253c2.js → checkbox.template-d2c0b7fc.js} +4 -3
  3. package/dist/cjs/checkbox.template-d2c0b7fc.js.map +1 -0
  4. package/dist/cjs/limel-breadcrumbs_7.cjs.entry.js +13 -14
  5. package/dist/cjs/limel-breadcrumbs_7.cjs.entry.js.map +1 -1
  6. package/dist/cjs/limel-checkbox.cjs.entry.js +2 -2
  7. package/dist/cjs/limel-checkbox.cjs.entry.js.map +1 -1
  8. package/dist/cjs/limel-chip_2.cjs.entry.js +1 -1
  9. package/dist/cjs/limel-chip_2.cjs.entry.js.map +1 -1
  10. package/dist/cjs/limel-dynamic-label_3.cjs.entry.js +1 -1
  11. package/dist/cjs/limel-dynamic-label_3.cjs.entry.js.map +1 -1
  12. package/dist/collection/components/checkbox/checkbox.css +72 -37
  13. package/dist/collection/components/checkbox/checkbox.template.js +2 -1
  14. package/dist/collection/components/checkbox/checkbox.template.js.map +1 -1
  15. package/dist/collection/components/chip-set/chip-set.css +2 -0
  16. package/dist/collection/components/input-field/input-field.css +9 -0
  17. package/dist/collection/components/list/list.css +282 -430
  18. package/dist/collection/components/list/radio-button/radio-button.template.js +6 -4
  19. package/dist/collection/components/list/radio-button/radio-button.template.js.map +1 -1
  20. package/dist/collection/components/menu-list/menu-list.css +282 -430
  21. package/dist/collection/components/notched-outline/notched-outline.css +1 -0
  22. package/dist/collection/style/internal/boolean-input.scss +178 -0
  23. package/dist/collection/style/internal/shared_input-select-picker.scss +3 -168
  24. package/dist/esm/{checkbox.template-0a54ff6e.js → checkbox.template-04a31caa.js} +4 -3
  25. package/dist/esm/checkbox.template-04a31caa.js.map +1 -0
  26. package/dist/esm/limel-breadcrumbs_7.entry.js +13 -14
  27. package/dist/esm/limel-breadcrumbs_7.entry.js.map +1 -1
  28. package/dist/esm/limel-checkbox.entry.js +2 -2
  29. package/dist/esm/limel-checkbox.entry.js.map +1 -1
  30. package/dist/esm/limel-chip_2.entry.js +1 -1
  31. package/dist/esm/limel-chip_2.entry.js.map +1 -1
  32. package/dist/esm/limel-dynamic-label_3.entry.js +1 -1
  33. package/dist/esm/limel-dynamic-label_3.entry.js.map +1 -1
  34. package/dist/lime-elements/lime-elements.esm.js +1 -1
  35. package/dist/lime-elements/{p-2869405b.entry.js → p-576a290b.entry.js} +2 -2
  36. package/dist/lime-elements/{p-2869405b.entry.js.map → p-576a290b.entry.js.map} +1 -1
  37. package/dist/lime-elements/{p-3fab45c9.entry.js → p-cc6195a9.entry.js} +7 -7
  38. package/dist/lime-elements/{p-3fab45c9.entry.js.map → p-cc6195a9.entry.js.map} +1 -1
  39. package/dist/lime-elements/p-d5b1f00e.js +2 -0
  40. package/dist/lime-elements/p-d5b1f00e.js.map +1 -0
  41. package/dist/lime-elements/{p-84f3deba.entry.js → p-e5ae9af8.entry.js} +2 -2
  42. package/dist/lime-elements/{p-84f3deba.entry.js.map → p-e5ae9af8.entry.js.map} +1 -1
  43. package/dist/lime-elements/p-e80040b7.entry.js +266 -0
  44. package/dist/lime-elements/p-e80040b7.entry.js.map +1 -0
  45. package/dist/lime-elements/style/internal/boolean-input.scss +178 -0
  46. package/dist/lime-elements/style/internal/shared_input-select-picker.scss +3 -168
  47. package/package.json +1 -1
  48. package/dist/cjs/checkbox.template-882253c2.js.map +0 -1
  49. package/dist/esm/checkbox.template-0a54ff6e.js.map +0 -1
  50. package/dist/lime-elements/p-6b746479.js +0 -2
  51. package/dist/lime-elements/p-6b746479.js.map +0 -1
  52. package/dist/lime-elements/p-6e698e38.entry.js +0 -266
  53. package/dist/lime-elements/p-6e698e38.entry.js.map +0 -1
@@ -3808,20 +3808,15 @@ img {
3808
3808
  * Media query mixins for responsive design based on screen width.
3809
3809
  * Note that these mixins do not detect the device type!
3810
3810
  */
3811
- /**
3812
- * @prop --checkbox-unchecked-border-color: Affects the border color of the default state of the checkbox (when it is not checked). Defaults to `--contrast-900`.
3813
- */
3814
- :host(limel-checkbox) {
3815
- min-height: var(--limel-checkbox-min-height, 2.5rem);
3816
- }
3817
-
3818
3811
  *,
3819
3812
  *:before,
3820
3813
  *:after {
3821
3814
  box-sizing: border-box;
3822
3815
  }
3823
3816
 
3824
- .checkbox {
3817
+ .boolean-input {
3818
+ --limel-boolean-input-box-size: 1.25rem;
3819
+ --limel-boolean-input-gap-size: 0.5rem;
3825
3820
  position: relative;
3826
3821
  isolation: isolate;
3827
3822
  display: flex;
@@ -3830,7 +3825,8 @@ img {
3830
3825
  width: 100%;
3831
3826
  }
3832
3827
 
3833
- input[type=checkbox] {
3828
+ .boolean-input input[type=checkbox],
3829
+ .boolean-input input[type=radio] {
3834
3830
  position: absolute;
3835
3831
  width: 0;
3836
3832
  height: 0;
@@ -3846,34 +3842,38 @@ input[type=checkbox] {
3846
3842
  appearance: none;
3847
3843
  }
3848
3844
 
3849
- label {
3850
- min-width: 1.25rem;
3851
- min-height: 1.25rem;
3845
+ label.boolean-input-label {
3846
+ min-width: var(--limel-boolean-input-box-size);
3847
+ min-height: var(--limel-boolean-input-box-size);
3852
3848
  padding-top: 0.125rem;
3853
3849
  cursor: pointer;
3854
3850
  position: relative;
3855
3851
  width: 100%;
3856
3852
  font-size: var(--limel-theme-default-small-font-size);
3857
3853
  color: var(--limel-theme-text-primary-on-background-color);
3858
- padding-left: 1.75rem;
3854
+ padding-left: calc(var(--limel-boolean-input-box-size) + var(--limel-boolean-input-gap-size));
3859
3855
  }
3860
- .disabled:not([readonly]):not([readonly=true]) label {
3856
+
3857
+ .disabled:not([readonly]):not([readonly=true]) label.boolean-input-label {
3861
3858
  cursor: not-allowed;
3862
3859
  color: var(--limel-theme-text-disabled-color);
3863
3860
  }
3864
- .required label:after {
3861
+
3862
+ .required label.boolean-input-label:after {
3865
3863
  margin-left: 0.0625rem;
3866
3864
  content: "*";
3867
3865
  }
3868
- .invalid:not(.readonly) label {
3866
+
3867
+ .invalid:not(.readonly) label.boolean-input-label {
3869
3868
  color: var(--limel-theme-error-text-color);
3870
3869
  }
3871
- :host(limel-checkbox.hide-label) label, .hide-label label {
3870
+
3871
+ :host(limel-checkbox.hide-label) label.boolean-input-label, .hide-label label.boolean-input-label {
3872
3872
  overflow: hidden;
3873
3873
  white-space: nowrap;
3874
3874
  text-overflow: ellipsis;
3875
3875
  opacity: 0;
3876
- width: 1.25rem;
3876
+ width: var(--limel-boolean-input-box-size);
3877
3877
  }
3878
3878
 
3879
3879
  .box {
@@ -3882,29 +3882,34 @@ label {
3882
3882
  transition: border-color 0.4s ease 0.2s, background-color 0.2s ease, box-shadow var(--limel-clickable-transform-speed, 0.4s) ease;
3883
3883
  display: inline-block;
3884
3884
  vertical-align: middle;
3885
- width: 1.25rem;
3886
- height: 1.25rem;
3887
- margin-right: 0.5rem;
3888
- border-radius: 0.25rem;
3885
+ width: var(--limel-boolean-input-box-size);
3886
+ height: var(--limel-boolean-input-box-size);
3887
+ margin-right: var(--limel-boolean-input-gap-size);
3888
+ border-radius: var(--limel-boolean-input-box-border-radius);
3889
3889
  border: 0.125rem solid;
3890
3890
  border-color: var(--checkbox-unchecked-border-color, rgb(var(--contrast-900)));
3891
3891
  background-color: var(--limel-checkbox-background-color, rgb(var(--contrast-300)));
3892
3892
  }
3893
- .checked .box, .checkbox:has(input[type=checkbox]:checked) .box {
3893
+
3894
+ .checked .box, .boolean-input:has(input[type=checkbox]:checked) .box, .boolean-input:has(input[type=radio]:checked) .box {
3894
3895
  background-color: var(--lime-primary-color, var(--limel-theme-primary-color));
3895
3896
  border-color: var(--lime-primary-color, var(--limel-theme-primary-color));
3896
3897
  }
3898
+
3897
3899
  .disabled .box {
3898
3900
  opacity: 0.4;
3899
3901
  }
3900
- .checkbox:not(.disabled):has(label:hover) .box {
3902
+
3903
+ .boolean-input:not(.disabled):has(label.boolean-input-label:hover) .box {
3901
3904
  will-change: box-shadow;
3902
3905
  box-shadow: var(--button-shadow-hovered);
3903
3906
  }
3904
- .checkbox:not(.disabled):has(label:active) .box {
3907
+
3908
+ .boolean-input:not(.disabled):has(label.boolean-input-label:active) .box {
3905
3909
  will-change: box-shadow;
3906
3910
  box-shadow: var(--button-shadow-pressed);
3907
3911
  }
3912
+
3908
3913
  .box:before {
3909
3914
  transition: color var(--limel-clickable-transition-speed, 0.4s) ease, background-color var(--limel-clickable-transition-speed, 0.4s) ease, box-shadow var(--limel-clickable-transform-speed, 0.4s) ease, transform var(--limel-clickable-transform-speed, 0.4s) var(--limel-clickable-transform-timing-function, ease);
3910
3915
  content: "";
@@ -3912,34 +3917,77 @@ label {
3912
3917
  inset: -0.1875rem;
3913
3918
  border-radius: inherit;
3914
3919
  }
3915
- .checkbox:has(input[type=checkbox]:focus-visible) .box:before {
3920
+
3921
+ .boolean-input:has(input[type=checkbox]:focus-visible) .box:before, .boolean-input:has(input[type=radio]:focus-visible) .box:before {
3916
3922
  will-change: box-shadow;
3917
3923
  box-shadow: var(--shadow-depth-8-focused);
3918
3924
  }
3925
+
3919
3926
  .box:after {
3920
- transition: opacity 0.2s ease, width 0.4s ease;
3927
+ transition: opacity 0.2s ease, width 0.4s ease, box-shadow 0.6s cubic-bezier(0.68, -0.55, 0, 1.87), transform 0.6s cubic-bezier(0.68, -0.55, 0, 1.87);
3921
3928
  content: "";
3922
3929
  position: absolute;
3923
3930
  inset: 0;
3924
3931
  margin: auto;
3925
- height: 0.125rem;
3926
- width: 0.25rem;
3927
3932
  border-radius: 1rem;
3928
3933
  opacity: 0;
3929
3934
  background-color: rgb(var(--color-white));
3930
3935
  }
3936
+
3937
+ .boolean-input:not(.disabled):has(label.boolean-input-label:hover) .box:after {
3938
+ will-change: opacity, box-shadow, transform, width;
3939
+ }
3940
+
3941
+ /**
3942
+ * :::important
3943
+ * The `CheckboxTemplate` can be imported and used in the HTML of
3944
+ * other components, to render a non-functional and decorative checkbox in
3945
+ * their UI. An example of this is the list component.
3946
+ * This means the content of `CheckboxTemplate` will become a part of the
3947
+ * consumer's DOM structure.
3948
+ *
3949
+ * Additionally, the consumer components' also need to import the current `.scss`
3950
+ * file into their own styles file, for the checkbox to be rendered correctly!
3951
+ * This means, if the styles in this file are not "specific" enough,
3952
+ * there is a risk that the consumer component's styles are affected by
3953
+ * our styles here.
3954
+ *
3955
+ * For instance if the consumer has a `<label>` or `<svg>` element,
3956
+ * it might unintentionally inherit styles from the checkbox; unless we
3957
+ * make the such styles more specific here.
3958
+ *
3959
+ * Naturally, we cannot mitigate all sorts of potential styling problems.
3960
+ * The consumer component should be aware of this issue too.
3961
+ * But we can ensure that our styles here both make sense,
3962
+ * are readable, and are as specific as possible to avoid unintended side effects.
3963
+ * :::
3964
+ */
3965
+ /**
3966
+ * @prop --checkbox-unchecked-border-color: Affects the border color of the default state of the checkbox (when it is not checked). Defaults to `--contrast-900`.
3967
+ */
3968
+ :host(limel-checkbox) {
3969
+ min-height: var(--limel-checkbox-min-height, 2.5rem);
3970
+ }
3971
+
3972
+ .box:after {
3973
+ height: 0.125rem;
3974
+ width: 0.25rem;
3975
+ }
3931
3976
  .indeterminate .box:after {
3932
3977
  opacity: 1;
3933
- width: 0.75rem;
3978
+ width: calc(var(--limel-boolean-input-box-size) - 0.5rem);
3934
3979
  }
3935
3980
 
3936
- svg {
3981
+ .checkbox {
3982
+ --limel-boolean-input-box-border-radius: 0.25rem;
3983
+ }
3984
+ .checkbox svg.check-mark {
3937
3985
  position: absolute;
3938
3986
  z-index: 1;
3939
3987
  inset: 0;
3940
3988
  transform: translate3d(-0.125rem, -0.125rem, 0);
3941
- width: 1.25rem;
3942
- height: 1.25rem;
3989
+ width: var(--limel-boolean-input-box-size);
3990
+ height: var(--limel-boolean-input-box-size);
3943
3991
  padding: 0.25rem;
3944
3992
  color: rgb(var(--color-white));
3945
3993
  opacity: 0;
@@ -3948,15 +3996,15 @@ svg {
3948
3996
  stroke-linecap: round;
3949
3997
  stroke-linejoin: round;
3950
3998
  }
3951
- svg path {
3999
+ .checkbox svg.check-mark path {
3952
4000
  stroke-dashoffset: 29.7833;
3953
4001
  stroke-dasharray: 29.7833;
3954
4002
  transition: stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);
3955
4003
  }
3956
- .checkbox:not(.indeterminate):has(input[type=checkbox]:checked) svg {
4004
+ .checkbox:not(.indeterminate):has(input[type=checkbox]:checked) svg.check-mark {
3957
4005
  opacity: 1;
3958
4006
  }
3959
- .checkbox:not(.indeterminate):has(input[type=checkbox]:checked) svg path {
4007
+ .checkbox:not(.indeterminate):has(input[type=checkbox]:checked) svg.check-mark path {
3960
4008
  stroke-dashoffset: 0;
3961
4009
  }
3962
4010
 
@@ -3984,445 +4032,249 @@ limel-dynamic-label {
3984
4032
  will-change: grid-template-rows;
3985
4033
  }
3986
4034
 
3987
- .mdc-touch-target-wrapper {
3988
- display: inline;
3989
- }
3990
-
3991
- .mdc-radio {
3992
- padding: calc((40px - 20px) / 2);
3993
- }
3994
-
3995
- .mdc-radio .mdc-radio__native-control:enabled:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle {
3996
- border-color: rgba(0, 0, 0, 0.54);
3997
- }
3998
-
3999
- .mdc-radio .mdc-radio__native-control:enabled:checked + .mdc-radio__background .mdc-radio__outer-circle {
4000
- border-color: #018786;
4001
- /* @alternate */
4002
- border-color: var(--mdc-theme-secondary, #018786);
4003
- }
4004
-
4005
- .mdc-radio .mdc-radio__native-control:enabled + .mdc-radio__background .mdc-radio__inner-circle {
4006
- border-color: #018786;
4007
- /* @alternate */
4008
- border-color: var(--mdc-theme-secondary, #018786);
4009
- }
4010
-
4011
- .mdc-radio [aria-disabled=true] .mdc-radio__native-control:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle,
4012
- .mdc-radio .mdc-radio__native-control:disabled:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle {
4013
- border-color: rgba(0, 0, 0, 0.38);
4014
- }
4015
-
4016
- .mdc-radio [aria-disabled=true] .mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__outer-circle,
4017
- .mdc-radio .mdc-radio__native-control:disabled:checked + .mdc-radio__background .mdc-radio__outer-circle {
4018
- border-color: rgba(0, 0, 0, 0.38);
4019
- }
4020
-
4021
- .mdc-radio [aria-disabled=true] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle,
4022
- .mdc-radio .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle {
4023
- border-color: rgba(0, 0, 0, 0.38);
4024
- }
4025
-
4026
- .mdc-radio .mdc-radio__background::before {
4027
- background-color: #018786;
4028
- /* @alternate */
4029
- background-color: var(--mdc-theme-secondary, #018786);
4030
- }
4031
-
4032
- .mdc-radio .mdc-radio__background::before {
4033
- top: calc(-1 * (40px - 20px) / 2);
4034
- left: calc(-1 * (40px - 20px) / 2);
4035
- width: 40px;
4036
- height: 40px;
4037
- }
4038
-
4039
- .mdc-radio .mdc-radio__native-control {
4040
- top: calc((40px - 40px) / 2);
4041
- right: calc((40px - 40px) / 2);
4042
- left: calc((40px - 40px) / 2);
4043
- width: 40px;
4044
- height: 40px;
4045
- }
4046
-
4047
- @media screen and (forced-colors: active), (-ms-high-contrast: active) {
4048
- .mdc-radio [aria-disabled=true] .mdc-radio__native-control:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle,
4049
- .mdc-radio .mdc-radio__native-control:disabled:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle {
4050
- border-color: GrayText;
4051
- }
4052
- .mdc-radio [aria-disabled=true] .mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__outer-circle,
4053
- .mdc-radio .mdc-radio__native-control:disabled:checked + .mdc-radio__background .mdc-radio__outer-circle {
4054
- border-color: GrayText;
4055
- }
4056
- .mdc-radio [aria-disabled=true] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle,
4057
- .mdc-radio .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle {
4058
- border-color: GrayText;
4059
- }
4060
- }
4061
- .mdc-radio {
4062
- display: inline-block;
4063
- position: relative;
4064
- flex: 0 0 auto;
4065
- box-sizing: content-box;
4066
- width: 20px;
4067
- height: 20px;
4068
- cursor: pointer;
4069
- /* @alternate */
4070
- will-change: opacity, transform, border-color, color;
4071
- }
4072
-
4073
- .mdc-radio__background {
4074
- display: inline-block;
4075
- position: relative;
4076
- box-sizing: border-box;
4077
- width: 20px;
4078
- height: 20px;
4079
- }
4080
-
4081
- .mdc-radio__background::before {
4082
- position: absolute;
4083
- transform: scale(0, 0);
4084
- border-radius: 50%;
4085
- opacity: 0;
4086
- pointer-events: none;
4087
- content: "";
4088
- transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
4089
- }
4090
-
4091
- .mdc-radio__outer-circle {
4092
- position: absolute;
4093
- top: 0;
4094
- left: 0;
4035
+ /**
4036
+ * Note! This file is exported to `dist/scss/` in the published
4037
+ * node module, for consumer projects to import.
4038
+ * That means this file cannot import from any file that isn't
4039
+ * also exported, keeping the same relative path.
4040
+ *
4041
+ * Or, just don't import anything, that works too.
4042
+ */
4043
+ /**
4044
+ * This can be used on a trigger element that opens a dropdown menu or a popover.
4045
+ */
4046
+ /**
4047
+ * This mixin will mask out the content that is close to
4048
+ * the edges of a scrollable area.
4049
+ * - If the scrollable content has `overflow-y`, use `vertically`
4050
+ * as an argument for `$direction`.
4051
+ - If the scrollable content has `overflow-x`, use `horizontally`
4052
+ * as an argument for `$direction`.
4053
+ *
4054
+ * For the visual effect to work smoothly, we need to make sure that
4055
+ * the size of the fade-out edge effect is the same as the
4056
+ * internal paddings of the scrollable area. Otherwise, content of a
4057
+ * scrollable area that does not have a padding will fade out before
4058
+ * any scrolling has been done.
4059
+ * This is why this mixin already adds paddings, which automatically
4060
+ * default to the size of the fade-out effect.
4061
+ * This size defaults to `1rem`, but to override the size use
4062
+ * `--limel-top-edge-fade-height` & `--limel-bottom-edge-fade-height`
4063
+ * when `vertically` argument is set, and use
4064
+ * `--limel-left-edge-fade-width` & `--limel-right-edge-fade-width`
4065
+ * when `horizontally` argument is set.
4066
+ * Of course you can also programmatically increase and decrease the
4067
+ * size of these variables for each edge, based on the amount of
4068
+ * scrolling that has been done by the user. In this case, make sure
4069
+ * to add a custom padding where the mixin is used, to override
4070
+ * the paddings that are automatically added by the mixin in the
4071
+ * compiled CSS code.
4072
+ */
4073
+ /**
4074
+ * This mixin will add an animated underline to the bottom of an `a` elements.
4075
+ * Note that you may need to add `all: unset;` –depending on your use case–
4076
+ * before using this mixin.
4077
+ */
4078
+ /**
4079
+ * This mixin creates a cross-browser font stack.
4080
+ * - `sans-serif` can be used for the UI of the components.
4081
+ * - `monospace` can be used for code.
4082
+ *
4083
+ * ⚠️ If we change the font stacks, we need to update
4084
+ * 1. the consumer documentation in `README.md`, and
4085
+ * 2. the CSS variables of `--kompendium-example-font-family`
4086
+ * in the `<style>` tag of `index.html`.
4087
+ */
4088
+ /**
4089
+ * This mixin is a hack, using old CSS syntax
4090
+ * to enable you to truncate a piece of text,
4091
+ * after a certain number of lines.
4092
+ */
4093
+ /**
4094
+ * The breakpoints below are used to create responsive designs
4095
+ * in Lime's products. Therefore, they are here to get distributed
4096
+ * to all components in other private repos, which rely on this `mixins`
4097
+ * file, to create consistent styles.
4098
+ *
4099
+ * :::important
4100
+ * In very rare cases you should used media queries!
4101
+ * Nowadays, there are many better ways of achieving responsive design
4102
+ * without media queries. For example, using CSS Grid, Flexbox, and their features.
4103
+ * :::
4104
+ */
4105
+ /**
4106
+ * Media query mixins for responsive design based on screen width.
4107
+ * Note that these mixins do not detect the device type!
4108
+ */
4109
+ *,
4110
+ *:before,
4111
+ *:after {
4095
4112
  box-sizing: border-box;
4096
- width: 100%;
4097
- height: 100%;
4098
- border-width: 2px;
4099
- border-style: solid;
4100
- border-radius: 50%;
4101
- transition: border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
4102
4113
  }
4103
4114
 
4104
- .mdc-radio__inner-circle {
4105
- position: absolute;
4106
- top: 0;
4107
- left: 0;
4108
- box-sizing: border-box;
4115
+ .boolean-input {
4116
+ --limel-boolean-input-box-size: 1.25rem;
4117
+ --limel-boolean-input-gap-size: 0.5rem;
4118
+ position: relative;
4119
+ isolation: isolate;
4120
+ display: flex;
4121
+ align-items: center;
4122
+ min-height: var(--limel-checkbox-min-height, 2.5rem);
4109
4123
  width: 100%;
4110
- height: 100%;
4111
- transform: scale(0, 0);
4112
- border-width: 10px;
4113
- border-style: solid;
4114
- border-radius: 50%;
4115
- transition: transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
4116
4124
  }
4117
4125
 
4118
- .mdc-radio__native-control {
4126
+ .boolean-input input[type=checkbox],
4127
+ .boolean-input input[type=radio] {
4119
4128
  position: absolute;
4120
- margin: 0;
4129
+ width: 0;
4130
+ height: 0;
4131
+ margin: -1px;
4121
4132
  padding: 0;
4122
- opacity: 0;
4123
- cursor: inherit;
4124
- z-index: 1;
4125
- }
4126
-
4127
- .mdc-radio--touch {
4128
- margin-top: 4px;
4129
- margin-bottom: 4px;
4130
- margin-right: 4px;
4131
- margin-left: 4px;
4132
- }
4133
-
4134
- .mdc-radio--touch .mdc-radio__native-control {
4135
- top: calc((40px - 48px) / 2);
4136
- right: calc((40px - 48px) / 2);
4137
- left: calc((40px - 48px) / 2);
4138
- width: 48px;
4139
- height: 48px;
4140
- }
4141
-
4142
- .mdc-radio__native-control:checked + .mdc-radio__background,
4143
- .mdc-radio__native-control:disabled + .mdc-radio__background {
4144
- transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
4145
- }
4146
-
4147
- .mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__outer-circle,
4148
- .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__outer-circle {
4149
- transition: border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
4150
- }
4151
-
4152
- .mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__inner-circle,
4153
- .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle {
4154
- transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
4133
+ border: 0;
4134
+ overflow: hidden;
4135
+ clip: rect(0, 0, 0, 0);
4136
+ clip-path: inset(50%);
4137
+ white-space: nowrap;
4138
+ -webkit-appearance: none;
4139
+ -moz-appearance: none;
4140
+ appearance: none;
4155
4141
  }
4156
4142
 
4157
- .mdc-radio--disabled {
4158
- cursor: default;
4159
- pointer-events: none;
4143
+ label.boolean-input-label {
4144
+ min-width: var(--limel-boolean-input-box-size);
4145
+ min-height: var(--limel-boolean-input-box-size);
4146
+ padding-top: 0.125rem;
4147
+ cursor: pointer;
4148
+ position: relative;
4149
+ width: 100%;
4150
+ font-size: var(--limel-theme-default-small-font-size);
4151
+ color: var(--limel-theme-text-primary-on-background-color);
4152
+ padding-left: calc(var(--limel-boolean-input-box-size) + var(--limel-boolean-input-gap-size));
4160
4153
  }
4161
4154
 
4162
- .mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__inner-circle {
4163
- transform: scale(0.5);
4164
- transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
4155
+ .disabled:not([readonly]):not([readonly=true]) label.boolean-input-label {
4156
+ cursor: not-allowed;
4157
+ color: var(--limel-theme-text-disabled-color);
4165
4158
  }
4166
4159
 
4167
- .mdc-radio__native-control:disabled + .mdc-radio__background,
4168
- [aria-disabled=true] .mdc-radio__native-control + .mdc-radio__background {
4169
- cursor: default;
4160
+ .required label.boolean-input-label:after {
4161
+ margin-left: 0.0625rem;
4162
+ content: "*";
4170
4163
  }
4171
4164
 
4172
- .mdc-radio__native-control:focus + .mdc-radio__background::before {
4173
- transform: scale(1);
4174
- opacity: 0.12;
4175
- transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
4165
+ .invalid:not(.readonly) label.boolean-input-label {
4166
+ color: var(--limel-theme-error-text-color);
4176
4167
  }
4177
4168
 
4178
- .mdc-radio {
4179
- --mdc-ripple-fg-size: 0;
4180
- --mdc-ripple-left: 0;
4181
- --mdc-ripple-top: 0;
4182
- --mdc-ripple-fg-scale: 1;
4183
- --mdc-ripple-fg-translate-end: 0;
4184
- --mdc-ripple-fg-translate-start: 0;
4185
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
4186
- will-change: transform, opacity;
4169
+ :host(limel-checkbox.hide-label) label.boolean-input-label, .hide-label label.boolean-input-label {
4170
+ overflow: hidden;
4171
+ white-space: nowrap;
4172
+ text-overflow: ellipsis;
4173
+ opacity: 0;
4174
+ width: var(--limel-boolean-input-box-size);
4187
4175
  }
4188
4176
 
4189
- .mdc-radio .mdc-radio__ripple::before,
4190
- .mdc-radio .mdc-radio__ripple::after {
4177
+ .box {
4191
4178
  position: absolute;
4192
- border-radius: 50%;
4193
- opacity: 0;
4194
4179
  pointer-events: none;
4195
- content: "";
4196
- }
4197
-
4198
- .mdc-radio .mdc-radio__ripple::before {
4199
- transition: opacity 15ms linear, background-color 15ms linear;
4200
- z-index: 1;
4201
- /* @alternate */
4202
- z-index: var(--mdc-ripple-z-index, 1);
4203
- }
4204
-
4205
- .mdc-radio .mdc-radio__ripple::after {
4206
- z-index: 0;
4207
- /* @alternate */
4208
- z-index: var(--mdc-ripple-z-index, 0);
4209
- }
4210
-
4211
- .mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::before {
4212
- transform: scale(var(--mdc-ripple-fg-scale, 1));
4213
- }
4214
-
4215
- .mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::after {
4216
- top: 0;
4217
- /* @noflip */ /*rtl:ignore*/
4218
- left: 0;
4219
- transform: scale(0);
4220
- transform-origin: center center;
4221
- }
4222
-
4223
- .mdc-radio.mdc-ripple-upgraded--unbounded .mdc-radio__ripple::after {
4224
- top: var(--mdc-ripple-top, 0);
4225
- /* @noflip */ /*rtl:ignore*/
4226
- left: var(--mdc-ripple-left, 0);
4227
- }
4228
-
4229
- .mdc-radio.mdc-ripple-upgraded--foreground-activation .mdc-radio__ripple::after {
4230
- animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards;
4231
- }
4232
-
4233
- .mdc-radio.mdc-ripple-upgraded--foreground-deactivation .mdc-radio__ripple::after {
4234
- animation: mdc-ripple-fg-opacity-out 150ms;
4235
- transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
4236
- }
4237
-
4238
- .mdc-radio .mdc-radio__ripple::before,
4239
- .mdc-radio .mdc-radio__ripple::after {
4240
- top: calc(50% - 50%);
4241
- /* @noflip */ /*rtl:ignore*/
4242
- left: calc(50% - 50%);
4243
- width: 100%;
4244
- height: 100%;
4180
+ transition: border-color 0.4s ease 0.2s, background-color 0.2s ease, box-shadow var(--limel-clickable-transform-speed, 0.4s) ease;
4181
+ display: inline-block;
4182
+ vertical-align: middle;
4183
+ width: var(--limel-boolean-input-box-size);
4184
+ height: var(--limel-boolean-input-box-size);
4185
+ margin-right: var(--limel-boolean-input-gap-size);
4186
+ border-radius: var(--limel-boolean-input-box-border-radius);
4187
+ border: 0.125rem solid;
4188
+ border-color: var(--checkbox-unchecked-border-color, rgb(var(--contrast-900)));
4189
+ background-color: var(--limel-checkbox-background-color, rgb(var(--contrast-300)));
4245
4190
  }
4246
4191
 
4247
- .mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::before,
4248
- .mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::after {
4249
- top: var(--mdc-ripple-top, calc(50% - 50%));
4250
- /* @noflip */ /*rtl:ignore*/
4251
- left: var(--mdc-ripple-left, calc(50% - 50%));
4252
- width: var(--mdc-ripple-fg-size, 100%);
4253
- height: var(--mdc-ripple-fg-size, 100%);
4192
+ .checked .box, .boolean-input:has(input[type=checkbox]:checked) .box, .boolean-input:has(input[type=radio]:checked) .box {
4193
+ background-color: var(--lime-primary-color, var(--limel-theme-primary-color));
4194
+ border-color: var(--lime-primary-color, var(--limel-theme-primary-color));
4254
4195
  }
4255
4196
 
4256
- .mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::after {
4257
- width: var(--mdc-ripple-fg-size, 100%);
4258
- height: var(--mdc-ripple-fg-size, 100%);
4197
+ .disabled .box {
4198
+ opacity: 0.4;
4259
4199
  }
4260
4200
 
4261
- .mdc-radio .mdc-radio__ripple::before, .mdc-radio .mdc-radio__ripple::after {
4262
- background-color: #018786;
4263
- /* @alternate */
4264
- background-color: var(--mdc-ripple-color, var(--mdc-theme-secondary, #018786));
4201
+ .boolean-input:not(.disabled):has(label.boolean-input-label:hover) .box {
4202
+ will-change: box-shadow;
4203
+ box-shadow: var(--button-shadow-hovered);
4265
4204
  }
4266
4205
 
4267
- .mdc-radio:hover .mdc-radio__ripple::before, .mdc-radio.mdc-ripple-surface--hover .mdc-radio__ripple::before {
4268
- opacity: 0.04;
4269
- /* @alternate */
4270
- opacity: var(--mdc-ripple-hover-opacity, 0.04);
4206
+ .boolean-input:not(.disabled):has(label.boolean-input-label:active) .box {
4207
+ will-change: box-shadow;
4208
+ box-shadow: var(--button-shadow-pressed);
4271
4209
  }
4272
4210
 
4273
- .mdc-radio.mdc-ripple-upgraded--background-focused .mdc-radio__ripple::before, .mdc-radio:not(.mdc-ripple-upgraded):focus .mdc-radio__ripple::before {
4274
- transition-duration: 75ms;
4275
- opacity: 0.12;
4276
- /* @alternate */
4277
- opacity: var(--mdc-ripple-focus-opacity, 0.12);
4211
+ .box:before {
4212
+ transition: color var(--limel-clickable-transition-speed, 0.4s) ease, background-color var(--limel-clickable-transition-speed, 0.4s) ease, box-shadow var(--limel-clickable-transform-speed, 0.4s) ease, transform var(--limel-clickable-transform-speed, 0.4s) var(--limel-clickable-transform-timing-function, ease);
4213
+ content: "";
4214
+ position: absolute;
4215
+ inset: -0.1875rem;
4216
+ border-radius: inherit;
4278
4217
  }
4279
4218
 
4280
- .mdc-radio:not(.mdc-ripple-upgraded) .mdc-radio__ripple::after {
4281
- transition: opacity 150ms linear;
4219
+ .boolean-input:has(input[type=checkbox]:focus-visible) .box:before, .boolean-input:has(input[type=radio]:focus-visible) .box:before {
4220
+ will-change: box-shadow;
4221
+ box-shadow: var(--shadow-depth-8-focused);
4282
4222
  }
4283
4223
 
4284
- .mdc-radio:not(.mdc-ripple-upgraded):active .mdc-radio__ripple::after {
4285
- transition-duration: 75ms;
4286
- opacity: 0.12;
4287
- /* @alternate */
4288
- opacity: var(--mdc-ripple-press-opacity, 0.12);
4224
+ .box:after {
4225
+ transition: opacity 0.2s ease, width 0.4s ease, box-shadow 0.6s cubic-bezier(0.68, -0.55, 0, 1.87), transform 0.6s cubic-bezier(0.68, -0.55, 0, 1.87);
4226
+ content: "";
4227
+ position: absolute;
4228
+ inset: 0;
4229
+ margin: auto;
4230
+ border-radius: 1rem;
4231
+ opacity: 0;
4232
+ background-color: rgb(var(--color-white));
4289
4233
  }
4290
4234
 
4291
- .mdc-radio.mdc-ripple-upgraded {
4292
- --mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12);
4235
+ .boolean-input:not(.disabled):has(label.boolean-input-label:hover) .box:after {
4236
+ will-change: opacity, box-shadow, transform, width;
4293
4237
  }
4294
4238
 
4295
- .mdc-radio.mdc-ripple-upgraded .mdc-radio__background::before, .mdc-radio.mdc-ripple-upgraded--background-focused .mdc-radio__background::before {
4296
- content: none;
4239
+ /**
4240
+ * :::important
4241
+ * The `RadioButtonTemplate` can be imported and used in the HTML of
4242
+ * other components, to render a non-functional and decorative radio button in
4243
+ * their UI. An example of this is the list component.
4244
+ * This means the content of `RadioButtonTemplate` will become a part of the
4245
+ * consumer's DOM structure.
4246
+ *
4247
+ * Additionally, the consumer components' also need to import the current `.scss`
4248
+ * file into their own styles file, for the radio button to be rendered correctly!
4249
+ * This means, if the styles in this file are not "specific" enough,
4250
+ * there is a risk that the consumer component's styles are affected by
4251
+ * our styles here.
4252
+ *
4253
+ * For instance if the consumer has a `<label>`,
4254
+ * it might unintentionally inherit styles from the radio button; unless we
4255
+ * make the such styles more specific here.
4256
+ *
4257
+ * Naturally, we cannot mitigate all sorts of potential styling problems.
4258
+ * The consumer component should be aware of this issue too.
4259
+ * But we can ensure that our styles here both make sense,
4260
+ * are readable, and are as specific as possible to avoid unintended side effects.
4261
+ * :::
4262
+ */
4263
+ .radio-button {
4264
+ --limel-boolean-input-box-border-radius: var(
4265
+ --limel-boolean-input-box-size
4266
+ );
4297
4267
  }
4298
4268
 
4299
- .mdc-radio__ripple {
4300
- position: absolute;
4301
- top: 0;
4302
- left: 0;
4269
+ .box:after {
4303
4270
  width: 100%;
4304
4271
  height: 100%;
4305
- pointer-events: none;
4306
- }
4307
-
4308
- .mdc-form-field {
4309
- -moz-osx-font-smoothing: grayscale;
4310
- -webkit-font-smoothing: antialiased;
4311
- font-family: Roboto, sans-serif;
4312
- /* @alternate */
4313
- font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));
4314
- font-size: 0.875rem;
4315
- /* @alternate */
4316
- font-size: var(--mdc-typography-body2-font-size, 0.875rem);
4317
- line-height: 1.25rem;
4318
- /* @alternate */
4319
- line-height: var(--mdc-typography-body2-line-height, 1.25rem);
4320
- font-weight: 400;
4321
- /* @alternate */
4322
- font-weight: var(--mdc-typography-body2-font-weight, 400);
4323
- letter-spacing: 0.0178571429em;
4324
- /* @alternate */
4325
- letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em);
4326
- text-decoration: inherit;
4327
- /* @alternate */
4328
- text-decoration: var(--mdc-typography-body2-text-decoration, inherit);
4329
- text-transform: inherit;
4330
- /* @alternate */
4331
- text-transform: var(--mdc-typography-body2-text-transform, inherit);
4332
- color: rgba(0, 0, 0, 0.87);
4333
- /* @alternate */
4334
- color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87));
4335
- display: inline-flex;
4336
- align-items: center;
4337
- vertical-align: middle;
4338
- }
4339
- .mdc-form-field > label {
4340
- /* @noflip */ /*rtl:ignore*/
4341
- margin-left: 0;
4342
- /* @noflip */ /*rtl:ignore*/
4343
- margin-right: auto;
4344
- /* @noflip */ /*rtl:ignore*/
4345
- padding-left: 4px;
4346
- /* @noflip */ /*rtl:ignore*/
4347
- padding-right: 0;
4348
- order: 0;
4349
- }
4350
- [dir=rtl] .mdc-form-field > label, .mdc-form-field > label[dir=rtl] {
4351
- /*rtl:begin:ignore*/
4352
- /* @noflip */ /*rtl:ignore*/
4353
- margin-left: auto;
4354
- /* @noflip */ /*rtl:ignore*/
4355
- margin-right: 0;
4356
- /*rtl:end:ignore*/
4357
- }
4358
-
4359
- [dir=rtl] .mdc-form-field > label, .mdc-form-field > label[dir=rtl] {
4360
- /*rtl:begin:ignore*/
4361
- /* @noflip */ /*rtl:ignore*/
4362
- padding-left: 0;
4363
- /* @noflip */ /*rtl:ignore*/
4364
- padding-right: 4px;
4365
- /*rtl:end:ignore*/
4366
- }
4367
-
4368
- .mdc-form-field--nowrap > label {
4369
- text-overflow: ellipsis;
4370
- overflow: hidden;
4371
- white-space: nowrap;
4372
- }
4373
-
4374
- .mdc-form-field--align-end > label {
4375
- /* @noflip */ /*rtl:ignore*/
4376
- margin-left: auto;
4377
- /* @noflip */ /*rtl:ignore*/
4378
- margin-right: 0;
4379
- /* @noflip */ /*rtl:ignore*/
4380
- padding-left: 0;
4381
- /* @noflip */ /*rtl:ignore*/
4382
- padding-right: 4px;
4383
- order: -1;
4384
- }
4385
- [dir=rtl] .mdc-form-field--align-end > label, .mdc-form-field--align-end > label[dir=rtl] {
4386
- /*rtl:begin:ignore*/
4387
- /* @noflip */ /*rtl:ignore*/
4388
- margin-left: 0;
4389
- /* @noflip */ /*rtl:ignore*/
4390
- margin-right: auto;
4391
- /*rtl:end:ignore*/
4392
- }
4393
-
4394
- [dir=rtl] .mdc-form-field--align-end > label, .mdc-form-field--align-end > label[dir=rtl] {
4395
- /*rtl:begin:ignore*/
4396
- /* @noflip */ /*rtl:ignore*/
4397
- padding-left: 4px;
4398
- /* @noflip */ /*rtl:ignore*/
4399
- padding-right: 0;
4400
- /*rtl:end:ignore*/
4401
- }
4402
-
4403
- .mdc-form-field--space-between {
4404
- justify-content: space-between;
4405
- }
4406
- .mdc-form-field--space-between > label {
4407
- margin: 0;
4408
- }
4409
- [dir=rtl] .mdc-form-field--space-between > label, .mdc-form-field--space-between > label[dir=rtl] {
4410
- /*rtl:begin:ignore*/
4411
- margin: 0;
4412
- /*rtl:end:ignore*/
4413
- }
4414
-
4415
- .mdc-form-field {
4416
- display: flex;
4417
- }
4418
- .mdc-form-field .mdc-radio .mdc-radio__native-control:enabled + .mdc-radio__background .mdc-radio__inner-circle {
4419
- border-color: #6200ee;
4420
- /* @alternate */
4421
- border-color: var(--mdc-theme-primary, #6200ee);
4272
+ border-radius: 50%;
4422
4273
  }
4423
-
4424
- .mdc-radio .mdc-radio__native-control:enabled:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle {
4425
- border-color: var(--mdc-checkbox-unchecked-color);
4274
+ .boolean-input:has(input[type=radio]:checked) .box:after {
4275
+ opacity: 1;
4276
+ transform: scale(0.6);
4277
+ box-shadow: var(--shadow-depth-8);
4426
4278
  }
4427
4279
 
4428
4280
  /**