@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 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.4.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.24.0",
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.24.0",
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",
@@ -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 {
@@ -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 page head, the filter bar, the stat strip, the plain data table, the
6
- * callout, the form section, the side-sheet footer. They work in any framework (plain HTML,
7
- * Lit, React) and read tokens only — no literal colours.
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 → stat strip → tabs → cards
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 (see .hs-stats). */
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 */