@iyulab/house-style 0.3.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,84 @@
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
+
43
+ ## [0.4.0] - 2026-10-14
44
+
45
+ ### Added
46
+
47
+ - `<kbd>` outside a component takes the keyboard-hint look (border, canvas background, overline size).
48
+ - `.hs-table-toolbar__actions` — the action group at the end of a table toolbar.
49
+
50
+ ### Changed
51
+
52
+ - Requires `@iyulab/components` 2.24.0 or later (peer range `^2.24.0`). The house sets the selection role
53
+ (`--u-selection-color`), which components reads from 2.24.0 — with an older components a checked box, a selected
54
+ radio and an on switch keep the primary colour.
55
+
56
+
57
+ ### Deprecated
58
+
59
+ - **`.hs-page-head` and its parts (`__eyebrow` · `__title` · `__description` · `__actions`) — use `u-page-header`**
60
+ from `@iyulab/modern-app`. The house already draws that component the same way (label-size eyebrow and
61
+ description, display-size title), and it carries the page's `h1`, a back link and a status slot the class pattern
62
+ does not. Move the eyebrow, title and description to its `eyebrow`, `title` and `subtitle` attributes and put each
63
+ scope picker and action in `slot="actions"`. Removed in 0.5.0.
64
+ - **`.hs-kbd` — use a plain `<kbd>`.** The house now draws `<kbd>` as the same small outlined cap, in the monospace
65
+ face. Removed in 0.5.0.
66
+ - **`.hs-stats` / `.hs-stat` and its parts — use `u-info-section layout="strip"`** with `u-info-field size="lg"`
67
+ (`@iyulab/modern-app` 0.54): `__label` → `label`, `__value` → `value`, `__unit` → `unit`, `__sub` → `description`,
68
+ `--warning` / `--danger` / `--success` → `tone="warning"` / `"negative"` / `"positive"`. The same strip — one surface,
69
+ hairline dividers, all side by side or all stacked below 640px. `.hs-stat--hero` has no counterpart (nothing used it)
70
+ and goes with it. Removed in 0.5.0.
71
+ - **`.hs-sheet-footer` and its parts — use `<u-action-bar sticky>`** (`@iyulab/modern-app` 0.54): the change summary in
72
+ `slot="summary"`, Cancel and Save as its children, the sheet's inset as `--action-bar-padding-inline`. It also keeps
73
+ a destructive action apart at the leading edge and puts the main actions on top when narrow. Removed in 0.5.0.
74
+
75
+ ### Fixed
76
+
77
+ - `.hs-views` no longer draws a vertical scrollbar beside its tabs. The selected tab's underline reached 1px
78
+ past the scrolling strip (a `-1px` margin over the strip's bottom border); the base line is now an inset shadow the
79
+ underline paints over.
80
+ - `.hs-table--compact` totals rows take the compact height too. `.hs-table tfoot td` set 40px with a higher
81
+ specificity, so a compact table's subtotal, tax and total rows stood taller than its body rows.
3
82
  ## [0.3.0] - 2026-10-13
4
83
 
5
84
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iyulab/house-style",
3
- "version": "0.3.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.0.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,11 +71,11 @@
71
71
  }
72
72
  },
73
73
  "devDependencies": {
74
- "@iyulab/components": "^2.20.0",
75
- "@iyulab/data-components": "^0.48.0",
74
+ "@iyulab/components": "^2.25.0",
75
+ "@iyulab/data-components": "^0.49.0",
76
76
  "@iyulab/enterprise": "^0.32.0",
77
- "@iyulab/flex-table": "^0.66.0",
78
- "@iyulab/modern-app": "^0.53.0",
77
+ "@iyulab/flex-table": "^0.67.0",
78
+ "@iyulab/modern-app": "^0.54.0",
79
79
  "@iyulab/router": "^0.24.0",
80
80
  "@iyulab/u-widgets": "^0.31.0",
81
81
  "@lit/react": "^1.0.8",
@@ -64,6 +64,17 @@
64
64
  :where(code, kbd, samp, pre) {
65
65
  font-family: var(--u-font-mono);
66
66
  }
67
+ /* A key the reader presses — a small outlined cap, quieter than the text around it. */
68
+ :where(kbd) {
69
+ padding: 0 4px;
70
+ border: 1px solid var(--u-border-color);
71
+ border-radius: var(--u-radius-md, 4px);
72
+ background: var(--u-canvas-bg-color);
73
+ font-size: var(--u-text-overline-size, 11px);
74
+ font-weight: 500;
75
+ line-height: 16px;
76
+ color: var(--u-txt-color-weak);
77
+ }
67
78
  /* A measure for running text — opt in where a paragraph can be wider than reads well. */
68
79
  :where(.hs-prose) :where(p, ul, ol, dl, blockquote) {
69
80
  max-inline-size: var(--hs-measure);
@@ -129,6 +140,54 @@ u-tag {
129
140
  --tag-padding-inline: 8px;
130
141
  --tag-gap: 5px;
131
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
+ }
132
191
 
133
192
  /* ── Card — flat surface, hairline border; shadow is for things that float ── */
134
193
  u-card {
@@ -2,16 +2,17 @@
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
- * list = .hs-page-head → .hs-filter-bar → .hs-stats → .hs-table-card (toolbar · table · pager)
13
- * detail = side sheet: head (id · status · one primary action) → steps → .hs-stats → tabs → cards
14
- * edit = side sheet with .hs-fieldset sections and a pinned .hs-sheet-footer
13
+ * list = u-page-header → .hs-filter-bar → u-info-section layout="strip" → .hs-table-card (toolbar · table · pager)
14
+ * detail = side sheet: head (id · status · one primary action) → steps → u-info-section strip → tabs → cards
15
+ * edit = side sheet with .hs-fieldset sections and a pinned u-action-bar (summary slot)
15
16
  *
16
17
  * Rules the patterns encode:
17
18
  * · one ink (primary) button per view — the rest are outlined, plain or in a menu
@@ -33,48 +34,19 @@
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
- .hs-page-head {
40
- display: flex;
41
- align-items: flex-end;
42
- justify-content: space-between;
43
- gap: var(--u-space-lg, 16px);
44
- flex-wrap: wrap;
45
- }
46
- .hs-page-head__eyebrow {
47
- margin: 0 0 2px;
48
- font-size: var(--u-text-label-size, 12px);
49
- line-height: 16px;
50
- color: var(--u-txt-color-weak);
51
- }
52
- .hs-page-head__title {
53
- margin: 0;
54
- font-size: var(--u-text-display-size, 22px);
55
- line-height: var(--u-text-display-leading, 1.364);
56
- font-weight: var(--u-text-display-weight, 700);
57
- letter-spacing: var(--u-text-display-tracking, -0.01em);
58
- color: var(--u-txt-color);
59
- }
60
- .hs-page-head__description {
61
- margin: 2px 0 0;
62
- font-size: var(--u-text-label-size, 12px);
63
- line-height: 18px;
64
- color: var(--u-txt-color-weak);
65
- }
66
- .hs-page-head__actions {
67
- display: flex;
68
- align-items: center;
69
- gap: var(--u-space-sm, 8px);
70
- flex-wrap: wrap;
71
- }
72
37
 
73
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 */
74
43
  .hs-views {
75
44
  display: flex;
76
45
  gap: var(--u-space-2xs, 4px);
77
- border-bottom: 1px solid var(--u-border-color);
46
+ /* The base line is an inset shadow, not a border: a tab's 2px underline paints over it without the tab
47
+ reaching past the box — with a border and a -1px tab margin the scroll container overflowed by 1px and
48
+ drew a vertical scrollbar beside the tabs. */
49
+ box-shadow: inset 0 -1px 0 var(--u-border-color);
78
50
  overflow-x: auto;
79
51
  }
80
52
  .hs-views__tab {
@@ -82,7 +54,6 @@
82
54
  align-items: center;
83
55
  gap: 6px;
84
56
  padding: var(--u-space-sm, 8px) var(--u-space-md, 12px);
85
- margin-bottom: -1px;
86
57
  border: 0;
87
58
  border-bottom: 2px solid transparent;
88
59
  background: none;
@@ -145,63 +116,6 @@
145
116
  display: none;
146
117
  }
147
118
 
148
- /* ── Stat strip — the result's totals as cells, not a sentence ───────────
149
- * 3–5 cells: label → value → one supporting line. One hero value per screen at most. */
150
- /* Side by side, or stacked when the strip is narrower than 640px — all or nothing, never a ragged row.
151
- * No size container: the threshold is each stat's flex-basis, calc((640px - 100%) * 999) — negative
152
- * (so 0) when wide, huge when narrow (the "Holy Albatross"). The dividers are the 1px gap showing the
153
- * strip's border-coloured background, so they turn from vertical to horizontal on their own. */
154
- .hs-stats {
155
- display: flex;
156
- flex-wrap: wrap;
157
- gap: 1px;
158
- background: var(--u-border-color);
159
- border: 1px solid var(--u-border-color);
160
- border-radius: var(--u-radius-xl, 10px);
161
- overflow: hidden;
162
- }
163
- .hs-stat {
164
- flex: 1 1 calc((640px - 100%) * 999);
165
- min-width: 0;
166
- padding: var(--u-space-md, 12px) var(--u-space-lg, 16px);
167
- background: var(--u-bg-color);
168
- }
169
- .hs-stat__label {
170
- font-size: var(--u-text-label-size, 12px);
171
- line-height: 16px;
172
- font-weight: 500;
173
- color: var(--u-txt-color-weak);
174
- }
175
- .hs-stat__value {
176
- margin-top: 2px;
177
- font-size: var(--u-text-title-size, 18px);
178
- line-height: 26px;
179
- font-weight: 700;
180
- font-variant-numeric: tabular-nums;
181
- white-space: nowrap;
182
- overflow: hidden;
183
- text-overflow: ellipsis;
184
- color: var(--u-txt-color);
185
- }
186
- .hs-stat__unit {
187
- margin-inline-start: 2px;
188
- font-size: var(--u-text-caption-size, 12px);
189
- font-weight: 500;
190
- color: var(--u-txt-color-weak);
191
- }
192
- .hs-stat__sub {
193
- font-size: var(--u-text-caption-size, 12px);
194
- line-height: 18px;
195
- color: var(--u-txt-color-weaker);
196
- }
197
- .hs-stat--hero .hs-stat__value {
198
- font-size: var(--hs-text-hero-size, 28px);
199
- line-height: 34px;
200
- letter-spacing: -0.01em;
201
- }
202
- .hs-stat--warning .hs-stat__value { color: var(--u-warning-color-strong); }
203
- .hs-stat--danger .hs-stat__value { color: var(--u-danger-color-strong); }
204
- .hs-stat--success .hs-stat__value { color: var(--u-success-color-strong); }
205
119
 
206
120
  /* ── Table card — toolbar · table · pager on one surface ──────────────── */
207
121
  .hs-table-card {
@@ -233,6 +147,12 @@
233
147
  font-size: var(--hs-text-dense-size, 13px);
234
148
  font-weight: 600;
235
149
  }
150
+ .hs-table-toolbar__actions {
151
+ display: flex;
152
+ align-items: center;
153
+ gap: var(--u-space-sm, 8px);
154
+ flex-wrap: wrap;
155
+ }
236
156
  .hs-pager {
237
157
  display: flex;
238
158
  align-items: center;
@@ -279,7 +199,9 @@
279
199
  }
280
200
  /* One line separates the totals from the body — not one per totals row (subtotal · tax · total). */
281
201
  .hs-table tfoot tr:first-child td { border-top: 1px solid var(--u-border-color); }
282
- .hs-table--compact td { height: var(--hs-row-compact, 32px); }
202
+ /* Totals rows follow the compact height too (`tfoot td` would otherwise win on specificity). */
203
+ .hs-table--compact td,
204
+ .hs-table--compact tfoot td { height: var(--hs-row-compact, 32px); }
283
205
  .hs-table--top td { vertical-align: top; padding-block: var(--u-space-sm, 8px); height: auto; }
284
206
  /* Cells (`th` too — header text aligns with its values) */
285
207
  .hs-num,
@@ -357,6 +279,8 @@ tr[aria-selected='true'] .hs-row-actions {
357
279
  text-decoration: none;
358
280
  }
359
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 */
360
284
  a.hs-card,
361
285
  .hs-card--link { cursor: pointer; transition: border-color 0.12s ease-out; }
362
286
  /* A whole card as a link reads as a card: ink text, no underline — the border carries hover. */
@@ -380,7 +304,8 @@ a.hs-card:hover,
380
304
  .hs-dl > dd { margin: 0; min-width: 0; }
381
305
 
382
306
  /* Two-column detail: main column plus a 340px side panel once the columns are 960px wide, one column
383
- * 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"). */
384
309
  .hs-detail__cols {
385
310
  display: flex;
386
311
  flex-wrap: wrap;
@@ -403,6 +328,10 @@ a.hs-card:hover,
403
328
  }
404
329
 
405
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
406
335
  * No thick coloured edge: an icon and a tint carry the tone. `--note` is a person's note
407
336
  * (a remark on a record), not a warning — it is neutral on purpose. */
408
337
  .hs-callout {
@@ -512,27 +441,10 @@ a.hs-card:hover,
512
441
  }
513
442
  .hs-span-all { grid-column: 1 / -1; }
514
443
 
515
- /* ── Side sheet footer — change summary on the left, Cancel / Save on the right ── */
516
- .hs-sheet-footer {
517
- display: flex;
518
- align-items: center;
519
- justify-content: space-between;
520
- gap: var(--u-space-sm, 8px);
521
- padding: var(--u-space-md, 12px) var(--u-space-xl, 20px);
522
- border-top: 1px solid var(--u-border-color);
523
- background: var(--u-bg-color);
524
- }
525
- .hs-sheet-footer__summary {
526
- font-size: var(--u-text-caption-size, 12px);
527
- color: var(--u-txt-color-weak);
528
- }
529
- .hs-sheet-footer__actions {
530
- display: flex;
531
- gap: var(--u-space-sm, 8px);
532
- }
533
444
 
534
445
  /* ── Small marks ───────────────────────────────────────────────────────── */
535
- /* 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 */
536
448
  .hs-attr {
537
449
  display: inline-flex;
538
450
  align-items: center;
@@ -563,14 +475,5 @@ a.hs-card:hover,
563
475
  }
564
476
  .hs-due--soon { background: var(--u-warning-bg-color); color: var(--u-warning-color-strong); }
565
477
  .hs-due--over { background: var(--u-danger-bg-color); color: var(--u-danger-color-strong); }
566
- /* A keyboard hint. */
567
- .hs-kbd {
568
- padding: 0 4px;
569
- border: 1px solid var(--u-border-color);
570
- border-radius: var(--u-radius-md, 4px);
571
- background: var(--u-canvas-bg-color);
572
- font: 500 11px/16px var(--u-font-base);
573
- color: var(--u-txt-color-weak);
574
- }
575
478
 
576
479
  } /* @layer iyu.house */