includio-cms 0.14.5 → 0.15.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 (174) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/DOCS.md +45 -1
  3. package/ROADMAP.md +30 -2
  4. package/dist/admin/auth-client.d.ts +42 -42
  5. package/dist/admin/client/account/profile-section.svelte +2 -2
  6. package/dist/admin/client/admin/admin-after-login-layout-content.svelte +12 -1
  7. package/dist/admin/client/collection/collection-entries.svelte +48 -4
  8. package/dist/admin/client/entry/entry.svelte +1 -0
  9. package/dist/admin/client/index.d.ts +6 -0
  10. package/dist/admin/client/index.js +6 -0
  11. package/dist/admin/client/login/login-page.svelte +4 -0
  12. package/dist/admin/client/login/reset-password-page.svelte +4 -0
  13. package/dist/admin/client/maintenance/maintenance-page.svelte +12 -0
  14. package/dist/admin/client/shop/shipping-method-edit-page.svelte +113 -0
  15. package/dist/admin/client/shop/shipping-method-edit-page.svelte.d.ts +3 -0
  16. package/dist/admin/client/shop/shipping-method-form.svelte +244 -0
  17. package/dist/admin/client/shop/shipping-method-form.svelte.d.ts +37 -0
  18. package/dist/admin/client/shop/shipping-method-new-page.svelte +47 -0
  19. package/dist/admin/client/shop/shipping-method-new-page.svelte.d.ts +3 -0
  20. package/dist/admin/client/shop/shipping-methods-list-page.svelte +172 -0
  21. package/dist/admin/client/shop/shipping-methods-list-page.svelte.d.ts +3 -0
  22. package/dist/admin/client/shop/shop-order-detail-page.svelte +332 -0
  23. package/dist/admin/client/shop/shop-order-detail-page.svelte.d.ts +3 -0
  24. package/dist/admin/client/shop/shop-orders-list-page.svelte +150 -0
  25. package/dist/admin/client/shop/shop-orders-list-page.svelte.d.ts +3 -0
  26. package/dist/admin/client/shop/shop-products-list-page.svelte +157 -0
  27. package/dist/admin/client/shop/shop-products-list-page.svelte.d.ts +3 -0
  28. package/dist/admin/client/users/accept-invite-page.svelte +4 -0
  29. package/dist/admin/client/users/users-page.svelte +10 -0
  30. package/dist/admin/components/fields/field-renderer.svelte +4 -2
  31. package/dist/admin/components/fields/media-field.svelte +203 -253
  32. package/dist/admin/components/fields/relation-field.svelte +4 -9
  33. package/dist/admin/components/fields/shop-field.svelte +298 -0
  34. package/dist/admin/components/fields/shop-field.svelte.d.ts +7 -0
  35. package/dist/admin/components/fields/url-field.svelte +42 -18
  36. package/dist/admin/components/layout/app-sidebar.svelte +2 -0
  37. package/dist/admin/components/layout/lang.d.ts +6 -0
  38. package/dist/admin/components/layout/lang.js +12 -0
  39. package/dist/admin/components/layout/nav-footer.svelte +12 -9
  40. package/dist/admin/components/layout/nav-shop.svelte +55 -0
  41. package/dist/admin/components/layout/nav-shop.svelte.d.ts +3 -0
  42. package/dist/admin/components/media/file/file-details.svelte +115 -18
  43. package/dist/admin/components/media/file/file-miniature.svelte +2 -2
  44. package/dist/admin/components/media/media-selector.svelte +9 -8
  45. package/dist/admin/remote/index.d.ts +1 -0
  46. package/dist/admin/remote/index.js +1 -0
  47. package/dist/admin/remote/media.remote.d.ts +6 -4
  48. package/dist/admin/remote/media.remote.js +17 -1
  49. package/dist/admin/remote/shop.remote.d.ts +244 -0
  50. package/dist/admin/remote/shop.remote.js +153 -0
  51. package/dist/admin/utils/debounce.d.ts +1 -0
  52. package/dist/admin/utils/debounce.js +8 -0
  53. package/dist/admin/utils/entryThumbnail.d.ts +6 -1
  54. package/dist/admin/utils/entryThumbnail.js +22 -13
  55. package/dist/admin/utils/pageTitle.d.ts +8 -0
  56. package/dist/admin/utils/pageTitle.js +15 -0
  57. package/dist/cli/scaffold/admin.js +84 -0
  58. package/dist/core/cms.d.ts +3 -0
  59. package/dist/core/cms.js +4 -0
  60. package/dist/core/fields/fieldSchemaToTs.js +5 -0
  61. package/dist/core/server/entries/operations/get.js +3 -3
  62. package/dist/core/server/fields/populateEntry.d.ts +1 -1
  63. package/dist/core/server/fields/populateEntry.js +3 -1
  64. package/dist/core/server/generator/fields.js +14 -0
  65. package/dist/core/server/generator/generator.js +13 -0
  66. package/dist/core/server/media/operations/batchRegenerateVideoPosters.d.ts +12 -0
  67. package/dist/core/server/media/operations/batchRegenerateVideoPosters.js +46 -42
  68. package/dist/core/server/media/operations/regenerateVideoPoster.d.ts +5 -0
  69. package/dist/core/server/media/operations/regenerateVideoPoster.js +17 -0
  70. package/dist/core/server/media/operations/replaceFile.js +8 -4
  71. package/dist/core/server/media/operations/uploadFile.js +7 -3
  72. package/dist/core/server/media/styles/operations/batchGenerateStyles.js +11 -0
  73. package/dist/core/server/media/utils/generateAdminThumbnail.d.ts +3 -0
  74. package/dist/core/server/media/utils/generateAdminThumbnail.js +33 -0
  75. package/dist/db-postgres/schema/index.d.ts +1 -0
  76. package/dist/db-postgres/schema/index.js +1 -0
  77. package/dist/db-postgres/schema/shop/index.d.ts +8 -0
  78. package/dist/db-postgres/schema/shop/index.js +8 -0
  79. package/dist/db-postgres/schema/shop/order.d.ts +396 -0
  80. package/dist/db-postgres/schema/shop/order.js +28 -0
  81. package/dist/db-postgres/schema/shop/orderItem.d.ts +179 -0
  82. package/dist/db-postgres/schema/shop/orderItem.js +20 -0
  83. package/dist/db-postgres/schema/shop/orderStatusHistory.d.ts +112 -0
  84. package/dist/db-postgres/schema/shop/orderStatusHistory.js +12 -0
  85. package/dist/db-postgres/schema/shop/payment.d.ts +180 -0
  86. package/dist/db-postgres/schema/shop/payment.js +16 -0
  87. package/dist/db-postgres/schema/shop/product.d.ts +143 -0
  88. package/dist/db-postgres/schema/shop/product.js +15 -0
  89. package/dist/db-postgres/schema/shop/productVariant.d.ts +164 -0
  90. package/dist/db-postgres/schema/shop/productVariant.js +15 -0
  91. package/dist/db-postgres/schema/shop/shippingMethod.d.ts +190 -0
  92. package/dist/db-postgres/schema/shop/shippingMethod.js +13 -0
  93. package/dist/db-postgres/schema/shop/stockReservation.d.ts +109 -0
  94. package/dist/db-postgres/schema/shop/stockReservation.js +13 -0
  95. package/dist/db-postgres/schema-core.d.ts +9 -0
  96. package/dist/db-postgres/schema-core.js +9 -0
  97. package/dist/db-postgres/schema-shop.d.ts +1 -0
  98. package/dist/db-postgres/schema-shop.js +1 -0
  99. package/dist/email-nodemailer/index.d.ts +2 -9
  100. package/dist/files-local/video.js +3 -18
  101. package/dist/paraglide/messages/_index.d.ts +36 -3
  102. package/dist/paraglide/messages/_index.js +71 -3
  103. package/dist/paraglide/messages/en.d.ts +5 -0
  104. package/dist/paraglide/messages/en.js +14 -0
  105. package/dist/paraglide/messages/pl.d.ts +5 -0
  106. package/dist/paraglide/messages/pl.js +14 -0
  107. package/dist/shop/adapters/manual/index.d.ts +10 -0
  108. package/dist/shop/adapters/manual/index.js +16 -0
  109. package/dist/shop/cart/cookie.d.ts +8 -0
  110. package/dist/shop/cart/cookie.js +84 -0
  111. package/dist/shop/cart/types.d.ts +42 -0
  112. package/dist/shop/cart/types.js +1 -0
  113. package/dist/shop/client/index.d.ts +59 -0
  114. package/dist/shop/client/index.js +40 -0
  115. package/dist/shop/http/cart-handler.d.ts +7 -0
  116. package/dist/shop/http/cart-handler.js +88 -0
  117. package/dist/shop/http/checkout-handler.d.ts +4 -0
  118. package/dist/shop/http/checkout-handler.js +100 -0
  119. package/dist/shop/http/index.d.ts +3 -0
  120. package/dist/shop/http/index.js +3 -0
  121. package/dist/shop/http/shipping-handler.d.ts +4 -0
  122. package/dist/shop/http/shipping-handler.js +31 -0
  123. package/dist/shop/index.d.ts +4 -0
  124. package/dist/shop/index.js +17 -0
  125. package/dist/shop/pricing.d.ts +15 -0
  126. package/dist/shop/pricing.js +31 -0
  127. package/dist/shop/rate-limit.d.ts +9 -0
  128. package/dist/shop/rate-limit.js +28 -0
  129. package/dist/shop/server/cart-hydrate.d.ts +4 -0
  130. package/dist/shop/server/cart-hydrate.js +172 -0
  131. package/dist/shop/server/db.d.ts +4 -0
  132. package/dist/shop/server/db.js +16 -0
  133. package/dist/shop/server/email.d.ts +2 -0
  134. package/dist/shop/server/email.js +138 -0
  135. package/dist/shop/server/order-number.d.ts +5 -0
  136. package/dist/shop/server/order-number.js +15 -0
  137. package/dist/shop/server/orders.d.ts +45 -0
  138. package/dist/shop/server/orders.js +293 -0
  139. package/dist/shop/server/populate.d.ts +15 -0
  140. package/dist/shop/server/populate.js +39 -0
  141. package/dist/shop/server/shipping.d.ts +37 -0
  142. package/dist/shop/server/shipping.js +111 -0
  143. package/dist/shop/server/shop-data.d.ts +51 -0
  144. package/dist/shop/server/shop-data.js +186 -0
  145. package/dist/shop/services/cart.service.d.ts +38 -0
  146. package/dist/shop/services/cart.service.js +1 -0
  147. package/dist/shop/services/email.service.d.ts +6 -0
  148. package/dist/shop/services/email.service.js +1 -0
  149. package/dist/shop/services/index.d.ts +6 -0
  150. package/dist/shop/services/index.js +1 -0
  151. package/dist/shop/services/orders.service.d.ts +34 -0
  152. package/dist/shop/services/orders.service.js +1 -0
  153. package/dist/shop/services/payment.service.d.ts +7 -0
  154. package/dist/shop/services/payment.service.js +1 -0
  155. package/dist/shop/services/products.service.d.ts +31 -0
  156. package/dist/shop/services/products.service.js +1 -0
  157. package/dist/shop/services/shipping.service.d.ts +23 -0
  158. package/dist/shop/services/shipping.service.js +1 -0
  159. package/dist/shop/types.d.ts +72 -0
  160. package/dist/shop/types.js +1 -0
  161. package/dist/types/cms.d.ts +4 -0
  162. package/dist/types/fields.d.ts +18 -2
  163. package/dist/updates/0.14.6/index.d.ts +2 -0
  164. package/dist/updates/0.14.6/index.js +21 -0
  165. package/dist/updates/0.15.0/index.d.ts +2 -0
  166. package/dist/updates/0.15.0/index.js +25 -0
  167. package/dist/updates/index.js +3 -1
  168. package/package.json +27 -1
  169. package/dist/paraglide/messages/hello_world.d.ts +0 -5
  170. package/dist/paraglide/messages/hello_world.js +0 -33
  171. package/dist/paraglide/messages/login_hello.d.ts +0 -16
  172. package/dist/paraglide/messages/login_hello.js +0 -34
  173. package/dist/paraglide/messages/login_please_login.d.ts +0 -16
  174. package/dist/paraglide/messages/login_please_login.js +0 -34
package/CHANGELOG.md CHANGED
@@ -3,6 +3,50 @@
3
3
  All notable changes to includio-cms are documented here.
4
4
  Generated from `src/lib/updates/` — do not edit manually.
5
5
 
6
+ ## 0.15.0 — 2026-04-14
7
+
8
+ Shop module MVP — headless e-commerce: products, cart, orders, payments, emails
9
+
10
+ ### Added
11
+ - New optional `shop` module — activate via `defineShop()` in `cms.config.ts`
12
+ - Product = CMS entry + built-in `shop` field (like `seo`) — add `{ type: "shop", slug: "shop" }` to any collection to make its entries purchasable. Shop data lives in `shop_products` (keyed by entry_id FK cascade), never in entry JSON
13
+ - Runtime `schema.ts` generator — auto-emits `src/lib/cms/runtime/schema.ts` combining core + auth + shop tables; point your `drizzle.config.ts` schema field at it, then `pnpm drizzle-kit push`
14
+ - Entry edit panel shows Shop section with net/gross toggle + live VAT preview; optional variants (auto default variant when disabled) and per-variant stock
15
+ - Shop admin: list of all shoppable entries across collections, list+drag-n-drop reorder for shipping methods, full orders list + detail with status history, change status, resend status email
16
+ - Headless cart (signed cookie) with server-hydrated totals — `POST/PATCH/DELETE /api/shop/cart` + typed `createShopClient()` SDK
17
+ - Checkout endpoint `POST /api/shop/checkout` — creates order from cart with consent validation, stock reservation (30-min TTL, released on cancel/reject, consumed on paid), and status emails
18
+ - Payment adapter interface + `manualAdapter()` for bank transfer / COD (order stays in `awaitingPayment` until admin marks paid)
19
+ - Shipping methods — admin CRUD with free-above threshold, carrier-agnostic (InPost/Stripe etc. slotted as adapters in later 0.15.x patches)
20
+ - Feature flags `variants`, `stock`, `accounts` — off by default; enable per project
21
+ - Rate-limit middleware on checkout + webhook endpoints
22
+ - Status-change emails rendered inline (PL/EN), sent via existing `EmailAdapter` — no new dependency
23
+ - Order numbers: random Crockford base32 (`XXXXX-XXXXX`) — unguessable
24
+ - CLI scaffold includes all shop routes (admin pages + public API stubs) — run `scaffoldAdmin()` to provision them in your consumer app
25
+ - `nodemailerAdapter` — `transportOptions` now typed as full `SMTPTransport.Options`, unlocking OAuth2 (Gmail etc.), pooled connections and all native Nodemailer options
26
+
27
+ ### Notes
28
+
29
+ Headless e-commerce MVP. Stripe (0.15.1), PayU (0.15.2) and InPost geowidget (0.15.3) ship as optional adapters in follow-up patches. Consumer UI (cart drawer, checkout forms, success screens) is built in the app — shop only exposes the API and admin.
30
+
31
+ ## 0.14.6 — 2026-04-13
32
+
33
+ Admin page titles — meaningful <title> in every admin route
34
+
35
+ ### Added
36
+ - CMS config: new optional `sidebarHelp` flag (default `true`) — set to `false` to hide the "Help" link in the admin sidebar footer
37
+
38
+ ### Fixed
39
+ - Video posters are now always generated from the first frame — eliminates the visible "jump" when the player starts at 0s after showing a poster taken from a later frame. Existing posters can be rebuilt via Maintenance → "Regenerate video posters"
40
+ - Media library → file details: new "Regenerate from video" button for video files to rebuild the poster/thumbnail on demand (e.g. after replacing a file or when the automatic poster looked wrong)
41
+ - Admin routes now render a descriptive <title> derived from the breadcrumbs trail (e.g. "Entry label · Collection · AriaCMS") instead of showing the raw URL in the browser tab
42
+ - Pre-login routes (login, password reset, accept invite) set their own titles
43
+ - Brand "AriaCMS" used across admin titles (replaces "Includio CMS")
44
+ - Media field: video preview now renders in the same aspect-square box as image preview (checkered background, object-contain) instead of a tall full-width player
45
+ - Media field: unified layout — Change/Remove buttons sit below the preview box for both images and videos (no more overlay covering the image)
46
+ - Media field: video previews now show the file-type icon in the top-right corner (parity with image preview)
47
+ - Media field: accessibility status is now surfaced as a compact informational badge in the top-left corner of the video preview with a tooltip describing what is missing (transcript, audio description); transcript/audio-description management was moved to the file details panel in the media library (single source of truth per file)
48
+ - Relation field: fixed missing space between "Select" and collection label in the picker trigger (e.g. "Select Price category" instead of "SelectPrice category")
49
+
6
50
  ## 0.14.5 — 2026-04-10
7
51
 
8
52
  Schema: unique indexes moved into Drizzle ORM definitions
package/DOCS.md CHANGED
@@ -1,4 +1,4 @@
1
- # Includio CMS Documentation (v0.14.5)
1
+ # Includio CMS Documentation (v0.15.0)
2
2
 
3
3
  > This file is auto-generated from the docs site. For the latest version, update the package.
4
4
 
@@ -3240,6 +3240,10 @@ interface SendMailOptions {
3240
3240
 
3241
3241
  ## Built-in: Nodemailer
3242
3242
 
3243
+ `transportOptions` accepts the full Nodemailer `SMTPTransport.Options` type, so anything Nodemailer supports works — classic SMTP, OAuth2, pooled connections, TLS options, etc.
3244
+
3245
+ ### SMTP with user/password
3246
+
3243
3247
  ```typescript
3244
3248
  import { nodemailerAdapter } from 'includio-cms/email-nodemailer';
3245
3249
 
@@ -3257,6 +3261,46 @@ email: nodemailerAdapter({
3257
3261
  })
3258
3262
  ```
3259
3263
 
3264
+ ### OAuth2 (generic)
3265
+
3266
+ ```typescript
3267
+ email: nodemailerAdapter({
3268
+ defaultFromAddress: 'noreply@example.com',
3269
+ defaultFromName: 'My Site',
3270
+ transportOptions: {
3271
+ host: 'smtp.example.com',
3272
+ port: 465,
3273
+ secure: true,
3274
+ auth: {
3275
+ type: 'OAuth2',
3276
+ user: 'noreply@example.com',
3277
+ clientId: process.env.OAUTH_CLIENT_ID,
3278
+ clientSecret: process.env.OAUTH_CLIENT_SECRET,
3279
+ refreshToken: process.env.OAUTH_REFRESH_TOKEN
3280
+ }
3281
+ }
3282
+ })
3283
+ ```
3284
+
3285
+ ### OAuth2 (Gmail)
3286
+
3287
+ ```typescript
3288
+ email: nodemailerAdapter({
3289
+ defaultFromAddress: 'noreply@gmail.com',
3290
+ defaultFromName: 'My Site',
3291
+ transportOptions: {
3292
+ service: 'gmail',
3293
+ auth: {
3294
+ type: 'OAuth2',
3295
+ user: 'noreply@gmail.com',
3296
+ clientId: process.env.GOOGLE_CLIENT_ID,
3297
+ clientSecret: process.env.GOOGLE_CLIENT_SECRET,
3298
+ refreshToken: process.env.GOOGLE_REFRESH_TOKEN
3299
+ }
3300
+ }
3301
+ })
3302
+ ```
3303
+
3260
3304
  > **Transactional Email:** For production, use a transactional email service (SendGrid, Postmark, Resend, etc). Implement the `EmailAdapter` interface with their SDK.
3261
3305
 
3262
3306
  ## Custom Adapter Example
package/ROADMAP.md CHANGED
@@ -280,14 +280,42 @@
280
280
 
281
281
  - [x] `[chore]` `[P2]` Move image & video style unique indexes into Drizzle ORM schema (single source of truth) <!-- files: src/lib/db-postgres/schema/imageStyle.ts, src/lib/db-postgres/schema/videoStyle.ts -->
282
282
 
283
- ## 0.15.0SEO module
283
+ ## 0.14.6Admin page titles
284
+
285
+ - [x] `[fix]` `[P2]` Admin `<title>` from breadcrumbs + pre-login titles + AriaCMS brand <!-- files: src/lib/admin/utils/pageTitle.ts, src/lib/admin/client/admin/admin-after-login-layout-content.svelte -->
286
+ - [x] `[fix]` `[P1]` Video poster always from first frame (no jump on load) <!-- files: src/lib/files-local/video.ts -->
287
+ - [x] `[feature]` `[P2]` Manual poster regeneration in media library file details <!-- files: src/lib/core/server/media/operations/regenerateVideoPoster.ts, src/lib/admin/components/media/file/file-details.svelte -->
288
+ - [x] `[feature]` `[P2]` Config flag `sidebarHelp` to hide admin sidebar Help link (default true) <!-- files: src/lib/types/cms.ts, src/lib/core/cms.ts, src/routes/admin/(afterLogin)/+layout.server.ts, src/lib/admin/components/layout/nav-footer.svelte -->
289
+
290
+ ## 0.15.0 — Shop MVP (headless e-commerce)
291
+
292
+ - [x] `[feature]` `[P0]` Scaffold: `defineShop`, types, CMSConfig slot, package export `./shop` <!-- files: src/lib/shop/index.ts, src/lib/shop/types.ts -->
293
+ - [x] `[feature]` `[P0]` Drizzle tables: products (entry-backed), variants, orders, order items, status history, payments, shipping methods, stock reservations <!-- files: src/lib/db-postgres/schema/shop/ -->
294
+ - [x] `[feature]` `[P0]` Runtime `schema.ts` generator for drizzle-kit (core + auth + optional shop) <!-- files: src/lib/core/server/generator/generator.ts, src/lib/db-postgres/schema-core.ts, src/lib/db-postgres/schema-shop.ts -->
295
+ - [x] `[feature]` `[P0]` Rate-limit middleware (checkout/webhook) <!-- files: src/lib/shop/rate-limit.ts -->
296
+ - [x] `[feature]` `[P0]` Built-in `shop` field type — makes entries purchasable, auto-hydrated via populateEntryData <!-- files: src/lib/admin/components/fields/shop-field.svelte, src/lib/shop/server/populate.ts -->
297
+ - [x] `[feature]` `[P0]` Net/gross price toggle + live VAT preview in shop field and shipping form
298
+ - [x] `[feature]` `[P0]` Auto default variant on upsert — cart/order always reference variantId
299
+ - [x] `[feature]` `[P0]` Shop admin: products list (JOIN entries × shop_products), shipping methods CRUD with drag-n-drop reorder + free-above threshold
300
+ - [x] `[feature]` `[P0]` Cart (signed cookie) service + `/api/shop/cart` REST + headless SDK `createShopClient()` <!-- files: src/lib/shop/cart/, src/lib/shop/client/ -->
301
+ - [x] `[feature]` `[P0]` Orders + checkout + `manualAdapter` + status emails (inline HTML, PL/EN) <!-- files: src/lib/shop/server/orders.ts, src/lib/shop/http/checkout-handler.ts -->
302
+ - [x] `[feature]` `[P0]` Stock reservation with 30-min TTL — released on cancel/reject, consumed on paid
303
+ - [x] `[feature]` `[P0]` Admin orders view — list (status + email filter), detail (items, history, customer/address/consents, change status, resend email)
304
+ - [x] `[feature]` `[P0]` Random Crockford base32 order numbers (`XXXXX-XXXXX`), unguessable
305
+ - [x] `[feature]` `[P0]` CLI scaffold provisions all shop routes (admin + public API) in consumer app
306
+ - [ ] `[feature]` `[P1]` Stripe payment adapter + webhook — deferred to 0.15.1
307
+ - [ ] `[feature]` `[P1]` PayU payment adapter + webhook — deferred to 0.15.2
308
+ - [ ] `[feature]` `[P2]` InPost carrier adapter (headless geowidget config) — deferred to 0.15.3
309
+ - [x] `[feature]` `[P2]` `nodemailerAdapter` — typowanie `transportOptions` jako `SMTPTransport.Options` (OAuth2, pool, itd.)
310
+
311
+ ## 0.16.0 — SEO module
284
312
 
285
313
  - [ ] `[feature]` `[P1]` SERP preview + character limits for title/description <!-- files: src/lib/admin/components/fields/seo-field.svelte -->
286
314
  - [ ] `[feature]` `[P1]` Global SEO settings
287
315
  - [ ] `[feature]` `[P1]` Dedicated frontend SEO components <!-- files: src/lib/sveltekit/components/seo.svelte -->
288
316
  - [ ] `[feature]` `[P2]` Sitemap generation
289
317
 
290
- ## 0.16.0 — WCAG/ATAG compliance
318
+ ## 0.17.0 — WCAG/ATAG compliance
291
319
 
292
320
  - [ ] `[chore]` `[P0]` Full WCAG/ATAG audit
293
321
  - [ ] `[feature]` `[P0]` Accessibility rework based on audit findings