@morphos/styles 0.1.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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +25 -0
  3. package/src/css.d.ts +1 -0
  4. package/src/feedback/alert.css +32 -0
  5. package/src/feedback/avatar.css +42 -0
  6. package/src/feedback/meter.css +34 -0
  7. package/src/feedback/progress.css +34 -0
  8. package/src/feedback/spinner.css +17 -0
  9. package/src/feedback/toast.css +80 -0
  10. package/src/feedback.css +11 -0
  11. package/src/index.css +50 -0
  12. package/src/inputs/autocomplete.css +60 -0
  13. package/src/inputs/button.css +55 -0
  14. package/src/inputs/checkbox-group.css +79 -0
  15. package/src/inputs/checkbox.css +63 -0
  16. package/src/inputs/combobox.css +76 -0
  17. package/src/inputs/field.css +44 -0
  18. package/src/inputs/fieldset.css +23 -0
  19. package/src/inputs/form.css +8 -0
  20. package/src/inputs/input.css +39 -0
  21. package/src/inputs/number-field.css +65 -0
  22. package/src/inputs/otp-field.css +32 -0
  23. package/src/inputs/radio.css +64 -0
  24. package/src/inputs/select.css +104 -0
  25. package/src/inputs/slider.css +84 -0
  26. package/src/inputs/switch.css +46 -0
  27. package/src/inputs/toggle-group.css +51 -0
  28. package/src/inputs/toggle.css +37 -0
  29. package/src/inputs.css +22 -0
  30. package/src/layout/accordion.css +67 -0
  31. package/src/layout/disclosure.css +47 -0
  32. package/src/layout/menubar.css +78 -0
  33. package/src/layout/navigation-menu.css +87 -0
  34. package/src/layout/scroll-area.css +82 -0
  35. package/src/layout/separator.css +21 -0
  36. package/src/layout/tabs.css +71 -0
  37. package/src/layout/toolbar.css +57 -0
  38. package/src/layout.css +13 -0
  39. package/src/overlays/alert-dialog.css +100 -0
  40. package/src/overlays/context-menu.css +51 -0
  41. package/src/overlays/dialog.css +91 -0
  42. package/src/overlays/drawer.css +124 -0
  43. package/src/overlays/dropdown.css +51 -0
  44. package/src/overlays/popover.css +28 -0
  45. package/src/overlays/preview-card.css +22 -0
  46. package/src/overlays/tooltip.css +23 -0
  47. package/src/overlays.css +13 -0
  48. package/src/tokens.css +62 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Combobox`. Apply with
3
+ * `class="morphos-combobox"` on the `Combobox` root — its text input and
4
+ * listbox are rendered inside it and styled here by role/data-attribute.
5
+ */
6
+ .morphos-combobox {
7
+ position: relative;
8
+ display: inline-block;
9
+ min-width: 14rem;
10
+ }
11
+
12
+ .morphos-combobox > input {
13
+ width: 100%;
14
+ font: inherit;
15
+ color: var(--morphos-color-text);
16
+ background: var(--morphos-color-bg);
17
+ border: 1px solid var(--morphos-color-border);
18
+ border-radius: var(--morphos-radius-md);
19
+ padding: var(--morphos-space-2) var(--morphos-space-3);
20
+ transition: border-color var(--morphos-transition-fast);
21
+ }
22
+
23
+ .morphos-combobox > input:focus-visible {
24
+ outline: none;
25
+ border-color: var(--morphos-color-accent);
26
+ box-shadow: var(--morphos-focus-ring);
27
+ }
28
+
29
+ .morphos-combobox[data-disabled] > input {
30
+ opacity: 0.5;
31
+ cursor: not-allowed;
32
+ }
33
+
34
+ .morphos-combobox > ul[role="listbox"] {
35
+ position: absolute;
36
+ top: calc(100% + var(--morphos-space-1));
37
+ left: 0;
38
+ right: 0;
39
+ z-index: 50;
40
+ max-height: 16rem;
41
+ overflow-y: auto;
42
+ margin: 0;
43
+ padding: var(--morphos-space-1);
44
+ list-style: none;
45
+ background: var(--morphos-color-bg);
46
+ border: 1px solid var(--morphos-color-border);
47
+ border-radius: var(--morphos-radius-md);
48
+ }
49
+
50
+ .morphos-combobox > ul[role="listbox"] > li[role="option"] {
51
+ padding: var(--morphos-space-2) var(--morphos-space-3);
52
+ border-radius: var(--morphos-radius-sm);
53
+ cursor: pointer;
54
+ }
55
+
56
+ .morphos-combobox > ul[role="listbox"] > li[role="option"]:not([data-disabled]):hover,
57
+ .morphos-combobox > ul[role="listbox"] > li[role="option"][data-active] {
58
+ background: var(--morphos-color-bg-hover);
59
+ }
60
+
61
+ .morphos-combobox > ul[role="listbox"] > li[role="option"][data-selected] {
62
+ background: var(--morphos-color-accent);
63
+ color: var(--morphos-color-accent-text);
64
+ }
65
+
66
+ /* Same specificity as the plain :hover/[data-active] rule above — placed after so it wins the tie and the selected option doesn't lose its (readable) accent background/text on hover. */
67
+ .morphos-combobox > ul[role="listbox"] > li[role="option"][data-selected]:hover,
68
+ .morphos-combobox > ul[role="listbox"] > li[role="option"][data-selected][data-active] {
69
+ background: var(--morphos-color-accent-hover);
70
+ color: var(--morphos-color-accent-text);
71
+ }
72
+
73
+ .morphos-combobox > ul[role="listbox"] > li[role="option"][data-disabled] {
74
+ opacity: 0.5;
75
+ cursor: not-allowed;
76
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Field` + its parts.
3
+ * Apply `class="morphos-field"` to `Field`, `class="morphos-field-label"`
4
+ * to `FieldLabel`, `class="morphos-field-description"` to
5
+ * `FieldDescription`, `class="morphos-field-error"` to `FieldError`, and
6
+ * `class="morphos-field-control"` to `FieldControl`.
7
+ */
8
+ .morphos-field {
9
+ display: flex;
10
+ flex-direction: column;
11
+ gap: var(--morphos-space-1);
12
+ }
13
+
14
+ .morphos-field[data-disabled] {
15
+ opacity: 0.5;
16
+ }
17
+
18
+ .morphos-field-label {
19
+ font-size: 0.875rem;
20
+ font-weight: 500;
21
+ color: var(--morphos-color-text);
22
+ }
23
+
24
+ .morphos-field[data-required] .morphos-field-label::after {
25
+ content: " *";
26
+ color: var(--morphos-color-danger);
27
+ }
28
+
29
+ .morphos-field-description {
30
+ margin: 0;
31
+ font-size: 0.8125rem;
32
+ color: var(--morphos-color-text-muted);
33
+ }
34
+
35
+ .morphos-field-error {
36
+ margin: 0;
37
+ font-size: 0.8125rem;
38
+ color: var(--morphos-color-danger);
39
+ }
40
+
41
+ .morphos-field-control {
42
+ display: flex;
43
+ flex-direction: column;
44
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Fieldset`. Apply with
3
+ * `class="morphos-fieldset"`.
4
+ */
5
+ .morphos-fieldset {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--morphos-space-3);
9
+ margin: 0;
10
+ padding: var(--morphos-space-4);
11
+ border: 1px solid var(--morphos-color-border);
12
+ border-radius: var(--morphos-radius-md);
13
+ }
14
+
15
+ .morphos-fieldset > legend {
16
+ padding: 0 var(--morphos-space-2);
17
+ font-weight: 600;
18
+ color: var(--morphos-color-text);
19
+ }
20
+
21
+ .morphos-fieldset[data-disabled] {
22
+ opacity: 0.5;
23
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Form`. Apply with `class="morphos-form"`.
3
+ */
4
+ .morphos-form {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: var(--morphos-space-4);
8
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Input`. Apply with `class="morphos-input"`.
3
+ */
4
+ .morphos-input {
5
+ display: block;
6
+ width: 100%;
7
+ font: inherit;
8
+ color: var(--morphos-color-text);
9
+ background: var(--morphos-color-bg);
10
+ border: 1px solid var(--morphos-color-border);
11
+ border-radius: var(--morphos-radius-md);
12
+ padding: var(--morphos-space-2) var(--morphos-space-3);
13
+ transition: border-color var(--morphos-transition-fast), box-shadow var(--morphos-transition-fast);
14
+ }
15
+
16
+ .morphos-input::placeholder {
17
+ color: var(--morphos-color-placeholder);
18
+ }
19
+
20
+ .morphos-input[data-focused] {
21
+ outline: none;
22
+ border-color: var(--morphos-color-accent);
23
+ box-shadow: var(--morphos-focus-ring);
24
+ }
25
+
26
+ .morphos-input[data-invalid] {
27
+ border-color: var(--morphos-color-danger);
28
+ }
29
+
30
+ .morphos-input[data-invalid][data-focused] {
31
+ box-shadow: 0 0 0 2px var(--morphos-color-bg), 0 0 0 4px var(--morphos-color-danger);
32
+ }
33
+
34
+ .morphos-input[data-disabled],
35
+ .morphos-input:disabled {
36
+ opacity: 0.5;
37
+ cursor: not-allowed;
38
+ background: var(--morphos-color-bg-subtle);
39
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `NumberField`. Apply with
3
+ * `class="morphos-number-field"` on the `NumberField` root.
4
+ */
5
+ .morphos-number-field {
6
+ display: inline-flex;
7
+ align-items: stretch;
8
+ border: 1px solid var(--morphos-color-border);
9
+ border-radius: var(--morphos-radius-md);
10
+ overflow: hidden;
11
+ }
12
+
13
+ .morphos-number-field > button {
14
+ font: inherit;
15
+ line-height: 1;
16
+ padding: var(--morphos-space-2) var(--morphos-space-3);
17
+ border: none;
18
+ background: var(--morphos-color-bg-subtle);
19
+ color: var(--morphos-color-text);
20
+ cursor: pointer;
21
+ }
22
+
23
+ .morphos-number-field > button:hover:not(:disabled) {
24
+ background: var(--morphos-color-bg-hover);
25
+ }
26
+
27
+ .morphos-number-field > button:focus-visible {
28
+ outline: none;
29
+ box-shadow: var(--morphos-focus-ring);
30
+ z-index: 1;
31
+ position: relative;
32
+ }
33
+
34
+ .morphos-number-field > button:disabled {
35
+ opacity: 0.5;
36
+ cursor: not-allowed;
37
+ }
38
+
39
+ .morphos-number-field > input {
40
+ /* Wide enough for a formatted value like "$1,234.56" — override if yours runs longer. */
41
+ width: 6rem;
42
+ border: none;
43
+ border-left: 1px solid var(--morphos-color-border);
44
+ border-right: 1px solid var(--morphos-color-border);
45
+ text-align: center;
46
+ font: inherit;
47
+ color: var(--morphos-color-text);
48
+ background: var(--morphos-color-bg);
49
+ padding: var(--morphos-space-2) var(--morphos-space-1);
50
+ }
51
+
52
+ .morphos-number-field > input:focus-visible {
53
+ outline: none;
54
+ box-shadow: var(--morphos-focus-ring);
55
+ z-index: 1;
56
+ position: relative;
57
+ }
58
+
59
+ .morphos-number-field[data-disabled] {
60
+ opacity: 0.5;
61
+ }
62
+
63
+ .morphos-number-field[data-disabled] > input {
64
+ cursor: not-allowed;
65
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `OtpField`. Apply with
3
+ * `class="morphos-otp-field"` on the `OtpField` root.
4
+ */
5
+ .morphos-otp-field {
6
+ display: inline-flex;
7
+ gap: var(--morphos-space-2);
8
+ }
9
+
10
+ .morphos-otp-field > input[data-index] {
11
+ width: 2.5rem;
12
+ height: 3rem;
13
+ text-align: center;
14
+ font: inherit;
15
+ font-size: 1.25rem;
16
+ color: var(--morphos-color-text);
17
+ background: var(--morphos-color-bg);
18
+ border: 1px solid var(--morphos-color-border);
19
+ border-radius: var(--morphos-radius-md);
20
+ transition: border-color var(--morphos-transition-fast), box-shadow var(--morphos-transition-fast);
21
+ }
22
+
23
+ .morphos-otp-field > input[data-index]:focus-visible {
24
+ outline: none;
25
+ border-color: var(--morphos-color-accent);
26
+ box-shadow: var(--morphos-focus-ring);
27
+ }
28
+
29
+ .morphos-otp-field[data-disabled] > input[data-index] {
30
+ opacity: 0.5;
31
+ cursor: not-allowed;
32
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `RadioGroup` + `Radio`.
3
+ * Apply `class="morphos-radio-group"` to `RadioGroup` and
4
+ * `class="morphos-radio"` to each `Radio`.
5
+ */
6
+ .morphos-radio-group {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--morphos-space-2);
10
+ }
11
+
12
+ .morphos-radio-group[data-orientation="horizontal"] {
13
+ flex-direction: row;
14
+ gap: var(--morphos-space-4);
15
+ }
16
+
17
+ .morphos-radio {
18
+ display: inline-flex;
19
+ align-items: center;
20
+ gap: var(--morphos-space-2);
21
+ cursor: pointer;
22
+ }
23
+
24
+ .morphos-radio input[type="radio"] {
25
+ appearance: none;
26
+ -webkit-appearance: none;
27
+ width: 1.125rem;
28
+ height: 1.125rem;
29
+ margin: 0;
30
+ border: 1px solid var(--morphos-color-border);
31
+ border-radius: var(--morphos-radius-full);
32
+ background: var(--morphos-color-bg);
33
+ display: inline-grid;
34
+ place-content: center;
35
+ transition: border-color var(--morphos-transition-fast);
36
+ }
37
+
38
+ .morphos-radio input[type="radio"]::before {
39
+ content: "";
40
+ width: 0.55rem;
41
+ height: 0.55rem;
42
+ border-radius: var(--morphos-radius-full);
43
+ background: var(--morphos-color-accent);
44
+ transform: scale(0);
45
+ transition: transform var(--morphos-transition-fast);
46
+ }
47
+
48
+ .morphos-radio[data-checked] input[type="radio"] {
49
+ border-color: var(--morphos-color-accent);
50
+ }
51
+
52
+ .morphos-radio[data-checked] input[type="radio"]::before {
53
+ transform: scale(1);
54
+ }
55
+
56
+ .morphos-radio input[type="radio"]:focus-visible {
57
+ outline: none;
58
+ box-shadow: var(--morphos-focus-ring);
59
+ }
60
+
61
+ .morphos-radio[data-disabled] {
62
+ opacity: 0.5;
63
+ cursor: not-allowed;
64
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Select`. Apply with `class="morphos-select"`
3
+ * on the `Select` root — the trigger button, clear button, and listbox are
4
+ * all rendered inside it and styled here by role/data-attribute.
5
+ */
6
+ .morphos-select {
7
+ position: relative;
8
+ display: inline-block;
9
+ min-width: 12rem;
10
+ }
11
+
12
+ .morphos-select > button[role="combobox"] {
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: space-between;
16
+ gap: var(--morphos-space-2);
17
+ width: 100%;
18
+ font: inherit;
19
+ text-align: left;
20
+ color: var(--morphos-color-text);
21
+ background: var(--morphos-color-bg);
22
+ border: 1px solid var(--morphos-color-border);
23
+ border-radius: var(--morphos-radius-md);
24
+ padding: var(--morphos-space-2) var(--morphos-space-3);
25
+ cursor: pointer;
26
+ transition: border-color var(--morphos-transition-fast);
27
+ }
28
+
29
+ .morphos-select > button[role="combobox"][data-placeholder] {
30
+ color: var(--morphos-color-placeholder);
31
+ }
32
+
33
+ .morphos-select > button[role="combobox"]:focus-visible {
34
+ outline: none;
35
+ border-color: var(--morphos-color-accent);
36
+ box-shadow: var(--morphos-focus-ring);
37
+ }
38
+
39
+ .morphos-select[data-disabled] > button[role="combobox"],
40
+ .morphos-select > button[role="combobox"]:disabled {
41
+ opacity: 0.5;
42
+ cursor: not-allowed;
43
+ }
44
+
45
+ .morphos-select > button[data-clear] {
46
+ position: absolute;
47
+ top: 50%;
48
+ right: var(--morphos-space-2);
49
+ transform: translateY(-50%);
50
+ border: none;
51
+ background: none;
52
+ color: var(--morphos-color-text-muted);
53
+ cursor: pointer;
54
+ line-height: 1;
55
+ padding: 0 var(--morphos-space-1);
56
+ }
57
+
58
+ .morphos-select > button[data-clear]:hover {
59
+ color: var(--morphos-color-text);
60
+ }
61
+
62
+ .morphos-select > ul[role="listbox"] {
63
+ position: absolute;
64
+ top: calc(100% + var(--morphos-space-1));
65
+ left: 0;
66
+ right: 0;
67
+ z-index: 50;
68
+ max-height: 16rem;
69
+ overflow-y: auto;
70
+ margin: 0;
71
+ padding: var(--morphos-space-1);
72
+ list-style: none;
73
+ background: var(--morphos-color-bg);
74
+ border: 1px solid var(--morphos-color-border);
75
+ border-radius: var(--morphos-radius-md);
76
+ }
77
+
78
+ .morphos-select > ul[role="listbox"] > li[role="option"] {
79
+ padding: var(--morphos-space-2) var(--morphos-space-3);
80
+ border-radius: var(--morphos-radius-sm);
81
+ cursor: pointer;
82
+ }
83
+
84
+ .morphos-select > ul[role="listbox"] > li[role="option"]:not([data-disabled]):hover,
85
+ .morphos-select > ul[role="listbox"] > li[role="option"][data-active] {
86
+ background: var(--morphos-color-bg-hover);
87
+ }
88
+
89
+ .morphos-select > ul[role="listbox"] > li[role="option"][data-selected] {
90
+ background: var(--morphos-color-accent);
91
+ color: var(--morphos-color-accent-text);
92
+ }
93
+
94
+ /* Same specificity as the plain :hover/[data-active] rule above — placed after so it wins the tie and the selected option doesn't lose its (readable) accent background/text on hover. */
95
+ .morphos-select > ul[role="listbox"] > li[role="option"][data-selected]:hover,
96
+ .morphos-select > ul[role="listbox"] > li[role="option"][data-selected][data-active] {
97
+ background: var(--morphos-color-accent-hover);
98
+ color: var(--morphos-color-accent-text);
99
+ }
100
+
101
+ .morphos-select > ul[role="listbox"] > li[role="option"][data-disabled] {
102
+ opacity: 0.5;
103
+ cursor: not-allowed;
104
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Slider`. Apply with `class="morphos-slider"`
3
+ * on the `Slider` root — it exposes the current position as the
4
+ * `--slider-value` custom property, used below to paint the filled track.
5
+ */
6
+ .morphos-slider {
7
+ position: relative;
8
+ display: flex;
9
+ align-items: center;
10
+ width: 100%;
11
+ height: 1.25rem;
12
+ }
13
+
14
+ .morphos-slider > input[type="range"] {
15
+ appearance: none;
16
+ -webkit-appearance: none;
17
+ width: 100%;
18
+ height: 0.35rem;
19
+ margin: 0;
20
+ border-radius: var(--morphos-radius-full);
21
+ background: linear-gradient(
22
+ to right,
23
+ var(--morphos-color-accent) var(--slider-value, 0%),
24
+ var(--morphos-color-border) var(--slider-value, 0%)
25
+ );
26
+ cursor: pointer;
27
+ }
28
+
29
+ .morphos-slider[data-orientation="vertical"] {
30
+ writing-mode: vertical-lr;
31
+ direction: rtl;
32
+ width: 1.25rem;
33
+ height: 100%;
34
+ }
35
+
36
+ .morphos-slider[data-orientation="vertical"] > input[type="range"] {
37
+ width: 0.35rem;
38
+ height: 100%;
39
+ background: linear-gradient(
40
+ to top,
41
+ var(--morphos-color-accent) var(--slider-value, 0%),
42
+ var(--morphos-color-border) var(--slider-value, 0%)
43
+ );
44
+ }
45
+
46
+ .morphos-slider > input[type="range"]::-webkit-slider-thumb {
47
+ appearance: none;
48
+ -webkit-appearance: none;
49
+ width: 1rem;
50
+ height: 1rem;
51
+ border-radius: var(--morphos-radius-full);
52
+ background: var(--morphos-color-bg);
53
+ border: 2px solid var(--morphos-color-accent);
54
+ cursor: pointer;
55
+ }
56
+
57
+ .morphos-slider > input[type="range"]::-moz-range-thumb {
58
+ width: 1rem;
59
+ height: 1rem;
60
+ border-radius: var(--morphos-radius-full);
61
+ background: var(--morphos-color-bg);
62
+ border: 2px solid var(--morphos-color-accent);
63
+ cursor: pointer;
64
+ }
65
+
66
+ .morphos-slider > input[type="range"]:focus-visible {
67
+ outline: none;
68
+ }
69
+
70
+ .morphos-slider > input[type="range"]:focus-visible::-webkit-slider-thumb {
71
+ box-shadow: var(--morphos-focus-ring);
72
+ }
73
+
74
+ .morphos-slider > input[type="range"]:focus-visible::-moz-range-thumb {
75
+ box-shadow: var(--morphos-focus-ring);
76
+ }
77
+
78
+ .morphos-slider[data-disabled] {
79
+ opacity: 0.5;
80
+ }
81
+
82
+ .morphos-slider[data-disabled] > input[type="range"] {
83
+ cursor: not-allowed;
84
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Switch`. Apply with `class="morphos-switch"`
3
+ * on the `Switch` root (a `role="switch"` button).
4
+ */
5
+ .morphos-switch {
6
+ position: relative;
7
+ display: inline-flex;
8
+ align-items: center;
9
+ width: 2.5rem;
10
+ height: 1.5rem;
11
+ padding: 2px;
12
+ border: none;
13
+ border-radius: var(--morphos-radius-full);
14
+ background: var(--morphos-color-border);
15
+ cursor: pointer;
16
+ transition: background var(--morphos-transition-fast);
17
+ }
18
+
19
+ .morphos-switch::before {
20
+ content: "";
21
+ width: 1.25rem;
22
+ height: 1.25rem;
23
+ border-radius: var(--morphos-radius-full);
24
+ background: var(--morphos-color-bg);
25
+ border: 1px solid var(--morphos-color-border);
26
+ transform: translateX(0);
27
+ transition: transform var(--morphos-transition-fast);
28
+ }
29
+
30
+ .morphos-switch[data-checked] {
31
+ background: var(--morphos-color-accent);
32
+ }
33
+
34
+ .morphos-switch[data-checked]::before {
35
+ transform: translateX(1rem);
36
+ }
37
+
38
+ .morphos-switch:focus-visible {
39
+ outline: none;
40
+ box-shadow: var(--morphos-focus-ring);
41
+ }
42
+
43
+ .morphos-switch[data-disabled] {
44
+ opacity: 0.5;
45
+ cursor: not-allowed;
46
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `ToggleGroup` + `ToggleGroupItem`.
3
+ * Apply `class="morphos-toggle-group"` to the group and
4
+ * `class="morphos-toggle-group-item"` to each item.
5
+ */
6
+ .morphos-toggle-group {
7
+ display: inline-flex;
8
+ gap: 1px;
9
+ border: 1px solid var(--morphos-color-border);
10
+ border-radius: var(--morphos-radius-md);
11
+ overflow: hidden;
12
+ }
13
+
14
+ .morphos-toggle-group[data-orientation="vertical"] {
15
+ flex-direction: column;
16
+ }
17
+
18
+ .morphos-toggle-group[data-disabled] {
19
+ opacity: 0.5;
20
+ }
21
+
22
+ .morphos-toggle-group-item {
23
+ font: inherit;
24
+ padding: var(--morphos-space-2) var(--morphos-space-3);
25
+ border: none;
26
+ background: var(--morphos-color-bg);
27
+ color: var(--morphos-color-text);
28
+ cursor: pointer;
29
+ transition: background var(--morphos-transition-fast), color var(--morphos-transition-fast);
30
+ }
31
+
32
+ .morphos-toggle-group-item:hover {
33
+ background: var(--morphos-color-bg-hover);
34
+ }
35
+
36
+ .morphos-toggle-group-item[data-pressed] {
37
+ background: var(--morphos-color-accent);
38
+ color: var(--morphos-color-accent-text);
39
+ }
40
+
41
+ .morphos-toggle-group-item:focus-visible {
42
+ outline: none;
43
+ box-shadow: var(--morphos-focus-ring);
44
+ z-index: 1;
45
+ position: relative;
46
+ }
47
+
48
+ .morphos-toggle-group-item[data-disabled] {
49
+ opacity: 0.5;
50
+ cursor: not-allowed;
51
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Toggle`. Apply with `class="morphos-toggle"`.
3
+ */
4
+ .morphos-toggle {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ gap: var(--morphos-space-2);
9
+ font: inherit;
10
+ padding: var(--morphos-space-2) var(--morphos-space-3);
11
+ border: 1px solid var(--morphos-color-border);
12
+ border-radius: var(--morphos-radius-md);
13
+ background: transparent;
14
+ color: var(--morphos-color-text);
15
+ cursor: pointer;
16
+ transition: background var(--morphos-transition-fast), color var(--morphos-transition-fast);
17
+ }
18
+
19
+ .morphos-toggle:hover {
20
+ background: var(--morphos-color-bg-hover);
21
+ }
22
+
23
+ .morphos-toggle[data-pressed] {
24
+ background: var(--morphos-color-accent);
25
+ border-color: var(--morphos-color-accent);
26
+ color: var(--morphos-color-accent-text);
27
+ }
28
+
29
+ .morphos-toggle:focus-visible {
30
+ outline: none;
31
+ box-shadow: var(--morphos-focus-ring);
32
+ }
33
+
34
+ .morphos-toggle[data-disabled] {
35
+ opacity: 0.5;
36
+ cursor: not-allowed;
37
+ }