@jungherz-de/notionkit-elements 1.11.1 → 1.12.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
@@ -4,6 +4,25 @@ All notable changes to NotionKit Elements are documented here. The format follow
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow
5
5
  [Semantic Versioning](https://semver.org/).
6
6
 
7
+ ## [1.12.0] – 2026-09-25
8
+
9
+ Built against NotionKit CSS 1.12.0 (peer `>= 1.12.0`). Auxdesk moved from 1.5.1 to 1.11 and sent back eight findings; this release answers all of them.
10
+
11
+ ### Added
12
+ - **`<nk-panel>` `slot="end"`** sits at the right edge of the title – a state as a tag, a button – as Notion's settings boxes show a connection, and moves under the title where both do not fit. Until now nothing could stand beside the title, and an `<h3>` of one's own lost the panel's type as soon as it shared a row with a tag.
13
+ - **`flush` on `<nk-props>` and `<nk-panels>`** drops the outer margin meant for the flow under a title – for a list inside a panel, a grid inside a flex column with a gap of its own. The margin sat in the shadow root, out of reach from outside.
14
+ - **`<nk-prop text>`**: a value that is text – a sentence, an address, a model name with a tag – flows and wraps as text instead of setting its parts one under the other.
15
+ - **`<nk-steps>` with a state per step, `selectable` and `horizontal`.** A step object takes `state: 'done' | 'skipped' | 'open'`, which wins over `current`, so a wizard can show a skipped step before a done one; a skipped step shows a dashed ring around a dash. `selectable` makes each label a button: a click or Enter fires `nk-select { index, value, step }` – `index` counts from 1, like `current` – and, unless cancelled, makes that step current; `select(index)` does the same from a script. `horizontal` sets the steps in one row above a wizard.
16
+ - **`<nk-tabs scroll>`** keeps many tabs in one row that scrolls sideways and holds the active tab in view – after the first layout, on every change and when the row's width changes – as `<nk-segmented scroll>` does. Ten tabs in a mailbox editor no longer run out of a phone's page.
17
+ - **An `actions` column in `<nk-table-view>`.** `{ type: 'actions', actions: [{ action, label, icon, danger, disabled, tooltip }] }` sets small buttons in each row; a row's value – a list of action names – picks which of them it shows. A click fires `nk-action { action, row, id, anchor }` instead of selecting the row, and the column's header sorts nothing. `renderPropertyCell()` draws it for tables of one's own too.
18
+ - **A `url` value may be `{ href, label, target }`**: a link of one's own – to another page of the app, with its own text, in the same tab unless `target` says otherwise. A string is still an address outside, opened in a new tab.
19
+
20
+ ### Changed
21
+ - **A property value keeps at least 220px** (NotionKit 1.12.0): in a column narrower than 380px – the details beside a message, a third of the page – it moves under its name instead of shrinking until an address breaks into syllables.
22
+ - The docs example of `<nk-table-view>` shows the actions column, `<nk-steps>` a wizard row with a skipped step, `<nk-panel>` a tag beside the title and `<nk-prop>` a text value.
23
+ - `--nk-page-full-max` (NotionKit 1.12.0) caps `<nk-page full>` as well: the token reaches the shadow root.
24
+ - Peer `@jungherz-de/notionkit >= 1.12.0`.
25
+
7
26
  ## [1.11.1] – 2026-09-24
8
27
 
9
28
  Built against NotionKit CSS 1.11.1 (peer `>= 1.11.0`).
@@ -620,6 +639,7 @@ built and tested against NotionKit CSS 1.1.1 (peer range `>= 1.0.0`).
620
639
  import, never in the core bundle – shadow-less, adding `nk-block-host` to
621
640
  itself so the foundation's editor adapter rules apply.
622
641
 
642
+ [1.12.0]: https://github.com/JUNGHERZ/NotionKit-Elements/releases/tag/v1.12.0
623
643
  [1.11.1]: https://github.com/JUNGHERZ/NotionKit-Elements/releases/tag/v1.11.1
624
644
  [1.11.0]: https://github.com/JUNGHERZ/NotionKit-Elements/releases/tag/v1.11.0
625
645
  [1.10.1]: https://github.com/JUNGHERZ/NotionKit-Elements/releases/tag/v1.10.1
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  <h1 align="center">🧩 NotionKit Elements</h1>
2
2
 
3
3
  <p align="center">
4
- <a href="https://www.npmjs.com/package/@jungherz-de/notionkit-elements"><img src="https://img.shields.io/badge/version-1.11.1-2383e2?style=flat-square" alt="Version"></a>
4
+ <a href="https://www.npmjs.com/package/@jungherz-de/notionkit-elements"><img src="https://img.shields.io/badge/version-1.12.0-2383e2?style=flat-square" alt="Version"></a>
5
5
  <a href="#"><img src="https://img.shields.io/badge/vanilla_JS-no_dependencies-448361?style=flat-square" alt="Vanilla JS"></a>
6
6
  <a href="#"><img src="https://img.shields.io/badge/elements-87-529cca?style=flat-square" alt="87 Elements"></a>
7
7
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-9065b0?style=flat-square" alt="MIT License"></a>
8
- <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/changelog-v1.11.1-lightgrey?style=flat-square" alt="Changelog"></a>
8
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/changelog-v1.12.0-lightgrey?style=flat-square" alt="Changelog"></a>
9
9
  <a href="https://www.npmjs.com/package/@jungherz-de/notionkit-elements"><img src="https://img.shields.io/badge/npm-%40jungherz--de%2Fnotionkit--elements-cb3837?style=flat-square&logo=npm" alt="npm"></a>
10
10
  </p>
11
11
 
@@ -59,7 +59,7 @@ It is the **app layer** of the NotionKit family – three layers, one design lan
59
59
  | 🧩 **87 Elements** | Forms with copy field, image picker and date picker, content blocks with bookmarks, app shell & tree with the ☰ drawer and the collapsing sidebar, page shell with properties, panels, avatars and steps, overlays (modal, sheet, dialog, resizable side peek, tooltip, ⌘K palette, menus that float in and become sheets on a phone, popover, emoji picker, toast), database table, board, list & calendar with toolbar and filter pills, comments, AI thread |
60
60
  | 🎛️ **Form participation** | Input, textarea, select, switch, check, radio, slider, segmented and model card work natively with `<form>` via `ElementInternals`; radios group across shadow roots |
61
61
  | 🌗 **Theme sync** | One observer mirrors `data-theme` on `<html>` into every element |
62
- | 🪶 **Lightweight** | 267 KB minified / 53 KB gzipped (IIFE, foundation sheet included), no external dependencies |
62
+ | 🪶 **Lightweight** | 272 KB minified / 54 KB gzipped (IIFE, foundation sheet included), no external dependencies |
63
63
  | 📦 **Four bundle shapes** | IIFE, minified IIFE, ESM, and per-component ESM entries on a stable `base.js`, which import NotionKit's sheet instead of carrying a copy |
64
64
  | 🤖 **AI-ready** | `SKILL.md` with copy-paste markup, six app skeletons and the rules – an agent given only that file built a working app in the release test |
65
65
 
@@ -71,8 +71,8 @@ It is the **app layer** of the NotionKit family – three layers, one design lan
71
71
  <!DOCTYPE html>
72
72
  <html lang="en" data-theme="light">
73
73
  <head>
74
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
75
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
74
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
75
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
76
76
  </head>
77
77
  <body class="nk-body">
78
78
  <nk-field label="Display name" desc="Shown next to your comments">
@@ -102,7 +102,7 @@ The per-component files import NotionKit's sheet as `@jungherz-de/notionkit/noti
102
102
 
103
103
  Do not mix the full bundle with the per-component files: each brings its own `NkElement`. With the bundle, take `componentsSheet` and `NkElement` from the bundle (`NotionKitElements.componentsSheet` from the `<script>` build).
104
104
 
105
- Two prerequisites, always: `notionkit.css` on the document (the peer dependency, `>= 1.11.0`; 1.11.0 keeps a floating menu inside an open modal or dialog in place and inside the window and brings the banner's action as a button, fields that share a row and tooltips of several lines, 1.10.1 lets a disabled button show its tooltip, 1.10.0 brings the collapsing sidebar, the resizable side peek, the dialog and the tooltip, 1.9.0 the date picker and the calendar view, 1.8.0 the side peek, the bookmark, the copy field and pictures on the profile row, 1.7.0 the sheet, menus that float in and become sheets on a phone, the sidebar drawer, the database toolbar with filter pills and the steps, 1.7.1 minified files that carry all of it, 1.6.0 page properties, page options, list view, panels, prose and the avatar, 1.5.1 the safe areas, 1.5.0 the Notion-2025 tokens, the nine tag colours and the filled inputs; from 1.5.0 on, Elements and the foundation share one version number – the elements are built and tested against the same release) and `class="nk-body"` on `<body>`. The elements ship no visual CSS of their own – every rule comes from the foundation. The bundle injects the design tokens once as `@layer notionkit-defaults`, so any plain `:root { --nk-accent: … }` of yours re-brands every element in both themes.
105
+ Two prerequisites, always: `notionkit.css` on the document (the peer dependency, `>= 1.12.0`; 1.12.0 brings a tag or button beside a panel's title, lists and grids without outer margin, text values, steps with states in any order and in a row, scrolling tabs, a cap for full pages and buttons per table row, 1.11.0 keeps a floating menu inside an open modal or dialog in place and inside the window and brings the banner's action as a button, fields that share a row and tooltips of several lines, 1.10.1 lets a disabled button show its tooltip, 1.10.0 brings the collapsing sidebar, the resizable side peek, the dialog and the tooltip, 1.9.0 the date picker and the calendar view, 1.8.0 the side peek, the bookmark, the copy field and pictures on the profile row, 1.7.0 the sheet, menus that float in and become sheets on a phone, the sidebar drawer, the database toolbar with filter pills and the steps, 1.7.1 minified files that carry all of it, 1.6.0 page properties, page options, list view, panels, prose and the avatar, 1.5.1 the safe areas, 1.5.0 the Notion-2025 tokens, the nine tag colours and the filled inputs; from 1.5.0 on, Elements and the foundation share one version number – the elements are built and tested against the same release) and `class="nk-body"` on `<body>`. The elements ship no visual CSS of their own – every rule comes from the foundation. The bundle injects the design tokens once as `@layer notionkit-defaults`, so any plain `:root { --nk-accent: … }` of yours re-brands every element in both themes.
106
106
 
107
107
  ## Elements
108
108
 
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: notionkit-elements
3
- description: NotionKit Elements is a vanilla-JS Web Components library (v1.11.1) wrapping NotionKit CSS v1.11.1 – the calm, document-centric design system in the Notion idiom. 87 custom elements with the `nk-` prefix, Shadow DOM, automatic light/dark sync via data-theme on <html>, and form-associated controls. Use this reference whenever generating HTML that uses <nk-*> tags to get attributes, slots, events and composition right.
3
+ description: NotionKit Elements is a vanilla-JS Web Components library (v1.12.0) wrapping NotionKit CSS v1.12.0 – the calm, document-centric design system in the Notion idiom. 87 custom elements with the `nk-` prefix, Shadow DOM, automatic light/dark sync via data-theme on <html>, and form-associated controls. Use this reference whenever generating HTML that uses <nk-*> tags to get attributes, slots, events and composition right.
4
4
  ---
5
5
 
6
6
  # NotionKit Elements – AI Component Reference
@@ -21,8 +21,8 @@ description: NotionKit Elements is a vanilla-JS Web Components library (v1.11.1)
21
21
  <head>
22
22
  <meta charset="UTF-8">
23
23
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
24
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
25
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
24
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
25
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
26
26
  </head>
27
27
  <body class="nk-body">
28
28
  <nk-btn variant="primary">Save</nk-btn>
@@ -1386,7 +1386,7 @@ _No attributes._
1386
1386
 
1387
1387
  ### 3.40 `<nk-props>` – Page properties
1388
1388
 
1389
- The properties under the title of a database page, the pattern Notion is known for: a list of `nk-prop` rows. The rows are hosts with `display: contents`, so each renders as a row of this list – no markup of their own around them.
1389
+ The properties under the title of a database page, the pattern Notion is known for: a list of `nk-prop` rows. The rows are hosts with `display: contents`, so each renders as a row of this list – no markup of their own around them. `flush` drops the outer margin meant for the flow under a title, for a list inside a panel or a flex column.
1390
1390
 
1391
1391
  ```html
1392
1392
  <nk-props style="max-width:520px">
@@ -1398,11 +1398,13 @@ The properties under the title of a database page, the pattern Notion is known f
1398
1398
  </nk-props>
1399
1399
  ```
1400
1400
 
1401
- _No attributes._
1401
+ | Attribute | Type | Default | Description |
1402
+ |---|---|---|---|
1403
+ | `flush` | boolean | – | No outer margin. |
1402
1404
 
1403
1405
  **Slots:** `(default)` – `nk-prop` children.
1404
1406
 
1405
- **Replaces:** `.nk-props`
1407
+ **Replaces:** `.nk-props`, `.flush`
1406
1408
 
1407
1409
  ```html
1408
1410
  <!-- equivalent class markup -->
@@ -1415,37 +1417,38 @@ _No attributes._
1415
1417
  </dl>
1416
1418
  ```
1417
1419
 
1418
- **Small screens:** Below 860px each property stacks: the name above its value.
1420
+ **Small screens:** Below 860px each property stacks: the name above its value. In a column narrower than 380px the value moves under its name as well.
1419
1421
 
1420
1422
  ### 3.41 `<nk-prop>` – Page property
1421
1423
 
1422
- One property: the name with its type icon in a 160px column, the value beside it, 34px with the hover wash on both halves. The value is the element’s content – tags, an avatar and a name, a date, `<nk-progress wide>`. A click fires `nk-action` with the half that was hit, the moment Notion opens the property’s editor.
1424
+ One property: the name with its type icon in a 160px column, the value beside it, 34px with the hover wash on both halves. The value is the element’s content – tags, an avatar and a name, a date, `<nk-progress wide>`. A click fires `nk-action` with the half that was hit, the moment Notion opens the property’s editor. `text` lets a value that is text – a sentence, an address, a model name with a tag – flow as text instead of setting its parts one under the other. The value keeps at least 220px: in a column narrower than 380px it moves under its name.
1423
1425
 
1424
1426
  ```html
1425
- <nk-props style="max-width:520px"><nk-prop label="Due" icon="📅">2 June 2026</nk-prop></nk-props>
1427
+ <nk-props style="max-width:520px"><nk-prop label="Due" icon="📅">2 June 2026</nk-prop><nk-prop label="Address" icon="✉️" text>support+design@notionkit.example.com · <nk-tag color="green">Verified</nk-tag></nk-prop></nk-props>
1426
1428
  ```
1427
1429
 
1428
1430
  | Attribute | Type | Default | Description |
1429
1431
  |---|---|---|---|
1430
1432
  | `label` | string | – | Property name. |
1431
1433
  | `icon` | string | – | Type icon. |
1434
+ | `text` | boolean | – | The value flows as text. |
1432
1435
 
1433
1436
  **Slots:** `(default)` – The value. · `icon` – Icon node.
1434
1437
 
1435
1438
  **Events:** `nk-action` `{ action: 'name' | 'value', label }` – Name or value clicked.
1436
1439
 
1437
- **Replaces:** `.nk-prop`, `.p-name`, `.p-icon`, `.p-value`
1440
+ **Replaces:** `.nk-prop`, `.p-name`, `.p-icon`, `.p-value`, `.text`
1438
1441
 
1439
1442
  ```html
1440
1443
  <!-- equivalent class markup -->
1441
- <dl class="nk-props" style="max-width:520px"><div class="nk-prop"><dt class="p-name"><span class="p-icon">📅</span>Due</dt><dd class="p-value">2 June 2026</dd></div></dl>
1444
+ <dl class="nk-props" style="max-width:520px"><div class="nk-prop"><dt class="p-name"><span class="p-icon">📅</span>Due</dt><dd class="p-value">2 June 2026</dd></div><div class="nk-prop"><dt class="p-name"><span class="p-icon">✉️</span>Address</dt><dd class="p-value text">support+design@notionkit.example.com · <span class="nk-tag green">Verified</span></dd></div></dl>
1442
1445
  ```
1443
1446
 
1444
- **Small screens:** Stacks below 860px.
1447
+ **Small screens:** Stacks below 860px, and in a column narrower than 380px.
1445
1448
 
1446
1449
  ### 3.42 `<nk-panels>` – Panels
1447
1450
 
1448
- A grid of `nk-panel`s: columns of at least 200px that share the row. The panels are hosts with `display: contents`, so each is a cell of this grid.
1451
+ A grid of `nk-panel`s: columns of at least 200px that share the row. The panels are hosts with `display: contents`, so each is a cell of this grid. `flush` drops the outer margin, for a grid inside a flex column with a gap of its own.
1449
1452
 
1450
1453
  ```html
1451
1454
  <nk-panels>
@@ -1455,11 +1458,13 @@ A grid of `nk-panel`s: columns of at least 200px that share the row. The panels
1455
1458
  </nk-panels>
1456
1459
  ```
1457
1460
 
1458
- _No attributes._
1461
+ | Attribute | Type | Default | Description |
1462
+ |---|---|---|---|
1463
+ | `flush` | boolean | – | No outer margin. |
1459
1464
 
1460
1465
  **Slots:** `(default)` – `nk-panel` children.
1461
1466
 
1462
- **Replaces:** `.nk-panels`
1467
+ **Replaces:** `.nk-panels`, `.flush`
1463
1468
 
1464
1469
  ```html
1465
1470
  <!-- equivalent class markup -->
@@ -1474,10 +1479,11 @@ _No attributes._
1474
1479
 
1475
1480
  ### 3.43 `<nk-panel>` – Panel
1476
1481
 
1477
- A neutral surface for content that belongs together – the cards on Notion’s Home, the boxes in its settings. `title` is the heading (never a tooltip); the content goes in as `<p>`s and blocks. `cover` without a value draws the gradient band, with a URL a picture; `icon` overlaps the cover as on a page – a page tile. With `href` the panel is a link.
1482
+ A neutral surface for content that belongs together – the cards on Notion’s Home, the boxes in its settings. `title` is the heading (never a tooltip); the content goes in as `<p>`s and blocks. `cover` without a value draws the gradient band, with a URL a picture; `icon` overlaps the cover as on a page – a page tile. With `href` the panel is a link. `slot="end"` sits at the right edge of the title – a state as a tag, a button – as Notion’s settings boxes show a connection, and moves under the title where both do not fit.
1478
1483
 
1479
1484
  ```html
1480
- <div style="max-width:260px"><nk-panel href="#" cover icon="🚀" title="NotionKit MVP"><p>2 min ago</p></nk-panel></div>
1485
+ <div style="max-width:360px;display:grid;gap:12px"><nk-panel href="#" cover icon="🚀" title="NotionKit MVP"><p>2 min ago</p></nk-panel>
1486
+ <nk-panel title="Weekly review"><nk-tag slot="end" color="blue">In progress</nk-tag><p>Three pages changed, one comment is waiting for an answer.</p></nk-panel></div>
1481
1487
  ```
1482
1488
 
1483
1489
  | Attribute | Type | Default | Description |
@@ -1488,13 +1494,14 @@ A neutral surface for content that belongs together – the cards on Notion’s
1488
1494
  | `href` | URL | – | Makes the panel a link. |
1489
1495
  | `target` | string | – | Link target. |
1490
1496
 
1491
- **Slots:** `(default)` – Content: `<p>`, a prose block, a progress bar.
1497
+ **Slots:** `(default)` – Content: `<p>`, a prose block, a progress bar. · `end` – Beside the title, at its right edge: a tag, a button.
1492
1498
 
1493
- **Replaces:** `.nk-panel`, `.nk-cover`, `.nk-page-icon`
1499
+ **Replaces:** `.nk-panel`, `.nk-cover`, `.nk-page-icon`, `.p-head`, `.p-end`
1494
1500
 
1495
1501
  ```html
1496
1502
  <!-- equivalent class markup -->
1497
- <div style="max-width:260px"><a class="nk-panel" href="#"><div class="nk-cover"></div><div class="nk-page-icon">🚀</div><h3>NotionKit MVP</h3><p>2 min ago</p></a></div>
1503
+ <div style="max-width:360px;display:grid;gap:12px"><a class="nk-panel" href="#"><div class="nk-cover"></div><div class="nk-page-icon">🚀</div><h3>NotionKit MVP</h3><p>2 min ago</p></a>
1504
+ <div class="nk-panel"><div class="p-head"><h3>Weekly review</h3><span class="p-end"><span class="nk-tag blue">In progress</span></span></div><p>Three pages changed, one comment is waiting for an answer.</p></div></div>
1498
1505
  ```
1499
1506
 
1500
1507
  **Small screens:** Takes the width of its grid cell.
@@ -1632,7 +1639,7 @@ Content that appears in several places, framed with a badge.
1632
1639
 
1633
1640
  ### 3.49 `<nk-tabs>` – Tabs
1634
1641
 
1635
- A tab strip with panels. `nk-tab` children are the tabs; elements with `slot="panel"` and a matching `data-tab` are the panels – the tabs hide every panel but the active one through `hidden`. Arrow keys move between tabs.
1642
+ A tab strip with panels. `nk-tab` children are the tabs; elements with `slot="panel"` and a matching `data-tab` are the panels – the tabs hide every panel but the active one through `hidden`. Arrow keys move between tabs. `scroll` keeps many tabs in one row that scrolls sideways, scrollbar hidden, and holds the active tab in view – after the first layout, on every change and when the row’s width changes.
1636
1643
 
1637
1644
  ```html
1638
1645
  <nk-tabs value="notes">
@@ -1648,14 +1655,15 @@ A tab strip with panels. `nk-tab` children are the tabs; elements with `slot="pa
1648
1655
  | Attribute | Type | Default | Description |
1649
1656
  |---|---|---|---|
1650
1657
  | `value` | string | – | Active tab value (default: the tab with `active`, else the first). |
1658
+ | `scroll` | boolean | – | One row that scrolls sideways and keeps the active tab in view. |
1651
1659
 
1652
1660
  **Slots:** `(default)` – `nk-tab` children. · `panel` – Panels with `data-tab`.
1653
1661
 
1654
1662
  **Events:** `nk-change` `{ value }` – Active tab changed. · `nk-select` `{ value, label }` – From the clicked tab.
1655
1663
 
1656
- **Properties:** `value`
1664
+ **Properties:** `value`, `scroll`
1657
1665
 
1658
- **Replaces:** `.nk-tabs`, `.nk-tab`, `.active`, `.nk-tab-panel`
1666
+ **Replaces:** `.nk-tabs`, `.nk-tab`, `.active`, `.nk-tab-panel`, `.scroll`
1659
1667
 
1660
1668
  ```html
1661
1669
  <!-- equivalent class markup -->
@@ -1667,7 +1675,7 @@ A tab strip with panels. `nk-tab` children are the tabs; elements with `slot="pa
1667
1675
  <div class="nk-tab-panel">Free-form notes on the project – meeting minutes, ideas, rough drafts.</div>
1668
1676
  ```
1669
1677
 
1670
- **Small screens:** Strip stays on one line; keep labels short.
1678
+ **Small screens:** The strip stays on one line; one longer than the screen takes `scroll`.
1671
1679
 
1672
1680
  ### 3.50 `<nk-tab>` – Tab
1673
1681
 
@@ -1731,11 +1739,13 @@ Plain `<button value>` children stay in the light DOM (the stylesheet’s slotte
1731
1739
 
1732
1740
  ### 3.52 `<nk-steps>` – Steps
1733
1741
 
1734
- A short flow – connecting an account, setting up a model – calm and vertical: a numbered circle per step joined by a hairline, done steps with a check on the green tag, the current one ringed in the accent and marked `aria-current="step"`. `current` counts from 1; one past the last marks every step done, and `next()` moves on. The `steps` attribute is a comma-separated list; the property also takes `{ label, desc }` objects for a line under the label.
1742
+ A short flow – connecting an account, setting up a model – calm and vertical: a numbered circle per step joined by a hairline, done steps with a check on the green tag, the current one ringed in the accent and marked `aria-current="step"`. `current` counts from 1; one past the last marks every step done, and `next()` moves on. The `steps` attribute is a comma-separated list; the property also takes `{ label, desc }` objects for a line under the label. A `state` in such an object – `done`, `skipped` or `open` – wins over the order, for a wizard that lets a step be skipped while a later one is done; a skipped step shows a dashed ring around a dash. `selectable` makes each label a button: a click or Enter fires `nk-select { index, value, step }` – `index` counts from 1, like `current` – and, unless cancelled, makes that step current. `horizontal` sets the steps in one row above a wizard.
1735
1743
 
1736
1744
  ```html
1737
1745
  <nk-steps label="Connect your own model" current="2"></nk-steps>
1738
1746
  <script>{ document.currentScript.previousElementSibling.steps = [{ label: 'Choose a provider', desc: 'Anthropic' }, 'Enter the API key', 'Test the connection']; }</script>
1747
+ <div style="margin-top:16px"><nk-steps id="stepsWizard" label="Connect your own model" current="3" horizontal selectable></nk-steps></div>
1748
+ <script>{ document.getElementById('stepsWizard').steps = [{ label: 'Choose a provider', state: 'done' }, { label: 'Enter the API key', desc: 'skipped', state: 'skipped' }, 'Test the connection']; }</script>
1739
1749
  ```
1740
1750
 
1741
1751
  | Attribute | Type | Default | Description |
@@ -1743,10 +1753,14 @@ A short flow – connecting an account, setting up a model – calm and vertical
1743
1753
  | `steps` | list | – | Comma-separated step labels. |
1744
1754
  | `current` | number | `1` | The current step, from 1. |
1745
1755
  | `label` | string | – | The list’s accessible name. |
1756
+ | `selectable` | boolean | – | Labels are buttons that jump to their step. |
1757
+ | `horizontal` | boolean | – | One row above a wizard. |
1746
1758
 
1747
- **Properties:** `steps`, `current` · **Methods:** `next()`
1759
+ **Events:** `nk-select` `{ index, value, step }` – A step clicked (with `selectable`); cancel it to stay.
1748
1760
 
1749
- **Replaces:** `.nk-steps`, `.nk-step`, `.st-mark`, `.st-desc`, `.done`, `.current`
1761
+ **Properties:** `steps`, `current`, `selectable`, `horizontal` · **Methods:** `next()`, `select(index)`
1762
+
1763
+ **Replaces:** `.nk-steps`, `.nk-step`, `.st-mark`, `.st-desc`, `.done`, `.current`, `.skipped`, `.st-label`, `.horizontal`
1750
1764
 
1751
1765
  ```html
1752
1766
  <!-- equivalent class markup -->
@@ -1755,9 +1769,14 @@ A short flow – connecting an account, setting up a model – calm and vertical
1755
1769
  <li class="nk-step current" aria-current="step"><span class="st-mark">2</span><span>Enter the API key</span></li>
1756
1770
  <li class="nk-step"><span class="st-mark">3</span><span>Test the connection</span></li>
1757
1771
  </ol>
1772
+ <div style="margin-top:16px"><ol class="nk-steps horizontal" aria-label="Connect your own model">
1773
+ <li class="nk-step done"><span class="st-mark">✓</span><button type="button" class="st-label">Choose a provider</button></li>
1774
+ <li class="nk-step skipped"><span class="st-mark">–</span><button type="button" class="st-label">Enter the API key<span class="st-desc">skipped</span></button></li>
1775
+ <li class="nk-step current" aria-current="step"><span class="st-mark">3</span><button type="button" class="st-label">Test the connection</button></li>
1776
+ </ol></div>
1758
1777
  ```
1759
1778
 
1760
- **Small screens:** Unchanged: vertical, so it never runs out of width.
1779
+ **Small screens:** Vertical steps stay as they are. `horizontal` keeps its row below 860px, with every mark but only the current step’s label.
1761
1780
 
1762
1781
  ### 3.53 `<nk-stats>` – Stat cards
1763
1782
 
@@ -2631,7 +2650,7 @@ The view switcher with Notion’s toolbar: child views (`nk-table-view`, `nk-boa
2631
2650
 
2632
2651
  ### 3.78 `<nk-table-view>` – Table view
2633
2652
 
2634
- Renders `columns` × `rows` as the NotionKit table. Cells are polymorphic (`text`, `select`, `multi-select`, `date`, `person`, `checkbox`, `url`, `number`, `progress`) and rendered as plain markup by the exported `renderPropertyCell()` – every cell rule starts with `.nk-table`, so a cell element of its own would never be styled. Header clicks sort with `sortable`. A `number` column stands right-aligned in figures of equal width, formatted by its `locale` and `format` (Intl.NumberFormat options); a person’s `color` takes one of the nine names.
2653
+ Renders `columns` × `rows` as the NotionKit table. Cells are polymorphic (`text`, `select`, `multi-select`, `date`, `person`, `checkbox`, `url`, `number`, `progress`) and rendered as plain markup by the exported `renderPropertyCell()` – every cell rule starts with `.nk-table`, so a cell element of its own would never be styled. Header clicks sort with `sortable`. A `number` column stands right-aligned in figures of equal width, formatted by its `locale` and `format` (Intl.NumberFormat options); a person’s `color` takes one of the nine names. A column of type `actions` (NotionKit 1.12.0) sets buttons in each row from `column.actions` – `[{ action, label, icon, danger, disabled, tooltip }]` –, and a row’s value – a list of action names – picks which of them it shows; a click fires `nk-action { action, row, id, anchor }` instead of selecting the row. A `url` value may be `{ href, label, target }`: a link of your own, to another page of the app, with its own text.
2635
2654
 
2636
2655
  ```html
2637
2656
  <nk-table-view new-row sortable></nk-table-view>
@@ -2645,12 +2664,13 @@ Renders `columns` × `rows` as the NotionKit table. Cells are polymorphic (`text
2645
2664
  { key: 'due', label: 'Due', type: 'date', icon: '📅' },
2646
2665
  { key: 'progress', label: 'Progress', type: 'progress', icon: '▰' },
2647
2666
  { key: 'effort', label: 'Effort (h)', type: 'number', icon: '#', locale: 'en', format: { minimumFractionDigits: 1 } },
2667
+ { key: 'actions', type: 'actions', actions: [{ action: 'open', label: 'Open' }, { action: 'archive', label: 'Archive', danger: true }] },
2648
2668
  ];
2649
2669
  db.rows = [
2650
2670
  { id: 1, icon: '🧭', name: 'App shell & sidebar', status: 'done', owner: { name: 'Marcel', initials: 'MK', color: 'purple' }, due: '08.05.2026', progress: 100, effort: 6 },
2651
2671
  { id: 2, icon: '📄', name: 'Page shell & typography', status: 'done', owner: { name: 'Marcel', initials: 'MK', color: 'purple' }, due: '10.05.2026', progress: 100, effort: 4.5 },
2652
2672
  { id: 3, icon: '🗃️', name: 'Database table view', status: 'progress', owner: { name: 'Marcel', initials: 'MK', color: 'purple' }, due: '20.05.2026', progress: 65, effort: 12.5 },
2653
- { id: 4, icon: '▤', name: 'Board view & drag-and-drop', status: 'planned', due: '02.06.2026', progress: 0, effort: 8 },
2673
+ { id: 4, icon: '▤', name: 'Board view & drag-and-drop', status: 'planned', due: '02.06.2026', progress: 0, effort: 8, actions: ['open'] },
2654
2674
  ];
2655
2675
  }</script>
2656
2676
  ```
@@ -2668,21 +2688,21 @@ Renders `columns` × `rows` as the NotionKit table. Cells are polymorphic (`text
2668
2688
  | `sort-dir` | asc | desc | – | Direction. |
2669
2689
  | `wrap` | boolean | – | Cell text may break (Notion's "wrap column"). |
2670
2690
 
2671
- **Events:** `nk-select` `{ row, id }` – Row clicked. · `nk-change` `{ row, key, value }` – Checkbox cell toggled (row updated in place). · `nk-action` `{ action: 'sort' | 'new-row', key?, value? }` – Header or add row clicked.
2691
+ **Events:** `nk-select` `{ row, id, key, cell }` – Row clicked. · `nk-change` `{ row, key, value }` – Checkbox cell toggled (row updated in place). · `nk-action` `{ action: 'sort' | 'new-row' | an actions column's action, key?, value?, row?, id?, anchor? }` – Header, add row or a row’s button clicked.
2672
2692
 
2673
2693
  **Properties:** `columns`, `rows`, `data` · **Methods:** `refresh()`
2674
2694
 
2675
- **Replaces:** `.nk-table-wrap`, `.nk-table`, `.wrap`, `.th-icon`, `.row-title`, `.date-cell`, `.person-cell`, `.nk-avatar`, `.num`, `.nk-new-row`
2695
+ **Replaces:** `.nk-table-wrap`, `.nk-table`, `.wrap`, `.th-icon`, `.row-title`, `.date-cell`, `.person-cell`, `.nk-avatar`, `.num`, `.row-actions`, `.actions`, `.nk-new-row`
2676
2696
 
2677
2697
  ```html
2678
2698
  <!-- equivalent class markup -->
2679
2699
  <div class="nk-table-wrap"><table class="nk-table">
2680
- <thead><tr><th><span class="th-icon">📄</span>Name</th><th><span class="th-icon">◉</span>Status</th><th><span class="th-icon">👤</span>Owner</th><th><span class="th-icon">📅</span>Due</th><th><span class="th-icon">▰</span>Progress</th><th><span class="th-icon">#</span>Effort (h)</th></tr></thead>
2700
+ <thead><tr><th><span class="th-icon">📄</span>Name</th><th><span class="th-icon">◉</span>Status</th><th><span class="th-icon">👤</span>Owner</th><th><span class="th-icon">📅</span>Due</th><th><span class="th-icon">▰</span>Progress</th><th><span class="th-icon">#</span>Effort (h)</th><th class="actions"></th></tr></thead>
2681
2701
  <tbody>
2682
- <tr><td><span class="row-title">🧭 App shell & sidebar</span></td><td><span class="nk-tag green">Done</span></td><td><span class="person-cell"><span class="nk-avatar small purple">MK</span> Marcel</span></td><td><span class="date-cell">08.05.2026</span></td><td><span class="nk-progress"><i style="width:100%"></i></span><span class="nk-progress-label">100%</span></td><td class="num"><span>6.0</span></td></tr>
2683
- <tr><td><span class="row-title">📄 Page shell & typography</span></td><td><span class="nk-tag green">Done</span></td><td><span class="person-cell"><span class="nk-avatar small purple">MK</span> Marcel</span></td><td><span class="date-cell">10.05.2026</span></td><td><span class="nk-progress"><i style="width:100%"></i></span><span class="nk-progress-label">100%</span></td><td class="num"><span>4.5</span></td></tr>
2684
- <tr><td><span class="row-title">🗃️ Database table view</span></td><td><span class="nk-tag blue">In progress</span></td><td><span class="person-cell"><span class="nk-avatar small purple">MK</span> Marcel</span></td><td><span class="date-cell">20.05.2026</span></td><td><span class="nk-progress"><i style="width:65%"></i></span><span class="nk-progress-label">65%</span></td><td class="num"><span>12.5</span></td></tr>
2685
- <tr><td><span class="row-title">▤ Board view & drag-and-drop</span></td><td><span class="nk-tag orange">Planned</span></td><td><span class="person-cell">—</span></td><td><span class="date-cell">02.06.2026</span></td><td><span class="nk-progress"><i style="width:0%"></i></span><span class="nk-progress-label">0%</span></td><td class="num"><span>8.0</span></td></tr>
2702
+ <tr><td><span class="row-title">🧭 App shell & sidebar</span></td><td><span class="nk-tag green">Done</span></td><td><span class="person-cell"><span class="nk-avatar small purple">MK</span> Marcel</span></td><td><span class="date-cell">08.05.2026</span></td><td><span class="nk-progress"><i style="width:100%"></i></span><span class="nk-progress-label">100%</span></td><td class="num"><span>6.0</span></td><td><span class="row-actions"><button class="nk-btn secondary small">Open</button><button class="nk-btn danger small">Archive</button></span></td></tr>
2703
+ <tr><td><span class="row-title">📄 Page shell & typography</span></td><td><span class="nk-tag green">Done</span></td><td><span class="person-cell"><span class="nk-avatar small purple">MK</span> Marcel</span></td><td><span class="date-cell">10.05.2026</span></td><td><span class="nk-progress"><i style="width:100%"></i></span><span class="nk-progress-label">100%</span></td><td class="num"><span>4.5</span></td><td><span class="row-actions"><button class="nk-btn secondary small">Open</button><button class="nk-btn danger small">Archive</button></span></td></tr>
2704
+ <tr><td><span class="row-title">🗃️ Database table view</span></td><td><span class="nk-tag blue">In progress</span></td><td><span class="person-cell"><span class="nk-avatar small purple">MK</span> Marcel</span></td><td><span class="date-cell">20.05.2026</span></td><td><span class="nk-progress"><i style="width:65%"></i></span><span class="nk-progress-label">65%</span></td><td class="num"><span>12.5</span></td><td><span class="row-actions"><button class="nk-btn secondary small">Open</button><button class="nk-btn danger small">Archive</button></span></td></tr>
2705
+ <tr><td><span class="row-title">▤ Board view & drag-and-drop</span></td><td><span class="nk-tag orange">Planned</span></td><td><span class="person-cell">—</span></td><td><span class="date-cell">02.06.2026</span></td><td><span class="nk-progress"><i style="width:0%"></i></span><span class="nk-progress-label">0%</span></td><td class="num"><span>8.0</span></td><td><span class="row-actions"><button class="nk-btn secondary small">Open</button></span></td></tr>
2686
2706
  </tbody>
2687
2707
  </table><div class="nk-new-row">+ New page</div></div>
2688
2708
  ```
@@ -3064,8 +3084,8 @@ Eight skeletons, one per app shape, mirroring the NotionKit CSS SKILL.md. Copy o
3064
3084
  <html lang="en" data-theme="light">
3065
3085
  <head>
3066
3086
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
3067
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
3068
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
3087
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
3088
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
3069
3089
  </head>
3070
3090
  <body class="nk-body">
3071
3091
  <nk-app>
@@ -3146,8 +3166,8 @@ Rules of the shell: `nk-sidebar`, `nk-topbar` and `nk-page` are `display: conten
3146
3166
  <html lang="en" data-theme="light">
3147
3167
  <head>
3148
3168
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
3149
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
3150
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
3169
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
3170
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
3151
3171
  </head>
3152
3172
  <body class="nk-body">
3153
3173
  <nk-app>
@@ -3254,8 +3274,8 @@ Data contract: `columns` describe the properties (`type`: text | select | multi-
3254
3274
  <html lang="en" data-theme="light">
3255
3275
  <head>
3256
3276
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
3257
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
3258
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
3277
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
3278
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
3259
3279
  </head>
3260
3280
  <body class="nk-body">
3261
3281
  <nk-app>
@@ -3314,8 +3334,8 @@ Data contract: `columns` describe the properties (`type`: text | select | multi-
3314
3334
  <html lang="en" data-theme="light">
3315
3335
  <head>
3316
3336
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
3317
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
3318
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
3337
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
3338
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
3319
3339
  </head>
3320
3340
  <body class="nk-body">
3321
3341
  <!-- your app -->
@@ -3392,8 +3412,8 @@ The open/close contract is one attribute: `settings.open = true`, `settings.show
3392
3412
  <html lang="en" data-theme="light">
3393
3413
  <head>
3394
3414
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
3395
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
3396
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
3415
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
3416
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
3397
3417
  </head>
3398
3418
  <body class="nk-body">
3399
3419
  <div class="nk-page" style="padding-top:48px">
@@ -3439,8 +3459,8 @@ The open/close contract is one attribute: `settings.open = true`, `settings.show
3439
3459
  <html lang="en" data-theme="light">
3440
3460
  <head>
3441
3461
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
3442
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
3443
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
3462
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
3463
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
3444
3464
  </head>
3445
3465
  <body class="nk-body">
3446
3466
  <nk-page narrow icon="📘" cover>
@@ -3484,8 +3504,8 @@ Note `narrow`: the page is the document, so there is no inner scroll wrapper –
3484
3504
  <html lang="en" data-theme="light">
3485
3505
  <head>
3486
3506
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
3487
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
3488
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
3507
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
3508
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
3489
3509
  </head>
3490
3510
  <body class="nk-body">
3491
3511
  <nk-app>
@@ -3539,8 +3559,8 @@ Note `narrow`: the page is the document, so there is no inner scroll wrapper –
3539
3559
  <html lang="en" data-theme="light">
3540
3560
  <head>
3541
3561
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
3542
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.11.1/notionkit.min.css">
3543
- <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.11.1/dist/notionkit-elements.min.js"></script>
3562
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1.12.0/notionkit.min.css">
3563
+ <script src="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit-elements@1.12.0/dist/notionkit-elements.min.js"></script>
3544
3564
  </head>
3545
3565
  <body class="nk-body">
3546
3566
  <!-- A narrow column, centred: layout is yours, so it is inline. -->
@@ -3672,19 +3692,19 @@ Form controls additionally re-dispatch a native, bubbling `change` event, so `fo
3672
3692
  | `<nk-page-cover>` | page | `src`, `position` | – | – |
3673
3693
  | `<nk-page-title>` | page | `editable`, `placeholder`, `value` | `(default)` | `nk-change` |
3674
3694
  | `<nk-page-actions>` | page | – | `(default)` | – |
3675
- | `<nk-props>` | page | – | `(default)` | – |
3676
- | `<nk-prop>` | page | `label`, `icon` | `(default)`, `icon` | `nk-action` |
3677
- | `<nk-panels>` | page | – | `(default)` | – |
3678
- | `<nk-panel>` | page | `title`, `icon`, `cover`, `href` | `(default)` | – |
3695
+ | `<nk-props>` | page | `flush` | `(default)` | – |
3696
+ | `<nk-prop>` | page | `label`, `icon`, `text` | `(default)`, `icon` | `nk-action` |
3697
+ | `<nk-panels>` | page | `flush` | `(default)` | – |
3698
+ | `<nk-panel>` | page | `title`, `icon`, `cover`, `href` | `(default)`, `end` | – |
3679
3699
  | `<nk-block-host>` | page | `handle`, `drop-target` | `(default)` | – |
3680
3700
  | `<nk-banner>` | page | `variant` | `(default)`, `action` | – |
3681
3701
  | `<nk-empty>` | page | `icon`, `title`, `desc` | `(default)`, `icon`, `title`, `desc` | – |
3682
3702
  | `<nk-skeleton>` | page | `lines`, `height`, `width`, `widths` | – | – |
3683
3703
  | `<nk-synced>` | page | `badge` | `(default)` | – |
3684
- | `<nk-tabs>` | page | `value` | `(default)`, `panel` | `nk-change`, `nk-select` |
3704
+ | `<nk-tabs>` | page | `value`, `scroll` | `(default)`, `panel` | `nk-change`, `nk-select` |
3685
3705
  | `<nk-tab>` | page | `value`, `active`, `disabled` | `(default)` | `nk-select` |
3686
3706
  | `<nk-segmented>` | page | `value`, `scroll`, `wrap`, `name` | `(default)` | `nk-change` |
3687
- | `<nk-steps>` | page | `steps`, `current`, `label` | – | – |
3707
+ | `<nk-steps>` | page | `steps`, `current`, `label`, `selectable` | – | `nk-select` |
3688
3708
  | `<nk-stats>` | page | `label`, `value`, `delta`, `trend` | `(default)` | – |
3689
3709
  | `<nk-stat>` | page | `label`, `value`, `delta`, `trend` | `label`, `value`, `delta` | – |
3690
3710
  | `<nk-avatar-group>` | page | `more` | `(default)` | – |
@@ -3739,10 +3759,10 @@ Form controls additionally re-dispatch a native, bubbling `change` event, so `fo
3739
3759
  | Theme sync | one `MutationObserver` on `<html>[data-theme]`, a `Set` of instances, `.nk-wrapper[data-theme]` inside each root |
3740
3760
  | Components | `src/components/{forms,content,shell,page,overlays,data}/nk-*.js`, one tag per file, `customElements.define` at the bottom |
3741
3761
  | Build | Rollup: IIFE, minified IIFE, ESM, and per-component ESM entries on a stable `dist/components/base.js` that import NotionKit's sheet (`@jungherz-de/notionkit/notionkit-styles.js`) instead of inlining it; the full bundles inline it and export `componentsSheet` |
3742
- | Peer | `@jungherz-de/notionkit >= 1.11.1` – from 1.5.0 on the elements and the foundation share one version number; the bundle embeds that release's stylesheet, so keep them in step |
3762
+ | Peer | `@jungherz-de/notionkit >= 1.12.0` – from 1.5.0 on the elements and the foundation share one version number; the bundle embeds that release's stylesheet, so keep them in step |
3743
3763
 
3744
3764
  Lifecycle: construct (attach shadow, adopt sheets) → first connect (wrapper + `render()`) → every connect (`setupEvents()`, theme registration, light-DOM observer) → `attributeChangedCallback` → `onAttributeChanged` → disconnect (`teardownEvents()`, unregister).
3745
3765
 
3746
3766
 
3747
3767
  ---
3748
- *NotionKit Elements v1.11.1 · wrapping NotionKit CSS v1.11.1 · MIT · Jungherz GmbH*
3768
+ *NotionKit Elements v1.12.0 · wrapping NotionKit CSS v1.12.0 · MIT · Jungherz GmbH*
@@ -1,5 +1,5 @@
1
1
  import { NkElement } from './base.js';
2
- import { t as tagFor, r as renderPropertyCell } from './shared/property-cell-Cddz5n2O.js';
2
+ import { t as tagFor, r as renderPropertyCell } from './shared/property-cell-DKvv6TIG.js';
3
3
  import '@jungherz-de/notionkit/notionkit-styles.js';
4
4
  import './shared/avatar-CzPZN3uP.js';
5
5
 
@@ -1,6 +1,6 @@
1
1
  import { NkFormElement } from './base.js';
2
2
  import { p as parseDay, i as isoOf, C as CHEVRONS, r as resolveLocale, f as firstWeekday, m as monthGrid, w as weekLabel, a as weekdayNames, b as isoWeek, s as stepMonth, c as addDays } from './shared/dates-a32DcW1l.js';
3
- import { p as placeUnder } from './shared/floating-CtqV6MBj.js';
3
+ import { p as placeUnder } from './shared/floating-DOK73b_D.js';
4
4
  import { d as deepActiveElement } from './shared/focus-BNAChOXO.js';
5
5
  import '@jungherz-de/notionkit/notionkit-styles.js';
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { NkElement } from './base.js';
2
- import { r as renderPropertyCell } from './shared/property-cell-Cddz5n2O.js';
2
+ import { r as renderPropertyCell } from './shared/property-cell-DKvv6TIG.js';
3
3
  import '@jungherz-de/notionkit/notionkit-styles.js';
4
4
  import './shared/avatar-CzPZN3uP.js';
5
5
 
@@ -1,6 +1,6 @@
1
1
  import { NkElement } from './base.js';
2
2
  import { d as deepActiveElement } from './shared/focus-BNAChOXO.js';
3
- import { p as placeUnder } from './shared/floating-CtqV6MBj.js';
3
+ import { p as placeUnder } from './shared/floating-DOK73b_D.js';
4
4
  import '@jungherz-de/notionkit/notionkit-styles.js';
5
5
 
6
6
  // <nk-menu>
@@ -5,9 +5,13 @@ import '@jungherz-de/notionkit/notionkit-styles.js';
5
5
  // <nk-panel href="/roadmap" cover="covers/aurora.svg" icon="🚀" title="Roadmap"><p>2 min ago</p></nk-panel>
6
6
  // → <a class="nk-panel" href="/roadmap"><div class="nk-cover"><img src="…" alt=""></div>
7
7
  // <div class="nk-page-icon">🚀</div><h3>Roadmap</h3>…</a>
8
+ // <nk-panel title="Contacts database"><nk-tag slot="end" color="green">Connected</nk-tag>…</nk-panel>
9
+ // → … <div class="p-head"><h3>Contacts database</h3><span class="p-end">…</span></div>
8
10
  // `cover` without a value draws the token gradient, with one a picture; `icon`
9
11
  // overlaps the cover as on a page – a page tile, as on Notion's Home. With
10
12
  // `href` the panel is a link. `title` is the heading, never a tooltip.
13
+ // slot="end" (NotionKit 1.12.0) sits at the right edge of the title – a state
14
+ // as a tag, a button – and moves under it where both do not fit.
11
15
  class NkPanel extends NkElement {
12
16
  static get observedAttributes() { return ['title', 'icon', 'cover', 'href', 'target']; }
13
17
 
@@ -16,6 +20,11 @@ class NkPanel extends NkElement {
16
20
  this._img = this.createElement('img', [], { alt: '' });
17
21
  this._icon = this.createElement('div', ['nk-page-icon']);
18
22
  this._heading = document.createElement('h3');
23
+ this._endSlot = this.createElement('slot', [], { name: 'end' });
24
+ this._end = this.createElement('span', ['p-end']);
25
+ this._end.appendChild(this._endSlot);
26
+ this._head = this.createElement('div', ['p-head']);
27
+ this._head.append(this._heading, this._end);
19
28
  this._slot = document.createElement('slot');
20
29
  this.takeTitle();
21
30
  this._build();
@@ -24,7 +33,7 @@ class NkPanel extends NkElement {
24
33
  _build() {
25
34
  const href = this.getAttribute('href');
26
35
  const box = this.createElement(href ? 'a' : 'div', ['nk-panel']);
27
- box.append(this._cover, this._icon, this._heading, this._slot);
36
+ box.append(this._cover, this._icon, this._head, this._slot);
28
37
  this._wrapper.replaceChildren(box);
29
38
  this._box = box;
30
39
  this._sync();
@@ -40,10 +49,23 @@ class NkPanel extends NkElement {
40
49
  const icon = this.getAttribute('icon');
41
50
  this._icon.textContent = icon || '';
42
51
  this._icon.style.display = icon ? '' : 'none';
43
- this._heading.textContent = this._titleText || '';
44
- this._heading.style.display = this._titleText ? '' : 'none';
52
+ const title = this._titleText || '';
53
+ if (this._heading.textContent !== title) this._heading.textContent = title;
54
+ this._heading.style.display = title ? '' : 'none';
55
+ // The end and the whole head leave the layout when they are empty, so a
56
+ // title alone lays out as it always did.
57
+ const end = this._endSlot.assignedNodes().some(n => n.nodeType === Node.ELEMENT_NODE || n.textContent.trim());
58
+ this._end.style.display = end ? '' : 'none';
59
+ this._head.style.display = title || end ? '' : 'none';
45
60
  }
46
61
 
62
+ setupEvents() {
63
+ this._onEnd = () => this._sync();
64
+ this._endSlot.addEventListener('slotchange', this._onEnd);
65
+ }
66
+
67
+ teardownEvents() { this._endSlot?.removeEventListener('slotchange', this._onEnd); }
68
+
47
69
  onAttributeChanged(name, _old, value) {
48
70
  if (name === 'title' && !this.takeTitle(value)) return;
49
71
  if (name === 'href' && (value === null) !== (this._box.localName === 'div')) { this._build(); return; }