@iyulab/house-style 0.4.0 → 0.5.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/CHANGELOG.md +40 -0
- package/package.json +3 -3
- package/styles/components.css +48 -0
- package/styles/patterns.css +19 -137
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.5.0] - 2026-10-14
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **The inline alert as the house callout.** `u-alert[inline]` lays its footer out as a right-hand action column
|
|
8
|
+
beside the title and body, at the dense text step (13px · 20px lines), with the body in the weak text colour.
|
|
9
|
+
- `u-tag[size='sm']` — the small step stays an 18px mark (no block padding, 5px sides) under the house tag padding.
|
|
10
|
+
- `u-tab-nav` — the tab strip of links draws the current view in ink (ink text, ink underline, semibold) at the dense
|
|
11
|
+
text step.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Requires `@iyulab/components` 2.25.0 or later (peer range `^2.25.0`) — the recipes above style its `u-tab-nav`,
|
|
16
|
+
`u-tag size` and `u-alert inline`.
|
|
17
|
+
|
|
18
|
+
### Deprecated
|
|
19
|
+
|
|
20
|
+
- **`.hs-callout` and its parts — use `<u-alert inline open>`** (`@iyulab/components` 2.25): `--warning` / `--info` /
|
|
21
|
+
`--success` / `--danger` → `status`, `__title` → `title`, `__body` → the content, `__actions` → `slot="footer"`
|
|
22
|
+
(the house puts it in the right-hand column). A note (`--note`) is `status="notice"` with `role="note"` and its
|
|
23
|
+
pencil in `slot="icon"`, so it is not announced as news. Removed in 0.6.0.
|
|
24
|
+
- **`.hs-views` / `.hs-views__tab` and `.hs-count` — use `<u-tab-nav label>` with `<u-tab href count>`**
|
|
25
|
+
(`@iyulab/components` 2.25). Saved views are URLs, so the tabs are links in a navigation landmark: the current view
|
|
26
|
+
is `aria-current="page"` (set `value` on the strip), and each link is a Tab stop. Removed in 0.6.0.
|
|
27
|
+
- **A whole card as a link (`a.hs-card`, `.hs-card--link`) — use `<u-card href>`** (`@iyulab/components` 2.25): the
|
|
28
|
+
outer box is the link, the border carries hover, the card does not lift. The titled card itself stays. Removed in
|
|
29
|
+
0.6.0.
|
|
30
|
+
- **`.hs-attr` — use `<u-tag size="sm" appearance="outlined">`** (`@iyulab/components` 2.25). Removed in 0.6.0.
|
|
31
|
+
|
|
32
|
+
### Removed
|
|
33
|
+
|
|
34
|
+
- The 0.4.0 deprecations: `.hs-page-head` and its parts (use `u-page-header`), `.hs-kbd` (use `<kbd>`), `.hs-stats` /
|
|
35
|
+
`.hs-stat` and its parts including `.hs-stat--hero` (use `u-info-section layout="strip"` with
|
|
36
|
+
`u-info-field size="lg"`), and `.hs-sheet-footer` and its parts (use `<u-action-bar sticky>`).
|
|
37
|
+
|
|
38
|
+
### Guide
|
|
39
|
+
|
|
40
|
+
- The list screen's saved views are a `u-tab-nav`, the attribute next to an order id is a small tag, and the callouts
|
|
41
|
+
are inline alerts.
|
|
42
|
+
|
|
3
43
|
## [0.4.0] - 2026-10-14
|
|
4
44
|
|
|
5
45
|
### Added
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iyulab/house-style",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "The iyulab house theme: a CSS-only theme for @iyulab components — tokens, component recipes, line-of-business layout patterns and a Tailwind CSS v4 preset — plus the guide site that documents it.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"pretendard": "^1.3.9"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
|
-
"@iyulab/components": "^2.
|
|
61
|
+
"@iyulab/components": "^2.25.0",
|
|
62
62
|
"@iyulab/flex-table": ">=0.41.0",
|
|
63
63
|
"@iyulab/modern-app": ">=0.39.0"
|
|
64
64
|
},
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
|
-
"@iyulab/components": "^2.
|
|
74
|
+
"@iyulab/components": "^2.25.0",
|
|
75
75
|
"@iyulab/data-components": "^0.49.0",
|
|
76
76
|
"@iyulab/enterprise": "^0.32.0",
|
|
77
77
|
"@iyulab/flex-table": "^0.67.0",
|
package/styles/components.css
CHANGED
|
@@ -140,6 +140,54 @@ u-tag {
|
|
|
140
140
|
--tag-padding-inline: 8px;
|
|
141
141
|
--tag-gap: 5px;
|
|
142
142
|
}
|
|
143
|
+
/* The small step — 18px marks inside a line of text (an attribute next to an id): no block padding, 5px sides. */
|
|
144
|
+
u-tag[size='sm'] {
|
|
145
|
+
--tag-padding-block: 0;
|
|
146
|
+
--tag-padding-inline: 5px;
|
|
147
|
+
--tag-gap: 4px;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* ── Tab strip of links (saved views) — ink, not blue: the current view is ink text with an ink underline,
|
|
151
|
+
* at the dense text step. ── */
|
|
152
|
+
u-tab-nav {
|
|
153
|
+
--tab-nav-color: var(--u-txt-color);
|
|
154
|
+
font-size: var(--hs-text-dense-size, 13px);
|
|
155
|
+
}
|
|
156
|
+
u-tab-nav u-tab[active] {
|
|
157
|
+
font-weight: 600;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* ── Inline alert — the house callout: actions in a right-hand column beside the title and body, at the dense
|
|
161
|
+
* text step. A floating alert (no `inline`) keeps the component layout. ── */
|
|
162
|
+
u-alert[inline]::part(container) {
|
|
163
|
+
display: grid;
|
|
164
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
165
|
+
column-gap: var(--u-space-md, 12px);
|
|
166
|
+
align-items: center;
|
|
167
|
+
}
|
|
168
|
+
u-alert[inline]::part(header),
|
|
169
|
+
u-alert[inline]::part(content) {
|
|
170
|
+
grid-column: 1;
|
|
171
|
+
}
|
|
172
|
+
u-alert[inline]::part(footer) {
|
|
173
|
+
grid-column: 2;
|
|
174
|
+
grid-row: 1 / span 2;
|
|
175
|
+
display: flex;
|
|
176
|
+
gap: var(--u-space-sm, 8px);
|
|
177
|
+
}
|
|
178
|
+
u-alert[inline]::part(header) {
|
|
179
|
+
margin-bottom: 0;
|
|
180
|
+
font-size: var(--hs-text-dense-size, 13px);
|
|
181
|
+
}
|
|
182
|
+
u-alert[inline]::part(title) {
|
|
183
|
+
line-height: 20px;
|
|
184
|
+
}
|
|
185
|
+
u-alert[inline]::part(content) {
|
|
186
|
+
font-size: var(--hs-text-dense-size, 13px);
|
|
187
|
+
font-weight: 400;
|
|
188
|
+
line-height: 20px;
|
|
189
|
+
color: var(--u-txt-color-weak);
|
|
190
|
+
}
|
|
143
191
|
|
|
144
192
|
/* ── Card — flat surface, hairline border; shadow is for things that float ── */
|
|
145
193
|
u-card {
|
package/styles/patterns.css
CHANGED
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
* @iyulab/house-style — layout patterns
|
|
3
3
|
* ==========================================================================
|
|
4
4
|
* Class-based patterns for the arrangements a line-of-business screen repeats and no single
|
|
5
|
-
* component owns: the
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* component owns: the filter bar, the table card, the plain data table, the form section, the
|
|
6
|
+
* detail layout. They work in any framework (plain HTML, Lit, React) and read tokens only — no
|
|
7
|
+
* literal colours. Where a component owns the arrangement, the component is the canonical form
|
|
8
|
+
* and the pattern is deprecated with the version it goes in (`remove:`).
|
|
8
9
|
*
|
|
9
10
|
* Prefix `hs-`. Everything sits in `@layer iyu.house`; an application rule always wins.
|
|
10
11
|
*
|
|
11
12
|
* Screen recipes (the guide shows each one):
|
|
12
13
|
* list = u-page-header → .hs-filter-bar → u-info-section layout="strip" → .hs-table-card (toolbar · table · pager)
|
|
13
|
-
* detail = side sheet: head (id · status · one primary action) → steps →
|
|
14
|
+
* detail = side sheet: head (id · status · one primary action) → steps → u-info-section strip → tabs → cards
|
|
14
15
|
* edit = side sheet with .hs-fieldset sections and a pinned u-action-bar (summary slot)
|
|
15
16
|
*
|
|
16
17
|
* Rules the patterns encode:
|
|
@@ -33,47 +34,12 @@
|
|
|
33
34
|
min-width: 0;
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
/* Page head — eyebrow · title · one-line description on the left; on the right a scope
|
|
37
|
-
picker (data-wide filters such as a season or period), up to two secondary actions and
|
|
38
|
-
the single primary action, in that order.
|
|
39
|
-
@deprecated Use `u-page-header` (`@iyulab/modern-app`) — `eyebrow` · `title` · `subtitle`, and the
|
|
40
|
-
scope picker and actions in its `actions` slot. The house already draws it this way
|
|
41
|
-
(`components.css`), and it carries the page's h1 and a back link. remove: 0.5.0 */
|
|
42
|
-
.hs-page-head {
|
|
43
|
-
display: flex;
|
|
44
|
-
align-items: flex-end;
|
|
45
|
-
justify-content: space-between;
|
|
46
|
-
gap: var(--u-space-lg, 16px);
|
|
47
|
-
flex-wrap: wrap;
|
|
48
|
-
}
|
|
49
|
-
.hs-page-head__eyebrow {
|
|
50
|
-
margin: 0 0 2px;
|
|
51
|
-
font-size: var(--u-text-label-size, 12px);
|
|
52
|
-
line-height: 16px;
|
|
53
|
-
color: var(--u-txt-color-weak);
|
|
54
|
-
}
|
|
55
|
-
.hs-page-head__title {
|
|
56
|
-
margin: 0;
|
|
57
|
-
font-size: var(--u-text-display-size, 22px);
|
|
58
|
-
line-height: var(--u-text-display-leading, 1.364);
|
|
59
|
-
font-weight: var(--u-text-display-weight, 700);
|
|
60
|
-
letter-spacing: var(--u-text-display-tracking, -0.01em);
|
|
61
|
-
color: var(--u-txt-color);
|
|
62
|
-
}
|
|
63
|
-
.hs-page-head__description {
|
|
64
|
-
margin: 2px 0 0;
|
|
65
|
-
font-size: var(--u-text-label-size, 12px);
|
|
66
|
-
line-height: 18px;
|
|
67
|
-
color: var(--u-txt-color-weak);
|
|
68
|
-
}
|
|
69
|
-
.hs-page-head__actions {
|
|
70
|
-
display: flex;
|
|
71
|
-
align-items: center;
|
|
72
|
-
gap: var(--u-space-sm, 8px);
|
|
73
|
-
flex-wrap: wrap;
|
|
74
|
-
}
|
|
75
37
|
|
|
76
38
|
/* ── Saved views — tabs above the filter bar, each with a count ─────────── */
|
|
39
|
+
/* @deprecated Use `<u-tab-nav label>` with `<u-tab href count>` (`@iyulab/components` 2.25) — the same strip as a
|
|
40
|
+
navigation landmark of links: the current view is `aria-current="page"` (these tabs are URLs, so they are links,
|
|
41
|
+
not a tablist), each link is a Tab stop, and `count` is the quiet count. The house draws it this way
|
|
42
|
+
(`components.css`). `.hs-count` goes with it. remove: 0.6.0 */
|
|
77
43
|
.hs-views {
|
|
78
44
|
display: flex;
|
|
79
45
|
gap: var(--u-space-2xs, 4px);
|
|
@@ -150,66 +116,6 @@
|
|
|
150
116
|
display: none;
|
|
151
117
|
}
|
|
152
118
|
|
|
153
|
-
/* ── Stat strip — the result's totals as cells, not a sentence ───────────
|
|
154
|
-
* 3–5 cells: label → value → one supporting line. One hero value per screen at most. */
|
|
155
|
-
/* Side by side, or stacked when the strip is narrower than 640px — all or nothing, never a ragged row.
|
|
156
|
-
* No size container: the threshold is each stat's flex-basis, calc((640px - 100%) * 999) — negative
|
|
157
|
-
* (so 0) when wide, huge when narrow (the "Holy Albatross"). The dividers are the 1px gap showing the
|
|
158
|
-
* strip's border-coloured background, so they turn from vertical to horizontal on their own.
|
|
159
|
-
* @deprecated Use `u-info-section layout="strip"` with `u-info-field size="lg"` (`@iyulab/modern-app` 0.54) — the
|
|
160
|
-
* same strip as a component: `label` · `value` · `unit` · `description` (the supporting line) and `tone` for the
|
|
161
|
-
* warning, danger and success values. `.hs-stat--hero` has no counterpart and goes with it. remove: 0.5.0 */
|
|
162
|
-
.hs-stats {
|
|
163
|
-
display: flex;
|
|
164
|
-
flex-wrap: wrap;
|
|
165
|
-
gap: 1px;
|
|
166
|
-
background: var(--u-border-color);
|
|
167
|
-
border: 1px solid var(--u-border-color);
|
|
168
|
-
border-radius: var(--u-radius-xl, 10px);
|
|
169
|
-
overflow: hidden;
|
|
170
|
-
}
|
|
171
|
-
.hs-stat {
|
|
172
|
-
flex: 1 1 calc((640px - 100%) * 999);
|
|
173
|
-
min-width: 0;
|
|
174
|
-
padding: var(--u-space-md, 12px) var(--u-space-lg, 16px);
|
|
175
|
-
background: var(--u-bg-color);
|
|
176
|
-
}
|
|
177
|
-
.hs-stat__label {
|
|
178
|
-
font-size: var(--u-text-label-size, 12px);
|
|
179
|
-
line-height: 16px;
|
|
180
|
-
font-weight: 500;
|
|
181
|
-
color: var(--u-txt-color-weak);
|
|
182
|
-
}
|
|
183
|
-
.hs-stat__value {
|
|
184
|
-
margin-top: 2px;
|
|
185
|
-
font-size: var(--u-text-title-size, 18px);
|
|
186
|
-
line-height: 26px;
|
|
187
|
-
font-weight: 700;
|
|
188
|
-
font-variant-numeric: tabular-nums;
|
|
189
|
-
white-space: nowrap;
|
|
190
|
-
overflow: hidden;
|
|
191
|
-
text-overflow: ellipsis;
|
|
192
|
-
color: var(--u-txt-color);
|
|
193
|
-
}
|
|
194
|
-
.hs-stat__unit {
|
|
195
|
-
margin-inline-start: 2px;
|
|
196
|
-
font-size: var(--u-text-caption-size, 12px);
|
|
197
|
-
font-weight: 500;
|
|
198
|
-
color: var(--u-txt-color-weak);
|
|
199
|
-
}
|
|
200
|
-
.hs-stat__sub {
|
|
201
|
-
font-size: var(--u-text-caption-size, 12px);
|
|
202
|
-
line-height: 18px;
|
|
203
|
-
color: var(--u-txt-color-weaker);
|
|
204
|
-
}
|
|
205
|
-
.hs-stat--hero .hs-stat__value {
|
|
206
|
-
font-size: var(--hs-text-hero-size, 28px);
|
|
207
|
-
line-height: 34px;
|
|
208
|
-
letter-spacing: -0.01em;
|
|
209
|
-
}
|
|
210
|
-
.hs-stat--warning .hs-stat__value { color: var(--u-warning-color-strong); }
|
|
211
|
-
.hs-stat--danger .hs-stat__value { color: var(--u-danger-color-strong); }
|
|
212
|
-
.hs-stat--success .hs-stat__value { color: var(--u-success-color-strong); }
|
|
213
119
|
|
|
214
120
|
/* ── Table card — toolbar · table · pager on one surface ──────────────── */
|
|
215
121
|
.hs-table-card {
|
|
@@ -373,6 +279,8 @@ tr[aria-selected='true'] .hs-row-actions {
|
|
|
373
279
|
text-decoration: none;
|
|
374
280
|
}
|
|
375
281
|
.hs-card__link:hover { text-decoration: underline; }
|
|
282
|
+
/* @deprecated A whole card as a link: use `<u-card href>` (`@iyulab/components` 2.25) — the outer box is the link,
|
|
283
|
+
the border carries hover and the card does not lift. remove: 0.6.0 */
|
|
376
284
|
a.hs-card,
|
|
377
285
|
.hs-card--link { cursor: pointer; transition: border-color 0.12s ease-out; }
|
|
378
286
|
/* A whole card as a link reads as a card: ink text, no underline — the border carries hover. */
|
|
@@ -396,7 +304,8 @@ a.hs-card:hover,
|
|
|
396
304
|
.hs-dl > dd { margin: 0; min-width: 0; }
|
|
397
305
|
|
|
398
306
|
/* Two-column detail: main column plus a 340px side panel once the columns are 960px wide, one column
|
|
399
|
-
* below that. No size container — the threshold is each column's flex-basis (
|
|
307
|
+
* below that. No size container — the threshold is each column's flex-basis, calc((960px - 100%) * 999):
|
|
308
|
+
* negative (so 0) when wide, huge when narrow (the "Holy Albatross"). */
|
|
400
309
|
.hs-detail__cols {
|
|
401
310
|
display: flex;
|
|
402
311
|
flex-wrap: wrap;
|
|
@@ -419,6 +328,10 @@ a.hs-card:hover,
|
|
|
419
328
|
}
|
|
420
329
|
|
|
421
330
|
/* ── Callout — a conclusion in the title, two lines of body at most ──────
|
|
331
|
+
* @deprecated Use `<u-alert inline open>` (`@iyulab/components` 2.25) — `status` for the tone, `title` for the
|
|
332
|
+
* conclusion, the body as content, actions in `slot="footer"`, and `slot="icon"` for a note's pencil; a note is a
|
|
333
|
+
* neutral alert with `role="note"`. The house lays the footer out as the right-hand action column
|
|
334
|
+
* (`components.css`). remove: 0.6.0
|
|
422
335
|
* No thick coloured edge: an icon and a tint carry the tone. `--note` is a person's note
|
|
423
336
|
* (a remark on a record), not a warning — it is neutral on purpose. */
|
|
424
337
|
.hs-callout {
|
|
@@ -528,30 +441,10 @@ a.hs-card:hover,
|
|
|
528
441
|
}
|
|
529
442
|
.hs-span-all { grid-column: 1 / -1; }
|
|
530
443
|
|
|
531
|
-
/* ── Side sheet footer — change summary on the left, Cancel / Save on the right ──
|
|
532
|
-
* @deprecated Use `<u-action-bar sticky>` (`@iyulab/modern-app` 0.54): the summary in `slot="summary"`, Cancel and
|
|
533
|
-
* Save as its children, the sheet's inset as `--action-bar-padding-inline`. It also keeps a destructive action
|
|
534
|
-
* apart at the leading edge and puts the main actions on top when narrow. remove: 0.5.0 */
|
|
535
|
-
.hs-sheet-footer {
|
|
536
|
-
display: flex;
|
|
537
|
-
align-items: center;
|
|
538
|
-
justify-content: space-between;
|
|
539
|
-
gap: var(--u-space-sm, 8px);
|
|
540
|
-
padding: var(--u-space-md, 12px) var(--u-space-xl, 20px);
|
|
541
|
-
border-top: 1px solid var(--u-border-color);
|
|
542
|
-
background: var(--u-bg-color);
|
|
543
|
-
}
|
|
544
|
-
.hs-sheet-footer__summary {
|
|
545
|
-
font-size: var(--u-text-caption-size, 12px);
|
|
546
|
-
color: var(--u-txt-color-weak);
|
|
547
|
-
}
|
|
548
|
-
.hs-sheet-footer__actions {
|
|
549
|
-
display: flex;
|
|
550
|
-
gap: var(--u-space-sm, 8px);
|
|
551
|
-
}
|
|
552
444
|
|
|
553
445
|
/* ── Small marks ───────────────────────────────────────────────────────── */
|
|
554
|
-
/* A quiet attribute label next to an identifier (not a status — no colour).
|
|
446
|
+
/* A quiet attribute label next to an identifier (not a status — no colour).
|
|
447
|
+
@deprecated Use `<u-tag size="sm" appearance="outlined">` (`@iyulab/components` 2.25). remove: 0.6.0 */
|
|
555
448
|
.hs-attr {
|
|
556
449
|
display: inline-flex;
|
|
557
450
|
align-items: center;
|
|
@@ -582,16 +475,5 @@ a.hs-card:hover,
|
|
|
582
475
|
}
|
|
583
476
|
.hs-due--soon { background: var(--u-warning-bg-color); color: var(--u-warning-color-strong); }
|
|
584
477
|
.hs-due--over { background: var(--u-danger-bg-color); color: var(--u-danger-color-strong); }
|
|
585
|
-
/* A keyboard hint.
|
|
586
|
-
@deprecated Use a plain `<kbd>` — the house draws it the same way (`components.css`), in the
|
|
587
|
-
monospace face. remove: 0.5.0 */
|
|
588
|
-
.hs-kbd {
|
|
589
|
-
padding: 0 4px;
|
|
590
|
-
border: 1px solid var(--u-border-color);
|
|
591
|
-
border-radius: var(--u-radius-md, 4px);
|
|
592
|
-
background: var(--u-canvas-bg-color);
|
|
593
|
-
font: 500 11px/16px var(--u-font-base);
|
|
594
|
-
color: var(--u-txt-color-weak);
|
|
595
|
-
}
|
|
596
478
|
|
|
597
479
|
} /* @layer iyu.house */
|