@lupinum/ginko 0.0.0-stage → 0.5.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.
Files changed (131) hide show
  1. package/CHANGELOG.md +225 -0
  2. package/LICENSE +21 -0
  3. package/README.md +99 -2
  4. package/dist/basics.d.mts +492 -0
  5. package/dist/basics.d.ts +492 -0
  6. package/dist/basics.mjs +416 -0
  7. package/dist/cli/index.d.mts +17 -0
  8. package/dist/cli/index.d.ts +17 -0
  9. package/dist/cli/index.mjs +678 -0
  10. package/dist/index.d.mts +7 -0
  11. package/dist/index.d.ts +7 -0
  12. package/dist/index.mjs +15 -0
  13. package/dist/internal/search.d.mts +25 -0
  14. package/dist/internal/search.d.ts +25 -0
  15. package/dist/internal/search.mjs +88 -0
  16. package/dist/internal.d.mts +842 -0
  17. package/dist/internal.d.ts +842 -0
  18. package/dist/internal.mjs +1069 -0
  19. package/dist/nuxt/module.d.mts +29 -0
  20. package/dist/nuxt/module.d.ts +29 -0
  21. package/dist/nuxt/module.mjs +456 -0
  22. package/dist/nuxt/runtime/GinkoImage.d.mts +39 -0
  23. package/dist/nuxt/runtime/GinkoImage.mjs +33 -0
  24. package/dist/nuxt/runtime/GinkoMarkdown.d.mts +36 -0
  25. package/dist/nuxt/runtime/GinkoMarkdown.mjs +24 -0
  26. package/dist/nuxt/runtime/composables.d.mts +122 -0
  27. package/dist/nuxt/runtime/composables.mjs +186 -0
  28. package/dist/nuxt/runtime/fetch.d.mts +28 -0
  29. package/dist/nuxt/runtime/fetch.mjs +56 -0
  30. package/dist/nuxt/runtime/markdown.d.mts +16 -0
  31. package/dist/nuxt/runtime/markdown.mjs +29 -0
  32. package/dist/nuxt/runtime/og/GinkoCard.vue +48 -0
  33. package/dist/nuxt/runtime/plugin.d.mts +2 -0
  34. package/dist/nuxt/runtime/plugin.mjs +60 -0
  35. package/dist/nuxt/runtime/preview-listener.d.mts +13 -0
  36. package/dist/nuxt/runtime/preview-listener.mjs +37 -0
  37. package/dist/nuxt/runtime/preview.vue +54 -0
  38. package/dist/nuxt/runtime/schema.d.ts +56 -0
  39. package/dist/nuxt/runtime/server/bundles.d.mts +4 -0
  40. package/dist/nuxt/runtime/server/bundles.d.ts +4 -0
  41. package/dist/nuxt/runtime/server/bundles.mjs +18 -0
  42. package/dist/nuxt/runtime/server/files-md.d.mts +2 -0
  43. package/dist/nuxt/runtime/server/files-md.d.ts +2 -0
  44. package/dist/nuxt/runtime/server/files-md.mjs +8 -0
  45. package/dist/nuxt/runtime/server/files.d.mts +2 -0
  46. package/dist/nuxt/runtime/server/files.d.ts +2 -0
  47. package/dist/nuxt/runtime/server/files.mjs +9 -0
  48. package/dist/nuxt/runtime/server/headers.d.mts +2 -0
  49. package/dist/nuxt/runtime/server/headers.d.ts +2 -0
  50. package/dist/nuxt/runtime/server/headers.mjs +9 -0
  51. package/dist/nuxt/runtime/server/items.d.mts +12 -0
  52. package/dist/nuxt/runtime/server/items.d.ts +12 -0
  53. package/dist/nuxt/runtime/server/items.mjs +17 -0
  54. package/dist/nuxt/runtime/server/llms-full.d.mts +2 -0
  55. package/dist/nuxt/runtime/server/llms-full.d.ts +2 -0
  56. package/dist/nuxt/runtime/server/llms-full.mjs +13 -0
  57. package/dist/nuxt/runtime/server/llms.d.mts +2 -0
  58. package/dist/nuxt/runtime/server/llms.d.ts +2 -0
  59. package/dist/nuxt/runtime/server/llms.mjs +13 -0
  60. package/dist/nuxt/runtime/server/markdown-trees.d.mts +2 -0
  61. package/dist/nuxt/runtime/server/markdown-trees.d.ts +2 -0
  62. package/dist/nuxt/runtime/server/markdown-trees.mjs +2 -0
  63. package/dist/nuxt/runtime/server/markdown.d.mts +2 -0
  64. package/dist/nuxt/runtime/server/markdown.d.ts +2 -0
  65. package/dist/nuxt/runtime/server/markdown.mjs +35 -0
  66. package/dist/nuxt/runtime/server/platform-md.d.mts +3 -0
  67. package/dist/nuxt/runtime/server/platform-md.d.ts +3 -0
  68. package/dist/nuxt/runtime/server/platform-md.mjs +71 -0
  69. package/dist/nuxt/runtime/server/redirects.d.mts +2 -0
  70. package/dist/nuxt/runtime/server/redirects.d.ts +2 -0
  71. package/dist/nuxt/runtime/server/redirects.mjs +17 -0
  72. package/dist/nuxt/runtime/server/robots.d.mts +2 -0
  73. package/dist/nuxt/runtime/server/robots.d.ts +2 -0
  74. package/dist/nuxt/runtime/server/robots.mjs +8 -0
  75. package/dist/nuxt/runtime/server/search.d.mts +2 -0
  76. package/dist/nuxt/runtime/server/search.d.ts +2 -0
  77. package/dist/nuxt/runtime/server/search.mjs +9 -0
  78. package/dist/nuxt/runtime/server/site-config.d.mts +14 -0
  79. package/dist/nuxt/runtime/server/site-config.d.ts +14 -0
  80. package/dist/nuxt/runtime/server/site-config.mjs +9 -0
  81. package/dist/nuxt/runtime/server/sitemap-source.d.mts +2 -0
  82. package/dist/nuxt/runtime/server/sitemap-source.d.ts +2 -0
  83. package/dist/nuxt/runtime/server/sitemap-source.mjs +14 -0
  84. package/dist/nuxt/runtime/server/sitemap-xml.d.mts +24 -0
  85. package/dist/nuxt/runtime/server/sitemap-xml.d.ts +24 -0
  86. package/dist/nuxt/runtime/server/sitemap-xml.mjs +88 -0
  87. package/dist/nuxt/runtime/server/sitemap.d.mts +2 -0
  88. package/dist/nuxt/runtime/server/sitemap.d.ts +2 -0
  89. package/dist/nuxt/runtime/server/sitemap.mjs +15 -0
  90. package/dist/nuxt/runtime/shared.d.mts +42 -0
  91. package/dist/nuxt/runtime/shared.mjs +9 -0
  92. package/dist/nuxt/runtime/today.client.d.mts +2 -0
  93. package/dist/nuxt/runtime/today.client.mjs +18 -0
  94. package/dist/search.d.mts +1 -0
  95. package/dist/search.d.ts +1 -0
  96. package/dist/search.mjs +2 -0
  97. package/dist/shared/ginko.1wwZv4B_.d.ts +1622 -0
  98. package/dist/shared/ginko.6cI8KXZP.d.mts +68 -0
  99. package/dist/shared/ginko.AprJymER.mjs +69 -0
  100. package/dist/shared/ginko.BNVC-g9n.mjs +10389 -0
  101. package/dist/shared/ginko.BWpep204.mjs +62 -0
  102. package/dist/shared/ginko.B_pACpVU.d.ts +68 -0
  103. package/dist/shared/ginko.C4gcOovG.mjs +1019 -0
  104. package/dist/shared/ginko.CXA2R3aS.mjs +571 -0
  105. package/dist/shared/ginko.CjWB8N7f.d.ts +128 -0
  106. package/dist/shared/ginko.D1PeQ3ds.mjs +36 -0
  107. package/dist/shared/ginko.D4ApSEyg.d.mts +57 -0
  108. package/dist/shared/ginko.D4ApSEyg.d.ts +57 -0
  109. package/dist/shared/ginko.DIl7l-75.mjs +26 -0
  110. package/dist/shared/ginko.DY7RbCEw.mjs +601 -0
  111. package/dist/shared/ginko.Dmgixfpf.mjs +130 -0
  112. package/dist/shared/ginko.DrkUeYFP.d.mts +2368 -0
  113. package/dist/shared/ginko.DrkUeYFP.d.ts +2368 -0
  114. package/dist/shared/ginko.DvPtlHIz.d.mts +258 -0
  115. package/dist/shared/ginko.EelR5dt9.d.ts +258 -0
  116. package/dist/shared/ginko.ULKQnAWd.d.ts +91 -0
  117. package/dist/shared/ginko.loGIxGZg.d.mts +91 -0
  118. package/dist/shared/ginko.o1yIKlgj.d.mts +128 -0
  119. package/dist/shared/ginko.plW4dLmm.d.mts +1622 -0
  120. package/dist/shared/ginko.raCzOPYC.mjs +95 -0
  121. package/dist/shared/ginko.yKMIjJ68.mjs +84 -0
  122. package/dist/vue.d.mts +46 -0
  123. package/dist/vue.d.ts +46 -0
  124. package/dist/vue.mjs +84 -0
  125. package/i18n/ar.json +212 -0
  126. package/i18n/de.json +212 -0
  127. package/i18n/en.json +212 -0
  128. package/i18n/es.json +212 -0
  129. package/i18n/fr.json +212 -0
  130. package/i18n/it.json +212 -0
  131. package/package.json +89 -3
package/CHANGELOG.md ADDED
@@ -0,0 +1,225 @@
1
+ # @lupinum/ginko
2
+
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add @lupinum/ginko/basics: site, legal, people, posts, authors, changelog, jobs, faq and downloads bricks.
8
+
9
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add country and sessions to @lupinum/ginko/basics; move hours, notices, events and gallery into basics (preset-gastro re-exports them unchanged).
10
+
11
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `breadcrumbJsonLd(steps, siteUrl)` to `@lupinum/ginko`: a JSON-LD BreadcrumbList from steps with `title` and `path`, such as the nodes of `useGinkoBreadcrumbs` (templates/_features/site/app/composables/usePageSeo.ts uses it).
12
+
13
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `status` to bricks: a declared status line for the Studio's Today page.
14
+
15
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change the changelog basic to support drafts and scheduled entries: an entry dated after the build day stays out until the first build on or after its date, and `draft: true` holds an entry back.
16
+
17
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `askAgainWhen` to `choices` fields: the Studio asks whether the choice is still right when the text it answers for changes.
18
+
19
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `fields` to create tasks: the task asks and writes only those fields.
20
+
21
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add an optional `language` field to the `downloads` brick of `@lupinum/ginko/basics`, so a list can say that a document is in another language (template files: `templates/_features/downloads/app/components/downloads/List.vue`).
22
+
23
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `bookingUntil` (the last day the booking link shows) to `events()` and an optional `summary` to `sessions()` from `@lupinum/ginko/basics` (template files: `templates/_features/events/app/composables/useEvents.ts`, `templates/_features/events/app/pages/events/[slug].vue`, `templates/_features/sessions/app/composables/useSessions.ts`, `templates/_features/sessions/app/components/session/Row.vue`, `templates/_features/sessions/app/pages/programme.vue`).
24
+
25
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `hours({ plans: 'hourPlans' })`: the hours name their hour plans in the stored schema (`status: { hours: { plans } }`), the release check refuses a key that is not a collection of hour plans, and the Studio's line for today reads only those plans.
26
+
27
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add today's opening hours to the Studio's Today page: `hours()` declares `status: { hours: true }`.
28
+
29
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add the site's `country` to page JSON-LD: `useGinkoSeo` fills `addressCountry` (and remote job applicants) where `siteJsonLd` or `jobJsonLd` got none.
30
+
31
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change Markdown refs in page state to carry no table of contents: read `toc` from the loaded text, `(await useGinkoMarkdown(() => entry.value.data.body)).value?.toc`.
32
+
33
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `formatMoney(money, language, { wholeWithoutMinor: true })` for "€390" instead of "€390.00", and `offerJsonLd` in `@lupinum/ginko/basics` for a schema.org Offer with an optional VAT note (templates/_features/services/app/composables/useServices.ts).
34
+
35
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `unitCode` to `offerJsonLd(money, currency, { unitCode })` for a recurring price: `MON` per month, `ANN` per year give the Offer a UnitPriceSpecification for one such unit, with `valueAddedTaxIncluded` when given. The pricing feature of the templates (templates/_features/pricing/app/composables/usePricing.ts) uses it for the plans' Offers.
36
+
37
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change an outdated translation to stay on the site until someone updates or confirms it, instead of being replaced by the main-language text; `fallback` now lists only missing translations.
38
+
39
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `planned` to `single()` and `collection()`: a field whose value changes on a date (`{ field: 'price', next: 'nextPrice', from: 'priceFrom' }`). The platform stores the planned value only with its date, opens a task on the new value from that date on, leaves the plan out of create tasks (Studio and agent tools), and `ginko check` reports a task that changes the field without showing its plan.
40
+
41
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change platform Markdown fields to `{ ref }` in page state, as file bricks already are, so a page's payload carries only the texts it shows.
42
+
43
+ Site code that reads a text's tree from an entry (`entry.data.body.nodes`) gets nothing now: load it with `useGinkoMarkdown(() => entry.value.data.body)` or, for several texts in one `useAsyncData`, `fetchGinkoMarkdown(value)`. `<GinkoMarkdown>` needs no change. A client navigation loads a text it has not shown yet from `/__ginko/platform/<locale>/<rev>/md/…`.
44
+
45
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add the `authors` option to `posts()`: name the brick the post's authors come from, for example `people`.
46
+
47
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `releaseAnchor(version)` to `@lupinum/ginko/basics`: the anchor of a release on a changelog page (`4.6.0` → `v4-6-0`). The changelog page of `@lupinum/ginko-docs` and the changelog feature of the templates (templates/_features/changelog/app/composables/useChangelog.ts, server/middleware/changelog-feed.ts) use it, so both keep the same public addresses.
48
+
49
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `getGinkoItems(event, brick, locale)` for a site's own server routes (a feed, a calendar): the visible entries of a collection with their address, for file and platform bricks; `rssXml` in `@lupinum/ginko/basics` writes an RSS 2.0 feed (template files: `templates/_features/blog/server/middleware/news-feed.ts`).
50
+
51
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change a required field with `showWhen` to be required only while it shows: `price: f.money('Amount', { showWhen: { field: 'pricing', is: 'price' } })` now refuses a fixed price without an amount in the build, the Studio and agent tools, and accepts an entry on request without one (templates/_features/services/app/bricks/services.ts).
52
+
53
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `after` to time fields (an end time must be later than its start) and `timeZone` to the gastro `eventJsonLd`, which then writes the start with the site's offset.
54
+
55
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change the default of `untranslated` for collections with a `route`: an entry is left out of a language until its required fields are translated there (no page, a 404 under its address, not in lists, the sitemap, hreflang or llms.txt); set `untranslated: 'fallback'` to list it there with a link to its main-language page.
56
+
57
+ An outdated translation no longer hides anything, also with `'hide'`; only a missing one does. Collections without a `route` (authors, FAQ, dishes) keep `'fallback'` as their default. A missing slug or image description never counts as a missing translation. A link to an entry (`$blog.<name>`) in a translated text goes to its main-language page while the entry has no page in that language.
58
+
59
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `wordsOf(value)`: the number of words of a Markdown value, also in lists where page state holds only `{ ref }`, for example for a reading time.
60
+
61
+ ### Patch Changes
62
+
63
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix the Markdown twin and llms.txt slowing down on a title with a long run of spaces
64
+
65
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix the message for text in square brackets that is no link or image (`![Bild(datei)` or `[sic]`): it now names the missing "]" or address and how to write brackets as text, instead of reporting an unknown component "span".
66
+
67
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix a site refusing its own content as "bundle too large" when its texts are heavily formatted: the size limit now covers everything the platform allows (4 MiB of text plus 8 MiB of Markdown trees).
68
+
69
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix `nuxt dev` ignoring changes to `ginko.config.ts`: a saved change now restarts the dev server, and a save with an error is reported in the terminal while the site keeps running with the last good version.
70
+
71
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix a missing entry from useGinkoEntry showing the last entry instead of the 404 when other code, such as useGinkoMarkdown, read it first; it now throws on every read and is a `Readonly<Ref>`.
72
+
73
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add a `ginko check` warning when a brick's field maxima can add up past the entry limit, so a schema does not allow entries the platform refuses at Save.
74
+
75
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix llms.txt, the Markdown twin of a page, its 404 suggestions and the site search naming an entry without a `title` field by its id (`people/lena-hofer`): they now use the field its slug is made from, such as a person's `name` with `people({ route })`.
76
+
77
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change `events()` from `@lupinum/ginko/basics` so `route` is optional: without it the events have no pages, and a site can still list them.
78
+
79
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `pathOf` and `defaultDir` to `@lupinum/ginko/internal`: the file layout of `ginko export`, which the Studio's backup download uses too.
80
+
81
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix `$file.<id>` references inside fenced or inline code counting as picture uses: they are text now, for the file checks and for the `local:files-export` rewrite. An escaped backtick (`` \` ``) opens no code.
82
+
83
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add a warning to `local:files-export` that counts the entries it leaves out (drafts, entries scheduled for later and entries that belong to a draft) and names the first three, so they can be added in the Studio.
84
+
85
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix `local:files-export`: a content file marked `draft: true` stays out of the export, as it stays out of the build, instead of making the import refuse every entry.
86
+
87
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add French, Italian and Arabic messages.
88
+
89
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix llms.txt, link checks and Markdown block splitting slowing down on a long run of slashes, spaces or tabs, or on many unclosed `::snippet{`
90
+
91
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `grantGroups` to `@lupinum/ginko/internal`: a person's rights grouped by area, in the order of the site's schema.
92
+
93
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change `upcomingClosures` and `upcomingHolidayClosures` to leave out a public holiday that falls on a day the week already closes.
94
+
95
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix upcomingPlans to end a plan's shown range on the last day planOn still gives to that plan.
96
+
97
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix image descriptions accepting invisible control characters and bidi overrides: an image field's description now refuses them with the same message as a text field.
98
+
99
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix `local:import` for big and inconsistent exports: it refuses a collection over its maximum, an entry ID twice or two entries at one address before it clears anything, imports thousands of entries and references in smaller calls, prints no schema warning when there is none, and suggests running it again only when that can finish.
100
+
101
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix links to entries in Markdown texts (`[Anna]($authors.<id>)`) after an import: they now point at the entry's new ID instead of showing as broken on the site.
102
+
103
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix local imports on a busy machine: Convex's "Function execution timed out" is now read from `convex run` and the import tries again (up to three times, with growing waits).
104
+
105
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix the reason of a failed local command: it now shows the end of its error output, where the error is, instead of the first line.
106
+
107
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `$file.<id>` references in platform Markdown texts: a picture, component image or link from the Files library is served with its current address, pixel size, smaller copies and library description, and a file that is gone is marked broken instead of loading nothing.
108
+
109
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix HTML comments in Markdown (`<!-- TODO -->`) showing on the site as text: the parsed tree now leaves them out, also a comment around formatting or around whole paragraphs, and the stored text keeps them.
110
+
111
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix Markdown reference links and images (`[Text][g]` with `[g]: https://…`): they now become normal links and images instead of an error about a component named "component".
112
+
113
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change the robots tag of `useGinkoSeo({ noindex: true })` to `noindex, follow`, so a page kept out of search results (the menu's print page in templates/_features/menu/app/pages/menu/print.vue, a draft) no longer tells search engines to ignore its links.
114
+
115
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change the type of `unitCode` in `offerJsonLd` so editors suggest `MON` and `ANN`; other codes stay valid.
116
+
117
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix the home page getting a second Organization JSON-LD node from `seo.organization` when the page writes its own (`siteJsonLd`).
118
+
119
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix a PDF of the Files library used as a picture (`![x]($file.<pdf id>)`): the text is now refused with a hint to link the PDF instead.
120
+
121
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add a `route` option to `people()` from `@lupinum/ginko/basics`: with it, each person gets a web address (a slug made from the name) and a page, for example speakers. Without it the stored fields stay as they are. Template files that read a person's `url` and need the route: `templates/_features/sessions/app/pages/speakers/[slug].vue`, `templates/_features/sessions/app/pages/speakers/index.vue`, `templates/_features/sessions/app/components/session/Speakers.vue` and `templates/_features/sessions/app/composables/useSessions.ts`.
122
+
123
+ - [#24](https://github.com/lupinum-dev/ginko/pull/24) [`c28d1e3`](https://github.com/lupinum-dev/ginko/commit/c28d1e3e4ba1e558f8c71d7b69961f7474a221d1) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix a docs site whose bricks all live on the platform failing on every page: `#ginko/search` is now defined (empty) without file bricks.
124
+
125
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix the Spanish label of `posts()`: "Artículos" instead of "Entradas", which the Studio uses for entries.
126
+
127
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix `ginko check` and `ginko release` refusing a release because of an entry the release does not change or one in the trash: only live entries the release writes, and only when they grow, must fit the entry limit (480 KiB, counted without Markdown trees), and the message names the entry.
128
+
129
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change the schema check to refuse a brick named `page` or `file`: `$page.…` and `$file.…` in Markdown texts always mean a page and a library file.
130
+
131
+ - [#23](https://github.com/lupinum-dev/ginko/pull/23) [`7b165c2`](https://github.com/lupinum-dev/ginko/commit/7b165c25e17ed2f4fb50e8054febf618a6af10d7) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix every page downloading the Markdown component registry: only a page that shows Markdown loads it now.
132
+
133
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix the build of a site with two headings in Arabic script on one page: the search index no longer stops with "duplicate ID".
134
+
135
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix the types of server auto-imports in a site that installs `@lupinum/ginko` from npm: `getGinkoItems` was `any` there.
136
+
137
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add `slugBases` to `@lupinum/ginko/internal`: the slug of a new entry per language before it is made unique, one rule for the platform and the Studio's preview of an entry not saved yet.
138
+
139
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Change the script every page loads to about 20 kB (gzip) less: the core's message catalogs, the editors' texts of the schema and the preview's listener no longer reach the browser.
140
+
141
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix the order of a collection sorted by a translatable field (`jobs()` by title): each language's list now follows its own titles, not the German ones (templates/_features/jobs).
142
+
143
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix French, Italian, Spanish and Arabic message texts: Arabic counts use all plural forms and Arabic punctuation, French uses narrow no-break spaces and the typographic apostrophe, and a few wordings read more naturally.
144
+
145
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix the silent loss of text after a block component without its closing `::` line: it is now refused with the line it starts on (Studio, agent tools, releases, `ginko check` and the build). Close every block component with a `::` line, also one at the very end of a text; for content files, `ginko check` and the build now fail and name the file and line.
146
+
147
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Remove HEIC from the accepted upload types (`UPLOAD_TYPES`): the Files library cannot read HEIC photos. `local:files-export` now names a HEIC photo and says how to save it as JPEG.
148
+
149
+ - [#21](https://github.com/lupinum-dev/ginko/pull/21) [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Fix a week saved as a mid-week day (a lunch week from Thursday) being accepted although the site never shows it: the field that holds a week start (`plans.field`, or the date a task presets to `@workWeek` or `@nextWorkWeek`) now needs the first day of a week, also in content files.
150
+ - Updated dependencies [[`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991), [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991), [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991), [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991), [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991), [`80f93a4`](https://github.com/lupinum-dev/ginko/commit/80f93a4f6bd171e1146b929913254039becdd991)]:
151
+ - @lupinum/ginko-i18n@0.5.0
152
+
153
+ ## 0.4.0
154
+
155
+ ### Minor Changes
156
+
157
+ - [`ea2ea13`](https://github.com/lupinum-dev/ginko/commit/ea2ea133997f2011ad0d43f77a0f1dc75605923e) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add Ginko 0.4, the first release: one content system for Nuxt websites, from Markdown files in Git to a hosted platform.
158
+
159
+ Owners, staff and AI agents edit the same content. All seven packages release together under one version. It starts at 0.4 because `@lupinum/ginko-content` and `@lupinum/ginko-docs` already published an older, unrelated line up to 0.3. Until 1.0, a minor version (0.4 → 0.5) may contain breaking changes; the changelog names each one and how to update.
160
+
161
+ Requirements: Node 22.18+, 24 or 26, and Nuxt 4.6+ or Nuxt 5 (tested on its nightly until it is released). Start a site with `npm create ginko@latest my-site`; the documentation explains every step.
162
+
163
+ **Public API**
164
+
165
+ - `@lupinum/ginko`: `defineSite`, `single`, `collection`, `f`, `defineComponents`, `formatMoney`, `plainText`, `safeHref`, `startOfWeek` and the documented types. Imported, not auto-imported.
166
+ - `@lupinum/ginko/nuxt`: the module, the `useGinko*` composables (everything that needs a Nuxt app starts with `useGinko`), `<GinkoMarkdown>` and `<GinkoImage>`. `@lupinum/ginko/vue`: `<GinkoMarkdown>` for any Vue app. `@lupinum/ginko/search`: `loadIndex` and `search`.
167
+ - `@lupinum/ginko/internal` and `@lupinum/ginko/internal/search` are for Ginko's own packages and have no stability promise.
168
+ - The `ginko` CLI: `check [--offline]`, `release` and `export [folder]`, plus `--version`. Every command run prints one JSON line, `{ "ok": true, … }` or `{ "ok": false, "error": { code, message } }` (`--help` and `--version` print plain text), and ends with exit code 0 (ok), 1 (fix the code), 2 (usage), 3 (platform unreachable, retry) or 4 (key not allowed). CI deploys the site only when `release` prints `"deploy": true` (a superseded run exits 0 with `"deploy": false`). The CLI reads `GINKO_PLATFORM` (or `NUXT_PUBLIC_GINKO_PLATFORM`), `GINKO_KEY`, `GINKO_COMMIT` (or `GITHUB_SHA`), `GINKO_BRANCH` and `GINKO_REMOTE`; it does not read `.env` files. `ginko-i18n --json` uses the same output shape, error codes (`USAGE`, `INVALID`) and exit codes.
169
+ - Config names: `f.ref` (one entry) and `f.refs` (several); `visible: { mode: 'until', field, days?, deleteExpired? }`; prefill tokens `@today`, `@workWeek`, `@nextWorkWeek`; `firstDayOfWeek`, `linkCheck`, `untranslated`, `maxBytes`, `Migration.compute`, `retired` rule `{ drop: true }`. Options and defaults are typed per field, and an unknown top-level key fails the build.
170
+ - Markdown components: `embed`, `frame` (`none`, `card`, `border`, …), `background` (`none`, `muted`, `tint`), `appearance` (`quiet`, `tint`), `quiz-question{mode}`, `code-tree{file}`.
171
+
172
+ **Content (`@lupinum/ginko`, `@lupinum/ginko-content`)**
173
+
174
+ - One text format: Markdown (comark 0.7) everywhere, with field profiles that limit what a field may contain. Footnotes, emoji, alerts, Shiki code, task lists, route links (`$blog.my-post`), reusable snippets and heading anchors.
175
+ - Data files: YAML and JSON (one file, one entry) and CSV (one file, many entries), checked against the field schema; every error names the file and field, and the line for CSV rows and unreadable files. Entries with `draft: true` stay out of production builds.
176
+ - Query engine in the site, over the loaded bundle: `where`, `order`, `limit`, pagination with totals, field selection, `include` for references, previous/next and facet counts.
177
+ - References (`f.ref`, `f.refs`), navigation trees and breadcrumbs, and a URL for every entry in every language; two entries on one URL fail the build.
178
+ - Link check before any HTML exists: route links, anchors, snippets and redirected paths, in the build, the dev terminal, `ginko check` and the agent tools. On the platform a save, a new entry or a scheduled publish that adds a broken link is stopped, and History says why. External links are checked on request (`linkCheck.external`), at build and in `ginko check` (never in dev), with a 7-day cache.
179
+ - Images: WebP copies at 480, 960 and 1600 px, made at upload on the platform and at build for files. `<GinkoImage>` and Markdown images get `srcset` and `sizes`.
180
+ - Redirects from `redirectFrom` (301) and site rules in `redirects` (301 by default, `status` 302/307/308 per rule).
181
+ - SEO from the bundle, with no other module: title template, canonical, Open Graph with `og:url`, `<html lang>`, hreflang with `x-default`, sitemap with `lastmod`, images and alternates, robots.txt with `noindex` on preview hosts, JSON-LD. With `nuxt-og-image` (in every starter), every page gets a generated share card in the brand colour `seo.color`, with the site's logo and the page's image.
182
+ - Works with the Nuxt SEO modules (`@nuxtjs/seo` or single ones, in any order): Ginko leaves them sitemap, robots.txt and JSON-LD defaults and hands them its pages with hreflang, the site's address, name and languages, and `noindex` on preview hosts. `nuxt-ai-ready` stays off while Ginko serves `/llms.txt`. Requires `nuxt-og-image` 7.
183
+ - Search index built in plain JS at build time, one record per heading section, loaded lazily per language.
184
+ - Agent output: `/llms.txt`, `/llms-full.txt`, a `.md` twin for every entry page (collections with a `route`), and a Markdown 404 that suggests pages. The normal address always answers with HTML.
185
+ - Render modes: Git-only sites prerender everything; platform sites refresh changed pages after a publish; previews render with `noindex`.
186
+ - In dev, `nuxt dev` restarts when `ginko.config.ts` changes, and a brick that cannot reach the platform names itself and the fix.
187
+ - CLI `ginko`: `check` (schema, links and the share image, for every site; `--offline` without the platform) and `release` for CI, `export` for backups; `pnpm local:dev|import|pull` run only in the Ginko monorepo.
188
+
189
+ **Languages (`@lupinum/ginko-i18n`)**
190
+
191
+ - The only locale authority: routes, alternates, hreflang, messages with plurals, and formatters for dates, ranges, relative time, numbers, currency and lists, each in the site's time zone.
192
+ - Works on its own in any Nuxt 4.6+ or Nuxt 5 app, without the rest of Ginko.
193
+
194
+ **Components and docs (`@lupinum/ginko-components`, `@lupinum/ginko-docs`)**
195
+
196
+ - Content components with props defined as Ginko fields: callouts, tabs, code groups, steps, cards, accordion, figures, embeds (click to load), timeline, quiz and more. Each one can also be copied into an app with the shadcn-vue CLI, from a registry the docs build generates.
197
+ - Docs layer (`@lupinum/ginko-docs`; `npm create ginko@latest my-docs -- --preset docs` starts a site with it): navigation, section tabs, breadcrumbs, table of contents with scroll spy, previous/next, ⌘K search with heading results, blog with authors and RSS, changelog, copy page as Markdown, dark mode. A guide for switching from Nuxt Content and `@nuxtjs/i18n`. Math (KaTeX) and mermaid diagrams render and load only on pages that use them.
198
+
199
+ **Platform and Studio (hosted by Lupinum)**
200
+
201
+ The platform is a hosted service, not an npm package. A site connects to it with one setting; without it, the site reads its content from files.
202
+
203
+ - Quick tasks for the jobs owners do most ("Heute geschlossen", "Preis ändern"), phone first, with the full form behind "Alles bearbeiten".
204
+ - Files library: All, Recent, Unused, Missing alt text, Duplicates and folders; icon and list views; "used in" with links; replace a file and keep its references; a used file cannot be removed by mistake. Alt text set in the library is the default for every use, per language.
205
+ - Approvals, off by default: a task or agent key can need a yes. Reviewers see the change, approve, approve for a time, or reject with a sentence; the author sees the reason. Releases publish several changes together.
206
+ - History with "show changes", "back to this version" and undo; drafts and scheduled publishing; trash with restore; translation status per language; "why is this not on the website?".
207
+ - Team and invitations with per-task rights, sign-in with an emailed code, AI agent keys with an MCP tool catalog derived from the operations, and weekly reminder mails.
208
+ - Long forms group their fields under headings or in tabs (`group` on a field, `layout: 'tabs'` on a brick); phones always show headings.
209
+ - A rich text editor (TipTap 3) that writes Markdown, where untouched text stays byte for byte. Headings, lists, task lists, quotes, code blocks, tables, images from the library, embeds, registry components with prop forms, slash and bubble menus, Markdown shortcuts and paste, source mode, find and replace (⌘F), a drag handle and Alt+↑/↓ to move blocks, character counter, a link card for pasted URLs, uploads with progress, and a formatting bar above the phone keyboard.
210
+ - Delete a site, with seven days to cancel, and delete your own account. The last owner of a site must hand it over or delete it first.
211
+ - Studio in German, English and Spanish (beta), light and dark.
212
+
213
+ **Presets (`@lupinum/ginko-preset-gastro`, `create-ginko`)**
214
+
215
+ - Gastro: opening hours with exceptions, seasons, holidays and new hours from a date; lunch week with planning ahead and an optional PDF; menu with prices from a date; notices that expire; events; JSON-LD for Restaurant, Menu, opening hours and Event; a printable lunch sheet.
216
+ - `create-ginko` starts a new site, plain or with `--preset gastro|docs`. Starters install with npm, pnpm 11 and bun, carry a `typecheck` script, a page description and share cards (`nuxt-og-image` with Takumi, Nuxt 4.6.1 or later; set `NUXT_APP_SECRET` where the site runs, `.env` has one), and create-ginko warns on an unsupported Node.
217
+
218
+ **Not in 0.4**
219
+
220
+ Real-time co-editing comes next. Also not included: an agency preset, the editor UI as a shadcn-vue registry, OAuth for agent connectors, and a Google Business sync.
221
+
222
+ ### Patch Changes
223
+
224
+ - Updated dependencies [[`ea2ea13`](https://github.com/lupinum-dev/ginko/commit/ea2ea133997f2011ad0d43f77a0f1dc75605923e)]:
225
+ - @lupinum/ginko-i18n@0.4.0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-2026 Lupinum OG
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,100 @@
1
- # Temporary Holding Version
1
+ # @lupinum/ginko
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Connect a Nuxt site with its content. The site stays normal Nuxt code; the content arrives as one
4
+ JSON **bundle** per language, either from the hosted Ginko platform (owners edit opening hours, menus,
5
+ events) or from Markdown files in your repo (with [`@lupinum/ginko-content`](https://github.com/lupinum-dev/ginko/tree/main/packages/ginko-content)).
6
+
7
+ ## Start
8
+
9
+ ```bash
10
+ npm create ginko my-site
11
+ ```
12
+
13
+ Or add it to an existing Nuxt 4.6+ or Nuxt 5 site:
14
+
15
+ ```bash
16
+ npm install @lupinum/ginko @lupinum/ginko-content
17
+ ```
18
+
19
+ ```ts
20
+ // ginko.config.ts: the bricks (content types) of this site
21
+ import { collection, defineSite, f } from '@lupinum/ginko'
22
+
23
+ export default defineSite({
24
+ site: 'my-site',
25
+ name: 'My site',
26
+ url: 'https://example.com',
27
+ timeZone: 'Europe/Vienna',
28
+ locales: ['en'],
29
+ currency: 'EUR',
30
+ pages: { home: '/' },
31
+ bricks: {
32
+ events: collection({
33
+ label: 'Events',
34
+ source: 'files', // read from content/events/*.md; without `source` the brick needs the Ginko platform
35
+ fields: { title: f.text('Title'), date: f.date('Date') },
36
+ max: 50,
37
+ order: { field: 'date', dir: 'asc' },
38
+ }),
39
+ },
40
+ })
41
+ ```
42
+
43
+ One file per entry, for example `content/events/opening.md`:
44
+
45
+ ```md
46
+ ---
47
+ title: Opening night
48
+ date: 2026-11-05
49
+ ---
50
+ ```
51
+
52
+ ```ts
53
+ // nuxt.config.ts
54
+ import ginko from './ginko.config.ts'
55
+
56
+ export default defineNuxtConfig({ modules: ['@lupinum/ginko/nuxt'], ginko })
57
+ ```
58
+
59
+ ```vue
60
+ <script setup lang="ts">
61
+ const events = useGinko('events') // typed from ginko.config.ts
62
+ </script>
63
+ ```
64
+
65
+ ## What is in the package
66
+
67
+ - **`@lupinum/ginko`**: `defineSite`, `single`, `collection`, `f`, `defineComponents`, `formatMoney`, `plainText`,
68
+ `safeHref`, `startOfWeek` and the documented types.
69
+ - **`@lupinum/ginko/nuxt`**: the Nuxt module. It fetches and caches the bundle, adds the composables
70
+ (`useGinko`, `useGinkoEntry`, `useGinkoQuery`, `useGinkoNeighbors`, `useGinkoNav`, `useGinkoBreadcrumbs`,
71
+ `useGinkoToday`, `useGinkoWeek`, `useGinkoLocale`, `useGinkoPath`, `useGinkoSeo` and more), the components
72
+ `<GinkoMarkdown>` and `<GinkoImage>`, a sitemap, and languages through
73
+ [`@lupinum/ginko-i18n`](https://github.com/lupinum-dev/ginko/tree/main/packages/ginko-i18n).
74
+ - **`@lupinum/ginko/vue`**: `<GinkoMarkdown :value>` for a Vue 3 app without Nuxt: takes a parsed `MarkdownTree`,
75
+ renders at once (no `<Suspense>`), and uses only the components you pass. Pass the site's `components` as
76
+ `registry` too: a component keeps only the props its registry declares.
77
+ - **`ginko`**: the CLI. `ginko check` checks the config and the content links of every site (use it in CI;
78
+ `--offline` needs no platform key); `release` and `export` work with the hosted platform. Every run prints one
79
+ JSON line and ends with a documented exit code.
80
+
81
+ ## Stability
82
+
83
+ `@lupinum/ginko`, `@lupinum/ginko/nuxt`, `@lupinum/ginko/vue`, `@lupinum/ginko/search` and `@lupinum/ginko/basics` are
84
+ the public API. Every name they export is documented on the docs site. `pos` and `retired` on fields and bricks are set by
85
+ the platform; do not set them. Until 1.0, a minor release may still break it, and the changelog names the break.
86
+ `@lupinum/ginko/internal` and `@lupinum/ginko/internal/search` are for Ginko's own packages. They can change in
87
+ any release, so do not import them in a site.
88
+
89
+ ## Docs
90
+
91
+ [Getting started](https://github.com/lupinum-dev/ginko/blob/main/sites/docs/content/docs/1.einstieg.en.md) ·
92
+ [Bricks](https://github.com/lupinum-dev/ginko/blob/main/sites/docs/content/docs/3.bausteine.en.md) ·
93
+ [Reading content](https://github.com/lupinum-dev/ginko/blob/main/sites/docs/content/docs/5.seiten-lesen.en.md) ·
94
+ [Languages](https://github.com/lupinum-dev/ginko/blob/main/sites/docs/content/docs/6.sprachen.en.md) ·
95
+ [Content from files](https://github.com/lupinum-dev/ginko/blob/main/sites/docs/content/docs/4.inhalte-aus-dateien.en.md) ·
96
+ [Platform and CLI](https://github.com/lupinum-dev/ginko/blob/main/sites/docs/content/docs/12.plattform-und-cli.en.md)
97
+
98
+ ## License
99
+
100
+ MIT © Lupinum OG