@kywi-software/core 0.6.2 → 0.6.4

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 (85) hide show
  1. package/AGENT-PATTERNS.md +221 -16
  2. package/README.md +23 -5
  3. package/dist/admin/layout-editor/column-overlay.d.ts +14 -1
  4. package/dist/admin/layout-editor/column-overlay.d.ts.map +1 -1
  5. package/dist/admin/layout-editor/column-overlay.js +5 -2
  6. package/dist/admin/layout-editor/column-overlay.js.map +1 -1
  7. package/dist/admin/layout-editor/editor-canvas.d.ts +34 -1
  8. package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
  9. package/dist/admin/layout-editor/editor-canvas.js +156 -16
  10. package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
  11. package/dist/admin/layout-editor/editor-state.d.ts +57 -2
  12. package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
  13. package/dist/admin/layout-editor/editor-state.js +125 -53
  14. package/dist/admin/layout-editor/editor-state.js.map +1 -1
  15. package/dist/admin/layout-editor/editor.css +487 -44
  16. package/dist/admin/layout-editor/index.d.ts +1 -1
  17. package/dist/admin/layout-editor/index.d.ts.map +1 -1
  18. package/dist/admin/layout-editor/index.js.map +1 -1
  19. package/dist/admin/layout-editor/inline-text.d.ts +44 -0
  20. package/dist/admin/layout-editor/inline-text.d.ts.map +1 -0
  21. package/dist/admin/layout-editor/inline-text.js +67 -0
  22. package/dist/admin/layout-editor/inline-text.js.map +1 -0
  23. package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
  24. package/dist/admin/layout-editor/layout-editor.js +23 -31
  25. package/dist/admin/layout-editor/layout-editor.js.map +1 -1
  26. package/dist/admin/layout-editor/module-overlay.d.ts +32 -1
  27. package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
  28. package/dist/admin/layout-editor/module-overlay.js +108 -6
  29. package/dist/admin/layout-editor/module-overlay.js.map +1 -1
  30. package/dist/admin/layout-editor/node-lookup.d.ts +94 -0
  31. package/dist/admin/layout-editor/node-lookup.d.ts.map +1 -0
  32. package/dist/admin/layout-editor/node-lookup.js +142 -0
  33. package/dist/admin/layout-editor/node-lookup.js.map +1 -0
  34. package/dist/admin/layout-editor/overlay-shell.d.ts +19 -1
  35. package/dist/admin/layout-editor/overlay-shell.d.ts.map +1 -1
  36. package/dist/admin/layout-editor/overlay-shell.js +177 -69
  37. package/dist/admin/layout-editor/overlay-shell.js.map +1 -1
  38. package/dist/admin/layout-editor/props-panel.d.ts +9 -2
  39. package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
  40. package/dist/admin/layout-editor/props-panel.js +13 -5
  41. package/dist/admin/layout-editor/props-panel.js.map +1 -1
  42. package/dist/admin/layout-editor/region-overlay.d.ts +8 -1
  43. package/dist/admin/layout-editor/region-overlay.d.ts.map +1 -1
  44. package/dist/admin/layout-editor/region-overlay.js +4 -1
  45. package/dist/admin/layout-editor/region-overlay.js.map +1 -1
  46. package/dist/admin/layout-editor/section-insert-line.d.ts +7 -1
  47. package/dist/admin/layout-editor/section-insert-line.d.ts.map +1 -1
  48. package/dist/admin/layout-editor/section-insert-line.js +4 -1
  49. package/dist/admin/layout-editor/section-insert-line.js.map +1 -1
  50. package/dist/admin/layout-editor/section-overlay.d.ts +13 -1
  51. package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
  52. package/dist/admin/layout-editor/section-overlay.js +24 -12
  53. package/dist/admin/layout-editor/section-overlay.js.map +1 -1
  54. package/dist/admin/layout-editor/section-variant-container-config.d.ts +29 -0
  55. package/dist/admin/layout-editor/section-variant-container-config.d.ts.map +1 -0
  56. package/dist/admin/layout-editor/section-variant-container-config.js +82 -0
  57. package/dist/admin/layout-editor/section-variant-container-config.js.map +1 -0
  58. package/dist/admin/styles/admin.css +5 -2
  59. package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -1
  60. package/dist/admin/surfaces/content/content-edit.js +8 -1
  61. package/dist/admin/surfaces/content/content-edit.js.map +1 -1
  62. package/dist/db/content-queries.d.ts +35 -0
  63. package/dist/db/content-queries.d.ts.map +1 -1
  64. package/dist/db/content-queries.js +175 -36
  65. package/dist/db/content-queries.js.map +1 -1
  66. package/dist/layout/registry.d.ts +8 -1
  67. package/dist/layout/registry.d.ts.map +1 -1
  68. package/dist/layout/registry.js +8 -1
  69. package/dist/layout/registry.js.map +1 -1
  70. package/dist/nav/index.d.ts +1 -1
  71. package/dist/nav/index.d.ts.map +1 -1
  72. package/dist/nav/index.js +4 -1
  73. package/dist/nav/index.js.map +1 -1
  74. package/dist/nav/url-resolver.d.ts +27 -0
  75. package/dist/nav/url-resolver.d.ts.map +1 -1
  76. package/dist/nav/url-resolver.js +36 -1
  77. package/dist/nav/url-resolver.js.map +1 -1
  78. package/dist/scope/edit-mode-hooks.d.ts.map +1 -1
  79. package/dist/scope/edit-mode-hooks.js +27 -1
  80. package/dist/scope/edit-mode-hooks.js.map +1 -1
  81. package/dist/scope/inline-editing.d.ts.map +1 -1
  82. package/dist/scope/inline-editing.js +2 -1
  83. package/dist/scope/inline-editing.js.map +1 -1
  84. package/dist/site/styles.css +147 -4
  85. package/package.json +1 -1
@@ -1,5 +1,32 @@
1
- import { eq, and, sql } from 'drizzle-orm';
1
+ import { eq, and, sql, inArray, asc } from 'drizzle-orm';
2
2
  import { kywiContent } from '../schema/base.js';
3
+ /**
4
+ * Base types that can legitimately own a public page URL.
5
+ *
6
+ * Mirrors `INDEXABLE_BASE_TYPES` (src/ax/filters.ts) plus `link`, which is also
7
+ * addressable (it redirects). Everything else — `form`, `component`, `media` —
8
+ * is an embeddable, not a standalone route.
9
+ */
10
+ export const PAGE_LIKE_BASE_TYPES = ['content', 'folder', 'event', 'gallery', 'link'];
11
+ /**
12
+ * ORDER BY fragments that rank page-like rows ahead of everything else, then
13
+ * break remaining ties deterministically by creation order.
14
+ *
15
+ * `kywi_content.slug`/`path` are not unique across base types, so a Page and a
16
+ * Form can both sit at `/contact`. Resolving whichever row the planner happened
17
+ * to return first served the form's row at the page URL and rendered an empty,
18
+ * layout-less page while the real page stayed invisible (kywi-cms#100 / UAT-009;
19
+ * kywi-cms#39 fixed the same collision on the form-*submission* side).
20
+ *
21
+ * This only breaks ties: a route that matches exactly one row resolves to that
22
+ * row exactly as before.
23
+ */
24
+ export function pageFirstOrdering() {
25
+ return [
26
+ sql `CASE WHEN ${inArray(kywiContent.baseType, PAGE_LIKE_BASE_TYPES)} THEN 0 ELSE 1 END`,
27
+ asc(kywiContent.createdAt),
28
+ ];
29
+ }
3
30
  /**
4
31
  * Resolve a content node by walking the materialized path.
5
32
  *
@@ -13,6 +40,10 @@ import { kywiContent } from '../schema/base.js';
13
40
  * row for that locale matches; the caller falls back to the default locale on a
14
41
  * miss. Omit it to match any locale (structural resolution).
15
42
  *
43
+ * When more than one row shares the path (slug is not unique across base types —
44
+ * e.g. a Page and a Form both named "contact"), the page-like row wins; see
45
+ * {@link pageFirstOrdering} (kywi-cms#100).
46
+ *
16
47
  * Returns null if no matching content exists for the site+path (+locale).
17
48
  */
18
49
  export async function resolveContentByPath(db, path, siteId, options) {
@@ -40,6 +71,7 @@ export async function resolveContentByPath(db, path, siteId, options) {
40
71
  })
41
72
  .from(kywiContent)
42
73
  .where(and(...conditions))
74
+ .orderBy(...pageFirstOrdering())
43
75
  .limit(1);
44
76
  if (!row)
45
77
  return null;
@@ -86,6 +118,9 @@ export async function resolveContentBySegments(db, path, siteId) {
86
118
  })
87
119
  .from(kywiContent)
88
120
  .where(and(...conditions))
121
+ // Same page-first tie-break as resolveContentByPath: a segment slug shared
122
+ // by a page and a non-page row must walk into the page (kywi-cms#100).
123
+ .orderBy(...pageFirstOrdering())
89
124
  .limit(1);
90
125
  if (!row)
91
126
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"url-resolver.js","sourceRoot":"","sources":["../../src/nav/url-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"url-resolver.js","sourceRoot":"","sources":["../../src/nav/url-resolver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"edit-mode-hooks.d.ts","sourceRoot":"","sources":["../../src/scope/edit-mode-hooks.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAA;IACnB,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAA;IAChB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAA;IACnB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,uBAAuB;IACvB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,uBAAuB;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,eAAe,CAC7B,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACrD,iBAAiB,CAOnB;AAID,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;;;;;EAUxD"}
1
+ {"version":3,"file":"edit-mode-hooks.d.ts","sourceRoot":"","sources":["../../src/scope/edit-mode-hooks.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAA;IACnB,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAA;IAChB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAA;IACnB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,uBAAuB;IACvB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,uBAAuB;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAwBD,wBAAgB,eAAe,CAC7B,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACrD,iBAAiB,CAYnB;AAID,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;;;;;EAUxD"}
@@ -1,11 +1,37 @@
1
1
  'use client';
2
- import { useState, useCallback } from 'react';
2
+ import { useState, useCallback, useEffect } from 'react';
3
+ const EDIT_PARAM = 'kywi-edit';
4
+ // Keep the `?kywi-edit=1` URL param mirroring edit-mode state. This is a plain
5
+ // `history.replaceState` (never a push — a UI-mode toggle isn't a new history
6
+ // entry, and this deliberately bypasses next/navigation's router so it can't
7
+ // trigger a server round-trip): entering edit mode adds the param so a reload
8
+ // or a shared link lands straight back in the editor; leaving removes it. A
9
+ // deep link that opened straight into edit mode (the param already present)
10
+ // is a no-op here — nothing to reconcile.
11
+ function syncEditModeParam(isEditMode) {
12
+ if (typeof window === 'undefined')
13
+ return;
14
+ const url = new URL(window.location.href);
15
+ const hasParam = url.searchParams.get(EDIT_PARAM) === '1';
16
+ if (isEditMode === hasParam)
17
+ return;
18
+ if (isEditMode) {
19
+ url.searchParams.set(EDIT_PARAM, '1');
20
+ }
21
+ else {
22
+ url.searchParams.delete(EDIT_PARAM);
23
+ }
24
+ window.history.replaceState(window.history.state, '', url.toString());
25
+ }
3
26
  export function useKywiEditMode(opts = {}) {
4
27
  const { canEdit = false, canPublish = false } = opts;
5
28
  const [isEditMode, setIsEditMode] = useState(false);
6
29
  const toggleEdit = useCallback(() => setIsEditMode(prev => !prev), []);
7
30
  const startEdit = useCallback(() => setIsEditMode(true), []);
8
31
  const endEdit = useCallback(() => setIsEditMode(false), []);
32
+ useEffect(() => {
33
+ syncEditModeParam(isEditMode);
34
+ }, [isEditMode]);
9
35
  return { isEditMode, canEdit, canPublish, toggleEdit, startEdit, endEdit };
10
36
  }
11
37
  // ─── useKywiInlineEdit ────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"edit-mode-hooks.js","sourceRoot":"","sources":["../../src/scope/edit-mode-hooks.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AACZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAmB7C,MAAM,UAAU,eAAe,CAC7B,OAAoD,EAAE;IAEtD,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,IAAI,CAAA;IACpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACtE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AAC5E,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,YAAoB,EACpB,MAAuD;IAEvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAClC,WAAW,CAAC,IAAI,CAAC,CAAA;QACjB,MAAM,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC1B,WAAW,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IAC1B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"edit-mode-hooks.js","sourceRoot":"","sources":["../../src/scope/edit-mode-hooks.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AACZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAmBxD,MAAM,UAAU,GAAG,WAAW,CAAA;AAE9B,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,0CAA0C;AAC1C,SAAS,iBAAiB,CAAC,UAAmB;IAC5C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAM;IACzC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAA;IACzD,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAM;IACnC,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IACvC,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACrC,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAoD,EAAE;IAEtD,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,IAAI,CAAA;IACpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACtE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAC/B,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AAC5E,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,YAAoB,EACpB,MAAuD;IAEvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAClC,WAAW,CAAC,IAAI,CAAC,CAAA;QACjB,MAAM,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC1B,WAAW,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IAC1B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"inline-editing.d.ts","sourceRoot":"","sources":["../../src/scope/inline-editing.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAIxC,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAA;AAE5D,MAAM,WAAW,0BAA0B;IACzC,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,IAAI,EAAE,gBAAgB,CAAA;IACtB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAA;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,GACT,EAAE,0BAA0B,GAAG,KAAK,CAAC,YAAY,CAYjD;AAID,MAAM,WAAW,uBAAuB;IACtC,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,SAAS,EACT,QAAQ,GACT,EAAE,uBAAuB,GAAG,KAAK,CAAC,YAAY,CAO9C;AAID,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAA;IACnB,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAA;IAChB,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAA;IACnB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAYD,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,OAAO,EACP,UAAU,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,GACV,EAAE,oBAAoB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAsDlD"}
1
+ {"version":3,"file":"inline-editing.d.ts","sourceRoot":"","sources":["../../src/scope/inline-editing.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAIxC,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAA;AAE5D,MAAM,WAAW,0BAA0B;IACzC,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,IAAI,EAAE,gBAAgB,CAAA;IACtB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAA;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,GACT,EAAE,0BAA0B,GAAG,KAAK,CAAC,YAAY,CAYjD;AAID,MAAM,WAAW,uBAAuB;IACtC,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,SAAS,EACT,QAAQ,GACT,EAAE,uBAAuB,GAAG,KAAK,CAAC,YAAY,CAO9C;AAID,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAA;IACnB,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAA;IAChB,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAA;IACnB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAYD,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,OAAO,EACP,UAAU,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,GACV,EAAE,oBAAoB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CA8DlD"}
@@ -49,6 +49,7 @@ export function KywiEditToolbar({ isEditMode, canEdit, canPublish, onToggleEdit,
49
49
  if (!canEdit)
50
50
  return null;
51
51
  const cls = ['kywi-edit-toolbar', className].filter(Boolean).join(' ');
52
- return (_jsx("div", { className: cls, role: "toolbar", "aria-label": "Edit controls", children: isEditMode ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "kywi-edit-toolbar-done", onClick: onToggleEdit, children: "Done" }), canPublish && (_jsx("button", { type: "button", className: "kywi-edit-toolbar-publish", onClick: onPublish, children: "Publish" }))] })) : (_jsxs(_Fragment, { children: [pageStatus && (_jsxs("span", { className: "kywi-edit-toolbar-status", children: [_jsx("span", { className: "kywi-edit-toolbar-status-dot" }), pageStatus.charAt(0).toUpperCase() + pageStatus.slice(1)] })), pageTitle && _jsx("span", { className: "kywi-edit-toolbar-title", children: pageTitle }), _jsx("span", { className: "kywi-edit-toolbar-spacer" }), adminHref && (_jsx("a", { className: "kywi-edit-toolbar-link", href: adminHref, children: "Admin" })), _jsx("button", { type: "button", className: "kywi-edit-toolbar-edit", onClick: onToggleEdit, children: "Edit Page" })] })) }));
52
+ return (_jsxs("div", { className: cls, role: "toolbar", "aria-label": "Edit controls", children: [_jsx("span", { className: "kywi-edit-toolbar-mark", "aria-hidden": "true", children: "Kywi" }), isEditMode ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "kywi-edit-toolbar-done", onClick: onToggleEdit, children: "Done" }), canPublish && (_jsx("button", { type: "button", className: "kywi-edit-toolbar-publish", onClick: onPublish, children: "Publish" }))] })) : (_jsxs(_Fragment, { children: [pageStatus && (_jsxs("span", { className: "kywi-edit-toolbar-status", children: [_jsx("span", { className: 'kywi-edit-toolbar-status-dot' +
53
+ (pageStatus.toLowerCase() === 'published' ? '' : ' kywi-edit-toolbar-status-dot--draft') }), pageStatus.charAt(0).toUpperCase() + pageStatus.slice(1)] })), pageTitle && _jsx("span", { className: "kywi-edit-toolbar-title", children: pageTitle }), _jsx("span", { className: "kywi-edit-toolbar-spacer" }), adminHref && (_jsx("a", { className: "kywi-edit-toolbar-link", href: adminHref, children: "Go to admin" })), _jsx("button", { type: "button", className: "kywi-edit-toolbar-edit", onClick: onToggleEdit, children: "Edit this page" })] }))] }));
53
54
  }
54
55
  //# sourceMappingURL=inline-editing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"inline-editing.js","sourceRoot":"","sources":["../../src/scope/inline-editing.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inline-editing.js","sourceRoot":"","sources":["../../src/scope/inline-editing.tsx"],"names":[],"mappings":"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"}
@@ -391,11 +391,12 @@
391
391
  * `--kywi-*` tokens rather than rewriting rules. A theme that wants a bespoke
392
392
  * widget can override any of these; nothing here is `!important`. */
393
393
 
394
- /* Self-ID widget — shared card. Three display modes (inline / modal / slide-in)
395
- * position the same card differently. `hello_bar_*` and `drawer` configs map to
396
- * slide-in in the scaffold runtime. */
394
+ /* Self-ID widget — shared card. Six display modes (inline / modal / slide-in /
395
+ * hello_bar_top / hello_bar_bottom / drawer) position and lay out the same
396
+ * card+form markup differently. */
397
397
  .kywi-selfid-widget {
398
398
  box-sizing: border-box;
399
+ position: relative;
399
400
  width: 100%;
400
401
  max-width: 24rem;
401
402
  padding: var(--kywi-spacing-lg, 1.5rem);
@@ -438,8 +439,150 @@
438
439
  from { opacity: 0; transform: translate(-50%, -46%); }
439
440
  to { opacity: 1; transform: translate(-50%, -50%); }
440
441
  }
442
+
443
+ /* Hello bars — full-width, fixed to the top/bottom viewport edge. The
444
+ * headline/subheadline/form lay out horizontally (the form's fields flow
445
+ * inline too), stacking vertically once the bar can't fit everything on one
446
+ * line. */
447
+ .kywi-selfid-hello-bar-top,
448
+ .kywi-selfid-hello-bar-bottom {
449
+ position: fixed;
450
+ left: 0;
451
+ right: 0;
452
+ z-index: 60;
453
+ width: 100%;
454
+ max-width: none;
455
+ display: flex;
456
+ align-items: center;
457
+ flex-wrap: wrap;
458
+ gap: var(--kywi-spacing-md, 1rem);
459
+ border-radius: 0;
460
+ padding: var(--kywi-spacing-md, 1rem) var(--kywi-spacing-lg, 1.5rem);
461
+ }
462
+ .kywi-selfid-hello-bar-top {
463
+ top: 0;
464
+ border-width: 0 0 1px;
465
+ animation: kywi-selfid-in-bar-top 240ms ease-out both;
466
+ }
467
+ .kywi-selfid-hello-bar-bottom {
468
+ bottom: 0;
469
+ border-width: 1px 0 0;
470
+ animation: kywi-selfid-in-bar-bottom 240ms ease-out both;
471
+ }
472
+ .kywi-selfid-hello-bar-top .kywi-selfid-headline,
473
+ .kywi-selfid-hello-bar-top .kywi-selfid-subheadline,
474
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-headline,
475
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-subheadline {
476
+ flex: 0 0 auto;
477
+ margin: 0;
478
+ }
479
+ .kywi-selfid-hello-bar-top .kywi-selfid-form,
480
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-form {
481
+ flex: 1 1 auto;
482
+ flex-direction: row;
483
+ flex-wrap: wrap;
484
+ align-items: center;
485
+ }
486
+ .kywi-selfid-hello-bar-top .kywi-selfid-field,
487
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-field {
488
+ flex: 0 1 auto;
489
+ flex-direction: row;
490
+ align-items: center;
491
+ gap: var(--kywi-spacing-xs, 0.25rem);
492
+ }
493
+ .kywi-selfid-hello-bar-top .kywi-selfid-field select,
494
+ .kywi-selfid-hello-bar-top .kywi-selfid-field input,
495
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-field select,
496
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-field input {
497
+ width: auto;
498
+ }
499
+ .kywi-selfid-hello-bar-top .kywi-selfid-actions,
500
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-actions {
501
+ flex: 0 0 auto;
502
+ }
503
+ @media (max-width: 640px) {
504
+ .kywi-selfid-hello-bar-top,
505
+ .kywi-selfid-hello-bar-bottom {
506
+ align-items: stretch;
507
+ }
508
+ .kywi-selfid-hello-bar-top .kywi-selfid-form,
509
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-form {
510
+ flex-direction: column;
511
+ align-items: stretch;
512
+ }
513
+ .kywi-selfid-hello-bar-top .kywi-selfid-field,
514
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-field {
515
+ flex-direction: column;
516
+ align-items: stretch;
517
+ }
518
+ .kywi-selfid-hello-bar-top .kywi-selfid-field select,
519
+ .kywi-selfid-hello-bar-top .kywi-selfid-field input,
520
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-field select,
521
+ .kywi-selfid-hello-bar-bottom .kywi-selfid-field input {
522
+ width: 100%;
523
+ }
524
+ }
525
+ @keyframes kywi-selfid-in-bar-top {
526
+ from { opacity: 0; transform: translateY(-100%); }
527
+ to { opacity: 1; transform: translateY(0); }
528
+ }
529
+ @keyframes kywi-selfid-in-bar-bottom {
530
+ from { opacity: 0; transform: translateY(100%); }
531
+ to { opacity: 1; transform: translateY(0); }
532
+ }
533
+
534
+ /* Drawer — panel sliding in from the right edge of the viewport. */
535
+ .kywi-selfid-drawer {
536
+ position: fixed;
537
+ top: 0;
538
+ right: 0;
539
+ bottom: 0;
540
+ z-index: 60;
541
+ width: 100%;
542
+ max-width: 24rem;
543
+ height: 100%;
544
+ overflow-y: auto;
545
+ border-radius: 0;
546
+ border-width: 0 0 0 1px;
547
+ animation: kywi-selfid-in-drawer 240ms ease-out both;
548
+ }
549
+ @keyframes kywi-selfid-in-drawer {
550
+ from { opacity: 0; transform: translateX(100%); }
551
+ to { opacity: 1; transform: translateX(0); }
552
+ }
553
+
441
554
  @media (prefers-reduced-motion: reduce) {
442
- .kywi-selfid-slide-in, .kywi-selfid-modal { animation: none; }
555
+ .kywi-selfid-slide-in,
556
+ .kywi-selfid-modal,
557
+ .kywi-selfid-hello-bar-top,
558
+ .kywi-selfid-hello-bar-bottom,
559
+ .kywi-selfid-drawer {
560
+ animation: none;
561
+ }
562
+ }
563
+
564
+ /* Dismiss control — shown on hello_bar_top/bottom and drawer modes, which have
565
+ * no headline/subheadline "skip" affordance of their own. */
566
+ .kywi-selfid-dismiss {
567
+ position: absolute;
568
+ top: var(--kywi-spacing-sm, 0.5rem);
569
+ right: var(--kywi-spacing-sm, 0.5rem);
570
+ width: 1.75rem;
571
+ height: 1.75rem;
572
+ display: inline-flex;
573
+ align-items: center;
574
+ justify-content: center;
575
+ font-size: 1.15rem;
576
+ line-height: 1;
577
+ cursor: pointer;
578
+ color: var(--kywi-color-muted, #64748b);
579
+ background: none;
580
+ border: none;
581
+ border-radius: var(--kywi-border-radius-sm, 6px);
582
+ }
583
+ .kywi-selfid-dismiss:hover {
584
+ color: var(--kywi-color-text, #0f172a);
585
+ background: var(--kywi-color-border, #e2e8f0);
443
586
  }
444
587
 
445
588
  .kywi-selfid-headline {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kywi-software/core",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "description": "Kywi CMS core — schema generator, REST API, and admin UI for Next.js.",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",