spec.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import type { Spec } from "@json-render/core";
  2. export const demoSpec: Spec = {
  3. root: "root",
  4. state: {
  5. renderer: "vue",
  6. count: 0,
  7. todos: [
  8. { id: 1, title: "Learn JSON Render", completed: true },
  9. {
  10. id: 2,
  11. title:
  12. "Try @json-render/vue, @json-render/react, @json-render/svelte, and @json-render/solid",
  13. completed: false,
  14. },
  15. { id: 3, title: "Build something awesome", completed: false },
  16. ],
  17. },
  18. elements: {
  19. root: {
  20. type: "Stack",
  21. props: { gap: 24, padding: 24, direction: "vertical" },
  22. children: [
  23. "demo-title",
  24. "renderer-tabs",
  25. "renderer-badge",
  26. "counter-card",
  27. "milestone-badge",
  28. "todos-card",
  29. ],
  30. },
  31. "demo-title": {
  32. type: "Text",
  33. props: {
  34. content: "@json-render multi-renderer demo",
  35. size: "xl",
  36. weight: "bold",
  37. },
  38. },
  39. "renderer-badge": {
  40. type: "RendererBadge",
  41. props: { renderer: { $state: "/renderer" } },
  42. },
  43. "renderer-tabs": {
  44. type: "RendererTabs",
  45. props: { renderer: { $state: "/renderer" } },
  46. on: {
  47. pressVue: { action: "switchToVue" },
  48. pressReact: { action: "switchToReact" },
  49. pressSvelte: { action: "switchToSvelte" },
  50. pressSolid: { action: "switchToSolid" },
  51. },
  52. },
  53. // ---- Counter card ----
  54. "counter-card": {
  55. type: "Card",
  56. props: {
  57. title: "Counter",
  58. subtitle: "Click the buttons to change the count",
  59. },
  60. children: ["counter-body"],
  61. },
  62. "counter-body": {
  63. type: "Stack",
  64. props: { gap: 12, direction: "horizontal", align: "center" },
  65. children: [
  66. "decrement-btn",
  67. "counter-value",
  68. "increment-btn",
  69. "reset-btn",
  70. ],
  71. },
  72. "decrement-btn": {
  73. type: "Button",
  74. props: { label: "−", variant: "secondary" },
  75. on: { press: { action: "decrement" } },
  76. },
  77. "counter-value": {
  78. type: "Text",
  79. props: {
  80. content: { $state: "/count" },
  81. size: "xl",
  82. weight: "bold",
  83. },
  84. },
  85. "increment-btn": {
  86. type: "Button",
  87. props: { label: "+", variant: "primary" },
  88. on: { press: { action: "increment" } },
  89. },
  90. "reset-btn": {
  91. type: "Button",
  92. props: { label: "Reset", variant: "danger" },
  93. on: { press: { action: "reset" } },
  94. },
  95. // ---- Milestone badge (visible only when count >= 10) ----
  96. "milestone-badge": {
  97. type: "Badge",
  98. props: { label: "Milestone reached: 10!", color: "#10b981" },
  99. visible: { $state: "/count", gte: 10 },
  100. },
  101. // ---- Todos card ----
  102. "todos-card": {
  103. type: "Card",
  104. props: { title: "Todo List", subtitle: "Your tasks" },
  105. children: ["todos-list"],
  106. },
  107. "todos-list": {
  108. type: "Stack",
  109. props: { gap: 8, direction: "vertical" },
  110. repeat: { statePath: "/todos", key: "id" },
  111. children: ["todo-item"],
  112. },
  113. "todo-item": {
  114. type: "ListItem",
  115. props: {
  116. title: { $item: "title" },
  117. completed: { $item: "completed" },
  118. },
  119. on: {
  120. press: { action: "toggleItem", params: { index: { $index: true } } },
  121. },
  122. },
  123. },
  124. };