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