@kolkrabbi/kol-shell 0.59.0 → 0.60.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/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-shell",
3
- "version": "0.59.0",
3
+ "version": "0.60.0",
4
4
  "private": false,
5
- "description": "KOL application shell — fixed 48px NavRail + AppShell layout root, PageShell/PageHeader scaffolds, ContentFilters catalog organism, GridCard, SettingsScaffold, WalkthroughPanel, ShortcutsOverlay. App chrome (kol-framework owns site chrome). Nav items, content, shortcuts and settings are consumer-injected. Sits above @kolkrabbi/kol-{theme,component,framework}.",
5
+ "description": "The application shell",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "main": "./src/index.js",
@@ -20,10 +20,10 @@
20
20
  "react-dom": "^18.3.0 || ^19.0.0"
21
21
  },
22
22
  "devDependencies": {
23
- "@kolkrabbi/kol-component": "^0.229.0",
24
- "@kolkrabbi/kol-theme": "^0.156.0",
25
- "@kolkrabbi/kol-framework": "^0.45.0",
26
- "@kolkrabbi/kol-icons": "^0.29.0"
23
+ "@kolkrabbi/kol-component": "^0.237.0",
24
+ "@kolkrabbi/kol-icons": "^0.33.0",
25
+ "@kolkrabbi/kol-framework": "^0.48.0",
26
+ "@kolkrabbi/kol-theme": "^0.163.0"
27
27
  },
28
28
  "files": [
29
29
  "src",
package/src/AppHub.jsx CHANGED
@@ -7,7 +7,7 @@ import { ShortcutsOverlay } from '@kolkrabbi/kol-component'
7
7
  /* taxonomy-ok: organism — nests AppShell / HubHome / HubSettings / ShortcutsOverlay (relative) */
8
8
 
9
9
  /**
10
- * AppHub — Shell + Hub in one call; the app passes its Tool as children (the app anatomy,
10
+ * AppHub — An app's shell and hub in one. Shell + Hub in one call; the app passes its Tool as children (the app anatomy,
11
11
  * `docs/documentation/04-compositions/16-app-anatomy.md`, 2026-09-26).
12
12
  *
13
13
  * monitor, mirror and fxr each assembled this by hand: the same AppShell props, the same
package/src/AppShell.jsx CHANGED
@@ -90,7 +90,7 @@ import { TABBAR_H, MastheadContext } from '@kolkrabbi/kol-component'
90
90
  * tab switch. Matched on `e.code` (`Digit1`…) because Opt+digit yields
91
91
  * `¡ ™ £ ¢` as `e.key` on macOS; ignored while typing in a field; only
92
92
  * digits with an item; `preventDefault` on a match. Default off.
93
- * @param {string} props.pageWash a CSS colour painted by `PageShell` OVER the shell's primary back
93
+ * @param {string} props.pageWash a CSS color painted by `PageShell` OVER the shell's primary back
94
94
  * (ShellPageWash, kol-monitor 2026-08-27 — user: "the back of the back
95
95
  * should be primary — then you can just add transparent on top to step
96
96
  * up the lightness"): `'var(--kol-fg-12)'` steps the page a rung lighter
package/src/AppStudio.jsx CHANGED
@@ -6,7 +6,7 @@ import PageShell from './PageShell.jsx'
6
6
  /* taxonomy-ok: organism — nests AppHub / CatalogPage / PageShell (relative) + kol-component's PageHeader */
7
7
 
8
8
  /**
9
- * AppStudio — the WORKSTATION: the Hub plus a fixed page set (apps review §6c-4, 2026-09-29).
9
+ * AppStudio — The studio workstation. the WORKSTATION: the Hub plus a fixed page set (apps review §6c-4, 2026-09-29).
10
10
  *
11
11
  * fxr, mirror and monitor each hand-build the same shape — a landing Catalog, a Library of what the
12
12
  * tool makes, a page that composes a new one, the tool itself full-bleed, a page or two of their own,
@@ -7,7 +7,7 @@ import WalkthroughPanel from './WalkthroughPanel.jsx'
7
7
  /* taxonomy-ok: organism — nests PageShell / PageHeader / WalkthroughPanel (relative) + kol-component's ContentFilters + ContentCard / ContentRow */
8
8
 
9
9
  /**
10
- * CatalogPage — the app tier's Home / Library page, shipped once (ShellHomeSystem,
10
+ * CatalogPage — An app's home or library page. the app tier's Home / Library page, shipped once (ShellHomeSystem,
11
11
  * kol-fxr 2026-08-27 — fxr's HomePage / LibraryPage and monitor's HomePage were
12
12
  * the same page written three times): `PageHeader` → `ContentFilters` (title ·
13
13
  * filter · search, the view strip in the header, LIST / GRID below the divider)
package/src/HubHome.jsx CHANGED
@@ -5,7 +5,7 @@ import CatalogPage from './CatalogPage.jsx'
5
5
  /* taxonomy-ok: organism — nests CatalogPage (relative) + kol-component's Button */
6
6
 
7
7
  /**
8
- * HubHome — the Hub's Home: a Catalog under the app's masthead (the Hub, 2026-09-26).
8
+ * HubHome — A hub's home page. the Hub's Home: a Catalog under the app's masthead (the Hub, 2026-09-26).
9
9
  * monitor, mirror and fxr each wrote this page on `CatalogPage` with the same five
10
10
  * decisions — the mono masthead, RECENT · SAVED, a walkthrough opened by a button,
11
11
  * that button's Close label, a "Get started" last step — and the case of the view
@@ -71,7 +71,7 @@ export default function HubHome({
71
71
  <>
72
72
  {actions}
73
73
  {steps.length > 0 && (
74
- <Button variant="grey" size="md" onClick={() => setTouring((t) => !t)}>
74
+ <Button tone="grey" size="md" onClick={() => setTouring((t) => !t)}>
75
75
  {touring ? 'Close' : 'Walkthrough'}
76
76
  </Button>
77
77
  )}
@@ -7,7 +7,7 @@ import SettingsLinks, { SettingsColophon } from './SettingsLinks.jsx'
7
7
  /* taxonomy-ok: organism — nests SettingsScaffold / SettingsShortcuts / SettingsLinks (relative) + kol-component's SettingsPanel / SettingsSections */
8
8
 
9
9
  /**
10
- * HubSettings — the Hub's Settings page (the Hub, 2026-09-26). monitor, mirror and fxr
10
+ * HubSettings — A hub's settings page. the Hub's Settings page (the Hub, 2026-09-26). monitor, mirror and fxr
11
11
  * each put the same page on `SettingsScaffold`: SETTINGS · ABOUT · REPO with the same
12
12
  * three subtitles, the same theme toggle in the masthead, About as the app's prose over
13
13
  * the colophon, Repo as a link list, and the keyboard shortcuts from the one array the
package/src/Logomark.jsx CHANGED
@@ -1,7 +1,7 @@
1
1
  import { useState, useEffect } from 'react'
2
2
 
3
3
  /**
4
- * Logomark — fetches and INLINES an SVG so currentColor theming works: an
4
+ * Logomark — An inlined SVG mark. fetches and INLINES an SVG so currentColor theming works: an
5
5
  * <img> renders a currentColor mark black in dark mode (invisible). Ported
6
6
  * verbatim from the kol-mirror cut (module-level cache; async resolve even on
7
7
  * cache hit — sync setState in an effect cascades renders).
package/src/PageShell.jsx CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * PageShell — the page scaffold every shell page re-declared by hand (6 pages
2
+ * PageShell — The page scaffold of an app. the page scaffold every shell page re-declared by hand (6 pages
3
3
  * in monitor, 4 in mirror — the most-duplicated block in both repos).
4
4
  *
5
5
  * `mode="scroll"` (default): min-height 100vh, natural page scroll.
package/src/PhoneNav.jsx CHANGED
@@ -4,7 +4,7 @@ import { Button, MobileTabBar } from '@kolkrabbi/kol-component'
4
4
  /* taxonomy-ok: molecule — MobileTabBar + a More sheet of Buttons */
5
5
 
6
6
  /**
7
- * PhoneNav — the rail, on a phone, as a bottom bar (AppShell `touch="bar"`, apps review
7
+ * PhoneNav — The rail as a phone tab bar. the rail, on a phone, as a bottom bar (AppShell `touch="bar"`, apps review
8
8
  * 2026-09-29). The user: *"what about when there are like 10 pages? … this seems like something
9
9
  * shell or hub should account for and ship, but not have per app fixes."*
10
10
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * SettingsLinks — the About / Repo link list every app hand-wrote (ShellHomeSystem,
2
+ * SettingsLinks — The links block of a settings page. the About / Repo link list every app hand-wrote (ShellHomeSystem,
3
3
  * kol-fxr 2026-08-27): label `kol-helper-12 text-fg-32` at 72px, the URL as an
4
4
  * external link `text-fg-64 hover:text-fg-96 hover:underline`.
5
5
  *
@@ -18,7 +18,7 @@ export default function SettingsLinks({ links = [], className = '' }) {
18
18
  )
19
19
  }
20
20
 
21
- /** SettingsColophon — the "Kolkrabbi Vinnustofa / 2026" foot under a settings scaffold. */
21
+ /** SettingsColophon — The foot of a settings page. the "Kolkrabbi Vinnustofa / 2026" foot under a settings scaffold. */
22
22
  export function SettingsColophon({ name = 'Kolkrabbi Vinnustofa', year = new Date().getFullYear(), className = '' }) {
23
23
  return (
24
24
  <div className={className} style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
@@ -4,7 +4,7 @@ import PageShell from './PageShell.jsx'
4
4
  import { PageHeader } from '@kolkrabbi/kol-component'
5
5
 
6
6
  /**
7
- * SettingsScaffold — the settings-page idiom both shells re-implemented inline:
7
+ * SettingsScaffold — The settings page scaffold. the settings-page idiom both shells re-implemented inline:
8
8
  * fixed PageShell, a PageHeader masthead, one header row, then a scrolling body.
9
9
  * Content is consumer-authored via `renderContent` — sections/rows are content,
10
10
  * not markup.
@@ -116,7 +116,7 @@ export default function SettingsScaffold({
116
116
  {picker}
117
117
  {themeToggle}
118
118
  {onOpenSettings && (
119
- <Tooltip label="Display settings">
119
+ <Tooltip label="Display">
120
120
  <IconFrame
121
121
  name="settings-01"
122
122
  variant="primary"
@@ -7,7 +7,7 @@ import { SettingsRow } from '@kolkrabbi/kol-component'
7
7
  * baseline row did. */
8
8
 
9
9
  /**
10
- * SettingsShortcuts — the keyboard-shortcuts block of a settings page
10
+ * SettingsShortcuts — The shortcuts block of a settings page. the keyboard-shortcuts block of a settings page
11
11
  * (ShellHomeSystem, kol-fxr 2026-08-27): the same `[{ section, items: [{ id,
12
12
  * label, combo }] }]` array `ShortcutsOverlay` takes, laid out UP TO six columns ×
13
13
  * two sections per column, filled column-first (user, 2026-08-27) — each
package/src/TabStrip.jsx CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * TabStrip — the flat text-tab idiom both shells use twice (ContentFilters
2
+ * TabStrip — A row of text tabs. the flat text-tab idiom both shells use twice (ContentFilters
3
3
  * view-mode/layout spans, Settings tabs): `kol-helper-14`, active
4
4
  * `text-fg-96`, rest `text-fg-32 hover:text-fg-48`.
5
5
  *
@@ -17,20 +17,24 @@ export function useTouchPrimary() {
17
17
  }
18
18
 
19
19
  /**
20
- * TouchDeviceOverlay — "Desktop recommended", once, on a touch-primary device
20
+ * TouchDeviceOverlay — A desktop-recommended note on touch devices. "Desktop recommended", once, on a touch-primary device
21
21
  * (kol-monitor's overlay, promoted 2026-08-27 — ShellHomeSystem; `AppShell
22
22
  * touch="overlay"` mounts it). Dismissal is remembered in localStorage.
23
23
  *
24
24
  * @param {string} appName the sentence's subject ("Monitor is built for mouse and keyboard…")
25
25
  * @param {string} message override the sentence whole
26
+ * @param {boolean} force show it whatever the pointer and whatever was dismissed — for a preview
27
+ * or a settings "show it again"; dismissing a forced note stores nothing
26
28
  */
27
- export default function TouchDeviceOverlay({ appName = 'This app', message }) {
29
+ export default function TouchDeviceOverlay({ appName = 'This app', message, force = false }) {
28
30
  const coarse = useTouchPrimary()
29
31
  const [dismissed, setDismissed] = useState(() => {
30
32
  try { return localStorage.getItem(STORAGE_KEY) === '1' } catch { return false }
31
33
  })
32
- if (!coarse || dismissed) return null
34
+ const [closed, setClosed] = useState(false)
35
+ if (force ? closed : !coarse || dismissed) return null
33
36
  const dismiss = () => {
37
+ if (force) { setClosed(true); return }
34
38
  try { localStorage.setItem(STORAGE_KEY, '1') } catch { /* storage blocked */ }
35
39
  setDismissed(true)
36
40
  }
@@ -2,7 +2,7 @@ import { useState } from 'react'
2
2
  import { Button } from '@kolkrabbi/kol-component'
3
3
 
4
4
  /**
5
- * WalkthroughPanel — the absolutely-centred stepped intro card (both repos'
5
+ * WalkthroughPanel — A stepped intro card. the absolutely-centred stepped intro card (both repos'
6
6
  * HomePage): chevron Buttons either side, text column + illustration pane.
7
7
  *
8
8
  * Steps are content: `[{ title, text: [..], illustration?, actions? }]` —
@@ -27,7 +27,7 @@ export default function WalkthroughPanel({ steps = [], iconComponent, onClose })
27
27
  maxWidth: 960, width: '100%', zIndex: 10,
28
28
  }}>
29
29
  <Button
30
- variant="grey"
30
+ tone="grey"
31
31
  size="md"
32
32
  iconOnly="chevron-left"
33
33
  iconComponent={iconComponent}
@@ -76,7 +76,7 @@ export default function WalkthroughPanel({ steps = [], iconComponent, onClose })
76
76
  </div>
77
77
 
78
78
  <Button
79
- variant="grey"
79
+ tone="grey"
80
80
  size="md"
81
81
  iconOnly="chevron-right"
82
82
  iconComponent={iconComponent}