@thalassic/themes 0.8.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/package.json +1 -1
  2. package/themes/thalassic/components/_chip-input.scss +65 -0
  3. package/themes/thalassic/components/_file-uploader.scss +147 -0
  4. package/themes/thalassic/components/_menu.scss +133 -0
  5. package/themes/thalassic/components/_password.scss +4 -2
  6. package/themes/thalassic/components/chip/_chip-color.scss +36 -0
  7. package/themes/thalassic/components/chip/_chip-control.scss +51 -0
  8. package/themes/thalassic/components/chip/_chip-size.scss +60 -0
  9. package/themes/thalassic/components/chip/_chip-variant.scss +17 -0
  10. package/themes/thalassic/components/chip/_chip.scss +10 -0
  11. package/themes/thalassic/components/chip/_index.scss +5 -0
  12. package/themes/thalassic/components/form/_index.scss +0 -3
  13. package/themes/thalassic/components/{form → form-control-group}/_form-control-group-size.scss +0 -1
  14. package/themes/thalassic/components/form-control-group/_form-control-group.scss +103 -0
  15. package/themes/thalassic/components/form-control-group/_index.scss +3 -0
  16. package/themes/thalassic/components/index.scss +7 -0
  17. package/themes/thalassic/components/textarea/_index.scss +2 -0
  18. package/themes/thalassic/components/textarea/_textarea-size.scss +15 -0
  19. package/themes/thalassic/components/textarea/_textarea.scss +7 -0
  20. package/themes/thalassic/components/toggle-group/_index.scss +3 -0
  21. package/themes/thalassic/components/toggle-group/_toggle-group-color.scss +36 -0
  22. package/themes/thalassic/components/toggle-group/_toggle-group-size.scss +31 -0
  23. package/themes/thalassic/components/toggle-group/_toggle-group.scss +106 -0
  24. package/themes/thalassic/components/form/_form-control-group.scss +0 -59
  25. /package/themes/thalassic/components/{form → form-control-group}/_form-control-addon.scss +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thalassic/themes",
3
- "version": "0.8.2",
3
+ "version": "0.10.0",
4
4
  "license": "MIT",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
@@ -0,0 +1,65 @@
1
+ tls-chip-input.tls-form-control {
2
+ --tls-chip-input-width: 16rem;
3
+
4
+ display: inline-flex;
5
+ flex-wrap: wrap;
6
+ align-items: center;
7
+ gap: var(--spacing-1);
8
+
9
+ width: var(--tls-chip-input-width);
10
+ height: auto;
11
+ min-height: var(--tls-form-control-height);
12
+ padding-inline: var(--tls-form-control-padding-inline);
13
+ padding-block: var(--spacing-1);
14
+
15
+ &.tls-form-control--fluid {
16
+ --tls-chip-input-width: 100%;
17
+ }
18
+
19
+ &:has(.tls-chip-input__field:focus) {
20
+ border-color: var(--color-primary);
21
+
22
+ box-shadow: 0 0 3px -1px var(--color-primary);
23
+ }
24
+
25
+ .tls-chip-input__field {
26
+ flex: 1 1 auto;
27
+ min-width: 4rem;
28
+
29
+ padding: 0;
30
+
31
+ border: none;
32
+ background: transparent;
33
+ color: inherit;
34
+ font: inherit;
35
+ outline: none;
36
+
37
+ &::placeholder {
38
+ color: var(--color-outline);
39
+ }
40
+ }
41
+
42
+ &:not(.tls-form-control--disabled).tls-form-control--touched.tls-form-control--invalid {
43
+ .tls-chip-input__field::placeholder {
44
+ color: var(--color-danger);
45
+ }
46
+ }
47
+
48
+ .tls-chip-input__remove {
49
+ display: inline-flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+
53
+ padding: 0;
54
+
55
+ border: none;
56
+ background: none;
57
+ color: inherit;
58
+ line-height: 1;
59
+ cursor: pointer;
60
+
61
+ &:disabled {
62
+ cursor: not-allowed;
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,147 @@
1
+ @use '../mixins' as mixins;
2
+
3
+ .tls-file-uploader {
4
+ --tls-file-uploader-border-color: var(--color-outline-variant);
5
+ --tls-file-uploader-border-radius: var(--radius-md);
6
+
7
+ display: inline-flex;
8
+ flex-direction: column;
9
+ gap: var(--spacing-2);
10
+
11
+ width: 18rem;
12
+
13
+ &--fluid {
14
+ width: 100%;
15
+ }
16
+
17
+ &__input {
18
+ display: none;
19
+ }
20
+
21
+ &__drop-zone {
22
+ display: flex;
23
+ flex-direction: column;
24
+ align-items: center;
25
+ justify-content: center;
26
+
27
+ padding: var(--spacing-6);
28
+
29
+ border: 2px dashed var(--tls-file-uploader-border-color);
30
+ border-radius: var(--tls-file-uploader-border-radius);
31
+ color: var(--color-on-surface-variant);
32
+
33
+ cursor: pointer;
34
+ user-select: none;
35
+
36
+ transition:
37
+ border-color var(--motion-fast) var(--motion-ease-in-out),
38
+ background-color var(--motion-fast) var(--motion-ease-in-out);
39
+
40
+ &:focus-visible {
41
+ @include mixins.focus-ring;
42
+ }
43
+
44
+ &:hover:not(&--disabled),
45
+ &--dragging {
46
+ --tls-file-uploader-border-color: var(--color-primary);
47
+
48
+ background-color: color-mix(in srgb, var(--color-primary) 8%, transparent);
49
+ }
50
+
51
+ &--rejected {
52
+ --tls-file-uploader-border-color: var(--color-danger);
53
+
54
+ color: var(--color-danger);
55
+ background-color: color-mix(in srgb, var(--color-danger) 8%, transparent);
56
+ }
57
+
58
+ &--disabled {
59
+ cursor: not-allowed;
60
+ opacity: 0.5;
61
+ }
62
+ }
63
+
64
+ &__label {
65
+ pointer-events: none;
66
+
67
+ font-size: var(--font-body-medium-size);
68
+ text-align: center;
69
+ }
70
+
71
+ &__hint {
72
+ pointer-events: none;
73
+
74
+ margin-top: var(--spacing-1);
75
+
76
+ font-size: var(--font-body-small-size);
77
+ text-align: center;
78
+ color: var(--color-on-surface-variant);
79
+ }
80
+
81
+ &__file-list {
82
+ display: flex;
83
+ flex-direction: column;
84
+ gap: var(--spacing-1);
85
+
86
+ margin: 0;
87
+ padding: 0;
88
+
89
+ list-style: none;
90
+ }
91
+
92
+ &__file {
93
+ display: flex;
94
+ align-items: center;
95
+ gap: var(--spacing-2);
96
+
97
+ padding: var(--spacing-1) var(--spacing-2);
98
+
99
+ border-radius: var(--radius-sm);
100
+ background-color: var(--color-surface-container);
101
+ }
102
+
103
+ &__file-name {
104
+ flex: 1;
105
+ overflow: hidden;
106
+ text-overflow: ellipsis;
107
+ white-space: nowrap;
108
+
109
+ font-size: var(--font-body-small-size);
110
+ color: var(--color-on-surface);
111
+ }
112
+
113
+ &__file-remove {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+
118
+ flex-shrink: 0;
119
+ padding: 0;
120
+
121
+ border: none;
122
+ background: none;
123
+ color: var(--color-on-surface-variant);
124
+ line-height: 1;
125
+ cursor: pointer;
126
+
127
+ transition: color var(--motion-fast) var(--motion-ease-in-out);
128
+
129
+ &:not(:disabled):hover {
130
+ color: var(--color-danger);
131
+ }
132
+
133
+ &:disabled {
134
+ cursor: not-allowed;
135
+ }
136
+ }
137
+
138
+ &--disabled {
139
+ .tls-file-uploader__drop-zone {
140
+ pointer-events: none;
141
+ }
142
+ }
143
+
144
+ &:not(.tls-file-uploader--disabled).tls-file-uploader--touched.tls-file-uploader--invalid {
145
+ --tls-file-uploader-border-color: var(--color-danger);
146
+ }
147
+ }
@@ -0,0 +1,133 @@
1
+ .tls-menu {
2
+ --tls-menu-min-width: 160px;
3
+ --tls-menu-padding-block: var(--spacing-1);
4
+
5
+ --tls-menu-border-radius: var(--radius-md);
6
+ --tls-menu-border-width: 1px;
7
+ --tls-menu-border-color: var(--color-outline-variant);
8
+
9
+ --tls-menu-background: var(--color-surface-container-lowest);
10
+ --tls-menu-shadow: var(--shadow-md);
11
+
12
+ --tls-menu-item-color: var(--color-on-surface);
13
+ --tls-menu-item-background: transparent;
14
+ --tls-menu-item-background-hover: var(--color-surface-container-low);
15
+ --tls-menu-item-padding-block: var(--spacing-2);
16
+ --tls-menu-item-padding-inline: var(--spacing-4);
17
+ --tls-menu-item-icon-size: 14px;
18
+
19
+ --tls-menu-label-color: var(--color-outline);
20
+ --tls-menu-label-padding-block: var(--spacing-2);
21
+ --tls-menu-label-padding-inline: var(--spacing-4);
22
+
23
+ --tls-menu-divider-color: var(--color-outline-variant);
24
+ --tls-menu-divider-margin-block: var(--spacing-1);
25
+
26
+ min-width: var(--tls-menu-min-width);
27
+ padding-block: var(--tls-menu-padding-block);
28
+
29
+ background-color: var(--tls-menu-background);
30
+
31
+ border: var(--tls-menu-border-width) solid var(--tls-menu-border-color);
32
+ border-radius: var(--tls-menu-border-radius);
33
+
34
+ box-shadow: var(--tls-menu-shadow);
35
+
36
+ overflow: hidden;
37
+
38
+ &__item {
39
+ width: 100%;
40
+ padding-block: var(--tls-menu-item-padding-block);
41
+ padding-inline: var(--tls-menu-item-padding-inline);
42
+
43
+ display: flex;
44
+ align-items: center;
45
+ gap: var(--spacing-2);
46
+
47
+ appearance: none;
48
+ border: none;
49
+ text-align: left;
50
+ cursor: pointer;
51
+ white-space: nowrap;
52
+
53
+ color: var(--tls-menu-item-color);
54
+ background-color: var(--tls-menu-item-background);
55
+
56
+ font-size: var(--font-body-medium-size);
57
+ font-weight: var(--font-body-medium-weight);
58
+ line-height: var(--font-body-medium-line-height);
59
+ letter-spacing: var(--font-body-medium-letter-spacing);
60
+
61
+ transition: background-color var(--motion-fast) var(--motion-ease-in-out);
62
+
63
+ &:hover:not(:disabled) {
64
+ background-color: var(--tls-menu-item-background-hover);
65
+ }
66
+
67
+ &:focus-visible {
68
+ outline: none;
69
+ background-color: var(--tls-menu-item-background-hover);
70
+ }
71
+
72
+ &:disabled {
73
+ opacity: 0.4;
74
+ cursor: not-allowed;
75
+ }
76
+ }
77
+
78
+ &__item-icon {
79
+ flex-shrink: 0;
80
+
81
+ // compound selector beats .tls-icon's width/height: auto regardless of cascade order
82
+ &.tls-icon {
83
+ width: var(--tls-menu-item-icon-size);
84
+ height: var(--tls-menu-item-icon-size);
85
+ }
86
+
87
+ svg {
88
+ display: block;
89
+ width: 100%;
90
+ height: 100%;
91
+ }
92
+ }
93
+
94
+ &__item-label {
95
+ flex: 1;
96
+ }
97
+
98
+ &__item-shortcut {
99
+ margin-inline-start: auto;
100
+ color: var(--tls-menu-label-color);
101
+
102
+ font-size: var(--font-label-small-size);
103
+ font-weight: var(--font-label-small-weight);
104
+ line-height: var(--font-label-small-line-height);
105
+ letter-spacing: var(--font-label-small-letter-spacing);
106
+
107
+ font-family: inherit;
108
+ background: none;
109
+ border: none;
110
+ padding: 0;
111
+ }
112
+
113
+ &__label {
114
+ display: block;
115
+ padding-block: var(--tls-menu-label-padding-block);
116
+ padding-inline: var(--tls-menu-label-padding-inline);
117
+
118
+ color: var(--tls-menu-label-color);
119
+
120
+ font-size: var(--font-label-small-size);
121
+ font-weight: var(--font-label-small-weight);
122
+ line-height: var(--font-label-small-line-height);
123
+ letter-spacing: var(--font-label-small-letter-spacing);
124
+
125
+ text-transform: uppercase;
126
+ }
127
+
128
+ &__divider {
129
+ margin-block: var(--tls-menu-divider-margin-block);
130
+ border: none;
131
+ border-top: 1px solid var(--tls-menu-divider-color);
132
+ }
133
+ }
@@ -1,5 +1,7 @@
1
1
  .tls-password {
2
- display: inline-flex;
2
+ // The layout/border now lives on the inner tls-form-control-group; the host is
3
+ // transparent so size/fluid set on the group resolve against the password's parent.
4
+ display: contents;
3
5
 
4
6
  .tls-password-toggle {
5
7
  display: grid;
@@ -15,4 +17,4 @@
15
17
  }
16
18
  }
17
19
  }
18
- }
20
+ }
@@ -0,0 +1,36 @@
1
+ .tls-chip {
2
+ &.tls-chip--primary {
3
+ --tls-chip-color: var(--color-primary);
4
+ --tls-chip-on-color: var(--color-on-primary);
5
+ }
6
+
7
+ &.tls-chip--secondary {
8
+ --tls-chip-color: var(--color-secondary);
9
+ --tls-chip-on-color: var(--color-on-secondary);
10
+ }
11
+
12
+ &.tls-chip--tertiary {
13
+ --tls-chip-color: var(--color-tertiary);
14
+ --tls-chip-on-color: var(--color-on-tertiary);
15
+ }
16
+
17
+ &.tls-chip--success {
18
+ --tls-chip-color: var(--color-success);
19
+ --tls-chip-on-color: var(--color-on-success);
20
+ }
21
+
22
+ &.tls-chip--info {
23
+ --tls-chip-color: var(--color-info);
24
+ --tls-chip-on-color: var(--color-on-info);
25
+ }
26
+
27
+ &.tls-chip--warning {
28
+ --tls-chip-color: var(--color-warning);
29
+ --tls-chip-on-color: var(--color-on-warning);
30
+ }
31
+
32
+ &.tls-chip--danger {
33
+ --tls-chip-color: var(--color-danger);
34
+ --tls-chip-on-color: var(--color-on-danger);
35
+ }
36
+ }
@@ -0,0 +1,51 @@
1
+ .tls-chip {
2
+ &.tls-chip--control {
3
+ cursor: pointer;
4
+ }
5
+
6
+ &.tls-chip--checked {
7
+ background-color: var(--tls-chip-color);
8
+ color: var(--tls-chip-on-color);
9
+ border-color: var(--tls-chip-color);
10
+ }
11
+
12
+ &.tls-chip--checked-primary {
13
+ --tls-chip-color: var(--color-primary);
14
+ --tls-chip-on-color: var(--color-on-primary);
15
+ }
16
+
17
+ &.tls-chip--checked-secondary {
18
+ --tls-chip-color: var(--color-secondary);
19
+ --tls-chip-on-color: var(--color-on-secondary);
20
+ }
21
+
22
+ &.tls-chip--checked-tertiary {
23
+ --tls-chip-color: var(--color-tertiary);
24
+ --tls-chip-on-color: var(--color-on-tertiary);
25
+ }
26
+
27
+ &.tls-chip--checked-success {
28
+ --tls-chip-color: var(--color-success);
29
+ --tls-chip-on-color: var(--color-on-success);
30
+ }
31
+
32
+ &.tls-chip--checked-info {
33
+ --tls-chip-color: var(--color-info);
34
+ --tls-chip-on-color: var(--color-on-info);
35
+ }
36
+
37
+ &.tls-chip--checked-warning {
38
+ --tls-chip-color: var(--color-warning);
39
+ --tls-chip-on-color: var(--color-on-warning);
40
+ }
41
+
42
+ &.tls-chip--checked-danger {
43
+ --tls-chip-color: var(--color-danger);
44
+ --tls-chip-on-color: var(--color-on-danger);
45
+ }
46
+
47
+ &.tls-chip--disabled {
48
+ cursor: not-allowed;
49
+ opacity: 0.5;
50
+ }
51
+ }
@@ -0,0 +1,60 @@
1
+ .tls-chip {
2
+ height: var(--tls-chip-height);
3
+ padding-inline: var(--tls-chip-padding-inline);
4
+
5
+ font-size: var(--tls-chip-font-size);
6
+ font-weight: var(--tls-chip-font-weight);
7
+ line-height: var(--tls-chip-line-height);
8
+ letter-spacing: var(--tls-chip-letter-spacing);
9
+
10
+ &.tls-chip--icon {
11
+ padding-inline: 0;
12
+ aspect-ratio: 1 / 1;
13
+
14
+ &.tls-chip--rounded {
15
+ --tls-chip-border-radius: 50%;
16
+ }
17
+ }
18
+
19
+ &.tls-chip--sm {
20
+ --tls-chip-height: 1.25rem;
21
+ --tls-chip-padding-inline: var(--spacing-2);
22
+
23
+ --tls-chip-font-size: var(--font-label-small-size);
24
+ --tls-chip-font-weight: var(--font-label-small-weight);
25
+ --tls-chip-line-height: var(--font-label-small-line-height);
26
+ --tls-chip-letter-spacing: var(--font-label-small-letter-spacing);
27
+
28
+ &.tls-chip--rounded {
29
+ --tls-chip-border-radius: var(--radius-xl);
30
+ }
31
+ }
32
+
33
+ &.tls-chip--md {
34
+ --tls-chip-height: 1.5rem;
35
+ --tls-chip-padding-inline: var(--spacing-3);
36
+
37
+ --tls-chip-font-size: var(--font-label-medium-size);
38
+ --tls-chip-font-weight: var(--font-label-medium-weight);
39
+ --tls-chip-line-height: var(--font-label-medium-line-height);
40
+ --tls-chip-letter-spacing: var(--font-label-medium-letter-spacing);
41
+
42
+ &.tls-chip--rounded {
43
+ --tls-chip-border-radius: var(--radius-2xl);
44
+ }
45
+ }
46
+
47
+ &.tls-chip--lg {
48
+ --tls-chip-height: 2rem;
49
+ --tls-chip-padding-inline: var(--spacing-4);
50
+
51
+ --tls-chip-font-size: var(--font-label-large-size);
52
+ --tls-chip-font-weight: var(--font-label-large-weight);
53
+ --tls-chip-line-height: var(--font-label-large-line-height);
54
+ --tls-chip-letter-spacing: var(--font-label-large-letter-spacing);
55
+
56
+ &.tls-chip--rounded {
57
+ --tls-chip-border-radius: var(--radius-3xl);
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,17 @@
1
+ .tls-chip {
2
+ &.tls-chip--filled {
3
+ background-color: var(--tls-chip-color);
4
+ color: var(--tls-chip-on-color);
5
+ }
6
+
7
+ &.tls-chip--outlined {
8
+ background-color: transparent;
9
+ color: var(--tls-chip-color);
10
+ border: 1px solid var(--tls-chip-color);
11
+ }
12
+
13
+ &.tls-chip--text {
14
+ background-color: transparent;
15
+ color: var(--tls-chip-color);
16
+ }
17
+ }
@@ -0,0 +1,10 @@
1
+ .tls-chip {
2
+ --tls-chip-border-radius: var(--radius-sm);
3
+
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ gap: var(--spacing-1);
8
+
9
+ border-radius: var(--tls-chip-border-radius);
10
+ }
@@ -0,0 +1,5 @@
1
+ @forward "chip";
2
+ @forward "chip-color";
3
+ @forward "chip-control";
4
+ @forward "chip-size";
5
+ @forward "chip-variant";
@@ -1,6 +1,3 @@
1
1
  @forward 'form-control';
2
- @forward 'form-control-addon';
3
- @forward 'form-control-group';
4
- @forward 'form-control-group-size';
5
2
  @forward 'form-control-size';
6
3
  @forward 'form-item';
@@ -3,7 +3,6 @@
3
3
 
4
4
  width: var(--tls-form-control-group-width);
5
5
  height: var(--tls-form-control-group-height);
6
- padding-inline: var(--tls-form-control-group-padding-inline);
7
6
 
8
7
  font-size: var(--tls-form-control-group-font-size);
9
8
  font-weight: var(--tls-form-control-group-font-weight);
@@ -0,0 +1,103 @@
1
+ .tls-form-control-group {
2
+ --tls-form-control-group-border-width: 1px;
3
+ --tls-form-control-group-border-style: solid;
4
+ --tls-form-control-group-border-color: var(--color-outline-variant);
5
+
6
+ display: inline-flex;
7
+ align-items: center;
8
+
9
+ border-radius: var(--radius-md);
10
+ border: var(--tls-form-control-group-border-width) var(--tls-form-control-group-border-style)
11
+ var(--tls-form-control-group-border-color);
12
+
13
+ transition:
14
+ border-color var(--motion-fast) var(--motion-ease-in-out),
15
+ background-color var(--motion-fast) var(--motion-ease-in-out),
16
+ box-shadow var(--motion-fast) var(--motion-ease-in-out);
17
+
18
+ &:hover {
19
+ --tls-form-control-group-border-color: var(--color-primary);
20
+ }
21
+
22
+ &:has(input.tls-form-control:focus),
23
+ &:has(.tls-select__trigger:focus) {
24
+ border: 1px solid var(--color-primary);
25
+ box-shadow: 0 0 3px -1px var(--color-primary);
26
+ }
27
+
28
+ // The wrapper component (e.g. tls-input) is the flex item, so it must stretch.
29
+ // It stays unpadded — the inline padding belongs on the value element inside.
30
+ > :not(.tls-form-control-addon) {
31
+ flex: 1 1 auto;
32
+ min-width: 0; // allow shrinking below intrinsic input width
33
+ }
34
+
35
+ // Visual reset for any control, leaf (<input>) or composite host (tls-select):
36
+ // the group owns the border/background, the control just fills the row.
37
+ .tls-form-control {
38
+ width: 100%;
39
+ flex-grow: 1;
40
+
41
+ border: none;
42
+ box-shadow: none;
43
+ background: transparent;
44
+ }
45
+
46
+ // The group border is the single focus indicator — suppress each control's own
47
+ // focus border/shadow (base input :focus, select :focus-within) so it never doubles up.
48
+ input.tls-form-control:focus,
49
+ textarea.tls-form-control:focus,
50
+ .tls-select.tls-form-control:focus-within {
51
+ border: none;
52
+ box-shadow: none;
53
+ }
54
+
55
+ // Inline padding lives on the element that actually renders the value, so the padded
56
+ // area is interactive (no dead zone) and never stacks with a neighbour:
57
+ // - leaf controls: the <input>/<textarea> itself
58
+ // - tls-select: its inner trigger button (the host only wraps it)
59
+ // Pad the inline-start only; the trailing outer edge is added on the last child below.
60
+ input.tls-form-control,
61
+ textarea.tls-form-control,
62
+ .tls-select__trigger,
63
+ .tls-form-control-addon {
64
+ padding-block: 0;
65
+ padding-inline-start: var(--tls-form-control-group-padding-inline);
66
+ padding-inline-end: 0;
67
+ }
68
+
69
+ // Outer end edge: give exactly one end padding to the last child's value element.
70
+ > :last-child input.tls-form-control,
71
+ > :last-child textarea.tls-form-control,
72
+ > :last-child .tls-select__trigger,
73
+ > .tls-form-control-addon:last-child {
74
+ padding-inline-end: var(--tls-form-control-group-padding-inline);
75
+ }
76
+
77
+ // Form control
78
+ &.tls-form-control.tls-form-control--disabled,
79
+ &:has(.tls-form-control.tls-form-control.tls-form-control--disabled) {
80
+ --tls-form-control-group-border-color: var(--color-outline);
81
+ background-color: var(--color-surface-variant);
82
+
83
+ cursor: not-allowed;
84
+ }
85
+
86
+ &:not(
87
+ .tls-form-control--disabled
88
+ ).tls-form-control.tls-form-control--touched.tls-form-control--invalid,
89
+ &:has(
90
+ .tls-form-control:not(
91
+ .tls-form-control--disabled
92
+ ).tls-form-control.tls-form-control--touched.tls-form-control--invalid
93
+ ) {
94
+ --tls-form-control-group-border-color: var(--color-danger);
95
+
96
+ color: var(--color-danger);
97
+
98
+ .tls-form-control::placeholder,
99
+ .tls-form-control__placeholder {
100
+ color: var(--color-danger);
101
+ }
102
+ }
103
+ }
@@ -0,0 +1,3 @@
1
+ @forward 'form-control-addon';
2
+ @forward 'form-control-group';
3
+ @forward 'form-control-group-size';
@@ -1,23 +1,30 @@
1
1
  @forward 'alert';
2
2
  @forward 'button';
3
3
  @forward 'chart';
4
+ @forward 'chip';
4
5
  @forward 'date-time-picker';
5
6
  @forward 'dialog';
6
7
  @forward 'loader';
7
8
  @forward 'pagination';
8
9
  @forward 'select';
9
10
  @forward 'form';
11
+ @forward 'form-control-group';
10
12
  @forward 'stepper';
11
13
  @forward 'switch';
12
14
  @forward 'tabs';
15
+ @forward 'textarea';
13
16
  @forward 'tooltip';
14
17
 
15
18
  @forward 'checkbox';
19
+ @forward 'chip-input';
20
+ @forward 'file-uploader';
16
21
  @forward 'divider';
17
22
  @forward 'icon';
23
+ @forward 'menu';
18
24
  @forward 'password';
19
25
  @forward 'pin-input';
20
26
  @forward 'popover';
21
27
  @forward 'radio-button';
22
28
  @forward 'skeleton';
23
29
  @forward 'table';
30
+ @forward 'toggle-group';
@@ -0,0 +1,2 @@
1
+ @forward 'textarea';
2
+ @forward 'textarea-size';
@@ -0,0 +1,15 @@
1
+ .tls-textarea {
2
+ .tls-form-control {
3
+ &.tls-form-control--sm {
4
+ --tls-textarea-padding-block: var(--spacing-1);
5
+ }
6
+
7
+ &.tls-form-control--md {
8
+ --tls-textarea-padding-block: var(--spacing-2);
9
+ }
10
+
11
+ &.tls-form-control--lg {
12
+ --tls-textarea-padding-block: var(--spacing-3);
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,7 @@
1
+ .tls-textarea .tls-form-control {
2
+ height: auto;
3
+
4
+ padding-block: var(--tls-textarea-padding-block);
5
+
6
+ font-family: inherit;
7
+ }
@@ -0,0 +1,3 @@
1
+ @forward 'toggle-group';
2
+ @forward 'toggle-group-color';
3
+ @forward 'toggle-group-size';
@@ -0,0 +1,36 @@
1
+ .tls-toggle-group {
2
+ &--primary {
3
+ --tls-toggle-group-color: var(--color-primary);
4
+ --tls-toggle-group-on-color: var(--color-on-primary);
5
+ }
6
+
7
+ &--secondary {
8
+ --tls-toggle-group-color: var(--color-secondary);
9
+ --tls-toggle-group-on-color: var(--color-on-secondary);
10
+ }
11
+
12
+ &--tertiary {
13
+ --tls-toggle-group-color: var(--color-tertiary);
14
+ --tls-toggle-group-on-color: var(--color-on-tertiary);
15
+ }
16
+
17
+ &--success {
18
+ --tls-toggle-group-color: var(--color-success);
19
+ --tls-toggle-group-on-color: var(--color-on-success);
20
+ }
21
+
22
+ &--info {
23
+ --tls-toggle-group-color: var(--color-info);
24
+ --tls-toggle-group-on-color: var(--color-on-info);
25
+ }
26
+
27
+ &--warning {
28
+ --tls-toggle-group-color: var(--color-warning);
29
+ --tls-toggle-group-on-color: var(--color-on-warning);
30
+ }
31
+
32
+ &--danger {
33
+ --tls-toggle-group-color: var(--color-danger);
34
+ --tls-toggle-group-on-color: var(--color-on-danger);
35
+ }
36
+ }
@@ -0,0 +1,31 @@
1
+ .tls-toggle-group {
2
+ &--sm {
3
+ --tls-toggle-group-option-height: var(--control-height-sm);
4
+ --tls-toggle-group-option-padding-inline: var(--spacing-3);
5
+
6
+ font-size: var(--font-label-small-size);
7
+ font-weight: var(--font-label-small-weight);
8
+ line-height: var(--font-label-small-line-height);
9
+ letter-spacing: var(--font-label-small-letter-spacing);
10
+ }
11
+
12
+ &--md {
13
+ --tls-toggle-group-option-height: var(--control-height-md);
14
+ --tls-toggle-group-option-padding-inline: var(--spacing-4);
15
+
16
+ font-size: var(--font-label-medium-size);
17
+ font-weight: var(--font-label-medium-weight);
18
+ line-height: var(--font-label-medium-line-height);
19
+ letter-spacing: var(--font-label-medium-letter-spacing);
20
+ }
21
+
22
+ &--lg {
23
+ --tls-toggle-group-option-height: var(--control-height-lg);
24
+ --tls-toggle-group-option-padding-inline: var(--spacing-5);
25
+
26
+ font-size: var(--font-label-large-size);
27
+ font-weight: var(--font-label-large-weight);
28
+ line-height: var(--font-label-large-line-height);
29
+ letter-spacing: var(--font-label-large-letter-spacing);
30
+ }
31
+ }
@@ -0,0 +1,106 @@
1
+ @use '../../mixins' as mixins;
2
+
3
+ .tls-toggle-group {
4
+ --tls-toggle-group-border-width: 1px;
5
+ --tls-toggle-group-border-color: var(--color-outline-variant);
6
+ --tls-toggle-group-border-radius: var(--radius-sm);
7
+
8
+ display: inline-flex;
9
+ flex-direction: row;
10
+
11
+ border: var(--tls-toggle-group-border-width) solid var(--tls-toggle-group-border-color);
12
+ border-radius: var(--tls-toggle-group-border-radius);
13
+ overflow: hidden;
14
+
15
+ &--vertical {
16
+ flex-direction: column;
17
+
18
+ .tls-toggle-group__option:not(:first-child) {
19
+ border-top: var(--tls-toggle-group-border-width) solid var(--tls-toggle-group-border-color);
20
+ border-left: none;
21
+ }
22
+ }
23
+
24
+ &__option {
25
+ position: relative;
26
+ z-index: 1;
27
+
28
+ display: inline-flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+
32
+ height: var(--tls-toggle-group-option-height);
33
+ padding-inline: var(--tls-toggle-group-option-padding-inline);
34
+
35
+ border: none;
36
+ background: transparent;
37
+ color: var(--color-on-surface);
38
+
39
+ cursor: pointer;
40
+ user-select: none;
41
+
42
+ transition: color var(--motion-fast) var(--motion-ease-in-out);
43
+
44
+ &::before {
45
+ content: '';
46
+ position: absolute;
47
+ inset: 0;
48
+ z-index: -1;
49
+
50
+ background-color: var(--tls-toggle-group-color);
51
+ opacity: 0;
52
+
53
+ transition: opacity var(--motion-fast) var(--motion-ease-in-out);
54
+ }
55
+
56
+ &:not(:first-child) {
57
+ border-left: var(--tls-toggle-group-border-width) solid var(--tls-toggle-group-border-color);
58
+ }
59
+
60
+ &:focus-visible {
61
+ @include mixins.focus-ring;
62
+ }
63
+
64
+ &:not(.tls-toggle-group__option--disabled):not(:disabled):hover::before {
65
+ opacity: 0.075;
66
+ }
67
+
68
+ &:not(.tls-toggle-group__option--disabled):not(:disabled):active::before {
69
+ opacity: 0.15;
70
+ }
71
+
72
+ &--selected {
73
+ color: var(--tls-toggle-group-on-color);
74
+
75
+ &::before {
76
+ opacity: 1;
77
+ }
78
+
79
+ &:not(.tls-toggle-group__option--disabled):not(:disabled):hover::before {
80
+ opacity: 0.85;
81
+ }
82
+
83
+ &:not(.tls-toggle-group__option--disabled):not(:disabled):active::before {
84
+ opacity: 0.75;
85
+ }
86
+ }
87
+
88
+ &--disabled,
89
+ &:disabled {
90
+ cursor: not-allowed;
91
+ opacity: 0.5;
92
+ }
93
+ }
94
+
95
+ &.tls-toggle-group--disabled {
96
+ cursor: not-allowed;
97
+
98
+ .tls-toggle-group__option {
99
+ pointer-events: none;
100
+ }
101
+ }
102
+
103
+ &:not(.tls-toggle-group--disabled).tls-toggle-group--touched.tls-toggle-group--invalid {
104
+ --tls-toggle-group-border-color: var(--color-danger);
105
+ }
106
+ }
@@ -1,59 +0,0 @@
1
- .tls-form-control-group {
2
- --tls-form-control-group-border-width: 1px;
3
- --tls-form-control-group-border-style: solid;
4
- --tls-form-control-group-border-color: var(--color-outline-variant);
5
-
6
- border-radius: var(--radius-md);
7
- border: var(--tls-form-control-group-border-width) var(--tls-form-control-group-border-style)
8
- var(--tls-form-control-group-border-color);
9
-
10
- transition:
11
- border-color var(--motion-fast) var(--motion-ease-in-out),
12
- background-color var(--motion-fast) var(--motion-ease-in-out),
13
- box-shadow var(--motion-fast) var(--motion-ease-in-out);
14
-
15
- &:hover {
16
- --tls-form-control-group-border-color: var(--color-primary);
17
- }
18
-
19
- &:has(input.tls-form-control:focus) {
20
- border: 1px solid var(--color-primary);
21
- box-shadow: 0 0 3px -1px var(--color-primary);
22
- }
23
-
24
- .tls-form-control {
25
- flex-grow: 1;
26
- padding: 0;
27
-
28
- border: none;
29
- box-shadow: none;
30
- background: transparent;
31
- }
32
-
33
- // Form control
34
- &.tls-form-control.tls-form-control--disabled,
35
- &:has(.tls-form-control.tls-form-control.tls-form-control--disabled) {
36
- --tls-form-control-group-border-color: var(--color-outline);
37
- background-color: var(--color-surface-variant);
38
-
39
- cursor: not-allowed;
40
- }
41
-
42
- &:not(
43
- .tls-form-control--disabled
44
- ).tls-form-control.tls-form-control--touched.tls-form-control--invalid,
45
- &:has(
46
- .tls-form-control:not(
47
- .tls-form-control--disabled
48
- ).tls-form-control.tls-form-control--touched.tls-form-control--invalid
49
- ) {
50
- --tls-form-control-group-border-color: var(--color-danger);
51
-
52
- color: var(--color-danger);
53
-
54
- .tls-form-control::placeholder,
55
- .tls-form-control__placeholder {
56
- color: var(--color-danger);
57
- }
58
- }
59
- }