@cosmicdrift/kumiko-renderer 0.328.0 → 0.329.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 (259) hide show
  1. package/dist/app/action-form-shim.d.ts +14 -0
  2. package/{src/app/action-form-shim.ts → dist/app/action-form-shim.js} +26 -46
  3. package/dist/app/app-features-context.d.ts +8 -0
  4. package/dist/app/app-features-context.js +16 -0
  5. package/dist/app/column-renderers.d.ts +30 -0
  6. package/dist/app/column-renderers.js +34 -0
  7. package/dist/app/config-edit-shim.d.ts +11 -0
  8. package/{src/app/config-edit-shim.ts → dist/app/config-edit-shim.js} +12 -25
  9. package/dist/app/content-editors.d.ts +38 -0
  10. package/dist/app/content-editors.js +26 -0
  11. package/dist/app/content-preview.d.ts +11 -0
  12. package/dist/app/content-preview.js +30 -0
  13. package/dist/app/custom-screens.d.ts +11 -0
  14. package/dist/app/custom-screens.js +20 -0
  15. package/dist/app/dashboard-body.d.ts +16 -0
  16. package/dist/app/dashboard-body.js +11 -0
  17. package/dist/app/extension-form-submit.d.ts +32 -0
  18. package/dist/app/extension-form-submit.js +73 -0
  19. package/dist/app/extension-sections.d.ts +72 -0
  20. package/dist/app/extension-sections.js +34 -0
  21. package/dist/app/feature-schema.d.ts +4 -0
  22. package/{src/app/feature-schema.ts → dist/app/feature-schema.js} +12 -22
  23. package/dist/app/form-schema.d.ts +4 -0
  24. package/dist/app/form-schema.js +85 -0
  25. package/dist/app/kumiko-screen.d.ts +43 -0
  26. package/dist/app/kumiko-screen.js +2206 -0
  27. package/dist/app/layout-fields.d.ts +3 -0
  28. package/dist/app/layout-fields.js +20 -0
  29. package/dist/app/list-facets.d.ts +48 -0
  30. package/dist/app/list-facets.js +185 -0
  31. package/dist/app/nav.d.ts +61 -0
  32. package/dist/app/nav.js +139 -0
  33. package/dist/app/projection-detail-shim.d.ts +8 -0
  34. package/dist/app/projection-detail-shim.js +71 -0
  35. package/dist/app/projection-list-shim.d.ts +13 -0
  36. package/{src/app/projection-list-shim.ts → dist/app/projection-list-shim.js} +26 -41
  37. package/dist/app/qn.d.ts +7 -0
  38. package/{src/app/qn.ts → dist/app/qn.js} +9 -11
  39. package/dist/app/qualify-screen-id.d.ts +2 -0
  40. package/{src/app/qualify-screen-id.ts → dist/app/qualify-screen-id.js} +5 -6
  41. package/dist/app/reference-facet-bridge.d.ts +10 -0
  42. package/dist/app/reference-facet-bridge.js +22 -0
  43. package/dist/app/return-to.d.ts +31 -0
  44. package/dist/app/return-to.js +188 -0
  45. package/dist/app/row-actions.d.ts +77 -0
  46. package/dist/app/row-actions.js +416 -0
  47. package/dist/app/screen-access.d.ts +8 -0
  48. package/dist/app/screen-access.js +48 -0
  49. package/dist/app/secret-mint-body.d.ts +10 -0
  50. package/dist/app/secret-mint-body.js +140 -0
  51. package/dist/app/secrets-edit-body.d.ts +8 -0
  52. package/dist/app/secrets-edit-body.js +76 -0
  53. package/dist/app/use-embedded-screen.d.ts +6 -0
  54. package/dist/app/use-embedded-screen.js +19 -0
  55. package/dist/app/variable-chips.d.ts +7 -0
  56. package/dist/app/variable-chips.js +16 -0
  57. package/dist/app/write-failed-error.d.ts +6 -0
  58. package/dist/app/write-failed-error.js +21 -0
  59. package/dist/components/embedded-list-field.d.ts +10 -0
  60. package/dist/components/embedded-list-field.js +259 -0
  61. package/dist/components/grid-cell-for-field.d.ts +25 -0
  62. package/dist/components/grid-cell-for-field.js +31 -0
  63. package/dist/components/multi-select-checkboxes.d.ts +14 -0
  64. package/dist/components/multi-select-checkboxes.js +36 -0
  65. package/dist/components/reference-create-dialog.d.ts +13 -0
  66. package/dist/components/reference-create-dialog.js +46 -0
  67. package/dist/components/related-list-section.d.ts +25 -0
  68. package/dist/components/related-list-section.js +273 -0
  69. package/dist/components/render-edit-action-button.d.ts +22 -0
  70. package/dist/components/render-edit-action-button.js +43 -0
  71. package/dist/components/render-edit-logic.d.ts +6 -0
  72. package/dist/components/render-edit-logic.js +63 -0
  73. package/dist/components/render-edit-types.d.ts +209 -0
  74. package/dist/components/render-edit-types.js +1 -0
  75. package/dist/components/render-edit.d.ts +6 -0
  76. package/dist/components/render-edit.js +1169 -0
  77. package/dist/components/render-field.d.ts +38 -0
  78. package/dist/components/render-field.js +544 -0
  79. package/dist/components/render-list.d.ts +117 -0
  80. package/dist/components/render-list.js +232 -0
  81. package/dist/components/write-form-section.d.ts +17 -0
  82. package/dist/components/write-form-section.js +104 -0
  83. package/dist/context/dispatcher-context.d.ts +10 -0
  84. package/{src/context/dispatcher-context.tsx → dist/context/dispatcher-context.js} +16 -29
  85. package/dist/context/draft-storage-context.d.ts +12 -0
  86. package/dist/context/draft-storage-context.js +18 -0
  87. package/dist/context/user-roles-context.d.ts +7 -0
  88. package/{src/context/user-roles-context.tsx → dist/context/user-roles-context.js} +7 -15
  89. package/dist/format-when.d.ts +1 -0
  90. package/{src/format-when.ts → dist/format-when.js} +7 -7
  91. package/dist/hooks/reference-limits.d.ts +3 -0
  92. package/{src/hooks/reference-limits.ts → dist/hooks/reference-limits.js} +0 -1
  93. package/dist/hooks/use-ai-text.d.ts +52 -0
  94. package/dist/hooks/use-ai-text.js +90 -0
  95. package/dist/hooks/use-disclosure.d.ts +7 -0
  96. package/dist/hooks/use-disclosure.js +8 -0
  97. package/dist/hooks/use-form.d.ts +7 -0
  98. package/dist/hooks/use-form.js +36 -0
  99. package/dist/hooks/use-list-url-state.d.ts +43 -0
  100. package/dist/hooks/use-list-url-state.js +131 -0
  101. package/dist/hooks/use-mutation.d.ts +9 -0
  102. package/dist/hooks/use-mutation.js +37 -0
  103. package/dist/hooks/use-query.d.ts +14 -0
  104. package/dist/hooks/use-query.js +118 -0
  105. package/dist/hooks/use-reference-lookup.d.ts +14 -0
  106. package/dist/hooks/use-reference-lookup.js +63 -0
  107. package/dist/hooks/use-store.d.ts +3 -0
  108. package/dist/hooks/use-store.js +38 -0
  109. package/dist/hooks/use-stream-handler.d.ts +14 -0
  110. package/dist/hooks/use-stream-handler.js +93 -0
  111. package/dist/i18n-defaults.d.ts +2 -0
  112. package/dist/i18n-defaults.js +201 -0
  113. package/dist/i18n.d.ts +64 -0
  114. package/dist/i18n.js +166 -0
  115. package/dist/index.d.ts +77 -0
  116. package/dist/index.js +55 -0
  117. package/dist/inside-drawer.d.ts +2 -0
  118. package/{src/inside-drawer.ts → dist/inside-drawer.js} +2 -5
  119. package/dist/page-header-slot.d.ts +2 -0
  120. package/{src/page-header-slot.ts → dist/page-header-slot.js} +2 -5
  121. package/dist/primitives.d.ts +1355 -0
  122. package/dist/primitives.js +73 -0
  123. package/dist/screen-fills-height.d.ts +3 -0
  124. package/dist/screen-fills-height.js +3 -0
  125. package/dist/share-links.d.ts +4 -0
  126. package/dist/share-links.js +11 -0
  127. package/dist/sort-by-accessor.d.ts +5 -0
  128. package/dist/sort-by-accessor.js +16 -0
  129. package/dist/sse/live-events.d.ts +23 -0
  130. package/dist/sse/live-events.js +28 -0
  131. package/dist/tokens.d.ts +83 -0
  132. package/dist/tokens.js +80 -0
  133. package/package.json +16 -9
  134. package/src/__tests__/error-i18n-defaults.test.ts +0 -82
  135. package/src/__tests__/format-when.test.ts +0 -12
  136. package/src/__tests__/i18n.test.tsx +0 -283
  137. package/src/__tests__/merge-search-params-into-initial.test.ts +0 -525
  138. package/src/__tests__/qn.test.ts +0 -83
  139. package/src/__tests__/share-links.test.ts +0 -26
  140. package/src/__tests__/sort-by-accessor.test.ts +0 -48
  141. package/src/__tests__/stringify-nav-params.test.ts +0 -33
  142. package/src/__tests__/use-list-url-state.test.tsx +0 -250
  143. package/src/app/__tests__/action-form-field-labels.test.tsx +0 -92
  144. package/src/app/__tests__/action-form-shim.test.ts +0 -137
  145. package/src/app/__tests__/build-list-query-payload.test.ts +0 -107
  146. package/src/app/__tests__/config-edit-shim.test.ts +0 -57
  147. package/src/app/__tests__/content-editors.test.tsx +0 -128
  148. package/src/app/__tests__/content-preview.test.tsx +0 -184
  149. package/src/app/__tests__/entity-edit-create-search-params.test.tsx +0 -236
  150. package/src/app/__tests__/entity-edit-fill-height.test.tsx +0 -118
  151. package/src/app/__tests__/entity-edit-jsonb-embedded-submit.test.tsx +0 -239
  152. package/src/app/__tests__/entity-list-create-singleton.test.tsx +0 -128
  153. package/src/app/__tests__/entity-list-row-action-entity-target.test.tsx +0 -424
  154. package/src/app/__tests__/entity-list-row-action-icon.test.tsx +0 -248
  155. package/src/app/__tests__/entity-list-row-action-kumiko-actions-view.test.tsx +0 -162
  156. package/src/app/__tests__/entity-list-row-action-refetch.test.tsx +0 -401
  157. package/src/app/__tests__/entity-list-screen-padding.test.tsx +0 -128
  158. package/src/app/__tests__/feature-schema.test.ts +0 -40
  159. package/src/app/__tests__/form-schema.test.ts +0 -247
  160. package/src/app/__tests__/list-daterange-facet.test.ts +0 -165
  161. package/src/app/__tests__/list-filter-facets.test.tsx +0 -521
  162. package/src/app/__tests__/nav.test.ts +0 -198
  163. package/src/app/__tests__/projection-detail-actions.test.tsx +0 -719
  164. package/src/app/__tests__/projection-detail-reference-field.test.tsx +0 -165
  165. package/src/app/__tests__/projection-detail-shim.test.ts +0 -188
  166. package/src/app/__tests__/projection-detail-singleton.test.tsx +0 -191
  167. package/src/app/__tests__/projection-list-bad-shape.test.tsx +0 -152
  168. package/src/app/__tests__/projection-list-reference-column.test.tsx +0 -219
  169. package/src/app/__tests__/projection-list-search-sort.test.tsx +0 -212
  170. package/src/app/__tests__/qualified-names.test.ts +0 -37
  171. package/src/app/__tests__/return-to.test.ts +0 -396
  172. package/src/app/__tests__/row-actions-navigate-tab.test.ts +0 -223
  173. package/src/app/__tests__/row-default-edit-action.test.tsx +0 -324
  174. package/src/app/__tests__/screen-access-allows.test.ts +0 -34
  175. package/src/app/__tests__/secret-mint-body.test.tsx +0 -404
  176. package/src/app/__tests__/variable-chips.test.tsx +0 -70
  177. package/src/app/app-features-context.tsx +0 -25
  178. package/src/app/column-renderers.tsx +0 -68
  179. package/src/app/content-editors.tsx +0 -85
  180. package/src/app/content-preview.tsx +0 -67
  181. package/src/app/custom-screens.tsx +0 -29
  182. package/src/app/dashboard-body.tsx +0 -33
  183. package/src/app/extension-form-submit.tsx +0 -123
  184. package/src/app/extension-sections.tsx +0 -111
  185. package/src/app/form-schema.ts +0 -91
  186. package/src/app/kumiko-screen.tsx +0 -3801
  187. package/src/app/layout-fields.ts +0 -31
  188. package/src/app/list-facets.ts +0 -259
  189. package/src/app/nav.tsx +0 -258
  190. package/src/app/projection-detail-shim.ts +0 -86
  191. package/src/app/reference-facet-bridge.tsx +0 -58
  192. package/src/app/return-to.tsx +0 -234
  193. package/src/app/row-actions.ts +0 -640
  194. package/src/app/screen-access.ts +0 -63
  195. package/src/app/secret-mint-body.tsx +0 -259
  196. package/src/app/secrets-edit-body.tsx +0 -194
  197. package/src/app/use-embedded-screen.ts +0 -27
  198. package/src/app/variable-chips.tsx +0 -39
  199. package/src/app/write-failed-error.ts +0 -27
  200. package/src/components/__tests__/embedded-list-field.test.tsx +0 -531
  201. package/src/components/__tests__/multi-select-checkboxes.test.tsx +0 -162
  202. package/src/components/__tests__/related-list-section-empty-state.test.tsx +0 -143
  203. package/src/components/__tests__/related-list-section.test.tsx +0 -1733
  204. package/src/components/__tests__/render-edit-action-button.test.tsx +0 -205
  205. package/src/components/__tests__/render-edit-hidden-section.test.tsx +0 -128
  206. package/src/components/__tests__/render-edit-logic.test.ts +0 -314
  207. package/src/components/__tests__/render-edit-screen-description.test.tsx +0 -152
  208. package/src/components/__tests__/render-edit-submit-actions.test.tsx +0 -460
  209. package/src/components/__tests__/render-field-app-locale.test.tsx +0 -142
  210. package/src/components/__tests__/render-field-enum-option.test.tsx +0 -99
  211. package/src/components/__tests__/render-field-icon-derivation.test.tsx +0 -119
  212. package/src/components/__tests__/render-field-json-format.test.tsx +0 -164
  213. package/src/components/__tests__/render-field-money-embedded-list-consistency.test.tsx +0 -212
  214. package/src/components/__tests__/render-field-money-roundtrip.test.tsx +0 -217
  215. package/src/components/__tests__/render-field-number-grouping.test.tsx +0 -76
  216. package/src/components/__tests__/render-field-number-unit.test.tsx +0 -227
  217. package/src/components/__tests__/render-field-password-format.test.tsx +0 -101
  218. package/src/components/__tests__/render-field-select-display.test.tsx +0 -134
  219. package/src/components/__tests__/render-field-unit-format.test.tsx +0 -107
  220. package/src/components/__tests__/render-field-unsupported-types.test.tsx +0 -195
  221. package/src/components/__tests__/render-list-toolbar-icon-only.test.tsx +0 -146
  222. package/src/components/__tests__/write-form-section.test.tsx +0 -375
  223. package/src/components/embedded-list-field.tsx +0 -354
  224. package/src/components/grid-cell-for-field.tsx +0 -88
  225. package/src/components/multi-select-checkboxes.tsx +0 -93
  226. package/src/components/reference-create-dialog.tsx +0 -91
  227. package/src/components/related-list-section.tsx +0 -491
  228. package/src/components/render-edit-action-button.tsx +0 -109
  229. package/src/components/render-edit-logic.ts +0 -85
  230. package/src/components/render-edit-types.ts +0 -226
  231. package/src/components/render-edit.tsx +0 -1871
  232. package/src/components/render-field.tsx +0 -951
  233. package/src/components/render-list.tsx +0 -593
  234. package/src/components/write-form-section.tsx +0 -198
  235. package/src/context/draft-storage-context.tsx +0 -39
  236. package/src/hooks/__tests__/use-ai-text.test.tsx +0 -177
  237. package/src/hooks/__tests__/use-disclosure.test.tsx +0 -25
  238. package/src/hooks/__tests__/use-form.test.tsx +0 -65
  239. package/src/hooks/__tests__/use-mutation.test.tsx +0 -77
  240. package/src/hooks/__tests__/use-query.test.tsx +0 -149
  241. package/src/hooks/__tests__/use-stream-handler.test.tsx +0 -107
  242. package/src/hooks/use-ai-text.ts +0 -172
  243. package/src/hooks/use-disclosure.ts +0 -20
  244. package/src/hooks/use-form.ts +0 -78
  245. package/src/hooks/use-list-url-state.ts +0 -207
  246. package/src/hooks/use-mutation.ts +0 -61
  247. package/src/hooks/use-query.ts +0 -166
  248. package/src/hooks/use-reference-lookup.ts +0 -76
  249. package/src/hooks/use-store.ts +0 -48
  250. package/src/hooks/use-stream-handler.ts +0 -134
  251. package/src/i18n-defaults.ts +0 -240
  252. package/src/i18n.tsx +0 -286
  253. package/src/index.ts +0 -279
  254. package/src/primitives.tsx +0 -1567
  255. package/src/screen-fills-height.ts +0 -3
  256. package/src/share-links.ts +0 -12
  257. package/src/sort-by-accessor.ts +0 -20
  258. package/src/sse/live-events.tsx +0 -56
  259. package/src/tokens.tsx +0 -170
@@ -1,3 +0,0 @@
1
- export function screenFillsHeight(screen: { readonly fillHeight?: boolean }): boolean {
2
- return screen.fillHeight !== false;
3
- }
@@ -1,12 +0,0 @@
1
- /** wa.me link that opens WhatsApp with `text` prefilled — addressed to
2
- * `phone` when given (any formatting; international form required, a
3
- * leading "+" or "00" is accepted), otherwise WhatsApp's contact picker. */
4
- export function buildWhatsAppShareUrl(text: string, phone?: string): string {
5
- const recipient = phone === undefined ? "" : whatsAppRecipientDigits(phone);
6
- return `https://wa.me/${recipient}?text=${encodeURIComponent(text)}`;
7
- }
8
-
9
- function whatsAppRecipientDigits(phone: string): string {
10
- const digits = phone.replace(/\D/g, "");
11
- return digits.startsWith("00") ? digits.slice(2) : digits;
12
- }
@@ -1,20 +0,0 @@
1
- import type { DataTableSort } from "./primitives";
2
-
3
- /** Sorts `rows` by a `DataTableSort` against a field->accessor map. Unknown
4
- * field or `sort === null` returns `rows` unchanged (no-op, not an error —
5
- * callers pass whatever the DataTable reports). */
6
- export function sortByAccessor<TRow>(
7
- rows: readonly TRow[],
8
- sort: DataTableSort | null,
9
- accessors: Readonly<Record<string, (row: TRow) => string | number>>,
10
- ): readonly TRow[] {
11
- if (sort === null) return rows;
12
- const accessor = accessors[sort.field];
13
- if (accessor === undefined) return rows;
14
- const factor = sort.dir === "asc" ? 1 : -1;
15
- return [...rows].sort((a, b) => {
16
- const av = accessor(a);
17
- const bv = accessor(b);
18
- return av < bv ? -factor : av > bv ? factor : 0;
19
- });
20
- }
@@ -1,56 +0,0 @@
1
- // Live-Events-Contract, plattform-neutral. Die Plattform (Web mit
2
- // EventSource, Native mit polyfill) liefert einen `LiveEventSubscriber`
3
- // via `<LiveEventsProvider value={...}>`; der shared-Layer konsumiert
4
- // nur das Interface.
5
- //
6
- // Warum ein Context statt Module-Singleton wie vor dem Split: ein
7
- // Module-Singleton koppelt an eine globale Verbindung. Mit Context
8
- // kann der Caller pro Tree eine andere Subscribe-Quelle durchreichen
9
- // — nützlich in Tests (Fake-Feed), bei Multi-Tenant-Bridges, und
10
- // beim Native-Renderer wo die Verbindungs-Lifecycle oft nicht dem
11
- // App-Lifecycle entspricht.
12
-
13
- import { createContext, type ReactNode, useContext } from "react";
14
-
15
- export type LiveEvent = {
16
- readonly type: string;
17
- readonly data: {
18
- readonly id: string;
19
- readonly aggregateType: string;
20
- readonly version: number;
21
- readonly payload: unknown;
22
- readonly createdAt: string;
23
- };
24
- };
25
-
26
- /** Abonniert Live-Events für eine Entity (aggregateType). Returnt die
27
- * Unsubscribe-Funktion. Mehrere Subscriptions parallel auf dieselbe
28
- * Entity sind erlaubt — jede bekommt ihr eigenes Event. */
29
- export type LiveEventSubscriber = (
30
- entityName: string,
31
- listener: (event: LiveEvent) => void,
32
- ) => () => void;
33
-
34
- // Wenn kein Provider da ist, liefern wir einen No-op-Subscriber statt
35
- // zu crashen. Grund: useQuery({ live: true }) kann optimistisch
36
- // ausgehakt werden ohne den ganzen Baum abzureißen, wenn die Plattform
37
- // z.B. SSE temporär deaktiviert hat. Fehler-Signale würden stumm
38
- // geschluckt — das ist explizit dokumentiert.
39
- const noopSubscriber: LiveEventSubscriber = () => () => {};
40
-
41
- const LiveEventsContext = createContext<LiveEventSubscriber>(noopSubscriber);
42
-
43
- export type LiveEventsProviderProps = {
44
- readonly children: ReactNode;
45
- readonly value: LiveEventSubscriber;
46
- };
47
-
48
- export function LiveEventsProvider({ children, value }: LiveEventsProviderProps): ReactNode {
49
- return <LiveEventsContext.Provider value={value}>{children}</LiveEventsContext.Provider>;
50
- }
51
-
52
- /** Hook für useQuery-like Consumer. Liefert die Subscribe-Function
53
- * aus dem Context. Wenn kein Provider da ist, ist's ein No-op. */
54
- export function useLiveEvents(): LiveEventSubscriber {
55
- return useContext(LiveEventsContext);
56
- }
package/src/tokens.tsx DELETED
@@ -1,170 +0,0 @@
1
- // Design-Tokens im shadcn-Namensschema. Werte sind CSS-Variable-
2
- // Referenzen (`var(--color-primary)`) — die echten Zahlen leben in
3
- // styles.css (Web) bzw. in einer StyleSheet.create-Config (Native,
4
- // später). Der Hook ist vor allem für Custom-Components die mal
5
- // einen Token-Wert in eine JS-style-prop schieben müssen; die
6
- // Default-Primitives nutzen direkt Tailwind-Klassen und brauchen
7
- // ihn nicht.
8
- //
9
- // Theme-Toggle läuft über `.dark`-Class auf `<html>` — kein JS-State
10
- // nötig, CSS rendert sofort neu. `useTokenController().toggleTheme()`
11
- // ist nur ein DOM-Wrapper, kein eigener React-State.
12
- //
13
- // Erweiterbar: AppTokens-Interface wie bei Primitives. Dev kann
14
- // eigene Token-Kategorien deklarieren und mit var-Strings befüllen.
15
-
16
- import { createContext, type ReactNode, useContext } from "react";
17
-
18
- // ---- Core-Token-Types (shadcn-Schema) ----
19
-
20
- export type ColorTokens = {
21
- readonly background: string;
22
- readonly foreground: string;
23
- readonly card: string;
24
- readonly cardForeground: string;
25
- readonly popover: string;
26
- readonly popoverForeground: string;
27
- readonly primary: string;
28
- readonly primaryForeground: string;
29
- readonly secondary: string;
30
- readonly secondaryForeground: string;
31
- readonly muted: string;
32
- readonly mutedForeground: string;
33
- readonly accent: string;
34
- readonly accentForeground: string;
35
- readonly destructive: string;
36
- readonly destructiveForeground: string;
37
- readonly border: string;
38
- readonly input: string;
39
- readonly ring: string;
40
- };
41
-
42
- export type RadiusTokens = {
43
- readonly sm: string;
44
- readonly md: string;
45
- readonly lg: string;
46
- readonly xl: string;
47
- };
48
-
49
- export type FontTokens = {
50
- readonly sans: string;
51
- readonly heading: string;
52
- readonly mono: string;
53
- };
54
-
55
- export type ShadowTokens = {
56
- readonly card: string;
57
- };
58
-
59
- export type SpacingTokens = {
60
- readonly card: string;
61
- };
62
-
63
- export type CoreTokens = {
64
- readonly color: ColorTokens;
65
- readonly radius: RadiusTokens;
66
- readonly font: FontTokens;
67
- readonly shadow: ShadowTokens;
68
- readonly spacing: SpacingTokens;
69
- };
70
-
71
- /** Erweiterung für App-eigene Token-Kategorien. Devs augmentieren:
72
- *
73
- * declare module "@cosmicdrift/kumiko-renderer" {
74
- * interface AppTokens {
75
- * chart: { gridline: string; line: string };
76
- * }
77
- * }
78
- *
79
- * Und reichen im App-CSS die passenden `--chart-*` Variablen rein.
80
- * Kumikos Default-Primitives nutzen nur CoreTokens. */
81
- // biome-ignore lint/suspicious/noEmptyInterface: extension point for module augmentation
82
- export interface AppTokens {}
83
-
84
- export type Tokens = CoreTokens & AppTokens;
85
-
86
- export type ThemeMode = "light" | "dark";
87
-
88
- export type TokensApi = {
89
- readonly tokens: Tokens;
90
- readonly mode: ThemeMode;
91
- readonly setMode: (mode: ThemeMode) => void;
92
- readonly toggleMode: () => void;
93
- };
94
-
95
- // ---- Context + Provider + Hooks ----
96
-
97
- const TokensContext = createContext<TokensApi | undefined>(undefined);
98
-
99
- export type TokensProviderProps = {
100
- readonly children: ReactNode;
101
- readonly value: TokensApi;
102
- };
103
-
104
- export function TokensProvider({ children, value }: TokensProviderProps): ReactNode {
105
- return <TokensContext.Provider value={value}>{children}</TokensContext.Provider>;
106
- }
107
-
108
- /** Read-only Tokens-Hook. Liefert CSS-var-Strings — nutzbar in
109
- * style-Props oder Tailwind-arbitrary-values wie
110
- * `bg-[var(--color-primary)]` (selten, die shadcn-Tailwind-Klassen
111
- * `bg-primary` sind idiomatischer). */
112
- export function useTokens(): Tokens {
113
- return useTokenController().tokens;
114
- }
115
-
116
- /** Volle API inkl. Theme-Toggle. Für den Dark/Light-Switch-Button. */
117
- export function useTokenController(): TokensApi {
118
- const api = useContext(TokensContext);
119
- if (api === undefined) {
120
- throw new Error(
121
- "useTokens/useTokenController: no <TokensProvider> mounted. createKumikoApp verdrahtet den Provider automatisch mit @cosmicdrift/kumiko-renderer-web defaults.",
122
- );
123
- }
124
- return api;
125
- }
126
-
127
- /** Tokens mit var-string-Werten. Konstant — die "Werte" sind
128
- * Referenzen, die echten Farben ändern sich per CSS ohne dass das
129
- * Objekt mutiert werden muss. Plattform-Packages (renderer-web,
130
- * -native) importieren das in ihre TokensApi-Impl. */
131
- export const cssVarTokens: Tokens = {
132
- color: {
133
- background: "var(--color-background)",
134
- foreground: "var(--color-foreground)",
135
- card: "var(--color-card)",
136
- cardForeground: "var(--color-card-foreground)",
137
- popover: "var(--color-popover)",
138
- popoverForeground: "var(--color-popover-foreground)",
139
- primary: "var(--color-primary)",
140
- primaryForeground: "var(--color-primary-foreground)",
141
- secondary: "var(--color-secondary)",
142
- secondaryForeground: "var(--color-secondary-foreground)",
143
- muted: "var(--color-muted)",
144
- mutedForeground: "var(--color-muted-foreground)",
145
- accent: "var(--color-accent)",
146
- accentForeground: "var(--color-accent-foreground)",
147
- destructive: "var(--color-destructive)",
148
- destructiveForeground: "var(--color-destructive-foreground)",
149
- border: "var(--color-border)",
150
- input: "var(--color-input)",
151
- ring: "var(--color-ring)",
152
- },
153
- radius: {
154
- sm: "var(--radius-sm)",
155
- md: "var(--radius-md)",
156
- lg: "var(--radius-lg)",
157
- xl: "var(--radius-xl)",
158
- },
159
- font: {
160
- sans: "var(--font-sans)",
161
- heading: "var(--font-heading)",
162
- mono: "var(--font-mono)",
163
- },
164
- shadow: {
165
- card: "var(--card-shadow)",
166
- },
167
- spacing: {
168
- card: "var(--card-padding)",
169
- },
170
- } as Tokens;