@blank-software/core-components 0.0.1 → 0.0.2

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 (39) hide show
  1. package/fesm2022/blank-software-core-components.mjs +118 -2
  2. package/fesm2022/blank-software-core-components.mjs.map +1 -1
  3. package/package.json +1 -1
  4. package/src/lib/accordion/accordion.css +5 -0
  5. package/src/lib/alert/alert.css +27 -0
  6. package/src/lib/avatar/avatar.css +0 -0
  7. package/src/lib/badge/badge.css +0 -0
  8. package/src/lib/breadcrumb/breadcrumb.css +0 -0
  9. package/src/lib/button/button.css +83 -0
  10. package/src/lib/card/card.css +31 -0
  11. package/src/lib/checkbox/checkbox.css +53 -0
  12. package/src/lib/date-picker/date-picker.css +0 -0
  13. package/src/lib/dropdown/dropdown.css +0 -0
  14. package/src/lib/file-upload/file-upload.css +0 -0
  15. package/src/lib/footer/footer.css +0 -0
  16. package/src/lib/form-field/form-field.css +0 -0
  17. package/src/lib/header/header.css +23 -0
  18. package/src/lib/icon/icon.css +0 -0
  19. package/src/lib/input/input.css +29 -0
  20. package/src/lib/label/label.css +27 -0
  21. package/src/lib/modal/modal-dialog.css +117 -0
  22. package/src/lib/modal/modal.css +69 -0
  23. package/src/lib/navigation/navigation.css +0 -0
  24. package/src/lib/pagination/pagination.css +76 -0
  25. package/src/lib/progress-bar/progress-bar.css +88 -0
  26. package/src/lib/radio/radio.css +35 -0
  27. package/src/lib/search-bar/search-bar.css +0 -0
  28. package/src/lib/select/select.css +75 -0
  29. package/src/lib/sidebar/sidebar.css +41 -0
  30. package/src/lib/skeleton/skeleton.css +46 -0
  31. package/src/lib/spinner/spinner.css +0 -0
  32. package/src/lib/stepper/stepper.css +0 -0
  33. package/src/lib/table/table.css +97 -0
  34. package/src/lib/tabs/tabs.css +0 -0
  35. package/src/lib/toggle/toggle.css +52 -0
  36. package/src/lib/tooltip/tooltip.css +0 -0
  37. package/src/styles/index.css +34 -0
  38. package/src/styles/theme.css +133 -0
  39. package/types/blank-software-core-components.d.ts +51 -2
@@ -0,0 +1,31 @@
1
+ @reference "tailwindcss";
2
+
3
+ .card {
4
+ @apply rounded-2xl overflow-hidden;
5
+ }
6
+
7
+ .card-default {
8
+ @apply bg-surface shadow-sm;
9
+ }
10
+
11
+ .card-outlined {
12
+ @apply bg-surface border border-ink-200;
13
+ }
14
+
15
+ .card-padded > .card-body,
16
+ .card-padded > [cardHeader],
17
+ .card-padded > [cardFooter] {
18
+ @apply px-6;
19
+ }
20
+
21
+ .card-padded > .card-body {
22
+ @apply py-6;
23
+ }
24
+
25
+ .card-padded > [cardHeader] {
26
+ @apply pt-6 pb-4 border-b border-ink-100;
27
+ }
28
+
29
+ .card-padded > [cardFooter] {
30
+ @apply pb-6 pt-4 border-t border-ink-100;
31
+ }
@@ -0,0 +1,53 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Wrapper ── */
4
+ .checkbox {
5
+ @apply inline-flex items-center gap-2 cursor-pointer select-none;
6
+ }
7
+
8
+ /* ── Hidden native input ── */
9
+ .checkbox-input {
10
+ @apply sr-only;
11
+ }
12
+
13
+ /* ── Custom box ── */
14
+ .checkbox-box {
15
+ @apply w-5 h-5 flex-shrink-0 border-2 border-ink-300 rounded
16
+ flex items-center justify-center
17
+ transition-all duration-200;
18
+ }
19
+
20
+ .checkbox-input:checked + .checkbox-box {
21
+ @apply bg-primary border-primary text-white;
22
+ }
23
+
24
+ .checkbox-input:focus-visible + .checkbox-box {
25
+ @apply ring-4 ring-primary-200;
26
+ }
27
+
28
+ .checkbox-input:disabled ~ .checkbox-box,
29
+ .checkbox-input:disabled ~ .checkbox-label {
30
+ @apply opacity-50 cursor-not-allowed;
31
+ }
32
+
33
+ .checkbox-input:disabled ~ .checkbox-box {
34
+ @apply bg-surface-muted;
35
+ }
36
+
37
+ /* ── Check icon ── */
38
+ .checkbox-check {
39
+ @apply w-3 h-3 opacity-0 transition-opacity duration-150;
40
+ }
41
+
42
+ .checkbox-input:checked + .checkbox-box .checkbox-check {
43
+ @apply opacity-100;
44
+ }
45
+
46
+ /* ── Indeterminate ── */
47
+ .checkbox-indeterminate {
48
+ @apply bg-primary border-primary text-white;
49
+ }
50
+
51
+ .checkbox-indeterminate .checkbox-check {
52
+ @apply opacity-100;
53
+ }
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,23 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Navbar container ── */
4
+ .header {
5
+ @apply fixed top-0 left-0 right-0 z-50
6
+ bg-surface border-b border-ink-200
7
+ px-4 py-2.5;
8
+ }
9
+
10
+ /* ── Inner layout ── */
11
+ .header-inner {
12
+ @apply flex items-center justify-between h-9;
13
+ }
14
+
15
+ /* ── Left section ── */
16
+ .header-left {
17
+ @apply flex items-center;
18
+ }
19
+
20
+ /* ── Right section ── */
21
+ .header-right {
22
+ @apply flex items-center gap-2;
23
+ }
File without changes
@@ -0,0 +1,29 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Base ── */
4
+ .input {
5
+ @apply w-full border border-ink-300 rounded-base bg-surface text-ink-900
6
+ placeholder:text-ink-400
7
+ transition-colors duration-200
8
+ focus:outline-none focus:ring-4 focus:ring-primary-200 focus:border-primary
9
+ disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-surface-muted;
10
+ }
11
+
12
+ /* ── Sizes ── */
13
+ .input-sm {
14
+ @apply text-sm px-3 py-2;
15
+ }
16
+ .input-md {
17
+ @apply text-sm px-4 py-2.5;
18
+ }
19
+ .input-lg {
20
+ @apply text-base px-5 py-3;
21
+ }
22
+
23
+ /* ── States ── */
24
+ .input-error {
25
+ @apply border-error-500 focus:ring-error-200 focus:border-error-500;
26
+ }
27
+ .input-success {
28
+ @apply border-success-500 focus:ring-success-200 focus:border-success-500;
29
+ }
@@ -0,0 +1,27 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Base ── */
4
+ .label {
5
+ @apply font-medium text-ink-700 inline-flex items-center gap-1;
6
+ }
7
+
8
+ /* ── Sizes ── */
9
+ .label-sm {
10
+ @apply text-xs;
11
+ }
12
+ .label-md {
13
+ @apply text-sm;
14
+ }
15
+ .label-lg {
16
+ @apply text-base;
17
+ }
18
+
19
+ /* ── States ── */
20
+ .label-disabled {
21
+ @apply opacity-50 cursor-not-allowed;
22
+ }
23
+
24
+ /* ── Required indicator ── */
25
+ .label-required {
26
+ @apply text-error font-bold;
27
+ }
@@ -0,0 +1,117 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Backdrop ── */
4
+ .bsc-modal-backdrop {
5
+ @apply fixed inset-0 z-40 bg-black/40;
6
+ animation: bsc-modal-fade-in 0.2s ease-out;
7
+ }
8
+
9
+ /* ── Overlay (centering) ── */
10
+ .bsc-modal-overlay {
11
+ @apply overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50
12
+ flex justify-center items-center w-full h-[calc(100%-1rem)] max-h-full
13
+ md:inset-0;
14
+ animation: bsc-modal-slide-in 0.2s ease-out;
15
+ }
16
+
17
+ /* ── Animations ── */
18
+ @keyframes bsc-modal-fade-in {
19
+ from {
20
+ opacity: 0;
21
+ }
22
+ to {
23
+ opacity: 1;
24
+ }
25
+ }
26
+
27
+ @keyframes bsc-modal-slide-in {
28
+ from {
29
+ opacity: 0;
30
+ transform: translateY(-1rem) scale(0.95);
31
+ }
32
+ to {
33
+ opacity: 1;
34
+ transform: translateY(0) scale(1);
35
+ }
36
+ }
37
+
38
+ /* ── Panel wrapper ── */
39
+ .bsc-modal-panel {
40
+ @apply relative p-4 w-full max-h-full;
41
+ }
42
+
43
+ /* ── Sizes ── */
44
+ .bsc-modal-sm {
45
+ @apply max-w-sm;
46
+ }
47
+ .bsc-modal-md {
48
+ @apply max-w-md;
49
+ }
50
+ .bsc-modal-lg {
51
+ @apply max-w-2xl;
52
+ }
53
+
54
+ /* ── Dialog card ── */
55
+ .bsc-modal-dialog {
56
+ @apply relative bg-surface border border-ink-200 rounded-base shadow-sm
57
+ p-6 md:p-8 text-center;
58
+ }
59
+
60
+ /* ── Icon ── */
61
+ .bsc-modal-dialog-icon {
62
+ @apply mx-auto mb-4 flex items-center justify-center w-16 h-16 rounded-full;
63
+ }
64
+
65
+ .bsc-modal-dialog-icon-success {
66
+ @apply bg-green-100 text-green-500;
67
+ }
68
+
69
+ .bsc-modal-dialog-icon-error {
70
+ @apply bg-red-100 text-red-500;
71
+ }
72
+
73
+ .bsc-modal-dialog-icon-confirm {
74
+ @apply bg-amber-100 text-amber-500;
75
+ }
76
+
77
+ /* ── Title ── */
78
+ .bsc-modal-dialog-title {
79
+ @apply text-lg font-semibold text-ink-900 mb-2;
80
+ }
81
+
82
+ /* ── Text ── */
83
+ .bsc-modal-dialog-text {
84
+ @apply text-sm text-ink-500 mb-6;
85
+ }
86
+
87
+ /* ── Actions ── */
88
+ .bsc-modal-dialog-actions {
89
+ @apply flex items-center justify-center gap-3;
90
+ }
91
+
92
+ /* ── Confirm button ── */
93
+ .bsc-modal-dialog-confirm-btn {
94
+ @apply inline-flex items-center font-medium rounded-base text-sm
95
+ px-5 py-2.5 text-white shadow-xs cursor-pointer
96
+ focus:ring-4 focus:outline-none;
97
+ }
98
+
99
+ .bsc-modal-dialog-btn-success {
100
+ @apply bg-green-500 hover:bg-green-600 focus:ring-green-200;
101
+ }
102
+
103
+ .bsc-modal-dialog-btn-error {
104
+ @apply bg-red-500 hover:bg-red-600 focus:ring-red-200;
105
+ }
106
+
107
+ .bsc-modal-dialog-btn-confirm {
108
+ @apply bg-primary hover:bg-primary-700 focus:ring-primary-200;
109
+ }
110
+
111
+ /* ── Cancel button ── */
112
+ .bsc-modal-dialog-cancel-btn {
113
+ @apply inline-flex items-center font-medium rounded-base text-sm
114
+ px-5 py-2.5 text-ink-700 bg-ink-100 hover:bg-ink-200
115
+ shadow-xs cursor-pointer focus:ring-4 focus:ring-ink-100
116
+ focus:outline-none;
117
+ }
@@ -0,0 +1,69 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Backdrop ── */
4
+ .bsc-modal-backdrop {
5
+ @apply fixed inset-0 z-40 bg-black/40;
6
+ }
7
+
8
+ /* ── Overlay (centering) ── */
9
+ .bsc-modal-overlay {
10
+ @apply overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50
11
+ flex justify-center items-center w-full h-[calc(100%-1rem)] max-h-full
12
+ md:inset-0;
13
+ }
14
+
15
+ /* ── Panel wrapper ── */
16
+ .bsc-modal-panel {
17
+ @apply relative p-4 w-full max-h-full;
18
+ }
19
+
20
+ /* ── Sizes ── */
21
+ .bsc-modal-sm {
22
+ @apply max-w-sm;
23
+ }
24
+ .bsc-modal-md {
25
+ @apply max-w-md;
26
+ }
27
+ .bsc-modal-lg {
28
+ @apply max-w-2xl;
29
+ }
30
+
31
+ /* ── Content ── */
32
+ .bsc-modal-content {
33
+ @apply relative bg-surface border border-ink-200 rounded-base shadow-sm p-4 md:p-6;
34
+ }
35
+
36
+ /* ── Header ── */
37
+ .bsc-modal-header {
38
+ @apply flex items-center justify-between border-b border-ink-200 pb-4 md:pb-5;
39
+ }
40
+
41
+ .bsc-modal-title {
42
+ @apply text-lg font-medium text-ink-900;
43
+ }
44
+
45
+ .bsc-modal-close {
46
+ @apply text-ink-500 bg-transparent hover:bg-ink-100 hover:text-ink-900
47
+ rounded-base text-sm w-9 h-9 ms-auto
48
+ inline-flex justify-center items-center cursor-pointer;
49
+ }
50
+
51
+ /* ── Body ── */
52
+ .bsc-modal-body {
53
+ @apply py-4 md:py-6;
54
+ }
55
+
56
+ /* ── Footer ── */
57
+ .bsc-modal-footer {
58
+ @apply flex items-center space-x-4 border-t border-ink-200 pt-4 md:pt-6;
59
+ }
60
+
61
+ /* ── Confirm button ── */
62
+ .bsc-modal-confirm-btn {
63
+ @apply inline-flex items-center text-white bg-primary
64
+ hover:bg-primary-700 box-border border border-transparent
65
+ focus:ring-4 focus:ring-primary-200 shadow-xs
66
+ font-medium leading-5 rounded-base text-sm px-4 py-2.5
67
+ focus:outline-none cursor-pointer
68
+ disabled:opacity-50 disabled:cursor-not-allowed;
69
+ }
File without changes
@@ -0,0 +1,76 @@
1
+ .pagination {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: 1rem;
5
+ }
6
+
7
+ .pagination-list {
8
+ display: flex;
9
+ list-style: none;
10
+ margin: 0;
11
+ padding: 0;
12
+ font-size: var(--text-sm);
13
+ }
14
+
15
+ .pagination-list > li + li > .pagination-btn {
16
+ margin-left: -1px;
17
+ }
18
+
19
+ .pagination-btn {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ background: var(--color-surface);
24
+ border: 1px solid var(--color-ink-200);
25
+ color: var(--color-ink-700);
26
+ font-weight: 500;
27
+ font-size: var(--text-sm);
28
+ height: 2.25rem;
29
+ cursor: pointer;
30
+ box-shadow: var(--shadow-xs);
31
+ transition:
32
+ background 150ms,
33
+ color 150ms;
34
+ }
35
+
36
+ .pagination-btn:hover:not(:disabled):not(.pagination-ellipsis) {
37
+ background: var(--color-ink-100);
38
+ color: var(--color-ink-900);
39
+ }
40
+
41
+ .pagination-btn-first {
42
+ border-radius: var(--radius-base) 0 0 var(--radius-base);
43
+ padding: 0 0.5rem;
44
+ }
45
+
46
+ .pagination-btn-prev {
47
+ padding: 0 0.5rem;
48
+ }
49
+
50
+ .pagination-btn-next {
51
+ padding: 0 0.5rem;
52
+ }
53
+
54
+ .pagination-btn-last {
55
+ border-radius: 0 var(--radius-base) var(--radius-base) 0;
56
+ padding: 0 0.5rem;
57
+ }
58
+
59
+ .pagination-btn-page {
60
+ width: 2.25rem;
61
+ }
62
+
63
+ .pagination-btn-active {
64
+ color: var(--color-primary);
65
+ background: var(--color-ink-100);
66
+ }
67
+
68
+ .pagination-btn-disabled {
69
+ opacity: 0.5;
70
+ pointer-events: none;
71
+ }
72
+
73
+ .pagination-ellipsis {
74
+ cursor: default;
75
+ pointer-events: none;
76
+ }
@@ -0,0 +1,88 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Label ── */
4
+ .progress-label {
5
+ @apply text-sm font-medium;
6
+ }
7
+
8
+ .progress-label-dark {
9
+ @apply text-ink-900;
10
+ }
11
+ .progress-label-brand {
12
+ @apply text-primary-700;
13
+ }
14
+ .progress-label-success {
15
+ @apply text-success-700;
16
+ }
17
+ .progress-label-danger {
18
+ @apply text-error-700;
19
+ }
20
+ .progress-label-warning {
21
+ @apply text-warning-700;
22
+ }
23
+
24
+ /* ── Outside header ── */
25
+ .progress-outside-header {
26
+ @apply flex justify-between mb-1;
27
+ }
28
+
29
+ .progress-outside-value {
30
+ @apply text-sm font-medium text-ink-500;
31
+ }
32
+
33
+ /* ── Track ── */
34
+ .progress-track {
35
+ @apply w-full bg-ink-200 rounded-full;
36
+ }
37
+
38
+ .progress-track-sm {
39
+ @apply h-1.5;
40
+ }
41
+ .progress-track-md {
42
+ @apply h-2;
43
+ }
44
+ .progress-track-lg {
45
+ @apply h-3;
46
+ }
47
+
48
+ .progress-track-inside {
49
+ @apply h-4;
50
+ }
51
+
52
+ /* ── Bar ── */
53
+ .progress-bar {
54
+ @apply rounded-full transition-all duration-300;
55
+ }
56
+
57
+ .progress-bar-sm {
58
+ @apply h-1.5;
59
+ }
60
+ .progress-bar-md {
61
+ @apply h-2;
62
+ }
63
+ .progress-bar-lg {
64
+ @apply h-3;
65
+ }
66
+
67
+ /* ── Bar inside (with text) ── */
68
+ .progress-bar-inside {
69
+ @apply h-4 text-xs font-medium text-white text-center p-0.5 leading-none
70
+ flex items-center justify-center;
71
+ }
72
+
73
+ /* ── Bar variants ── */
74
+ .progress-bar-dark {
75
+ @apply bg-ink-900;
76
+ }
77
+ .progress-bar-brand {
78
+ @apply bg-primary;
79
+ }
80
+ .progress-bar-success {
81
+ @apply bg-success;
82
+ }
83
+ .progress-bar-danger {
84
+ @apply bg-error;
85
+ }
86
+ .progress-bar-warning {
87
+ @apply bg-warning;
88
+ }
@@ -0,0 +1,35 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Wrapper ── */
4
+ .radio {
5
+ @apply inline-flex items-center gap-2 cursor-pointer select-none;
6
+ }
7
+
8
+ /* ── Hidden native input ── */
9
+ .radio-input {
10
+ @apply sr-only;
11
+ }
12
+
13
+ /* ── Custom circle ── */
14
+ .radio-circle {
15
+ @apply w-5 h-5 flex-shrink-0 rounded-full border-2 border-ink-300
16
+ transition-all duration-200;
17
+ }
18
+
19
+ .radio-input:checked + .radio-circle {
20
+ @apply border-primary;
21
+ box-shadow: inset 0 0 0 4px var(--color-primary);
22
+ }
23
+
24
+ .radio-input:focus-visible + .radio-circle {
25
+ @apply ring-4 ring-primary-200;
26
+ }
27
+
28
+ .radio-input:disabled ~ .radio-circle,
29
+ .radio-input:disabled ~ .radio-label {
30
+ @apply opacity-50 cursor-not-allowed;
31
+ }
32
+
33
+ .radio-input:disabled ~ .radio-circle {
34
+ @apply bg-surface-muted;
35
+ }
File without changes
@@ -0,0 +1,75 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Wrapper ── */
4
+ .select-wrapper {
5
+ @apply relative inline-block w-full;
6
+ }
7
+
8
+ /* ── Trigger ── */
9
+ .select-trigger {
10
+ @apply w-full appearance-none border border-ink-300 rounded-base bg-surface text-ink-900
11
+ pr-10 cursor-pointer text-left relative
12
+ transition-colors duration-200
13
+ focus:outline-none focus:ring-4 focus:ring-primary-200 focus:border-primary;
14
+ }
15
+
16
+ .select-disabled {
17
+ @apply opacity-50 cursor-not-allowed bg-surface-muted;
18
+ }
19
+
20
+ .select-placeholder {
21
+ @apply text-ink-400;
22
+ }
23
+
24
+ /* ── Sizes ── */
25
+ .select-sm {
26
+ @apply text-sm px-3 py-2;
27
+ }
28
+ .select-md {
29
+ @apply text-sm px-4 py-2.5;
30
+ }
31
+ .select-lg {
32
+ @apply text-base px-5 py-3;
33
+ }
34
+
35
+ /* ── States ── */
36
+ .select-error {
37
+ @apply border-error-500 focus:ring-error-200 focus:border-error-500;
38
+ }
39
+ .select-success {
40
+ @apply border-success-500 focus:ring-success-200 focus:border-success-500;
41
+ }
42
+
43
+ /* ── Chevron icon ── */
44
+ .select-icon {
45
+ @apply absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-ink-400
46
+ transition-transform duration-200;
47
+ }
48
+ .select-chevron-open {
49
+ @apply rotate-180;
50
+ }
51
+
52
+ /* ── Dropdown panel ── */
53
+ .select-panel {
54
+ @apply absolute z-50 mt-1 w-full bg-surface border border-ink-200 rounded-base shadow-lg
55
+ max-h-60 overflow-y-auto py-1 list-none m-0 p-0;
56
+ }
57
+
58
+ /* ── Option item ── */
59
+ .select-option {
60
+ @apply px-4 py-2.5 text-sm text-ink-900 cursor-pointer flex items-center gap-2
61
+ transition-colors duration-100
62
+ hover:bg-ink-50;
63
+ }
64
+ .select-option-selected {
65
+ @apply bg-primary-50 text-primary-700;
66
+ }
67
+
68
+ /* ── Checkbox (multi-select) ── */
69
+ .select-checkbox {
70
+ @apply inline-flex items-center justify-center w-4 h-4 border border-ink-300 rounded-sm
71
+ bg-surface flex-shrink-0;
72
+ }
73
+ .select-checkbox-checked {
74
+ @apply bg-primary border-primary text-white;
75
+ }
@@ -0,0 +1,41 @@
1
+ @reference "tailwindcss";
2
+
3
+ /* ── Sidebar container ── */
4
+ .sidebar {
5
+ @apply fixed top-0 left-0 z-40 w-64 h-screen
6
+ bg-surface border-r border-ink-200
7
+ flex flex-col
8
+ transition-transform duration-200 ease-in-out;
9
+ }
10
+
11
+ .sidebar-with-header {
12
+ @apply pt-14;
13
+ }
14
+
15
+ .sidebar-hidden {
16
+ @apply -translate-x-full invisible pointer-events-none;
17
+ }
18
+
19
+ .sidebar-visible {
20
+ @apply translate-x-0;
21
+ }
22
+
23
+ /* ── Header slot ── */
24
+ .sidebar-header {
25
+ @apply p-5 border-b border-ink-200 flex items-center justify-between;
26
+ }
27
+
28
+ /* ── Scrollable body ── */
29
+ .sidebar-body {
30
+ @apply mt-6 flex-1 overflow-y-auto p-4;
31
+ }
32
+
33
+ /* ── Footer slot ── */
34
+ .sidebar-footer {
35
+ @apply p-4 border-t border-ink-200;
36
+ }
37
+
38
+ /* ── Hover trigger strip (left edge, invisible) ── */
39
+ .sidebar-trigger {
40
+ @apply fixed top-0 left-0 z-30 w-3 h-screen;
41
+ }