@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026-present Mateus Martins
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@morphos/styles",
3
+ "version": "0.1.0",
4
+ "description": "Optional, unstyled-by-default CSS recipes for Morphos components. Import only what you need, one file per component.",
5
+ "type": "module",
6
+ "types": "./src/css.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./src/css.d.ts"
10
+ },
11
+ "./tokens.css": "./src/tokens.css",
12
+ "./index.css": "./src/index.css",
13
+ "./inputs.css": "./src/inputs.css",
14
+ "./inputs/*.css": "./src/inputs/*.css",
15
+ "./overlays.css": "./src/overlays.css",
16
+ "./overlays/*.css": "./src/overlays/*.css",
17
+ "./layout.css": "./src/layout.css",
18
+ "./layout/*.css": "./src/layout/*.css",
19
+ "./feedback.css": "./src/feedback.css",
20
+ "./feedback/*.css": "./src/feedback/*.css"
21
+ },
22
+ "files": [
23
+ "src"
24
+ ]
25
+ }
package/src/css.d.ts ADDED
@@ -0,0 +1 @@
1
+ declare module "*.css";
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Recipe for @morphos/feedback `Alert`. Apply with `class="morphos-alert"`.
3
+ */
4
+ .morphos-alert {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: var(--morphos-space-1);
8
+ padding: var(--morphos-space-3) var(--morphos-space-4);
9
+ border: 1px solid var(--morphos-color-info);
10
+ border-radius: var(--morphos-radius-md);
11
+ background: var(--morphos-color-info-bg);
12
+ color: var(--morphos-color-text);
13
+ }
14
+
15
+ .morphos-alert > strong {
16
+ font-weight: 600;
17
+ }
18
+
19
+ .morphos-alert[data-variant="success"] {
20
+ border-color: var(--morphos-color-success);
21
+ background: var(--morphos-color-success-bg);
22
+ }
23
+
24
+ .morphos-alert[data-variant="warning"] {
25
+ border-color: var(--morphos-color-warning);
26
+ background: var(--morphos-color-warning-bg);
27
+ }
28
+
29
+ .morphos-alert[data-variant="error"] {
30
+ border-color: var(--morphos-color-danger);
31
+ background: var(--morphos-color-danger-bg);
32
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Recipe for @morphos/feedback `Avatar`.
3
+ * Apply `class="morphos-avatar"` to `Avatar`, `class="morphos-avatar-image"`
4
+ * to `AvatarImage`, and `class="morphos-avatar-fallback"` to
5
+ * `AvatarFallback`.
6
+ */
7
+ .morphos-avatar {
8
+ position: relative;
9
+ display: inline-flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ width: 2.5rem;
13
+ height: 2.5rem;
14
+ overflow: hidden;
15
+ border-radius: var(--morphos-radius-full);
16
+ background: var(--morphos-color-bg-subtle);
17
+ color: var(--morphos-color-text-muted);
18
+ font-size: 0.875rem;
19
+ font-weight: 500;
20
+ }
21
+
22
+ .morphos-avatar-image {
23
+ position: absolute;
24
+ inset: 0;
25
+ width: 100%;
26
+ height: 100%;
27
+ object-fit: cover;
28
+ }
29
+
30
+ .morphos-avatar-image[hidden] {
31
+ display: none;
32
+ }
33
+
34
+ .morphos-avatar-fallback {
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: center;
38
+ }
39
+
40
+ .morphos-avatar-fallback[hidden] {
41
+ display: none;
42
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Recipe for @morphos/feedback `Meter`. Apply with `class="morphos-meter"`.
3
+ * The component renders its own fill child, `<div data-meter-fill>`,
4
+ * styled below without needing its own class. The fill percentage is
5
+ * exposed as the `--meter-value` custom property.
6
+ */
7
+ .morphos-meter {
8
+ display: block;
9
+ width: 100%;
10
+ height: 0.5rem;
11
+ overflow: hidden;
12
+ border-radius: var(--morphos-radius-full);
13
+ background: var(--morphos-color-bg-subtle);
14
+ }
15
+
16
+ .morphos-meter > [data-meter-fill] {
17
+ height: 100%;
18
+ width: var(--meter-value, 0%);
19
+ background: var(--morphos-color-accent);
20
+ border-radius: var(--morphos-radius-full);
21
+ transition: width var(--morphos-transition-medium);
22
+ }
23
+
24
+ .morphos-meter[data-low] > [data-meter-fill] {
25
+ background: var(--morphos-color-warning);
26
+ }
27
+
28
+ .morphos-meter[data-high] > [data-meter-fill] {
29
+ background: var(--morphos-color-danger);
30
+ }
31
+
32
+ .morphos-meter[data-optimum] > [data-meter-fill] {
33
+ background: var(--morphos-color-success);
34
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Recipe for @morphos/feedback `Progress`. Apply with
3
+ * `class="morphos-progress"`. The component exposes its fill percentage as
4
+ * the `--progress` custom property, painted below via `::after`.
5
+ */
6
+ .morphos-progress {
7
+ position: relative;
8
+ display: block;
9
+ width: 100%;
10
+ height: 0.5rem;
11
+ overflow: hidden;
12
+ border-radius: var(--morphos-radius-full);
13
+ background: var(--morphos-color-bg-subtle);
14
+ }
15
+
16
+ .morphos-progress::after {
17
+ content: "";
18
+ position: absolute;
19
+ inset: 0;
20
+ width: var(--progress, 0%);
21
+ background: var(--morphos-color-accent);
22
+ border-radius: var(--morphos-radius-full);
23
+ transition: width var(--morphos-transition-medium);
24
+ }
25
+
26
+ .morphos-progress[data-indeterminate]::after {
27
+ width: 40%;
28
+ animation: morphos-progress-indeterminate 1.2s ease-in-out infinite;
29
+ }
30
+
31
+ @keyframes morphos-progress-indeterminate {
32
+ 0% { left: -40%; }
33
+ 100% { left: 100%; }
34
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Recipe for @morphos/feedback `Spinner`. Apply with
3
+ * `class="morphos-spinner"`.
4
+ */
5
+ .morphos-spinner {
6
+ display: inline-block;
7
+ width: 1.25rem;
8
+ height: 1.25rem;
9
+ border: 2px solid var(--morphos-color-border);
10
+ border-top-color: var(--morphos-color-accent);
11
+ border-radius: var(--morphos-radius-full);
12
+ animation: morphos-spin 0.7s linear infinite;
13
+ }
14
+
15
+ @keyframes morphos-spin {
16
+ to { transform: rotate(360deg); }
17
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Recipe for @morphos/feedback `ToastProvider` + `Toast`.
3
+ * Apply `class="morphos-toast-viewport"` to `ToastProvider` — its
4
+ * auto-rendered toasts (`role="status"`) are styled here without needing
5
+ * their own class. If you render toasts manually with the standalone
6
+ * `Toast` component instead, apply `class="morphos-toast"` to it.
7
+ */
8
+ .morphos-toast-viewport {
9
+ /* Portaled to document.body, so it can't inherit the page's font — set it explicitly. */
10
+ font-family: var(--morphos-font);
11
+ position: fixed;
12
+ bottom: var(--morphos-space-4);
13
+ right: var(--morphos-space-4);
14
+ z-index: 200;
15
+ display: flex;
16
+ flex-direction: column;
17
+ gap: var(--morphos-space-2);
18
+ width: 20rem;
19
+ max-width: calc(100vw - 2 * var(--morphos-space-4));
20
+ }
21
+
22
+ .morphos-toast-viewport > [role="status"],
23
+ .morphos-toast {
24
+ position: relative;
25
+ display: flex;
26
+ flex-direction: column;
27
+ gap: var(--morphos-space-1);
28
+ padding: var(--morphos-space-3) var(--morphos-space-8, 2rem) var(--morphos-space-3) var(--morphos-space-3);
29
+ background: var(--morphos-color-bg);
30
+ color: var(--morphos-color-text);
31
+ border: 1px solid var(--morphos-color-border);
32
+ border-radius: var(--morphos-radius-md);
33
+ animation: morphos-slide-in var(--morphos-transition-medium);
34
+ }
35
+
36
+ .morphos-toast-viewport > [role="status"][data-variant="success"],
37
+ .morphos-toast[data-variant="success"] {
38
+ border-color: var(--morphos-color-success);
39
+ background: var(--morphos-color-success-bg);
40
+ }
41
+
42
+ .morphos-toast-viewport > [role="status"][data-variant="error"],
43
+ .morphos-toast[data-variant="error"] {
44
+ border-color: var(--morphos-color-danger);
45
+ background: var(--morphos-color-danger-bg);
46
+ }
47
+
48
+ .morphos-toast-viewport > [role="status"][data-variant="warning"],
49
+ .morphos-toast[data-variant="warning"] {
50
+ border-color: var(--morphos-color-warning);
51
+ background: var(--morphos-color-warning-bg);
52
+ }
53
+
54
+ .morphos-toast-viewport > [role="status"] > button,
55
+ .morphos-toast > button {
56
+ position: absolute;
57
+ top: var(--morphos-space-2);
58
+ right: var(--morphos-space-2);
59
+ border: none;
60
+ background: none;
61
+ color: var(--morphos-color-text-muted);
62
+ cursor: pointer;
63
+ line-height: 1;
64
+ }
65
+
66
+ .morphos-toast-viewport > [role="status"] > button:hover,
67
+ .morphos-toast > button:hover {
68
+ color: var(--morphos-color-text);
69
+ }
70
+
71
+ @keyframes morphos-slide-in {
72
+ from {
73
+ opacity: 0;
74
+ transform: translateY(0.5rem);
75
+ }
76
+ to {
77
+ opacity: 1;
78
+ transform: translateY(0);
79
+ }
80
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * All @morphos/feedback recipes in one file. Prefer importing individual
3
+ * files from `@morphos/styles/feedback/*.css` if you only need a few.
4
+ */
5
+ @import "./tokens.css";
6
+ @import "./feedback/toast.css";
7
+ @import "./feedback/alert.css";
8
+ @import "./feedback/progress.css";
9
+ @import "./feedback/spinner.css";
10
+ @import "./feedback/avatar.css";
11
+ @import "./feedback/meter.css";
package/src/index.css ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Every @morphos/* recipe in one file. Prefer importing
3
+ * `@morphos/styles/inputs.css`, `overlays.css`, `layout.css`, `feedback.css`,
4
+ * or an individual `@morphos/styles/<category>/<component>.css` file if you
5
+ * only need part of the set.
6
+ */
7
+ @import "./tokens.css";
8
+
9
+ @import "./inputs/button.css";
10
+ @import "./inputs/input.css";
11
+ @import "./inputs/checkbox.css";
12
+ @import "./inputs/select.css";
13
+ @import "./inputs/radio.css";
14
+ @import "./inputs/switch.css";
15
+ @import "./inputs/toggle.css";
16
+ @import "./inputs/toggle-group.css";
17
+ @import "./inputs/checkbox-group.css";
18
+ @import "./inputs/slider.css";
19
+ @import "./inputs/number-field.css";
20
+ @import "./inputs/field.css";
21
+ @import "./inputs/fieldset.css";
22
+ @import "./inputs/form.css";
23
+ @import "./inputs/otp-field.css";
24
+ @import "./inputs/combobox.css";
25
+ @import "./inputs/autocomplete.css";
26
+
27
+ @import "./overlays/dialog.css";
28
+ @import "./overlays/tooltip.css";
29
+ @import "./overlays/popover.css";
30
+ @import "./overlays/dropdown.css";
31
+ @import "./overlays/alert-dialog.css";
32
+ @import "./overlays/drawer.css";
33
+ @import "./overlays/context-menu.css";
34
+ @import "./overlays/preview-card.css";
35
+
36
+ @import "./layout/accordion.css";
37
+ @import "./layout/tabs.css";
38
+ @import "./layout/disclosure.css";
39
+ @import "./layout/separator.css";
40
+ @import "./layout/scroll-area.css";
41
+ @import "./layout/toolbar.css";
42
+ @import "./layout/menubar.css";
43
+ @import "./layout/navigation-menu.css";
44
+
45
+ @import "./feedback/toast.css";
46
+ @import "./feedback/alert.css";
47
+ @import "./feedback/progress.css";
48
+ @import "./feedback/spinner.css";
49
+ @import "./feedback/avatar.css";
50
+ @import "./feedback/meter.css";
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Autocomplete`. Apply with
3
+ * `class="morphos-autocomplete"` on the `Autocomplete` root — its text
4
+ * input and suggestion list are rendered inside it and styled here by
5
+ * role/data-attribute.
6
+ */
7
+ .morphos-autocomplete {
8
+ position: relative;
9
+ display: inline-block;
10
+ min-width: 14rem;
11
+ }
12
+
13
+ .morphos-autocomplete > input {
14
+ width: 100%;
15
+ font: inherit;
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
+ padding: var(--morphos-space-2) var(--morphos-space-3);
21
+ transition: border-color var(--morphos-transition-fast);
22
+ }
23
+
24
+ .morphos-autocomplete > input:focus-visible {
25
+ outline: none;
26
+ border-color: var(--morphos-color-accent);
27
+ box-shadow: var(--morphos-focus-ring);
28
+ }
29
+
30
+ .morphos-autocomplete[data-disabled] > input {
31
+ opacity: 0.5;
32
+ cursor: not-allowed;
33
+ }
34
+
35
+ .morphos-autocomplete > ul[role="listbox"] {
36
+ position: absolute;
37
+ top: calc(100% + var(--morphos-space-1));
38
+ left: 0;
39
+ right: 0;
40
+ z-index: 50;
41
+ max-height: 16rem;
42
+ overflow-y: auto;
43
+ margin: 0;
44
+ padding: var(--morphos-space-1);
45
+ list-style: none;
46
+ background: var(--morphos-color-bg);
47
+ border: 1px solid var(--morphos-color-border);
48
+ border-radius: var(--morphos-radius-md);
49
+ }
50
+
51
+ .morphos-autocomplete > ul[role="listbox"] > li[role="option"] {
52
+ padding: var(--morphos-space-2) var(--morphos-space-3);
53
+ border-radius: var(--morphos-radius-sm);
54
+ cursor: pointer;
55
+ }
56
+
57
+ .morphos-autocomplete > ul[role="listbox"] > li[role="option"]:hover,
58
+ .morphos-autocomplete > ul[role="listbox"] > li[role="option"][data-active] {
59
+ background: var(--morphos-color-bg-hover);
60
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Button`.
3
+ * Apply with `class="morphos-button"` (add `morphos-button--ghost` /
4
+ * `morphos-button--outline` for the optional variants below).
5
+ */
6
+ .morphos-button {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ gap: var(--morphos-space-2);
11
+ font: inherit;
12
+ font-weight: 500;
13
+ line-height: 1;
14
+ padding: var(--morphos-space-2) var(--morphos-space-4);
15
+ border-radius: var(--morphos-radius-md);
16
+ border: 1px solid transparent;
17
+ background: var(--morphos-color-accent);
18
+ color: var(--morphos-color-accent-text);
19
+ cursor: pointer;
20
+ transition: background var(--morphos-transition-fast), border-color var(--morphos-transition-fast), opacity var(--morphos-transition-fast);
21
+ }
22
+
23
+ .morphos-button:hover {
24
+ background: var(--morphos-color-accent-hover);
25
+ }
26
+
27
+ .morphos-button:focus-visible {
28
+ outline: none;
29
+ box-shadow: var(--morphos-focus-ring);
30
+ }
31
+
32
+ .morphos-button[data-disabled],
33
+ .morphos-button:disabled {
34
+ opacity: 0.5;
35
+ cursor: not-allowed;
36
+ }
37
+
38
+ .morphos-button--outline {
39
+ background: transparent;
40
+ border-color: var(--morphos-color-border);
41
+ color: var(--morphos-color-text);
42
+ }
43
+
44
+ .morphos-button--outline:hover {
45
+ background: var(--morphos-color-bg-hover);
46
+ }
47
+
48
+ .morphos-button--ghost {
49
+ background: transparent;
50
+ color: var(--morphos-color-text);
51
+ }
52
+
53
+ .morphos-button--ghost:hover {
54
+ background: var(--morphos-color-bg-hover);
55
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `CheckboxGroup` + `CheckboxGroupItem`.
3
+ * Apply `class="morphos-checkbox-group"` to the group and
4
+ * `class="morphos-checkbox-group-item"` to each item's `<label>`.
5
+ * `CheckboxGroupItem` doesn't expose a `class` prop on its inner `<input>`,
6
+ * so its checkbox look is styled here via a descendant selector instead of
7
+ * the standalone `morphos-checkbox` class.
8
+ */
9
+ .morphos-checkbox-group {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: var(--morphos-space-2);
13
+ }
14
+
15
+ .morphos-checkbox-group[data-orientation="horizontal"] {
16
+ flex-direction: row;
17
+ gap: var(--morphos-space-4);
18
+ }
19
+
20
+ .morphos-checkbox-group[data-disabled] {
21
+ opacity: 0.5;
22
+ }
23
+
24
+ .morphos-checkbox-group-item {
25
+ display: inline-flex;
26
+ align-items: center;
27
+ gap: var(--morphos-space-2);
28
+ cursor: pointer;
29
+ }
30
+
31
+ .morphos-checkbox-group-item[data-disabled] {
32
+ opacity: 0.5;
33
+ cursor: not-allowed;
34
+ }
35
+
36
+ .morphos-checkbox-group-item input[type="checkbox"] {
37
+ appearance: none;
38
+ -webkit-appearance: none;
39
+ display: inline-flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ flex-shrink: 0;
43
+ width: 1.125rem;
44
+ height: 1.125rem;
45
+ margin: 0;
46
+ border: 1px solid var(--morphos-color-border);
47
+ border-radius: var(--morphos-radius-sm);
48
+ background: var(--morphos-color-bg);
49
+ cursor: pointer;
50
+ transition: background var(--morphos-transition-fast), border-color var(--morphos-transition-fast);
51
+ }
52
+
53
+ .morphos-checkbox-group-item input[type="checkbox"]::before {
54
+ content: "";
55
+ width: 0.65rem;
56
+ height: 0.65rem;
57
+ background: var(--morphos-color-accent-text);
58
+ clip-path: polygon(9% 45%, 34% 66%, 87% 8%, 100% 22%, 37% 91%, 0% 58%);
59
+ transform: scale(0);
60
+ transition: transform var(--morphos-transition-fast);
61
+ }
62
+
63
+ .morphos-checkbox-group-item input[type="checkbox"]:checked {
64
+ background: var(--morphos-color-accent);
65
+ border-color: var(--morphos-color-accent);
66
+ }
67
+
68
+ .morphos-checkbox-group-item input[type="checkbox"]:checked::before {
69
+ transform: scale(1);
70
+ }
71
+
72
+ .morphos-checkbox-group-item input[type="checkbox"]:focus-visible {
73
+ outline: none;
74
+ box-shadow: var(--morphos-focus-ring);
75
+ }
76
+
77
+ .morphos-checkbox-group-item input[type="checkbox"]:disabled {
78
+ cursor: not-allowed;
79
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Recipe for @morphos/inputs `Checkbox`.
3
+ * `Checkbox` renders a bare `<input type="checkbox">` — apply
4
+ * `class="morphos-checkbox"` directly to it. Pair with a `<label>` in your
5
+ * own markup for the visible text.
6
+ */
7
+ .morphos-checkbox {
8
+ appearance: none;
9
+ -webkit-appearance: none;
10
+ display: inline-flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ width: 1.125rem;
14
+ height: 1.125rem;
15
+ margin: 0;
16
+ border: 1px solid var(--morphos-color-border);
17
+ border-radius: var(--morphos-radius-sm);
18
+ background: var(--morphos-color-bg);
19
+ cursor: pointer;
20
+ transition: background var(--morphos-transition-fast), border-color var(--morphos-transition-fast);
21
+ }
22
+
23
+ .morphos-checkbox::before {
24
+ content: "";
25
+ width: 0.65rem;
26
+ height: 0.65rem;
27
+ background: var(--morphos-color-accent-text);
28
+ clip-path: polygon(9% 45%, 34% 66%, 87% 8%, 100% 22%, 37% 91%, 0% 58%);
29
+ transform: scale(0);
30
+ transition: transform var(--morphos-transition-fast);
31
+ }
32
+
33
+ .morphos-checkbox[data-checked] {
34
+ background: var(--morphos-color-accent);
35
+ border-color: var(--morphos-color-accent);
36
+ }
37
+
38
+ .morphos-checkbox[data-checked]::before {
39
+ transform: scale(1);
40
+ }
41
+
42
+ .morphos-checkbox:indeterminate {
43
+ background: var(--morphos-color-accent);
44
+ border-color: var(--morphos-color-accent);
45
+ }
46
+
47
+ .morphos-checkbox:indeterminate::before {
48
+ clip-path: none;
49
+ width: 0.6rem;
50
+ height: 0.15rem;
51
+ transform: scale(1);
52
+ }
53
+
54
+ .morphos-checkbox:focus-visible {
55
+ outline: none;
56
+ box-shadow: var(--morphos-focus-ring);
57
+ }
58
+
59
+ .morphos-checkbox[data-disabled],
60
+ .morphos-checkbox:disabled {
61
+ opacity: 0.5;
62
+ cursor: not-allowed;
63
+ }