@fasl-work/caos-app-shell 0.6.3 → 0.6.5

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/README.md CHANGED
@@ -49,6 +49,7 @@ const config: ShellConfig = {
49
49
  ```
50
50
 
51
51
  - **Land on the tool:** make `/` your interactive tool; Introduction/Methodology/etc. are separate routes.
52
+ - **Product metadata:** `footer.attribution` accepts bilingual text or `false` when a product excludes personal attribution. `footer.license` accepts the product's bilingual license label. Omitting these keeps existing consumer defaults. A product does not inherit the shell's MIT license.
52
53
  - **Hub case (Faena):** pass `routes: []` (or one) → the nav is hidden, header/footer identical.
53
54
  - **Deep pages:** compose with `Tabs`, `SubTabs`, `Equation`/`InlineMath`, `Callout`, `Figure`, and
54
55
  `CitationsProvider` + `Cite`/`Refs`/`ReferenceList`. Read the current language with `useShellLang()`.
package/dist/index.d.ts CHANGED
@@ -59,6 +59,16 @@ interface ShellConfig {
59
59
  * license (e.g. "Engine: lingbot-map (arXiv:2604.14141, Apache-2.0)") and the one-line honest
60
60
  * disclaimer of how the app runs. Both optional, both bilingual. */
61
61
  footer?: {
62
+ /** Explicit product attribution, or false when the product excludes personal attribution. */
63
+ attribution?: {
64
+ en: string;
65
+ es: string;
66
+ } | false;
67
+ /** The consuming product's license; the shell's MIT license is not inherited by applications. */
68
+ license?: {
69
+ en: string;
70
+ es: string;
71
+ };
62
72
  provenance?: {
63
73
  en: string;
64
74
  es: string;
package/dist/index.js CHANGED
@@ -293,8 +293,10 @@ function AppShell({ config, children }) {
293
293
  c.version,
294
294
  config.version
295
295
  ] }) }),
296
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
297
- /* @__PURE__ */ jsx("span", { children: c.attribution }),
296
+ config.footer?.attribution !== false && /* @__PURE__ */ jsxs(Fragment, { children: [
297
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
298
+ /* @__PURE__ */ jsx("span", { children: config.footer?.attribution?.[lang] ?? c.attribution })
299
+ ] }),
298
300
  config.footer?.provenance && /* @__PURE__ */ jsxs(Fragment, { children: [
299
301
  /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
300
302
  /* @__PURE__ */ jsx("span", { children: config.footer.provenance[lang] })
@@ -302,7 +304,7 @@ function AppShell({ config, children }) {
302
304
  /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
303
305
  /* @__PURE__ */ jsx("a", { href: config.links.github, target: "_blank", rel: "noreferrer noopener", children: c.github }),
304
306
  /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
305
- /* @__PURE__ */ jsx("span", { className: "faint", children: c.license }),
307
+ /* @__PURE__ */ jsx("span", { className: "faint", children: config.footer?.license?.[lang] ?? c.license }),
306
308
  config.footer?.disclaimer && /* @__PURE__ */ jsxs(Fragment, { children: [
307
309
  /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
308
310
  /* @__PURE__ */ jsx("span", { className: "faint", children: config.footer.disclaimer[lang] })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fasl-work/caos-app-shell",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "description": "Shared web-app shell + content primitives + design system for the CAOS / Faena public apps (ADR-0016).",
5
5
  "license": "MIT",
6
6
  "author": "Felipe Santibáñez-Leal",
package/styles.css CHANGED
@@ -181,7 +181,12 @@ code, kbd { font-family: var(--font-mono); }
181
181
  .subtab { padding: 0.32rem 0.8rem; border: 1px solid var(--color-border); border-radius: 999px; background: var(--color-surface); color: var(--color-fg-subtle); font-size: 0.84rem; font-weight: 500; transition: color 0.15s, background-color 0.15s, border-color 0.15s; }
182
182
  .subtab:hover { color: var(--color-fg); border-color: var(--color-fg-faint); }
183
183
  .subtab.active { color: var(--color-accent); background: var(--color-accent-soft); border-color: color-mix(in oklab, var(--color-accent) 40%, transparent); font-weight: 600; }
184
- .subtabs-vertical { display: grid; grid-template-columns: minmax(180px, 240px) 1fr; gap: 1.5rem; align-items: start; }
184
+ /* `minmax(0, 1fr)`, NOT `1fr`. A bare `1fr` track is `minmax(auto, 1fr)`, and `auto` is the
185
+ min-content width of the panel, so a wide table in a sub-tab panel sized the whole grid to
186
+ the table and pushed the page past the viewport instead of scrolling inside its wrapper
187
+ (ADR-0071 rule 3). Measured on Porvenir's Datasets tab at 1280x800: the panel column
188
+ rendered 1380px wide on a 1280px viewport. */
189
+ .subtabs-vertical { display: grid; grid-template-columns: minmax(180px, 240px) minmax(0, 1fr); gap: 1.5rem; align-items: start; }
185
190
  .subtabs-vertical .subtablist { flex-direction: column; margin-bottom: 0; }
186
191
  .subtabs-vertical .subtab { text-align: left; border-radius: 8px; }
187
192
  @media (max-width: 760px) { .subtabs-vertical { grid-template-columns: 1fr; } .subtabs-vertical .subtablist { flex-direction: row; } }
@@ -293,7 +298,7 @@ html, body { overflow-x: hidden; }
293
298
  width of the display, which is the opposite of what ADR-0017 s1.1 specifies. The wide workbench
294
299
  opt-in is `.page-body.wide`; a prose page must keep the measure. */
295
300
  .page-body { min-width: 0; }
296
- .tabs, .tabpanel { min-width: 0; max-width: 100%; }
301
+ .tabs, .tabpanel, .subtabs, .subtabpanels, .subtabpanel { min-width: 0; max-width: 100%; }
297
302
  .tablist { min-width: 0; max-width: 100%; width: 100%; }
298
303
 
299
304
  /* NO MAGIC CHROME NUMBER. An app surface must not compute its height from a hardcoded guess at the
@@ -308,6 +313,12 @@ html, body { overflow-x: hidden; }
308
313
  /* A viewport-filling app must not carry the prose footer margin: it becomes dead space between the
309
314
  content and the chrome. Measured on ChargeCascade as exactly 48px (3rem). */
310
315
  .app-shell.fixed .site-footer { margin-top: 0; }
316
+ /* On a contained surface the footer competes with the instrument for a fixed height. With a
317
+ product's provenance and disclaimer it wrapped into 178px at 1600x900 (five lines), and the
318
+ instrument fell from 56 to 42 percent of the viewport, under the ADR-0071 rule 8 floor. The
319
+ text stays (ADR-0016 s2: provenance and the honest disclaimer are the footer's job); it is set
320
+ compact, so it takes two to three lines, not five. */
321
+ .app-shell.fixed .site-footer .footer-inner { padding: 0.45rem 1.5rem; gap: 0.4rem; font-size: 0.74rem; line-height: 1.3; }
311
322
 
312
323
  /* ADR-0058 diagram i18n. A hand-authored architecture SVG carries BOTH languages inside ONE file,
313
324
  and the modal wrapper picks one. Two files would be two things to keep in step, and the one not
@@ -316,7 +327,7 @@ html, body { overflow-x: hidden; }
316
327
  [data-arch-lang] .l-es { display: none; }
317
328
  [data-arch-lang="es"] .l-en { display: none; }
318
329
  [data-arch-lang="es"] .l-es { display: inline; }
319
-
320
- /* The compact one-of-N case picker (ADR-0071 rule 7). Ten cases in four categories
321
- cost a 308px chip block, 21% of a 2560x1440 viewport, and one row as a dropdown. */
322
- .cs-select { width: 100%; max-width: 460px; }
330
+
331
+ /* The compact one-of-N case picker (ADR-0071 rule 7). Ten cases in four categories
332
+ cost a 308px chip block, 21% of a 2560x1440 viewport, and one row as a dropdown. */
333
+ .cs-select { width: 100%; max-width: 460px; }