@iyulab/house-style 0.4.0 → 0.6.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,100 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.6.0] - 2026-10-14
4
+
5
+ ### Added
6
+
7
+ - **`u-field` as the house form row** — 40px controls (the edit-form size, with the density), the label at the label
8
+ step in the weak colour, the help line in the weaker colour and the error in the danger colour. Needs
9
+ `@iyulab/components` 2.26 (the `header` · `label` · `footer` parts).
10
+
11
+ - **`u-list-page` as the house list screen** — the filters row centred with an 8px gap, a search field
12
+ (`type="search"`) at 240–360px, and with `appearance="card"` a flat surface (10px radius) with a 48px toolbar and a
13
+ quiet pager line (12px, weak, tabular). Needs `@iyulab/enterprise` 0.33.
14
+
15
+ - **The table toolbar as the bulk-action bar** — a 48px band above the rows; while rows are selected it takes the
16
+ primary tint, and its title (the count, or what the list holds) sits at the dense step, semibold, in ink. On a card
17
+ list page the toolbar row is a `u-action-bar` with the title in `slot="summary"`, and the tint follows the page's
18
+ `:state(selected)` (`@iyulab/enterprise` 0.34.1); `u-rich-table` gets the same look on its own toolbar and selection
19
+ bar (`@iyulab/data-components` 0.50).
20
+
21
+ ### Changed
22
+
23
+ - Requires `@iyulab/components` 2.26.0 or later (peer range `^2.26.0`) — the `u-field` recipe styles its `header`,
24
+ `label` and `footer` parts.
25
+
26
+ ### Deprecated
27
+
28
+ - **`.hs-filter-bar` (and `__search` · `__end`) and `.hs-chips` — use `u-list-page`** (`@iyulab/enterprise` 0.33): the
29
+ search and filters in `slot="filters"`, the applied chips in `slot="applied"` (it folds when empty), `__end` →
30
+ `margin-inline-start: auto` on the last filter. Removed in 0.7.0.
31
+ - **`.hs-table-card` and `.hs-pager` — use `<u-list-page appearance="card">`** with `u-pagination` in `slot="pager"`.
32
+ Removed in 0.7.0.
33
+ - **`.hs-table-toolbar` (`--selected` · `__title` · `__actions`) — use `<u-action-bar slot="toolbar">`** on a card list
34
+ page, the title in `slot="summary"`; the selected tint follows the page's `:state(selected)`. `u-rich-table` styles
35
+ its own toolbar. Removed in 0.7.0.
36
+ - **`.hs-field` and its parts — use `<u-field label>`** (`@iyulab/components` 2.26): `__label` → `label`, `__required`
37
+ → `required`, `__help` → `description`, `__error` → `invalid` with `validation-message`. The component also names the
38
+ control it wraps (the class pattern relied on a wrapping `<label>`). Removed in 0.7.0.
39
+ - **`.hs-card` (`__head` · `__title` · `__link`) — a titled card is `<u-group-box title>`** (`@iyulab/modern-app`) with
40
+ the link in `slot="actions"`; an untitled surface is `<u-card>`, or `<u-group-box flush>` when the content runs to
41
+ the edge and holds a sticky footer (`u-card` clips its overflow). Removed in 0.7.0.
42
+
43
+ ### Removed
44
+
45
+ - The 0.5.0 deprecations: `.hs-callout` and its parts (use `<u-alert inline open>`), `.hs-views` / `.hs-views__tab`
46
+ and `.hs-count` (use `<u-tab-nav>` with `<u-tab href count>`), a whole card as a link — `a.hs-card` and
47
+ `.hs-card--link` (use `<u-card href>`) — and `.hs-attr` (use `<u-tag size="sm" appearance="outlined">`).
48
+
49
+ ### Guide
50
+
51
+ - The edit form's fields are `u-field`.
52
+ - The table toolbar is a `u-action-bar` with the title in `slot="summary"`; the raw table speaks `selection-change`, so
53
+ the toolbar turns into the bulk-action bar while a row is selected.
54
+ - The brand swatches are `u-card`s and the edit form sits in a `u-group-box flush`.
55
+ - The list screen is a `u-list-page appearance="card"` — filters, an applied chip, the toolbar, the table and a
56
+ `u-pagination`.
57
+
58
+ ## [0.5.0] - 2026-10-14
59
+
60
+ ### Added
61
+
62
+ - **The inline alert as the house callout.** `u-alert[inline]` lays its footer out as a right-hand action column
63
+ beside the title and body, at the dense text step (13px · 20px lines), with the body in the weak text colour.
64
+ - `u-tag[size='sm']` — the small step stays an 18px mark (no block padding, 5px sides) under the house tag padding.
65
+ - `u-tab-nav` — the tab strip of links draws the current view in ink (ink text, ink underline, semibold) at the dense
66
+ text step.
67
+
68
+ ### Changed
69
+
70
+ - Requires `@iyulab/components` 2.25.0 or later (peer range `^2.25.0`) — the recipes above style its `u-tab-nav`,
71
+ `u-tag size` and `u-alert inline`.
72
+
73
+ ### Deprecated
74
+
75
+ - **`.hs-callout` and its parts — use `<u-alert inline open>`** (`@iyulab/components` 2.25): `--warning` / `--info` /
76
+ `--success` / `--danger` → `status`, `__title` → `title`, `__body` → the content, `__actions` → `slot="footer"`
77
+ (the house puts it in the right-hand column). A note (`--note`) is `status="notice"` with `role="note"` and its
78
+ pencil in `slot="icon"`, so it is not announced as news. Removed in 0.6.0.
79
+ - **`.hs-views` / `.hs-views__tab` and `.hs-count` — use `<u-tab-nav label>` with `<u-tab href count>`**
80
+ (`@iyulab/components` 2.25). Saved views are URLs, so the tabs are links in a navigation landmark: the current view
81
+ is `aria-current="page"` (set `value` on the strip), and each link is a Tab stop. Removed in 0.6.0.
82
+ - **A whole card as a link (`a.hs-card`, `.hs-card--link`) — use `<u-card href>`** (`@iyulab/components` 2.25): the
83
+ outer box is the link, the border carries hover, the card does not lift. The titled card itself stays. Removed in
84
+ 0.6.0.
85
+ - **`.hs-attr` — use `<u-tag size="sm" appearance="outlined">`** (`@iyulab/components` 2.25). Removed in 0.6.0.
86
+
87
+ ### Removed
88
+
89
+ - The 0.4.0 deprecations: `.hs-page-head` and its parts (use `u-page-header`), `.hs-kbd` (use `<kbd>`), `.hs-stats` /
90
+ `.hs-stat` and its parts including `.hs-stat--hero` (use `u-info-section layout="strip"` with
91
+ `u-info-field size="lg"`), and `.hs-sheet-footer` and its parts (use `<u-action-bar sticky>`).
92
+
93
+ ### Guide
94
+
95
+ - 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
96
+ are inline alerts.
97
+
3
98
  ## [0.4.0] - 2026-10-14
4
99
 
5
100
  ### 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.6.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.26.0",
62
62
  "@iyulab/flex-table": ">=0.41.0",
63
63
  "@iyulab/modern-app": ">=0.39.0"
64
64
  },
@@ -71,9 +71,9 @@
71
71
  }
72
72
  },
73
73
  "devDependencies": {
74
- "@iyulab/components": "^2.24.0",
75
- "@iyulab/data-components": "^0.49.0",
76
- "@iyulab/enterprise": "^0.32.0",
74
+ "@iyulab/components": "^2.26.0",
75
+ "@iyulab/data-components": "^0.50.0",
76
+ "@iyulab/enterprise": "^0.34.1",
77
77
  "@iyulab/flex-table": "^0.67.0",
78
78
  "@iyulab/modern-app": "^0.54.0",
79
79
  "@iyulab/router": "^0.24.0",
@@ -140,6 +140,132 @@ 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
+ /* ── Field — a labelled field is a form row: 40px controls (the side-sheet and edit-form size; toolbars keep 32px
151
+ * with unlabelled controls), the label at the label step in the weak colour, the help line in the weaker colour.
152
+ * A control's own size wins (`size="sm"` / `"lg"` set the padding on the control itself). ── */
153
+ u-field {
154
+ --u-field-padding-block: calc(8.5em / 14); /* 14px: 21 + 17 + 2 = 40 — and with the density */
155
+ }
156
+ u-field::part(header) {
157
+ margin-bottom: 6px;
158
+ font-size: var(--u-text-label-size, 12px);
159
+ }
160
+ u-field::part(label) {
161
+ line-height: 16px;
162
+ font-weight: 500;
163
+ color: var(--u-txt-color-weak);
164
+ }
165
+ u-field::part(footer) {
166
+ margin-top: 6px;
167
+ font-size: var(--u-text-caption-size, 12px);
168
+ line-height: 18px;
169
+ color: var(--u-txt-color-weaker);
170
+ }
171
+ u-field[invalid]::part(footer) {
172
+ color: var(--u-danger-color-strong);
173
+ }
174
+
175
+ /* ── List page (`@iyulab/enterprise`) — the list screen: filters on one centred row with an 8px gap and a search field
176
+ * that takes 240–360px, applied chips below, and with `appearance="card"` toolbar · table · pager on one flat
177
+ * surface (the toolbar row draws its own 48px band, a quiet pager line). ── */
178
+ u-list-page::part(filters) {
179
+ align-items: center;
180
+ gap: var(--u-space-sm, 8px);
181
+ }
182
+ u-list-page > u-input[slot='filters'][type='search'] {
183
+ flex: 0 1 360px;
184
+ min-width: 240px;
185
+ }
186
+ u-list-page[appearance='card']::part(surface) {
187
+ border-radius: var(--u-radius-xl, 10px);
188
+ background-color: var(--u-bg-color);
189
+ }
190
+ u-list-page[appearance='card']::part(pager) {
191
+ font-size: var(--u-text-label-size, 12px);
192
+ color: var(--u-txt-color-weak);
193
+ font-variant-numeric: tabular-nums;
194
+ }
195
+
196
+ /* ── Table toolbar — a 48px band above the rows; while rows are selected it is the bulk-action bar: the primary tint,
197
+ * and its title (the count, or what the list holds) at the dense step, semibold, in ink. On a card list page the
198
+ * toolbar row is a `u-action-bar` with its title in `slot="summary"`; the tint follows the page's
199
+ * `:state(selected)` (the visible view's selection, `@iyulab/enterprise` 0.34). `u-rich-table` draws its own
200
+ * toolbar and selection bar (`@iyulab/data-components` 0.50). ── */
201
+ u-list-page[appearance='card'] > u-action-bar[slot='toolbar'] {
202
+ --action-bar-padding-inline: var(--u-space-md, 12px);
203
+ box-sizing: border-box;
204
+ min-height: 48px;
205
+ padding-block: var(--u-space-sm, 8px);
206
+ }
207
+ u-list-page[appearance='card'] > u-action-bar[slot='toolbar']::part(summary) {
208
+ font-size: var(--hs-text-dense-size, 13px);
209
+ font-weight: 600;
210
+ color: var(--u-txt-color);
211
+ }
212
+ u-list-page[appearance='card']:state(selected)::part(toolbar),
213
+ u-rich-table:state(selected)::part(toolbar),
214
+ u-rich-table:state(selected)::part(selection-bar) {
215
+ background-color: var(--u-primary-bg-color);
216
+ }
217
+ u-rich-table::part(toolbar),
218
+ u-rich-table::part(selection-bar) {
219
+ box-sizing: border-box;
220
+ min-height: 48px;
221
+ }
222
+ u-rich-table::part(selection-info) {
223
+ font-size: var(--hs-text-dense-size, 13px);
224
+ font-weight: 600;
225
+ color: var(--u-txt-color);
226
+ }
227
+
228
+ /* ── Tab strip of links (saved views) — ink, not blue: the current view is ink text with an ink underline,
229
+ * at the dense text step. ── */
230
+ u-tab-nav {
231
+ --tab-nav-color: var(--u-txt-color);
232
+ font-size: var(--hs-text-dense-size, 13px);
233
+ }
234
+ u-tab-nav u-tab[active] {
235
+ font-weight: 600;
236
+ }
237
+
238
+ /* ── Inline alert — the house callout: actions in a right-hand column beside the title and body, at the dense
239
+ * text step. A floating alert (no `inline`) keeps the component layout. ── */
240
+ u-alert[inline]::part(container) {
241
+ display: grid;
242
+ grid-template-columns: minmax(0, 1fr) auto;
243
+ column-gap: var(--u-space-md, 12px);
244
+ align-items: center;
245
+ }
246
+ u-alert[inline]::part(header),
247
+ u-alert[inline]::part(content) {
248
+ grid-column: 1;
249
+ }
250
+ u-alert[inline]::part(footer) {
251
+ grid-column: 2;
252
+ grid-row: 1 / span 2;
253
+ display: flex;
254
+ gap: var(--u-space-sm, 8px);
255
+ }
256
+ u-alert[inline]::part(header) {
257
+ margin-bottom: 0;
258
+ font-size: var(--hs-text-dense-size, 13px);
259
+ }
260
+ u-alert[inline]::part(title) {
261
+ line-height: 20px;
262
+ }
263
+ u-alert[inline]::part(content) {
264
+ font-size: var(--hs-text-dense-size, 13px);
265
+ font-weight: 400;
266
+ line-height: 20px;
267
+ color: var(--u-txt-color-weak);
268
+ }
143
269
 
144
270
  /* ── Card — flat surface, hairline border; shadow is for things that float ── */
145
271
  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,100 +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
- /* ── Saved views — tabs above the filter bar, each with a count ─────────── */
77
- .hs-views {
78
- display: flex;
79
- gap: var(--u-space-2xs, 4px);
80
- /* The base line is an inset shadow, not a border: a tab's 2px underline paints over it without the tab
81
- reaching past the box — with a border and a -1px tab margin the scroll container overflowed by 1px and
82
- drew a vertical scrollbar beside the tabs. */
83
- box-shadow: inset 0 -1px 0 var(--u-border-color);
84
- overflow-x: auto;
85
- }
86
- .hs-views__tab {
87
- display: inline-flex;
88
- align-items: center;
89
- gap: 6px;
90
- padding: var(--u-space-sm, 8px) var(--u-space-md, 12px);
91
- border: 0;
92
- border-bottom: 2px solid transparent;
93
- background: none;
94
- font: inherit;
95
- font-size: var(--hs-text-dense-size, 13px);
96
- line-height: 20px;
97
- color: var(--u-txt-color-weak);
98
- text-decoration: none; /* a tab may be a link (`aria-current="page"`) */
99
- white-space: nowrap;
100
- cursor: pointer;
101
- }
102
- .hs-views__tab:hover {
103
- color: var(--u-txt-color);
104
- }
105
- .hs-views__tab[aria-selected='true'],
106
- .hs-views__tab[aria-current='page'] {
107
- color: var(--u-txt-color);
108
- border-bottom-color: var(--u-txt-color);
109
- font-weight: 600;
110
- }
111
- .hs-views__tab:focus-visible {
112
- outline: 2px solid var(--u-focus-ring-color);
113
- outline-offset: -2px;
114
- }
115
- .hs-count {
116
- display: inline-block;
117
- min-width: 20px;
118
- padding: 0 6px;
119
- border-radius: var(--u-radius-pill, 9999px);
120
- background: var(--u-bg-color-raised);
121
- color: var(--u-txt-color-weak);
122
- font-size: var(--u-text-overline-size, 11px);
123
- line-height: 16px;
124
- font-weight: 500;
125
- text-align: center;
126
- font-variant-numeric: tabular-nums;
127
- }
128
-
129
- /* ── Filter bar — search · up to three key filters · "Filters" panel · applied chips ── */
38
+ /* ── Filter bar — search · up to three key filters · "Filters" panel · applied chips ──
39
+ * @deprecated Use `u-list-page` (`@iyulab/enterprise` 0.33): the search and filters in `slot="filters"` (the house
40
+ * gives a search field 240–360px and centres the row — `components.css`), the applied chips (`u-chip removable`) in
41
+ * `slot="applied"`, which folds when empty. `__end` → `style="margin-inline-start: auto"` on the last filter.
42
+ * `.hs-chips` goes with it. remove: 0.7.0 */
130
43
  .hs-filter-bar {
131
44
  display: flex;
132
45
  flex-wrap: wrap;
@@ -150,68 +63,14 @@
150
63
  display: none;
151
64
  }
152
65
 
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
66
 
214
- /* ── Table card — toolbar · table · pager on one surface ──────────────── */
67
+ /* ── Table card — toolbar · table · pager on one surface ────────────────
68
+ * @deprecated `.hs-table-card` and `.hs-pager`: use `<u-list-page appearance="card">` (`@iyulab/enterprise` 0.33) —
69
+ * the toolbar, view and pager regions on one surface with lines between them, and `u-pagination` in `slot="pager"`.
70
+ * @deprecated `.hs-table-toolbar` (`--selected` · `__title` · `__actions`): on a card list page use
71
+ * `<u-action-bar slot="toolbar">` with the title in `slot="summary"` — the house recipe gives it the 48px band and the
72
+ * selected tint follows the page's `:state(selected)` (`@iyulab/enterprise` 0.34); `u-rich-table` styles its own toolbar
73
+ * (`@iyulab/data-components` 0.50). remove: 0.7.0 */
215
74
  .hs-table-card {
216
75
  background: var(--u-bg-color);
217
76
  border: 1px solid var(--u-border-color);
@@ -237,6 +96,10 @@
237
96
  .hs-table-toolbar--selected {
238
97
  background: var(--u-primary-bg-color);
239
98
  }
99
+ /* In a `u-list-page appearance="card"` toolbar the region draws the line below. */
100
+ u-list-page > .hs-table-toolbar {
101
+ border-bottom: 0;
102
+ }
240
103
  .hs-table-toolbar__title {
241
104
  font-size: var(--hs-text-dense-size, 13px);
242
105
  font-weight: 600;
@@ -345,7 +208,10 @@ tr[aria-selected='true'] .hs-row-actions {
345
208
  .hs-row-actions { display: none; }
346
209
  }
347
210
 
348
- /* ── Card — a titled surface for detail panels and dashboards ─────────── */
211
+ /* ── Card — a titled surface for detail panels and dashboards ───────────
212
+ * @deprecated `.hs-card` (`__head` · `__title` · `__link`): a titled card is `<u-group-box title>` (`@iyulab/modern-app`)
213
+ * with the link in `slot="actions"`; an untitled surface is `<u-card>` (`@iyulab/components`), or `<u-group-box flush>`
214
+ * when its content runs to the edge and holds a sticky footer (`u-card` clips its overflow). remove: 0.7.0 */
349
215
  .hs-card {
350
216
  background: var(--u-bg-color);
351
217
  border: 1px solid var(--u-border-color);
@@ -373,15 +239,6 @@ tr[aria-selected='true'] .hs-row-actions {
373
239
  text-decoration: none;
374
240
  }
375
241
  .hs-card__link:hover { text-decoration: underline; }
376
- a.hs-card,
377
- .hs-card--link { cursor: pointer; transition: border-color 0.12s ease-out; }
378
- /* A whole card as a link reads as a card: ink text, no underline — the border carries hover. */
379
- a.hs-card { color: inherit; text-decoration: none; }
380
- a.hs-card:hover,
381
- .hs-card--link:hover { border-color: var(--u-border-color-strong); }
382
- @media (prefers-reduced-motion: reduce) {
383
- a.hs-card, .hs-card--link { transition: none; }
384
- }
385
242
 
386
243
  /* Description list — label / value pairs inside a card. */
387
244
  .hs-dl {
@@ -396,7 +253,8 @@ a.hs-card:hover,
396
253
  .hs-dl > dd { margin: 0; min-width: 0; }
397
254
 
398
255
  /* 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). */
256
+ * below that. No size container — the threshold is each column's flex-basis, calc((960px - 100%) * 999):
257
+ * negative (so 0) when wide, huge when narrow (the "Holy Albatross"). */
400
258
  .hs-detail__cols {
401
259
  display: flex;
402
260
  flex-wrap: wrap;
@@ -418,34 +276,6 @@ a.hs-card:hover,
418
276
  align-items: start;
419
277
  }
420
278
 
421
- /* ── Callout — a conclusion in the title, two lines of body at most ──────
422
- * No thick coloured edge: an icon and a tint carry the tone. `--note` is a person's note
423
- * (a remark on a record), not a warning — it is neutral on purpose. */
424
- .hs-callout {
425
- display: grid;
426
- grid-template-columns: auto minmax(0, 1fr) auto;
427
- gap: var(--u-space-md, 12px);
428
- align-items: start;
429
- padding: var(--u-space-md, 12px) var(--u-space-lg, 16px);
430
- border-radius: var(--u-radius-xl, 10px);
431
- background: var(--u-bg-color-raised);
432
- font-size: var(--hs-text-dense-size, 13px);
433
- line-height: 20px;
434
- }
435
- .hs-callout__icon { color: var(--u-txt-color-weak); line-height: 20px; }
436
- .hs-callout__title { font-weight: 600; color: var(--u-txt-color); }
437
- .hs-callout__body { color: var(--u-txt-color-weak); }
438
- .hs-callout__actions { display: flex; gap: var(--u-space-sm, 8px); align-items: center; }
439
- .hs-callout--info { background: var(--u-info-bg-color); }
440
- .hs-callout--info .hs-callout__icon { color: var(--u-info-color-strong); }
441
- .hs-callout--success { background: var(--u-success-bg-color); }
442
- .hs-callout--success .hs-callout__icon { color: var(--u-success-color-strong); }
443
- .hs-callout--warning { background: var(--u-warning-bg-color); }
444
- .hs-callout--warning .hs-callout__icon { color: var(--u-warning-color-strong); }
445
- .hs-callout--danger { background: var(--u-danger-bg-color); }
446
- .hs-callout--danger .hs-callout__icon { color: var(--u-danger-color-strong); }
447
- .hs-callout--note { background: var(--u-bg-color-raised); }
448
-
449
279
  /* ── Form — label above, help below; sections instead of one long grid ── */
450
280
  .hs-fieldset {
451
281
  margin: 0;
@@ -475,6 +305,10 @@ a.hs-card:hover,
475
305
  clear: both;
476
306
  margin-top: 0;
477
307
  }
308
+ /* @deprecated Use `<u-field label>` (`@iyulab/components` 2.26) — `label`, `required`, `description` for the help line
309
+ and `invalid` + `validation-message` for the error; it names the control it wraps and fills the cell. The house
310
+ draws it this way (`components.css`: 40px controls, label and help steps). `.hs-field__label` · `__required` ·
311
+ `__help` · `__error` go with it. remove: 0.7.0 */
478
312
  .hs-field {
479
313
  display: grid;
480
314
  gap: 6px;
@@ -528,44 +362,8 @@ a.hs-card:hover,
528
362
  }
529
363
  .hs-span-all { grid-column: 1 / -1; }
530
364
 
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
365
 
553
366
  /* ── Small marks ───────────────────────────────────────────────────────── */
554
- /* A quiet attribute label next to an identifier (not a status — no colour). */
555
- .hs-attr {
556
- display: inline-flex;
557
- align-items: center;
558
- height: 18px;
559
- padding: 0 5px;
560
- border: 1px solid var(--u-border-color);
561
- border-radius: var(--u-radius-md, 4px);
562
- font-size: var(--u-text-overline-size, 11px);
563
- line-height: 16px;
564
- font-weight: 500;
565
- color: var(--u-txt-color-weak);
566
- white-space: nowrap;
567
- vertical-align: middle;
568
- }
569
367
  /* Days left: neutral, soon (warning), overdue (danger). */
570
368
  .hs-due {
571
369
  display: inline-flex;
@@ -582,16 +380,5 @@ a.hs-card:hover,
582
380
  }
583
381
  .hs-due--soon { background: var(--u-warning-bg-color); color: var(--u-warning-color-strong); }
584
382
  .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
383
 
597
384
  } /* @layer iyu.house */