func-to-web 2.7.0__tar.gz → 2.7.2__tar.gz

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.
Files changed (54) hide show
  1. {func_to_web-2.7.0/src/func_to_web.egg-info → func_to_web-2.7.2}/PKG-INFO +48 -12
  2. {func_to_web-2.7.0 → func_to_web-2.7.2}/README.md +47 -11
  3. {func_to_web-2.7.0 → func_to_web-2.7.2}/pyproject.toml +5 -1
  4. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/config.py +1 -1
  5. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/sdk.js +17 -1
  6. {func_to_web-2.7.0 → func_to_web-2.7.2/src/func_to_web.egg-info}/PKG-INFO +48 -12
  7. {func_to_web-2.7.0 → func_to_web-2.7.2}/LICENSE +0 -0
  8. {func_to_web-2.7.0 → func_to_web-2.7.2}/setup.cfg +0 -0
  9. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/__init__.py +0 -0
  10. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/models/__init__.py +0 -0
  11. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/models/file_defaults.py +0 -0
  12. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/models/function.py +0 -0
  13. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/models/functions.py +0 -0
  14. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/models/return_parser.py +0 -0
  15. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/models/submit_defaults.py +0 -0
  16. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/outputs/__init__.py +0 -0
  17. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/outputs/download.py +0 -0
  18. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/outputs/form.py +0 -0
  19. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/outputs/image.py +0 -0
  20. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/outputs/table.py +0 -0
  21. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/outputs/text.py +0 -0
  22. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/py.typed +0 -0
  23. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/emit.js +0 -0
  24. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/icons/alert.svg +0 -0
  25. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/icons/check.svg +0 -0
  26. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/icons/clock.svg +0 -0
  27. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/icons/copy.svg +0 -0
  28. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/icons/download.svg +0 -0
  29. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/output.js +0 -0
  30. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/page.css +0 -0
  31. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/page.js +0 -0
  32. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/static/upload.js +0 -0
  33. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/templates/__init__.py +0 -0
  34. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/templates/doc.py +0 -0
  35. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/templates/index.html +0 -0
  36. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/templates/index.py +0 -0
  37. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/templates/page.html +0 -0
  38. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/templates/page.py +0 -0
  39. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/templates/theme.py +0 -0
  40. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/__init__.py +0 -0
  41. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/execution.py +0 -0
  42. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/messages.py +0 -0
  43. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/pending.py +0 -0
  44. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/print_capture.py +0 -0
  45. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/references.py +0 -0
  46. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/returned_files.py +0 -0
  47. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/router.py +0 -0
  48. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/run.py +0 -0
  49. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/stream.py +0 -0
  50. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web/web/upload.py +0 -0
  51. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web.egg-info/SOURCES.txt +0 -0
  52. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web.egg-info/dependency_links.txt +0 -0
  53. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web.egg-info/requires.txt +0 -0
  54. {func_to_web-2.7.0 → func_to_web-2.7.2}/src/func_to_web.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: func-to-web
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: Expose typed Python functions as web interfaces.
5
5
  Author: Beltrán Offerrall
6
6
  License: MIT License
@@ -61,7 +61,7 @@ Provides-Extra: test-browser
61
61
  Requires-Dist: playwright; extra == "test-browser"
62
62
  Dynamic: license-file
63
63
 
64
- # FuncToWeb 2.7.0
64
+ # FuncToWeb
65
65
 
66
66
  [![PyPI version](https://img.shields.io/pypi/v/func-to-web.svg)](https://pypi.org/project/func-to-web/)
67
67
  [![Python](https://img.shields.io/pypi/pyversions/func-to-web.svg)](https://pypi.org/project/func-to-web/)
@@ -447,7 +447,7 @@ upload no execution ever uses expires; what your code received stays.
447
447
  ## Examples
448
448
 
449
449
  The examples are probably the best way to learn the library.
450
- [`examples/`](examples/README.md) contains 81 runnable programs in 11 folders.
450
+ [`examples/`](docs/examples.md) contains 81 runnable programs in 11 folders.
451
451
  Each file teaches **a single capability**: you can read it in one sitting and
452
452
  run it as it is. Alongside them, [`examples/project/`](examples/project/) holds
453
453
  mini-apps, where several capabilities are combined into one small application.
@@ -539,13 +539,13 @@ mini-app with the dict swapped for a store.
539
539
 
540
540
  Those three libraries are the whole stack: nested forms, recursive validation,
541
541
  streaming, the file lifecycle and the published contract are all inside these
542
- lines (v2.6.0, `.py`/`.js`/`.css` under `src/`).
542
+ lines (v2.7.1, `.py`/`.js`/`.css` under `src/`).
543
543
 
544
544
  ```text
545
545
  pytypehint 2,740 lines types, validation, defaults
546
- pytypehintweb 9,468 lines plan, widgets, transport (includes the JS/CSS)
547
- FuncToWeb 5,071 lines routes, execution, storage, /doc
548
- total ~17,300 lines
546
+ pytypehintweb 9,499 lines plan, widgets, transport (includes the JS/CSS)
547
+ FuncToWeb 5,306 lines routes, execution, storage, /doc
548
+ total ~17,500 lines
549
549
  ```
550
550
 
551
551
  Each layer can be read on its own: pytypehint is under 3,000 lines of pure
@@ -578,16 +578,52 @@ func-to-web && pip freeze` in an empty virtualenv prints exactly this.
578
578
 
579
579
  ## Documentation
580
580
 
581
- [docs/index.md](docs/index.md) is the complete index, organized by what you
582
- want to do, and the technical reference for everything the examples show in
583
- practice.
581
+ The technical reference, organized by what you want to do. For hands-on use,
582
+ see [Examples](docs/examples.md), one capability per file.
583
+
584
+ ### Start here
585
+
586
+ - [Getting started](docs/getting-started.md): install, write your first function and run it.
587
+ - [Examples](docs/examples.md): the runnable examples and mini-apps, how to run them, and what each folder teaches.
588
+ - [`run()`](docs/run.md): the standalone application and the space index.
589
+ - [`app_of()`](docs/router.md): mounting the application in an existing FastAPI host application.
590
+
591
+ ### Inputs and forms
592
+
593
+ - [Types and validation](docs/types.md): constraints, dataclasses, lists, unions, optionals and defaults.
594
+ - [Prefill and hidden parameters](docs/prefill.md): open a form with initial values, from Python or from the URL.
595
+ - [Files](docs/files.md): uploads, reusable file references, and which layer applies each limit.
596
+ - [`WebFunction`](docs/web-function.md): the name, description and slug of a function; prepared spaces.
597
+
598
+ ### Execution and results
599
+
600
+ - [Execution over HTTP](docs/http.md): `/invoke`, the request body, the envelope and the status codes.
601
+ - [Streaming](docs/streaming.md): `/invoke-stream`, SSE events and `print()` capture.
602
+ - [Outputs](docs/outputs.md): text, images, tables and downloads with `Download`.
603
+ - [`OpenForm`](docs/open-form.md): open another function's form with the return value as prefill.
604
+
605
+ ### Integration
606
+
607
+ - [`/doc`](docs/api-docs.md): the published contract that a client or an agent consumes.
608
+ - [`sdk.js`](docs/sdk.md): the helpers that call a space from your own frontend, and how to embed a function's page in another site.
609
+ - [Static assets](docs/static-assets.md): `/static`, the icons, the theme and how they are cached.
610
+ - [Security](docs/security.md): what FuncToWeb covers and what belongs to the host application.
611
+
612
+ ### Internals
613
+
614
+ - [Architecture](docs/architecture.md): the layers and what each one solves.
615
+ - [Limitations](docs/limitations.md): the known limits, in a single list.
616
+
617
+ ### Design notes
618
+
619
+ The pages above say what each thing is: the signature, the values, the errors and one example. The reasoning behind each of those decisions lives apart, in [`design/`](docs/design/index.md) — for whoever contributes to FuncToWeb, and for the curious. Nothing there is needed in order to use the library.
584
620
 
585
621
  ## Status
586
622
 
587
- **FuncToWeb 2.7.0 is stable, used daily and actively maintained.**
623
+ **FuncToWeb is stable, used daily and actively maintained.**
588
624
 
589
625
  The public API is the one described in
590
- [`docs/`](docs/index.md), and the known limitations are listed in
626
+ [documentation](#documentation), and the known limitations are listed in
591
627
  [limitations.md](docs/limitations.md).
592
628
 
593
629
  ## License
@@ -1,4 +1,4 @@
1
- # FuncToWeb 2.7.0
1
+ # FuncToWeb
2
2
 
3
3
  [![PyPI version](https://img.shields.io/pypi/v/func-to-web.svg)](https://pypi.org/project/func-to-web/)
4
4
  [![Python](https://img.shields.io/pypi/pyversions/func-to-web.svg)](https://pypi.org/project/func-to-web/)
@@ -384,7 +384,7 @@ upload no execution ever uses expires; what your code received stays.
384
384
  ## Examples
385
385
 
386
386
  The examples are probably the best way to learn the library.
387
- [`examples/`](examples/README.md) contains 81 runnable programs in 11 folders.
387
+ [`examples/`](docs/examples.md) contains 81 runnable programs in 11 folders.
388
388
  Each file teaches **a single capability**: you can read it in one sitting and
389
389
  run it as it is. Alongside them, [`examples/project/`](examples/project/) holds
390
390
  mini-apps, where several capabilities are combined into one small application.
@@ -476,13 +476,13 @@ mini-app with the dict swapped for a store.
476
476
 
477
477
  Those three libraries are the whole stack: nested forms, recursive validation,
478
478
  streaming, the file lifecycle and the published contract are all inside these
479
- lines (v2.6.0, `.py`/`.js`/`.css` under `src/`).
479
+ lines (v2.7.1, `.py`/`.js`/`.css` under `src/`).
480
480
 
481
481
  ```text
482
482
  pytypehint 2,740 lines types, validation, defaults
483
- pytypehintweb 9,468 lines plan, widgets, transport (includes the JS/CSS)
484
- FuncToWeb 5,071 lines routes, execution, storage, /doc
485
- total ~17,300 lines
483
+ pytypehintweb 9,499 lines plan, widgets, transport (includes the JS/CSS)
484
+ FuncToWeb 5,306 lines routes, execution, storage, /doc
485
+ total ~17,500 lines
486
486
  ```
487
487
 
488
488
  Each layer can be read on its own: pytypehint is under 3,000 lines of pure
@@ -515,16 +515,52 @@ func-to-web && pip freeze` in an empty virtualenv prints exactly this.
515
515
 
516
516
  ## Documentation
517
517
 
518
- [docs/index.md](docs/index.md) is the complete index, organized by what you
519
- want to do, and the technical reference for everything the examples show in
520
- practice.
518
+ The technical reference, organized by what you want to do. For hands-on use,
519
+ see [Examples](docs/examples.md), one capability per file.
520
+
521
+ ### Start here
522
+
523
+ - [Getting started](docs/getting-started.md): install, write your first function and run it.
524
+ - [Examples](docs/examples.md): the runnable examples and mini-apps, how to run them, and what each folder teaches.
525
+ - [`run()`](docs/run.md): the standalone application and the space index.
526
+ - [`app_of()`](docs/router.md): mounting the application in an existing FastAPI host application.
527
+
528
+ ### Inputs and forms
529
+
530
+ - [Types and validation](docs/types.md): constraints, dataclasses, lists, unions, optionals and defaults.
531
+ - [Prefill and hidden parameters](docs/prefill.md): open a form with initial values, from Python or from the URL.
532
+ - [Files](docs/files.md): uploads, reusable file references, and which layer applies each limit.
533
+ - [`WebFunction`](docs/web-function.md): the name, description and slug of a function; prepared spaces.
534
+
535
+ ### Execution and results
536
+
537
+ - [Execution over HTTP](docs/http.md): `/invoke`, the request body, the envelope and the status codes.
538
+ - [Streaming](docs/streaming.md): `/invoke-stream`, SSE events and `print()` capture.
539
+ - [Outputs](docs/outputs.md): text, images, tables and downloads with `Download`.
540
+ - [`OpenForm`](docs/open-form.md): open another function's form with the return value as prefill.
541
+
542
+ ### Integration
543
+
544
+ - [`/doc`](docs/api-docs.md): the published contract that a client or an agent consumes.
545
+ - [`sdk.js`](docs/sdk.md): the helpers that call a space from your own frontend, and how to embed a function's page in another site.
546
+ - [Static assets](docs/static-assets.md): `/static`, the icons, the theme and how they are cached.
547
+ - [Security](docs/security.md): what FuncToWeb covers and what belongs to the host application.
548
+
549
+ ### Internals
550
+
551
+ - [Architecture](docs/architecture.md): the layers and what each one solves.
552
+ - [Limitations](docs/limitations.md): the known limits, in a single list.
553
+
554
+ ### Design notes
555
+
556
+ The pages above say what each thing is: the signature, the values, the errors and one example. The reasoning behind each of those decisions lives apart, in [`design/`](docs/design/index.md) — for whoever contributes to FuncToWeb, and for the curious. Nothing there is needed in order to use the library.
521
557
 
522
558
  ## Status
523
559
 
524
- **FuncToWeb 2.7.0 is stable, used daily and actively maintained.**
560
+ **FuncToWeb is stable, used daily and actively maintained.**
525
561
 
526
562
  The public API is the one described in
527
- [`docs/`](docs/index.md), and the known limitations are listed in
563
+ [documentation](#documentation), and the known limitations are listed in
528
564
  [limitations.md](docs/limitations.md).
529
565
 
530
566
  ## License
@@ -62,7 +62,11 @@ Source = "https://github.com/offerrall/FuncToWeb"
62
62
  [tool.pytest.ini_options]
63
63
  testpaths = ["tests"]
64
64
  addopts = "--strict-markers --strict-config"
65
- filterwarnings = ["error"]
65
+ filterwarnings = [
66
+ "error",
67
+ # Raised inside Starlette's TestClient by anyio 4.15, not by FuncToWeb.
68
+ "ignore:The anyio.abc.BlockingPortal alias is deprecated:DeprecationWarning",
69
+ ]
66
70
  markers = [
67
71
  "browser: needs a real headless browser",
68
72
  "package: builds or installs the distribution",
@@ -3,7 +3,7 @@ from pathlib import Path
3
3
  from sys import platform
4
4
  from tempfile import gettempdir
5
5
 
6
- __version__ = "2.7.0"
6
+ __version__ = "2.7.2"
7
7
 
8
8
  NAME: str = "".join(part.title() for part in __name__.split(".")[0].split("_"))
9
9
 
@@ -51,6 +51,15 @@ const MODAL_STYLE = `
51
51
  background: transparent;
52
52
  }
53
53
 
54
+ .ftw-modal-panel[data-ftw-sizing] {
55
+ visibility: hidden;
56
+ animation: ftw-reveal 0s 1.5s forwards;
57
+ }
58
+
59
+ @keyframes ftw-reveal {
60
+ to { visibility: visible; }
61
+ }
62
+
54
63
  .ftw-modal-close {
55
64
  position: absolute;
56
65
  top: 10px;
@@ -568,6 +577,11 @@ export function openModal(url, options = {}) {
568
577
  panel.append(button);
569
578
  overlay.append(panel);
570
579
 
580
+ // Until the page reports its height the panel would open at its maximum
581
+ // and then shrink. It stays invisible meanwhile; the overlay still shows
582
+ // at once, and the stylesheet reveals the panel if no height ever comes.
583
+ if (autoHeight) panel.setAttribute("data-ftw-sizing", "");
584
+
571
585
  // The modal owns sizing and listener lifetime; its iframe fills the panel.
572
586
  const frame = embed(panel, url, { ...rest, autoHeight: false });
573
587
 
@@ -580,7 +594,9 @@ export function openModal(url, options = {}) {
580
594
 
581
595
  const channel = listen(frame, {
582
596
  onResize(size) {
583
- if (autoHeight) panel.style.setProperty("--ftw-content-height", `${size}px`);
597
+ if (!autoHeight) return;
598
+ panel.style.setProperty("--ftw-content-height", `${size}px`);
599
+ panel.removeAttribute("data-ftw-sizing");
584
600
  },
585
601
  onResult(outputs) {
586
602
  if (onResult !== null) onResult(outputs);
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: func-to-web
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: Expose typed Python functions as web interfaces.
5
5
  Author: Beltrán Offerrall
6
6
  License: MIT License
@@ -61,7 +61,7 @@ Provides-Extra: test-browser
61
61
  Requires-Dist: playwright; extra == "test-browser"
62
62
  Dynamic: license-file
63
63
 
64
- # FuncToWeb 2.7.0
64
+ # FuncToWeb
65
65
 
66
66
  [![PyPI version](https://img.shields.io/pypi/v/func-to-web.svg)](https://pypi.org/project/func-to-web/)
67
67
  [![Python](https://img.shields.io/pypi/pyversions/func-to-web.svg)](https://pypi.org/project/func-to-web/)
@@ -447,7 +447,7 @@ upload no execution ever uses expires; what your code received stays.
447
447
  ## Examples
448
448
 
449
449
  The examples are probably the best way to learn the library.
450
- [`examples/`](examples/README.md) contains 81 runnable programs in 11 folders.
450
+ [`examples/`](docs/examples.md) contains 81 runnable programs in 11 folders.
451
451
  Each file teaches **a single capability**: you can read it in one sitting and
452
452
  run it as it is. Alongside them, [`examples/project/`](examples/project/) holds
453
453
  mini-apps, where several capabilities are combined into one small application.
@@ -539,13 +539,13 @@ mini-app with the dict swapped for a store.
539
539
 
540
540
  Those three libraries are the whole stack: nested forms, recursive validation,
541
541
  streaming, the file lifecycle and the published contract are all inside these
542
- lines (v2.6.0, `.py`/`.js`/`.css` under `src/`).
542
+ lines (v2.7.1, `.py`/`.js`/`.css` under `src/`).
543
543
 
544
544
  ```text
545
545
  pytypehint 2,740 lines types, validation, defaults
546
- pytypehintweb 9,468 lines plan, widgets, transport (includes the JS/CSS)
547
- FuncToWeb 5,071 lines routes, execution, storage, /doc
548
- total ~17,300 lines
546
+ pytypehintweb 9,499 lines plan, widgets, transport (includes the JS/CSS)
547
+ FuncToWeb 5,306 lines routes, execution, storage, /doc
548
+ total ~17,500 lines
549
549
  ```
550
550
 
551
551
  Each layer can be read on its own: pytypehint is under 3,000 lines of pure
@@ -578,16 +578,52 @@ func-to-web && pip freeze` in an empty virtualenv prints exactly this.
578
578
 
579
579
  ## Documentation
580
580
 
581
- [docs/index.md](docs/index.md) is the complete index, organized by what you
582
- want to do, and the technical reference for everything the examples show in
583
- practice.
581
+ The technical reference, organized by what you want to do. For hands-on use,
582
+ see [Examples](docs/examples.md), one capability per file.
583
+
584
+ ### Start here
585
+
586
+ - [Getting started](docs/getting-started.md): install, write your first function and run it.
587
+ - [Examples](docs/examples.md): the runnable examples and mini-apps, how to run them, and what each folder teaches.
588
+ - [`run()`](docs/run.md): the standalone application and the space index.
589
+ - [`app_of()`](docs/router.md): mounting the application in an existing FastAPI host application.
590
+
591
+ ### Inputs and forms
592
+
593
+ - [Types and validation](docs/types.md): constraints, dataclasses, lists, unions, optionals and defaults.
594
+ - [Prefill and hidden parameters](docs/prefill.md): open a form with initial values, from Python or from the URL.
595
+ - [Files](docs/files.md): uploads, reusable file references, and which layer applies each limit.
596
+ - [`WebFunction`](docs/web-function.md): the name, description and slug of a function; prepared spaces.
597
+
598
+ ### Execution and results
599
+
600
+ - [Execution over HTTP](docs/http.md): `/invoke`, the request body, the envelope and the status codes.
601
+ - [Streaming](docs/streaming.md): `/invoke-stream`, SSE events and `print()` capture.
602
+ - [Outputs](docs/outputs.md): text, images, tables and downloads with `Download`.
603
+ - [`OpenForm`](docs/open-form.md): open another function's form with the return value as prefill.
604
+
605
+ ### Integration
606
+
607
+ - [`/doc`](docs/api-docs.md): the published contract that a client or an agent consumes.
608
+ - [`sdk.js`](docs/sdk.md): the helpers that call a space from your own frontend, and how to embed a function's page in another site.
609
+ - [Static assets](docs/static-assets.md): `/static`, the icons, the theme and how they are cached.
610
+ - [Security](docs/security.md): what FuncToWeb covers and what belongs to the host application.
611
+
612
+ ### Internals
613
+
614
+ - [Architecture](docs/architecture.md): the layers and what each one solves.
615
+ - [Limitations](docs/limitations.md): the known limits, in a single list.
616
+
617
+ ### Design notes
618
+
619
+ The pages above say what each thing is: the signature, the values, the errors and one example. The reasoning behind each of those decisions lives apart, in [`design/`](docs/design/index.md) — for whoever contributes to FuncToWeb, and for the curious. Nothing there is needed in order to use the library.
584
620
 
585
621
  ## Status
586
622
 
587
- **FuncToWeb 2.7.0 is stable, used daily and actively maintained.**
623
+ **FuncToWeb is stable, used daily and actively maintained.**
588
624
 
589
625
  The public API is the one described in
590
- [`docs/`](docs/index.md), and the known limitations are listed in
626
+ [documentation](#documentation), and the known limitations are listed in
591
627
  [limitations.md](docs/limitations.md).
592
628
 
593
629
  ## License
File without changes
File without changes