@cawalch/porchlight 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.
- package/README.md +28 -0
- package/dist/porchlight.css +3765 -0
- package/dist/porchlight.min.css +1 -0
- package/package.json +59 -0
- package/porchlight.css +62 -0
- package/src/00-layer-order.css +22 -0
- package/src/01-reset.css +53 -0
- package/src/02-tokens.css +254 -0
- package/src/03-themes.css +79 -0
- package/src/04-base.css +78 -0
- package/src/05-layout.css +209 -0
- package/src/06-components/accordion.css +161 -0
- package/src/06-components/alert.css +102 -0
- package/src/06-components/avatar.css +112 -0
- package/src/06-components/badge.css +73 -0
- package/src/06-components/breadcrumb.css +111 -0
- package/src/06-components/button.css +180 -0
- package/src/06-components/card.css +186 -0
- package/src/06-components/chip.css +146 -0
- package/src/06-components/command-palette.css +201 -0
- package/src/06-components/data-table.css +380 -0
- package/src/06-components/dialog.css +148 -0
- package/src/06-components/drawer.css +137 -0
- package/src/06-components/dropdown.css +180 -0
- package/src/06-components/empty-state.css +85 -0
- package/src/06-components/field.css +125 -0
- package/src/06-components/file-upload.css +104 -0
- package/src/06-components/nav.css +185 -0
- package/src/06-components/pagination.css +106 -0
- package/src/06-components/popover-menu.css +146 -0
- package/src/06-components/progress.css +77 -0
- package/src/06-components/reveal.css +73 -0
- package/src/06-components/scroll-progress.css +73 -0
- package/src/06-components/segmented.css +113 -0
- package/src/06-components/skeleton.css +73 -0
- package/src/06-components/stat.css +107 -0
- package/src/06-components/stepper.css +172 -0
- package/src/06-components/switch.css +138 -0
- package/src/06-components/tabs.css +164 -0
- package/src/06-components/tag-input.css +77 -0
- package/src/06-components/textarea-auto.css +77 -0
- package/src/06-components/timeline.css +129 -0
- package/src/06-components/toast.css +175 -0
- package/src/06-components/toolbar.css +87 -0
- package/src/06-components/tooltip.css +104 -0
- package/src/07-utilities.css +77 -0
- package/src/08-enhancements.css +129 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Porchlight - chip component
|
|
3
|
+
* ===========================================================================
|
|
4
|
+
* A compact tag/pill with an optional remove button. Uses relative color
|
|
5
|
+
* syntax (oklch(from ...)) to derive tinted backgrounds from the accent token.
|
|
6
|
+
*
|
|
7
|
+
* Tones via [data-tone]: default (accent), success, warning, danger.
|
|
8
|
+
* Sizes via [data-size]: default, sm.
|
|
9
|
+
*
|
|
10
|
+
* Structure:
|
|
11
|
+
* <span class="c-chip">Label</span>
|
|
12
|
+
* <span class="c-chip" data-tone="success">
|
|
13
|
+
* Active
|
|
14
|
+
* <button class="c-chip__remove" aria-label="Remove">x</button>
|
|
15
|
+
* </span>
|
|
16
|
+
*
|
|
17
|
+
* Group wrapping:
|
|
18
|
+
* <div class="c-chip-group">
|
|
19
|
+
* <span class="c-chip">...</span>
|
|
20
|
+
* <span class="c-chip">...</span>
|
|
21
|
+
* </div>
|
|
22
|
+
*/
|
|
23
|
+
@layer porchlight.components {
|
|
24
|
+
@scope (.c-chip) {
|
|
25
|
+
:scope {
|
|
26
|
+
/* Default tone: derived accent tint via relative color syntax. */
|
|
27
|
+
--c-chip-bg: oklch(from var(--pl-color-accent) calc(l + 0.35) c h / 10%);
|
|
28
|
+
--c-chip-text: var(--pl-color-accent);
|
|
29
|
+
--c-chip-pad: var(--pl-space-1) var(--pl-space-2);
|
|
30
|
+
--c-chip-gap: var(--pl-space-1);
|
|
31
|
+
|
|
32
|
+
display: inline-flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
gap: var(--c-chip-gap);
|
|
35
|
+
padding: var(--c-chip-pad);
|
|
36
|
+
border-radius: var(--pl-radius-pill);
|
|
37
|
+
background: var(--c-chip-bg);
|
|
38
|
+
color: var(--c-chip-text);
|
|
39
|
+
font-size: var(--pl-text-xs);
|
|
40
|
+
font-weight: var(--pl-font-weight-medium);
|
|
41
|
+
line-height: var(--pl-leading-snug);
|
|
42
|
+
white-space: nowrap;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Fallback bg when relative color syntax is not supported. */
|
|
46
|
+
@supports not (background: oklch(from red l c h)) {
|
|
47
|
+
:scope {
|
|
48
|
+
--c-chip-bg: color-mix(
|
|
49
|
+
in oklab,
|
|
50
|
+
var(--pl-color-accent),
|
|
51
|
+
transparent 88%
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* Tone variants. */
|
|
57
|
+
:scope[data-tone="success"] {
|
|
58
|
+
--c-chip-bg: oklch(from var(--pl-color-success) calc(l + 0.35) c h / 12%);
|
|
59
|
+
--c-chip-text: var(--pl-color-success-text);
|
|
60
|
+
|
|
61
|
+
@supports not (background: oklch(from red l c h)) {
|
|
62
|
+
--c-chip-bg: color-mix(
|
|
63
|
+
in oklab,
|
|
64
|
+
var(--pl-color-success),
|
|
65
|
+
transparent 86%
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
:scope[data-tone="warning"] {
|
|
71
|
+
--c-chip-bg: oklch(from var(--pl-color-warning) calc(l + 0.35) c h / 14%);
|
|
72
|
+
--c-chip-text: var(--pl-color-warning-text);
|
|
73
|
+
|
|
74
|
+
@supports not (background: oklch(from red l c h)) {
|
|
75
|
+
--c-chip-bg: color-mix(
|
|
76
|
+
in oklab,
|
|
77
|
+
var(--pl-color-warning),
|
|
78
|
+
transparent 84%
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
:scope[data-tone="danger"] {
|
|
84
|
+
--c-chip-bg: oklch(from var(--pl-color-danger) calc(l + 0.35) c h / 12%);
|
|
85
|
+
--c-chip-text: var(--pl-color-danger-text);
|
|
86
|
+
|
|
87
|
+
@supports not (background: oklch(from red l c h)) {
|
|
88
|
+
--c-chip-bg: color-mix(
|
|
89
|
+
in oklab,
|
|
90
|
+
var(--pl-color-danger),
|
|
91
|
+
transparent 86%
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Size variant. */
|
|
97
|
+
:scope[data-size="sm"] {
|
|
98
|
+
--c-chip-pad: 0.125rem var(--pl-space-2);
|
|
99
|
+
|
|
100
|
+
font-size: 0.6875rem;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Remove button. */
|
|
104
|
+
.c-chip__remove {
|
|
105
|
+
display: inline-flex;
|
|
106
|
+
align-items: center;
|
|
107
|
+
justify-content: center;
|
|
108
|
+
inline-size: 1rem;
|
|
109
|
+
block-size: 1rem;
|
|
110
|
+
padding: 0;
|
|
111
|
+
border: 0;
|
|
112
|
+
border-radius: 50%;
|
|
113
|
+
background: transparent;
|
|
114
|
+
color: inherit;
|
|
115
|
+
font-size: 0.75rem;
|
|
116
|
+
line-height: 1;
|
|
117
|
+
cursor: pointer;
|
|
118
|
+
opacity: 0.7;
|
|
119
|
+
transition: opacity var(--pl-duration-1) var(--pl-ease-standard);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.c-chip__remove:hover:not(:disabled) {
|
|
123
|
+
opacity: 1;
|
|
124
|
+
background: oklch(from currentColor l c h / 12%);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.c-chip__remove:focus-visible {
|
|
128
|
+
outline: var(--pl-focus-size) solid var(--pl-focus-color);
|
|
129
|
+
outline-offset: calc(var(--pl-focus-offset) / 2);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* Chip group: wrapping flex container. */
|
|
134
|
+
:where(.c-chip-group) {
|
|
135
|
+
display: flex;
|
|
136
|
+
flex-wrap: wrap;
|
|
137
|
+
gap: var(--pl-space-2);
|
|
138
|
+
align-items: center;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@media (forced-colors: active) {
|
|
142
|
+
:where(.c-chip) {
|
|
143
|
+
border: 1px solid ButtonBorder;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Porchlight - command palette component
|
|
3
|
+
* ===========================================================================
|
|
4
|
+
* A Cmd+K quick-action search overlay. Search input at top, grouped action
|
|
5
|
+
* list below, keyboard navigation (JS responsibility). Uses the Popover API
|
|
6
|
+
* for top-layer rendering + @starting-style for enter animation.
|
|
7
|
+
*
|
|
8
|
+
* The palette is centered in the viewport (not anchored to a trigger).
|
|
9
|
+
*
|
|
10
|
+
* Structure:
|
|
11
|
+
* <div popover class="c-command" id="cmdk">
|
|
12
|
+
* <input class="c-command__search" placeholder="Type a command..." />
|
|
13
|
+
* <div class="c-command__body">
|
|
14
|
+
* <div class="c-command__group">
|
|
15
|
+
* <h3 class="c-command__heading">Actions</h3>
|
|
16
|
+
* <button class="c-command__item" data-selected>
|
|
17
|
+
* <svg class="c-command__icon">...</svg>
|
|
18
|
+
* <span>Create new project</span>
|
|
19
|
+
* </button>
|
|
20
|
+
* </div>
|
|
21
|
+
* </div>
|
|
22
|
+
* <footer class="c-command__footer">
|
|
23
|
+
* <span>↑↓ to navigate</span>
|
|
24
|
+
* <span>↵ to select</span>
|
|
25
|
+
* <span>esc to close</span>
|
|
26
|
+
* </footer>
|
|
27
|
+
* </div>
|
|
28
|
+
*
|
|
29
|
+
* Open via: <button popovertarget="cmdk">Cmd+K</button>
|
|
30
|
+
*/
|
|
31
|
+
@layer porchlight.components {
|
|
32
|
+
@scope (.c-command) {
|
|
33
|
+
:scope {
|
|
34
|
+
--c-command-inline: min(36rem, calc(100vi - 2 * var(--pl-space-4)));
|
|
35
|
+
--c-command-max-block: 28rem;
|
|
36
|
+
|
|
37
|
+
margin: auto;
|
|
38
|
+
padding: 0;
|
|
39
|
+
inline-size: var(--c-command-inline);
|
|
40
|
+
max-block-size: var(--c-command-max-block);
|
|
41
|
+
|
|
42
|
+
/* Liquid Glass: no border; radius-2xl for centerstage prominence. */
|
|
43
|
+
border: none;
|
|
44
|
+
border-radius: var(--pl-radius-2xl);
|
|
45
|
+
background: light-dark(
|
|
46
|
+
oklch(100% 0 0deg / 94%),
|
|
47
|
+
oklch(17% 0.04 250deg / 92%)
|
|
48
|
+
);
|
|
49
|
+
backdrop-filter: blur(var(--pl-backdrop-blur-strong)) saturate(var(--pl-backdrop-saturate-strong));
|
|
50
|
+
-webkit-backdrop-filter: blur(var(--pl-backdrop-blur-strong)) saturate(var(--pl-backdrop-saturate-strong));
|
|
51
|
+
box-shadow: var(--pl-shadow-3);
|
|
52
|
+
overflow: hidden;
|
|
53
|
+
|
|
54
|
+
/* Asymmetric: enters deliberately (scale up + fade), exits snappily. */
|
|
55
|
+
opacity: 0;
|
|
56
|
+
transform: scale(0.97) translateY(-10px);
|
|
57
|
+
transition:
|
|
58
|
+
opacity var(--pl-duration-enter) var(--pl-ease-decelerate),
|
|
59
|
+
transform var(--pl-duration-enter) var(--pl-ease-decelerate),
|
|
60
|
+
overlay var(--pl-duration-exit) var(--pl-ease-accelerate) allow-discrete,
|
|
61
|
+
display var(--pl-duration-exit) var(--pl-ease-accelerate) allow-discrete;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* Center in viewport (override popover's default). */
|
|
65
|
+
:scope:popover-open {
|
|
66
|
+
opacity: 1;
|
|
67
|
+
transform: scale(1) translateY(0);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@starting-style {
|
|
71
|
+
:scope:popover-open {
|
|
72
|
+
opacity: 0;
|
|
73
|
+
transform: scale(0.97) translateY(-10px);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.c-command__search {
|
|
78
|
+
inline-size: 100%;
|
|
79
|
+
padding: var(--pl-space-4);
|
|
80
|
+
border: 0;
|
|
81
|
+
|
|
82
|
+
/* Softer divider on a Liquid Glass surface. */
|
|
83
|
+
border-block-end: 1px solid color-mix(
|
|
84
|
+
in oklab,
|
|
85
|
+
var(--pl-color-border),
|
|
86
|
+
transparent 40%
|
|
87
|
+
);
|
|
88
|
+
background: transparent;
|
|
89
|
+
color: var(--pl-color-text);
|
|
90
|
+
font: inherit;
|
|
91
|
+
font-size: var(--pl-text-md);
|
|
92
|
+
outline: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.c-command__search::placeholder {
|
|
96
|
+
color: var(--pl-color-text-muted);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.c-command__body {
|
|
100
|
+
max-block-size: calc(var(--c-command-max-block) - 4rem);
|
|
101
|
+
overflow-y: auto;
|
|
102
|
+
padding: var(--pl-space-2);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.c-command__group + .c-command__group {
|
|
106
|
+
margin-block-start: var(--pl-space-2);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.c-command__heading {
|
|
110
|
+
margin-block: var(--pl-space-2) var(--pl-space-1);
|
|
111
|
+
padding-inline: var(--pl-space-3);
|
|
112
|
+
font-size: var(--pl-text-xs);
|
|
113
|
+
font-weight: var(--pl-font-weight-semibold);
|
|
114
|
+
text-transform: uppercase;
|
|
115
|
+
letter-spacing: 0.04em;
|
|
116
|
+
color: var(--pl-color-text-muted);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.c-command__item {
|
|
120
|
+
display: flex;
|
|
121
|
+
align-items: center;
|
|
122
|
+
gap: var(--pl-space-3);
|
|
123
|
+
inline-size: 100%;
|
|
124
|
+
padding: var(--pl-space-2) var(--pl-space-3);
|
|
125
|
+
border: 0;
|
|
126
|
+
border-radius: var(--pl-radius-sm);
|
|
127
|
+
background: transparent;
|
|
128
|
+
color: var(--pl-color-text);
|
|
129
|
+
font: inherit;
|
|
130
|
+
font-size: var(--pl-text-sm);
|
|
131
|
+
text-align: start;
|
|
132
|
+
cursor: pointer;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.c-command__item:hover,
|
|
136
|
+
.c-command__item[data-selected] {
|
|
137
|
+
background: var(--pl-color-surface-2);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.c-command__item[data-selected] {
|
|
141
|
+
box-shadow: inset var(--pl-accent-bar-width) 0 0 var(--pl-color-accent);
|
|
142
|
+
color: var(--pl-color-accent);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.c-command__item:focus-visible {
|
|
146
|
+
outline: var(--pl-focus-size) solid var(--pl-focus-color);
|
|
147
|
+
outline-offset: calc(var(--pl-focus-offset) * -1);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.c-command__icon {
|
|
151
|
+
inline-size: 1rem;
|
|
152
|
+
block-size: 1rem;
|
|
153
|
+
color: var(--pl-color-text-muted);
|
|
154
|
+
flex-shrink: 0;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.c-command__shortcut {
|
|
158
|
+
margin-inline-start: auto;
|
|
159
|
+
padding: 0.125rem var(--pl-space-1);
|
|
160
|
+
border-radius: var(--pl-radius-sm);
|
|
161
|
+
background: var(--pl-color-surface);
|
|
162
|
+
border: 1px solid var(--pl-color-border);
|
|
163
|
+
font-size: var(--pl-text-xs);
|
|
164
|
+
color: var(--pl-color-text-muted);
|
|
165
|
+
font-family: var(--pl-font-mono);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.c-command__footer {
|
|
169
|
+
display: flex;
|
|
170
|
+
gap: var(--pl-space-4);
|
|
171
|
+
padding: var(--pl-space-2) var(--pl-space-4);
|
|
172
|
+
|
|
173
|
+
/* Softer divider. */
|
|
174
|
+
border-block-start: 1px solid color-mix(
|
|
175
|
+
in oklab,
|
|
176
|
+
var(--pl-color-border),
|
|
177
|
+
transparent 40%
|
|
178
|
+
);
|
|
179
|
+
font-size: var(--pl-text-xs);
|
|
180
|
+
color: var(--pl-color-text-muted);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* Backdrop scrim. Stronger tint + blur for contrast against Liquid Glass surface. */
|
|
185
|
+
:where(.c-command)::backdrop {
|
|
186
|
+
background: var(--pl-color-scrim);
|
|
187
|
+
backdrop-filter: blur(var(--pl-backdrop-blur-scrim)) saturate(var(--pl-backdrop-saturate-scrim));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
@media (forced-colors: active) {
|
|
191
|
+
:where(.c-command) {
|
|
192
|
+
border-color: ButtonBorder;
|
|
193
|
+
background: Canvas;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
:where(.c-command__item[data-selected]) {
|
|
197
|
+
box-shadow: inset 2px 0 0 Highlight;
|
|
198
|
+
color: Highlight;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|