sovrium 0.0.2

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 (527) hide show
  1. package/CHANGELOG.md +3497 -0
  2. package/LICENSE.md +147 -0
  3. package/LICENSE_EE.md +297 -0
  4. package/README.md +321 -0
  5. package/drizzle/0000_melted_kabuki.sql +163 -0
  6. package/drizzle/meta/0000_snapshot.json +1216 -0
  7. package/drizzle/meta/_journal.json +13 -0
  8. package/package.json +167 -0
  9. package/schemas/0.0.1/app.openapi.json +70 -0
  10. package/schemas/0.0.1/app.schema.json +7961 -0
  11. package/schemas/0.0.2/app.openapi.json +80 -0
  12. package/schemas/0.0.2/app.schema.json +8829 -0
  13. package/schemas/development/app.openapi.json +70 -0
  14. package/schemas/development/app.schema.json +7456 -0
  15. package/src/application/errors/app-validation-error.ts +14 -0
  16. package/src/application/errors/static-generation-error.ts +16 -0
  17. package/src/application/metadata/favicon-transformer.ts +127 -0
  18. package/src/application/models/server.ts +27 -0
  19. package/src/application/ports/models/user-metadata.ts +36 -0
  20. package/src/application/ports/models/user-session.ts +34 -0
  21. package/src/application/ports/repositories/activity-log-repository.ts +68 -0
  22. package/src/application/ports/repositories/activity-repository.ts +49 -0
  23. package/src/application/ports/repositories/analytics-repository.ts +164 -0
  24. package/src/application/ports/repositories/auth-repository.ts +33 -0
  25. package/src/application/ports/repositories/batch-repository.ts +86 -0
  26. package/src/application/ports/repositories/comment-repository.ts +150 -0
  27. package/src/application/ports/repositories/index.ts +41 -0
  28. package/src/application/ports/repositories/table-repository.ts +139 -0
  29. package/src/application/ports/services/css-compiler.ts +55 -0
  30. package/src/application/ports/services/index.ts +16 -0
  31. package/src/application/ports/services/page-renderer.ts +79 -0
  32. package/src/application/ports/services/server-factory.ts +80 -0
  33. package/src/application/ports/services/static-site-generator.ts +82 -0
  34. package/src/application/use-cases/activity/programs.ts +66 -0
  35. package/src/application/use-cases/analytics/collect-page-view.ts +114 -0
  36. package/src/application/use-cases/analytics/purge-old-data.ts +40 -0
  37. package/src/application/use-cases/analytics/query-campaigns.ts +43 -0
  38. package/src/application/use-cases/analytics/query-devices.ts +36 -0
  39. package/src/application/use-cases/analytics/query-overview.ts +50 -0
  40. package/src/application/use-cases/analytics/query-pages.ts +40 -0
  41. package/src/application/use-cases/analytics/query-referrers.ts +43 -0
  42. package/src/application/use-cases/analytics/ua-parser.ts +89 -0
  43. package/src/application/use-cases/analytics/visitor-hash.ts +77 -0
  44. package/src/application/use-cases/auth/bootstrap-admin.ts +270 -0
  45. package/src/application/use-cases/list-activity-logs.ts +123 -0
  46. package/src/application/use-cases/server/generate-static-helpers.ts +374 -0
  47. package/src/application/use-cases/server/generate-static.ts +287 -0
  48. package/src/application/use-cases/server/start-server.ts +118 -0
  49. package/src/application/use-cases/server/startup-error-handler.ts +69 -0
  50. package/src/application/use-cases/server/static-content-generators.ts +182 -0
  51. package/src/application/use-cases/server/static-language-generators.ts +181 -0
  52. package/src/application/use-cases/server/static-url-rewriter.ts +237 -0
  53. package/src/application/use-cases/server/translation-replacer.ts +164 -0
  54. package/src/application/use-cases/tables/activity-programs.ts +93 -0
  55. package/src/application/use-cases/tables/batch-operations.ts +156 -0
  56. package/src/application/use-cases/tables/comment-programs.ts +436 -0
  57. package/src/application/use-cases/tables/permissions/permissions.ts +25 -0
  58. package/src/application/use-cases/tables/programs.ts +435 -0
  59. package/src/application/use-cases/tables/table-operations.ts +412 -0
  60. package/src/application/use-cases/tables/user-role.ts +52 -0
  61. package/src/application/use-cases/tables/utils/display-formatter.ts +471 -0
  62. package/src/application/use-cases/tables/utils/field-read-filter.ts +189 -0
  63. package/src/application/use-cases/tables/utils/list-helpers.ts +122 -0
  64. package/src/application/use-cases/tables/utils/record-transformer.ts +319 -0
  65. package/src/cli.ts +370 -0
  66. package/src/domain/errors/create-tagged-error.ts +36 -0
  67. package/src/domain/errors/index.ts +78 -0
  68. package/src/domain/models/api/analytics.ts +179 -0
  69. package/src/domain/models/api/auth.ts +231 -0
  70. package/src/domain/models/api/common.ts +60 -0
  71. package/src/domain/models/api/error.ts +89 -0
  72. package/src/domain/models/api/health.ts +38 -0
  73. package/src/domain/models/api/index.ts +42 -0
  74. package/src/domain/models/api/request.ts +132 -0
  75. package/src/domain/models/api/tables.ts +444 -0
  76. package/src/domain/models/app/analytics/index.ts +129 -0
  77. package/src/domain/models/app/auth/config.ts +116 -0
  78. package/src/domain/models/app/auth/index.ts +230 -0
  79. package/src/domain/models/app/auth/methods/email-and-password.ts +67 -0
  80. package/src/domain/models/app/auth/methods/index.ts +11 -0
  81. package/src/domain/models/app/auth/methods/magic-link.ts +54 -0
  82. package/src/domain/models/app/auth/oauth/index.ts +8 -0
  83. package/src/domain/models/app/auth/oauth/providers.ts +105 -0
  84. package/src/domain/models/app/auth/plugins/admin.ts +130 -0
  85. package/src/domain/models/app/auth/plugins/index.ts +74 -0
  86. package/src/domain/models/app/auth/plugins/two-factor.ts +63 -0
  87. package/src/domain/models/app/auth/roles.ts +179 -0
  88. package/src/domain/models/app/auth/strategies.ts +191 -0
  89. package/src/domain/models/app/auth/validation.ts +127 -0
  90. package/src/domain/models/app/common/branded-ids.ts +200 -0
  91. package/src/domain/models/app/common/definitions.ts +187 -0
  92. package/src/domain/models/app/component/common/component-children.ts +119 -0
  93. package/src/domain/models/app/component/common/component-props.ts +89 -0
  94. package/src/domain/models/app/component/common/component-reference.ts +170 -0
  95. package/src/domain/models/app/component/component.ts +81 -0
  96. package/src/domain/models/app/components.ts +65 -0
  97. package/src/domain/models/app/description.ts +83 -0
  98. package/src/domain/models/app/index.ts +258 -0
  99. package/src/domain/models/app/language/language-config.ts +200 -0
  100. package/src/domain/models/app/languages.ts +205 -0
  101. package/src/domain/models/app/name.ts +66 -0
  102. package/src/domain/models/app/page/common/interactions/click-interaction.ts +116 -0
  103. package/src/domain/models/app/page/common/interactions/entrance-animation.ts +84 -0
  104. package/src/domain/models/app/page/common/interactions/hover-interaction.ts +144 -0
  105. package/src/domain/models/app/page/common/interactions/interactions.ts +64 -0
  106. package/src/domain/models/app/page/common/interactions/scroll-interaction.ts +93 -0
  107. package/src/domain/models/app/page/common/responsive.ts +114 -0
  108. package/src/domain/models/app/page/common/url.ts +35 -0
  109. package/src/domain/models/app/page/common/variable-reference.ts +53 -0
  110. package/src/domain/models/app/page/id.ts +44 -0
  111. package/src/domain/models/app/page/index.ts +270 -0
  112. package/src/domain/models/app/page/meta/analytics.ts +248 -0
  113. package/src/domain/models/app/page/meta/custom-elements.ts +180 -0
  114. package/src/domain/models/app/page/meta/dns-prefetch.ts +77 -0
  115. package/src/domain/models/app/page/meta/favicon-set.ts +203 -0
  116. package/src/domain/models/app/page/meta/favicon.ts +50 -0
  117. package/src/domain/models/app/page/meta/favicons-config.ts +73 -0
  118. package/src/domain/models/app/page/meta/index.ts +278 -0
  119. package/src/domain/models/app/page/meta/open-graph.ts +166 -0
  120. package/src/domain/models/app/page/meta/preload.ts +190 -0
  121. package/src/domain/models/app/page/meta/structured-data/article.ts +211 -0
  122. package/src/domain/models/app/page/meta/structured-data/breadcrumb.ts +115 -0
  123. package/src/domain/models/app/page/meta/structured-data/common-fields.ts +201 -0
  124. package/src/domain/models/app/page/meta/structured-data/education-event.ts +256 -0
  125. package/src/domain/models/app/page/meta/structured-data/faq-page.ts +127 -0
  126. package/src/domain/models/app/page/meta/structured-data/index.ts +95 -0
  127. package/src/domain/models/app/page/meta/structured-data/local-business.ts +247 -0
  128. package/src/domain/models/app/page/meta/structured-data/organization.ts +171 -0
  129. package/src/domain/models/app/page/meta/structured-data/person.ts +138 -0
  130. package/src/domain/models/app/page/meta/structured-data/postal-address.ts +106 -0
  131. package/src/domain/models/app/page/meta/structured-data/product.ts +214 -0
  132. package/src/domain/models/app/page/meta/twitter-card.ts +217 -0
  133. package/src/domain/models/app/page/name.ts +38 -0
  134. package/src/domain/models/app/page/path.ts +21 -0
  135. package/src/domain/models/app/page/scripts/external-scripts.ts +163 -0
  136. package/src/domain/models/app/page/scripts/features.ts +135 -0
  137. package/src/domain/models/app/page/scripts/inline-scripts.ts +114 -0
  138. package/src/domain/models/app/page/scripts/scripts.ts +102 -0
  139. package/src/domain/models/app/page/sections.ts +298 -0
  140. package/src/domain/models/app/pages.ts +61 -0
  141. package/src/domain/models/app/permissions/index.ts +61 -0
  142. package/src/domain/models/app/permissions/resource-action.ts +114 -0
  143. package/src/domain/models/app/permissions/roles.ts +120 -0
  144. package/src/domain/models/app/table/check-constraints.ts +105 -0
  145. package/src/domain/models/app/table/cycle-detection.ts +124 -0
  146. package/src/domain/models/app/table/database-identifier.ts +153 -0
  147. package/src/domain/models/app/table/field-name.ts +36 -0
  148. package/src/domain/models/app/table/field-types/advanced/array-field.ts +33 -0
  149. package/src/domain/models/app/table/field-types/advanced/autonumber-field.ts +54 -0
  150. package/src/domain/models/app/table/field-types/advanced/button-field.ts +56 -0
  151. package/src/domain/models/app/table/field-types/advanced/color-field.ts +57 -0
  152. package/src/domain/models/app/table/field-types/advanced/count-field.ts +54 -0
  153. package/src/domain/models/app/table/field-types/advanced/formula-field.ts +58 -0
  154. package/src/domain/models/app/table/field-types/advanced/geolocation-field.ts +49 -0
  155. package/src/domain/models/app/table/field-types/advanced/index.ts +16 -0
  156. package/src/domain/models/app/table/field-types/advanced/json-field.ts +25 -0
  157. package/src/domain/models/app/table/field-types/advanced/unknown-field.ts +85 -0
  158. package/src/domain/models/app/table/field-types/base-field.ts +42 -0
  159. package/src/domain/models/app/table/field-types/date-time/created-at-field.ts +49 -0
  160. package/src/domain/models/app/table/field-types/date-time/date-field.ts +95 -0
  161. package/src/domain/models/app/table/field-types/date-time/deleted-at-field.ts +56 -0
  162. package/src/domain/models/app/table/field-types/date-time/duration-field.ts +73 -0
  163. package/src/domain/models/app/table/field-types/date-time/index.ts +12 -0
  164. package/src/domain/models/app/table/field-types/date-time/updated-at-field.ts +50 -0
  165. package/src/domain/models/app/table/field-types/index.ts +19 -0
  166. package/src/domain/models/app/table/field-types/media/barcode-field.ts +58 -0
  167. package/src/domain/models/app/table/field-types/media/index.ts +10 -0
  168. package/src/domain/models/app/table/field-types/media/multiple-attachments-field.ts +80 -0
  169. package/src/domain/models/app/table/field-types/media/single-attachment-field.ts +81 -0
  170. package/src/domain/models/app/table/field-types/numeric/currency-field.ts +144 -0
  171. package/src/domain/models/app/table/field-types/numeric/decimal-field.ts +113 -0
  172. package/src/domain/models/app/table/field-types/numeric/index.ts +13 -0
  173. package/src/domain/models/app/table/field-types/numeric/integer-field.ts +98 -0
  174. package/src/domain/models/app/table/field-types/numeric/percentage-field.ts +115 -0
  175. package/src/domain/models/app/table/field-types/numeric/progress-field.ts +71 -0
  176. package/src/domain/models/app/table/field-types/numeric/rating-field.ts +74 -0
  177. package/src/domain/models/app/table/field-types/relational/index.ts +10 -0
  178. package/src/domain/models/app/table/field-types/relational/lookup-field.ts +46 -0
  179. package/src/domain/models/app/table/field-types/relational/relationship-field.ts +112 -0
  180. package/src/domain/models/app/table/field-types/relational/rollup-field.ts +58 -0
  181. package/src/domain/models/app/table/field-types/selection/checkbox-field.ts +51 -0
  182. package/src/domain/models/app/table/field-types/selection/index.ts +11 -0
  183. package/src/domain/models/app/table/field-types/selection/multi-select-field.ts +68 -0
  184. package/src/domain/models/app/table/field-types/selection/single-select-field.ts +54 -0
  185. package/src/domain/models/app/table/field-types/selection/status-field.ts +37 -0
  186. package/src/domain/models/app/table/field-types/text/email-field.ts +80 -0
  187. package/src/domain/models/app/table/field-types/text/index.ts +13 -0
  188. package/src/domain/models/app/table/field-types/text/long-text-field.ts +77 -0
  189. package/src/domain/models/app/table/field-types/text/phone-number-field.ts +82 -0
  190. package/src/domain/models/app/table/field-types/text/rich-text-field.ts +66 -0
  191. package/src/domain/models/app/table/field-types/text/single-line-text-field.ts +79 -0
  192. package/src/domain/models/app/table/field-types/text/url-field.ts +81 -0
  193. package/src/domain/models/app/table/field-types/user/created-by-field.ts +50 -0
  194. package/src/domain/models/app/table/field-types/user/deleted-by-field.ts +57 -0
  195. package/src/domain/models/app/table/field-types/user/index.ts +11 -0
  196. package/src/domain/models/app/table/field-types/user/updated-by-field.ts +51 -0
  197. package/src/domain/models/app/table/field-types/user/user-field.ts +52 -0
  198. package/src/domain/models/app/table/field-types/validation-utils.ts +166 -0
  199. package/src/domain/models/app/table/fields.ts +216 -0
  200. package/src/domain/models/app/table/foreign-keys.ts +111 -0
  201. package/src/domain/models/app/table/formula-keywords.ts +326 -0
  202. package/src/domain/models/app/table/id.ts +31 -0
  203. package/src/domain/models/app/table/index.ts +290 -0
  204. package/src/domain/models/app/table/indexes.ts +80 -0
  205. package/src/domain/models/app/table/name.ts +37 -0
  206. package/src/domain/models/app/table/permissions/field-permission.ts +83 -0
  207. package/src/domain/models/app/table/permissions/index.ts +167 -0
  208. package/src/domain/models/app/table/permissions/permission-evaluator.ts +372 -0
  209. package/src/domain/models/app/table/permissions/permission.ts +49 -0
  210. package/src/domain/models/app/table/primary-key.ts +62 -0
  211. package/src/domain/models/app/table/table-formula-validation.ts +168 -0
  212. package/src/domain/models/app/table/table-indexes-validation.ts +38 -0
  213. package/src/domain/models/app/table/table-permissions-validation.ts +77 -0
  214. package/src/domain/models/app/table/table-primary-key-validation.ts +49 -0
  215. package/src/domain/models/app/table/table-views-validation.ts +408 -0
  216. package/src/domain/models/app/table/unique-constraints.ts +79 -0
  217. package/src/domain/models/app/table/views/fields.ts +28 -0
  218. package/src/domain/models/app/table/views/filters.ts +162 -0
  219. package/src/domain/models/app/table/views/group-by.ts +32 -0
  220. package/src/domain/models/app/table/views/id.ts +50 -0
  221. package/src/domain/models/app/table/views/index.ts +177 -0
  222. package/src/domain/models/app/table/views/name.ts +32 -0
  223. package/src/domain/models/app/table/views/permissions.ts +98 -0
  224. package/src/domain/models/app/table/views/sorts.ts +31 -0
  225. package/src/domain/models/app/tables.ts +695 -0
  226. package/src/domain/models/app/theme/animations.ts +208 -0
  227. package/src/domain/models/app/theme/border-radius.ts +58 -0
  228. package/src/domain/models/app/theme/breakpoints.ts +62 -0
  229. package/src/domain/models/app/theme/colors.ts +110 -0
  230. package/src/domain/models/app/theme/fonts.ts +164 -0
  231. package/src/domain/models/app/theme/shadows.ts +61 -0
  232. package/src/domain/models/app/theme/spacing.ts +115 -0
  233. package/src/domain/models/app/theme.ts +66 -0
  234. package/src/domain/models/app/version.ts +87 -0
  235. package/src/domain/models/record-comment.ts +91 -0
  236. package/src/domain/utils/content-parsing.ts +49 -0
  237. package/src/domain/utils/format-detection.ts +69 -0
  238. package/src/domain/utils/index.ts +9 -0
  239. package/src/domain/utils/route-matcher.ts +184 -0
  240. package/src/domain/utils/translation-resolver.ts +170 -0
  241. package/src/index.ts +208 -0
  242. package/src/infrastructure/analytics/tracking-script.ts +48 -0
  243. package/src/infrastructure/auth/better-auth/auth.ts +216 -0
  244. package/src/infrastructure/auth/better-auth/email-handlers.ts +162 -0
  245. package/src/infrastructure/auth/better-auth/index.ts +16 -0
  246. package/src/infrastructure/auth/better-auth/layer.ts +97 -0
  247. package/src/infrastructure/auth/better-auth/plugins/admin.ts +56 -0
  248. package/src/infrastructure/auth/better-auth/plugins/magic-link.ts +31 -0
  249. package/src/infrastructure/auth/better-auth/plugins/two-factor.ts +19 -0
  250. package/src/infrastructure/auth/better-auth/schema.ts +152 -0
  251. package/src/infrastructure/auth/index.ts +27 -0
  252. package/src/infrastructure/css/cache/css-cache-service.ts +130 -0
  253. package/src/infrastructure/css/compiler.ts +210 -0
  254. package/src/infrastructure/css/css-compiler-live.ts +20 -0
  255. package/src/infrastructure/css/index.ts +25 -0
  256. package/src/infrastructure/css/styles/animation-styles-generator.ts +177 -0
  257. package/src/infrastructure/css/styles/click-animations.ts +147 -0
  258. package/src/infrastructure/css/styles/component-layer-generators.ts +147 -0
  259. package/src/infrastructure/css/theme/theme-generators.ts +130 -0
  260. package/src/infrastructure/css/theme/theme-layer-generators.ts +219 -0
  261. package/src/infrastructure/css/theme/theme-token-resolver.ts +76 -0
  262. package/src/infrastructure/database/activity-queries.ts +111 -0
  263. package/src/infrastructure/database/auth/auth-validation.ts +101 -0
  264. package/src/infrastructure/database/drizzle/db-bun.ts +17 -0
  265. package/src/infrastructure/database/drizzle/db.ts +17 -0
  266. package/src/infrastructure/database/drizzle/index.ts +16 -0
  267. package/src/infrastructure/database/drizzle/layer.ts +34 -0
  268. package/src/infrastructure/database/drizzle/migrate.ts +77 -0
  269. package/src/infrastructure/database/drizzle/schema/activity-log.ts +111 -0
  270. package/src/infrastructure/database/drizzle/schema/analytics-page-views.ts +116 -0
  271. package/src/infrastructure/database/drizzle/schema/migration-audit.ts +68 -0
  272. package/src/infrastructure/database/drizzle/schema/record-comments.ts +79 -0
  273. package/src/infrastructure/database/drizzle/schema.ts +12 -0
  274. package/src/infrastructure/database/field-utils.ts +87 -0
  275. package/src/infrastructure/database/filter-operators.ts +136 -0
  276. package/src/infrastructure/database/formula/formula-trigger-generators.ts +114 -0
  277. package/src/infrastructure/database/formula/formula-utils.ts +440 -0
  278. package/src/infrastructure/database/generators/index-generators.ts +152 -0
  279. package/src/infrastructure/database/generators/trigger-generators.ts +154 -0
  280. package/src/infrastructure/database/index.ts +35 -0
  281. package/src/infrastructure/database/lookup/lookup-expression-generators.ts +356 -0
  282. package/src/infrastructure/database/lookup/lookup-expressions.ts +116 -0
  283. package/src/infrastructure/database/lookup/lookup-view-generators.ts +403 -0
  284. package/src/infrastructure/database/lookup/lookup-view-helpers.ts +65 -0
  285. package/src/infrastructure/database/lookup/lookup-view-triggers.ts +121 -0
  286. package/src/infrastructure/database/migration-audit-trail.ts +375 -0
  287. package/src/infrastructure/database/repositories/activity-log-repository-live.ts +99 -0
  288. package/src/infrastructure/database/repositories/activity-repository-live.ts +21 -0
  289. package/src/infrastructure/database/repositories/analytics-repository-live.ts +316 -0
  290. package/src/infrastructure/database/repositories/auth-repository-live.ts +42 -0
  291. package/src/infrastructure/database/repositories/batch-repository-live.ts +29 -0
  292. package/src/infrastructure/database/repositories/comment-repository-live.ts +39 -0
  293. package/src/infrastructure/database/repositories/table-repository-live.ts +38 -0
  294. package/src/infrastructure/database/schema/schema-dependency-sorting.ts +142 -0
  295. package/src/infrastructure/database/schema/schema-initializer.ts +598 -0
  296. package/src/infrastructure/database/schema-migration/column-detection.ts +286 -0
  297. package/src/infrastructure/database/schema-migration/constants.ts +31 -0
  298. package/src/infrastructure/database/schema-migration/constraint-sync.ts +288 -0
  299. package/src/infrastructure/database/schema-migration/index-sync.ts +108 -0
  300. package/src/infrastructure/database/schema-migration/index.ts +66 -0
  301. package/src/infrastructure/database/schema-migration/migration-statements.ts +106 -0
  302. package/src/infrastructure/database/schema-migration/rename-detection.ts +87 -0
  303. package/src/infrastructure/database/schema-migration/table-operations.ts +65 -0
  304. package/src/infrastructure/database/schema-migration/type-utils.ts +98 -0
  305. package/src/infrastructure/database/schema-migration/types.ts +14 -0
  306. package/src/infrastructure/database/schema-migration-helpers.ts +53 -0
  307. package/src/infrastructure/database/session-context.ts +20 -0
  308. package/src/infrastructure/database/sql/sql-check-constraints.ts +252 -0
  309. package/src/infrastructure/database/sql/sql-column-generators.ts +174 -0
  310. package/src/infrastructure/database/sql/sql-execution.ts +245 -0
  311. package/src/infrastructure/database/sql/sql-field-predicates.ts +81 -0
  312. package/src/infrastructure/database/sql/sql-generators.ts +91 -0
  313. package/src/infrastructure/database/sql/sql-junction-tables.ts +79 -0
  314. package/src/infrastructure/database/sql/sql-key-constraints.ts +210 -0
  315. package/src/infrastructure/database/sql/sql-type-mappings.ts +106 -0
  316. package/src/infrastructure/database/sql/sql-utils.ts +53 -0
  317. package/src/infrastructure/database/table-live-layers.ts +30 -0
  318. package/src/infrastructure/database/table-operations/column-generators.ts +82 -0
  319. package/src/infrastructure/database/table-operations/create-table-sql.ts +81 -0
  320. package/src/infrastructure/database/table-operations/index.ts +55 -0
  321. package/src/infrastructure/database/table-operations/migration-utils.ts +157 -0
  322. package/src/infrastructure/database/table-operations/table-effects.ts +234 -0
  323. package/src/infrastructure/database/table-operations/table-features.ts +96 -0
  324. package/src/infrastructure/database/table-operations/type-compatibility.ts +58 -0
  325. package/src/infrastructure/database/table-operations.ts +47 -0
  326. package/src/infrastructure/database/table-queries/batch/batch-create.ts +80 -0
  327. package/src/infrastructure/database/table-queries/batch/batch-delete.ts +212 -0
  328. package/src/infrastructure/database/table-queries/batch/batch-helpers.ts +124 -0
  329. package/src/infrastructure/database/table-queries/batch/batch-restore.ts +161 -0
  330. package/src/infrastructure/database/table-queries/batch/batch-update.ts +146 -0
  331. package/src/infrastructure/database/table-queries/batch/batch-upsert.ts +357 -0
  332. package/src/infrastructure/database/table-queries/batch/batch.ts +14 -0
  333. package/src/infrastructure/database/table-queries/crud/crud-read.ts +351 -0
  334. package/src/infrastructure/database/table-queries/crud/crud-write.ts +399 -0
  335. package/src/infrastructure/database/table-queries/crud/crud.ts +16 -0
  336. package/src/infrastructure/database/table-queries/index.ts +11 -0
  337. package/src/infrastructure/database/table-queries/mutation-helpers/authorship-helpers.ts +152 -0
  338. package/src/infrastructure/database/table-queries/mutation-helpers/create-record-helpers.ts +90 -0
  339. package/src/infrastructure/database/table-queries/mutation-helpers/delete-helpers.ts +163 -0
  340. package/src/infrastructure/database/table-queries/mutation-helpers/record-fetch-helpers.ts +79 -0
  341. package/src/infrastructure/database/table-queries/mutation-helpers/update-helpers.ts +74 -0
  342. package/src/infrastructure/database/table-queries/query-helpers/activity-log-helpers.ts +53 -0
  343. package/src/infrastructure/database/table-queries/query-helpers/activity-queries.ts +106 -0
  344. package/src/infrastructure/database/table-queries/query-helpers/aggregation-helpers.ts +314 -0
  345. package/src/infrastructure/database/table-queries/query-helpers/comment-queries.ts +414 -0
  346. package/src/infrastructure/database/table-queries/query-helpers/record-validation-queries.ts +126 -0
  347. package/src/infrastructure/database/table-queries/query-helpers/trash-helpers.ts +58 -0
  348. package/src/infrastructure/database/table-queries/shared/error-handling.ts +47 -0
  349. package/src/infrastructure/database/table-queries/shared/typed-execute.ts +27 -0
  350. package/src/infrastructure/database/table-queries/shared/user-join-helpers.ts +38 -0
  351. package/src/infrastructure/database/table-queries/shared/validation.ts +39 -0
  352. package/src/infrastructure/database/views/view-generators.ts +258 -0
  353. package/src/infrastructure/devtools/devtools-layer.ts +43 -0
  354. package/src/infrastructure/devtools/index.ts +8 -0
  355. package/src/infrastructure/email/email-config.ts +103 -0
  356. package/src/infrastructure/email/email-service.ts +152 -0
  357. package/src/infrastructure/email/index.ts +107 -0
  358. package/src/infrastructure/email/nodemailer.ts +125 -0
  359. package/src/infrastructure/email/templates.ts +244 -0
  360. package/src/infrastructure/errors/auth-config-required-error.ts +21 -0
  361. package/src/infrastructure/errors/auth-error.ts +16 -0
  362. package/src/infrastructure/errors/css-compilation-error.ts +14 -0
  363. package/src/infrastructure/errors/index.ts +26 -0
  364. package/src/infrastructure/errors/schema-initialization-error.ts +19 -0
  365. package/src/infrastructure/errors/server-creation-error.ts +14 -0
  366. package/src/infrastructure/filesystem/copy-directory.ts +136 -0
  367. package/src/infrastructure/layers/app-layer.ts +61 -0
  368. package/src/infrastructure/layers/page-renderer-layer.ts +41 -0
  369. package/src/infrastructure/logging/index.ts +8 -0
  370. package/src/infrastructure/logging/logger.ts +204 -0
  371. package/src/infrastructure/schema/file-loader.ts +53 -0
  372. package/src/infrastructure/schema/index.ts +15 -0
  373. package/src/infrastructure/schema/remote-loader.ts +48 -0
  374. package/src/infrastructure/server/index.ts +26 -0
  375. package/src/infrastructure/server/language-detection.ts +87 -0
  376. package/src/infrastructure/server/lifecycle.ts +67 -0
  377. package/src/infrastructure/server/route-setup/api-routes.ts +310 -0
  378. package/src/infrastructure/server/route-setup/auth-route-utils.ts +399 -0
  379. package/src/infrastructure/server/route-setup/auth-routes.ts +245 -0
  380. package/src/infrastructure/server/route-setup/openapi-routes.ts +45 -0
  381. package/src/infrastructure/server/route-setup/openapi-schema.ts +120 -0
  382. package/src/infrastructure/server/route-setup/page-routes.ts +219 -0
  383. package/src/infrastructure/server/route-setup/static-assets.ts +191 -0
  384. package/src/infrastructure/server/server-factory-live.ts +45 -0
  385. package/src/infrastructure/server/server.ts +275 -0
  386. package/src/infrastructure/server/ssg-adapter.ts +196 -0
  387. package/src/infrastructure/server/static-site-generator-live.ts +20 -0
  388. package/src/infrastructure/utils/accept-language-parser.ts +106 -0
  389. package/src/infrastructure/utils/glob-matcher.ts +50 -0
  390. package/src/presentation/api/client.ts +114 -0
  391. package/src/presentation/api/middleware/auth.ts +233 -0
  392. package/src/presentation/api/middleware/table.ts +155 -0
  393. package/src/presentation/api/middleware/validation.ts +88 -0
  394. package/src/presentation/api/routes/activity/get-activity-by-id-handler.ts +77 -0
  395. package/src/presentation/api/routes/activity/index.ts +28 -0
  396. package/src/presentation/api/routes/activity.ts +339 -0
  397. package/src/presentation/api/routes/analytics.ts +328 -0
  398. package/src/presentation/api/routes/auth.ts +169 -0
  399. package/src/presentation/api/routes/index.ts +11 -0
  400. package/src/presentation/api/routes/tables/activity-handlers.ts +57 -0
  401. package/src/presentation/api/routes/tables/batch-permission-helpers.ts +163 -0
  402. package/src/presentation/api/routes/tables/batch-routes.ts +355 -0
  403. package/src/presentation/api/routes/tables/comment-handlers.ts +377 -0
  404. package/src/presentation/api/routes/tables/create-record-helpers.ts +179 -0
  405. package/src/presentation/api/routes/tables/effect-runner.ts +58 -0
  406. package/src/presentation/api/routes/tables/error-handlers.ts +53 -0
  407. package/src/presentation/api/routes/tables/field-permission-validation.ts +167 -0
  408. package/src/presentation/api/routes/tables/filter-parser.ts +75 -0
  409. package/src/presentation/api/routes/tables/formula-parser.ts +118 -0
  410. package/src/presentation/api/routes/tables/index.ts +113 -0
  411. package/src/presentation/api/routes/tables/list-records-filter.ts +54 -0
  412. package/src/presentation/api/routes/tables/param-parsers.ts +59 -0
  413. package/src/presentation/api/routes/tables/record-handlers.ts +484 -0
  414. package/src/presentation/api/routes/tables/record-routes.ts +53 -0
  415. package/src/presentation/api/routes/tables/record-update-handler.ts +200 -0
  416. package/src/presentation/api/routes/tables/sort-validation.ts +85 -0
  417. package/src/presentation/api/routes/tables/table-routes.ts +76 -0
  418. package/src/presentation/api/routes/tables/timezone-validation.ts +41 -0
  419. package/src/presentation/api/routes/tables/upsert-helpers.ts +471 -0
  420. package/src/presentation/api/routes/tables/utils.ts +159 -0
  421. package/src/presentation/api/routes/tables/view-routes.ts +51 -0
  422. package/src/presentation/api/routes/tables.ts +9 -0
  423. package/src/presentation/api/utils/context-helpers.ts +43 -0
  424. package/src/presentation/api/utils/error-sanitizer.ts +235 -0
  425. package/src/presentation/api/utils/field-permission-validator.ts +53 -0
  426. package/src/presentation/api/utils/filter-field-validator.ts +90 -0
  427. package/src/presentation/api/utils/index.ts +13 -0
  428. package/src/presentation/api/utils/run-effect.ts +94 -0
  429. package/src/presentation/api/utils/validate-request.ts +89 -0
  430. package/src/presentation/api/validation/index.ts +29 -0
  431. package/src/presentation/api/validation/rules/field-rules.ts +158 -0
  432. package/src/presentation/api/validation/rules/record-rules.ts +73 -0
  433. package/src/presentation/cli/index.ts +19 -0
  434. package/src/presentation/cli/schema-loader.ts +172 -0
  435. package/src/presentation/hooks/use-breakpoint.ts +155 -0
  436. package/src/presentation/rendering/render-error-pages.tsx +60 -0
  437. package/src/presentation/rendering/render-homepage.tsx +137 -0
  438. package/src/presentation/scripts/script-renderers.ts +112 -0
  439. package/src/presentation/styling/animation-composer.ts +117 -0
  440. package/src/presentation/styling/index.ts +13 -0
  441. package/src/presentation/styling/parse-style.ts +243 -0
  442. package/src/presentation/styling/style-utils.ts +50 -0
  443. package/src/presentation/styling/theme-colors.ts +53 -0
  444. package/src/presentation/translations/component-utils.ts +54 -0
  445. package/src/presentation/translations/index.ts +16 -0
  446. package/src/presentation/translations/translation-resolver.ts +22 -0
  447. package/src/presentation/ui/languages/language-switcher.tsx +119 -0
  448. package/src/presentation/ui/metadata/analytics-builders.tsx +174 -0
  449. package/src/presentation/ui/metadata/analytics-head.tsx +39 -0
  450. package/src/presentation/ui/metadata/custom-elements-builders.tsx +157 -0
  451. package/src/presentation/ui/metadata/extract-component-meta.ts +108 -0
  452. package/src/presentation/ui/metadata/head-elements.tsx +164 -0
  453. package/src/presentation/ui/metadata/index.tsx +35 -0
  454. package/src/presentation/ui/metadata/meta-utils.tsx +42 -0
  455. package/src/presentation/ui/metadata/open-graph-meta.tsx +57 -0
  456. package/src/presentation/ui/metadata/structured-data-from-component.tsx +134 -0
  457. package/src/presentation/ui/metadata/structured-data.tsx +88 -0
  458. package/src/presentation/ui/metadata/twitter-card-meta.tsx +80 -0
  459. package/src/presentation/ui/pages/DefaultHomePage.tsx +43 -0
  460. package/src/presentation/ui/pages/DefaultPageConfigs.ts +220 -0
  461. package/src/presentation/ui/pages/DynamicPage.tsx +307 -0
  462. package/src/presentation/ui/pages/ErrorPage.tsx +25 -0
  463. package/src/presentation/ui/pages/NotFoundPage.tsx +25 -0
  464. package/src/presentation/ui/pages/PageBodyScripts.tsx +242 -0
  465. package/src/presentation/ui/pages/PageBodyStyles.ts +52 -0
  466. package/src/presentation/ui/pages/PageHead.tsx +380 -0
  467. package/src/presentation/ui/pages/PageLangResolver.ts +58 -0
  468. package/src/presentation/ui/pages/PageMain.tsx +58 -0
  469. package/src/presentation/ui/pages/PageMetadata.ts +168 -0
  470. package/src/presentation/ui/pages/PageMetadataI18n.ts +169 -0
  471. package/src/presentation/ui/pages/PageScripts.ts +78 -0
  472. package/src/presentation/ui/pages/SectionRenderer.tsx +67 -0
  473. package/src/presentation/ui/pages/SectionSpacing.tsx +131 -0
  474. package/src/presentation/ui/sections/component-renderer.tsx +426 -0
  475. package/src/presentation/ui/sections/component-renderer.types.ts +33 -0
  476. package/src/presentation/ui/sections/components/component-reference-handler.tsx +74 -0
  477. package/src/presentation/ui/sections/components/component-resolution.ts +65 -0
  478. package/src/presentation/ui/sections/components/index.ts +9 -0
  479. package/src/presentation/ui/sections/hero.tsx +394 -0
  480. package/src/presentation/ui/sections/props/component-builder.ts +183 -0
  481. package/src/presentation/ui/sections/props/element-props.ts +179 -0
  482. package/src/presentation/ui/sections/props/index.ts +9 -0
  483. package/src/presentation/ui/sections/props/prop-conversion.ts +171 -0
  484. package/src/presentation/ui/sections/props/props-builder-config.ts +42 -0
  485. package/src/presentation/ui/sections/props/props-builder.ts +296 -0
  486. package/src/presentation/ui/sections/renderers/element-renderers/html-element-renderer.tsx +124 -0
  487. package/src/presentation/ui/sections/renderers/element-renderers/index.ts +59 -0
  488. package/src/presentation/ui/sections/renderers/element-renderers/interactive-renderers.tsx +231 -0
  489. package/src/presentation/ui/sections/renderers/element-renderers/media-renderers.tsx +102 -0
  490. package/src/presentation/ui/sections/renderers/element-renderers/text-content-renderers.tsx +42 -0
  491. package/src/presentation/ui/sections/renderers/element-renderers.ts +53 -0
  492. package/src/presentation/ui/sections/renderers/html-element-helpers.ts +100 -0
  493. package/src/presentation/ui/sections/renderers/specialized-renderers.tsx +212 -0
  494. package/src/presentation/ui/sections/rendering/component-dispatch-config.ts +31 -0
  495. package/src/presentation/ui/sections/rendering/component-registry/index.ts +39 -0
  496. package/src/presentation/ui/sections/rendering/component-registry/interactive-components.ts +54 -0
  497. package/src/presentation/ui/sections/rendering/component-registry/media-components.ts +36 -0
  498. package/src/presentation/ui/sections/rendering/component-registry/special-components.tsx +153 -0
  499. package/src/presentation/ui/sections/rendering/component-registry/structural-components.ts +215 -0
  500. package/src/presentation/ui/sections/rendering/component-registry/text-components.ts +57 -0
  501. package/src/presentation/ui/sections/rendering/component-registry-helpers.tsx +29 -0
  502. package/src/presentation/ui/sections/rendering/component-registry.tsx +21 -0
  503. package/src/presentation/ui/sections/rendering/component-type-dispatcher.tsx +33 -0
  504. package/src/presentation/ui/sections/rendering/index.ts +9 -0
  505. package/src/presentation/ui/sections/responsive/responsive-children-builder.tsx +96 -0
  506. package/src/presentation/ui/sections/responsive/responsive-content-builder.tsx +95 -0
  507. package/src/presentation/ui/sections/responsive/responsive-props-merger.ts +195 -0
  508. package/src/presentation/ui/sections/responsive/responsive-resolver.ts +213 -0
  509. package/src/presentation/ui/sections/styling/animation-composer-wrapper.ts +65 -0
  510. package/src/presentation/ui/sections/styling/class-builders.ts +45 -0
  511. package/src/presentation/ui/sections/styling/color-resolver.ts +43 -0
  512. package/src/presentation/ui/sections/styling/hover-interaction-handler.ts +107 -0
  513. package/src/presentation/ui/sections/styling/index.ts +9 -0
  514. package/src/presentation/ui/sections/styling/interaction-props-builder.ts +55 -0
  515. package/src/presentation/ui/sections/styling/shadow-resolver.ts +83 -0
  516. package/src/presentation/ui/sections/styling/spacing-resolver.ts +104 -0
  517. package/src/presentation/ui/sections/styling/style-processor.ts +170 -0
  518. package/src/presentation/ui/sections/styling/theme-tokens.ts +184 -0
  519. package/src/presentation/ui/sections/translations/i18n-content-resolver.ts +198 -0
  520. package/src/presentation/ui/sections/translations/index.ts +9 -0
  521. package/src/presentation/ui/sections/translations/translation-handler.ts +143 -0
  522. package/src/presentation/ui/sections/translations/variable-substitution.ts +225 -0
  523. package/src/presentation/ui/sections/utils/time-parser.ts +82 -0
  524. package/src/presentation/utils/link-attributes.ts +50 -0
  525. package/src/presentation/utils/string-utils.ts +58 -0
  526. package/src/presentation/utils/styles.ts +50 -0
  527. package/tsconfig.json +46 -0
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Copyright (c) 2025 ESSENTIAL SERVICES
3
+ *
4
+ * This source code is licensed under the Business Source License 1.1
5
+ * found in the LICENSE.md file in the root directory of this source tree.
6
+ */
7
+
8
+ import { Schema } from 'effect'
9
+ import {
10
+ DurationSchema,
11
+ EasingFunctionSchema,
12
+ } from '@/domain/models/app/page/common/interactions/hover-interaction'
13
+
14
+ /**
15
+ * Animation configuration object
16
+ *
17
+ * Detailed animation config with duration, easing, delay, and keyframes.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const config = {
22
+ * enabled: true,
23
+ * duration: '300ms',
24
+ * easing: 'ease-in-out',
25
+ * delay: '0ms',
26
+ * }
27
+ * ```
28
+ *
29
+ * @see specs/app/theme/animations/animations.schema.json#/patternProperties/.../oneOf[2]
30
+ */
31
+ export const AnimationConfigObjectSchema = Schema.Struct({
32
+ enabled: Schema.optional(Schema.Boolean),
33
+ duration: Schema.optional(DurationSchema),
34
+ easing: Schema.optional(EasingFunctionSchema),
35
+ delay: Schema.optional(DurationSchema),
36
+ keyframes: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
37
+ }).pipe(
38
+ Schema.annotations({
39
+ title: 'Animation Configuration Object',
40
+ description: 'Detailed animation configuration',
41
+ })
42
+ )
43
+
44
+ /**
45
+ * Animation value (boolean, string, or object)
46
+ *
47
+ * Flexible animation configuration:
48
+ * - Boolean: Simple enable/disable (true/false)
49
+ * - String: CSS animation value or class name
50
+ * - Object: Detailed config (duration, easing, delay, keyframes)
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * const simple = true
55
+ * const className = 'animate-fade-in'
56
+ * const detailed = {
57
+ * enabled: true,
58
+ * duration: '300ms',
59
+ * easing: 'ease-in-out',
60
+ * }
61
+ * ```
62
+ *
63
+ * @see specs/app/theme/animations/animations.schema.json#/patternProperties/.../oneOf
64
+ */
65
+ export const AnimationValueSchema = Schema.Union(
66
+ Schema.Boolean,
67
+ Schema.String,
68
+ AnimationConfigObjectSchema
69
+ ).pipe(
70
+ Schema.annotations({
71
+ title: 'Animation Value',
72
+ description: 'Animation configuration (boolean, string, or object)',
73
+ })
74
+ )
75
+
76
+ /**
77
+ * Duration design tokens schema
78
+ *
79
+ * Map of duration token names to CSS duration values.
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const durations = {
84
+ * fast: '200ms',
85
+ * normal: '300ms',
86
+ * slow: '500ms',
87
+ * }
88
+ * ```
89
+ */
90
+ const DurationTokensSchema = Schema.Record({
91
+ key: Schema.String.pipe(
92
+ Schema.pattern(/^[a-zA-Z][a-zA-Z0-9]*$/, {
93
+ message: () =>
94
+ 'Duration key must start with a letter and contain only alphanumeric characters',
95
+ })
96
+ ),
97
+ value: DurationSchema,
98
+ })
99
+
100
+ /**
101
+ * Easing function design tokens schema
102
+ *
103
+ * Map of easing token names to CSS easing functions.
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * const easings = {
108
+ * smooth: 'cubic-bezier(0.4, 0, 0.2, 1)',
109
+ * bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',
110
+ * }
111
+ * ```
112
+ */
113
+ const EasingTokensSchema = Schema.Record({
114
+ key: Schema.String.pipe(
115
+ Schema.pattern(/^[a-zA-Z][a-zA-Z0-9]*$/, {
116
+ message: () => 'Easing key must start with a letter and contain only alphanumeric characters',
117
+ })
118
+ ),
119
+ value: EasingFunctionSchema,
120
+ })
121
+
122
+ /**
123
+ * Keyframes design tokens schema
124
+ *
125
+ * Map of keyframe animation names to CSS keyframe definitions.
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * const keyframes = {
130
+ * fadeIn: {
131
+ * from: { opacity: '0' },
132
+ * to: { opacity: '1' },
133
+ * },
134
+ * colorPulse: {
135
+ * '0%': { backgroundColor: '$colors.primary' },
136
+ * '50%': { backgroundColor: '$colors.accent' },
137
+ * '100%': { backgroundColor: '$colors.primary' },
138
+ * },
139
+ * }
140
+ * ```
141
+ */
142
+ const KeyframesTokensSchema = Schema.Record({
143
+ key: Schema.String.pipe(
144
+ Schema.pattern(/^[a-zA-Z][a-zA-Z0-9]*$/, {
145
+ message: () =>
146
+ 'Keyframe key must start with a letter and contain only alphanumeric characters',
147
+ })
148
+ ),
149
+ value: Schema.Record({ key: Schema.String, value: Schema.Unknown }),
150
+ })
151
+
152
+ /**
153
+ * Animation configuration (animation and transition design tokens)
154
+ *
155
+ * Supports two formats:
156
+ * 1. Nested design tokens (duration, easing, keyframes)
157
+ * 2. Legacy flat animation names
158
+ *
159
+ * @example
160
+ * ```typescript
161
+ * // Nested design tokens
162
+ * const animations = {
163
+ * duration: { fast: '200ms', normal: '300ms', slow: '500ms' },
164
+ * easing: { smooth: 'cubic-bezier(0.4, 0, 0.2, 1)', bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)' },
165
+ * keyframes: {
166
+ * fadeIn: { from: { opacity: '0' }, to: { opacity: '1' } },
167
+ * colorPulse: { '0%': { backgroundColor: '$colors.primary' }, '50%': { backgroundColor: '$colors.accent' }, '100%': { backgroundColor: '$colors.primary' } },
168
+ * },
169
+ * }
170
+ *
171
+ * // Legacy flat animations
172
+ * const animations = {
173
+ * fadeIn: true,
174
+ * slideUp: 'animate-slide-up',
175
+ * modalOpen: { enabled: true, duration: '300ms', easing: 'ease-in-out' },
176
+ * }
177
+ * ```
178
+ *
179
+ * @see specs/app/theme/animations/animations.schema.json
180
+ */
181
+ export const AnimationsConfigSchema = Schema.Record({
182
+ key: Schema.String.pipe(
183
+ Schema.pattern(/^[a-zA-Z][a-zA-Z0-9]*$/, {
184
+ message: () =>
185
+ 'Animation key must start with a letter and contain only alphanumeric characters',
186
+ }),
187
+ Schema.annotations({
188
+ title: 'Animation Key',
189
+ description: 'Animation name (alphanumeric)',
190
+ examples: ['fadeIn', 'slideUp', 'modalOpen', 'duration', 'easing', 'keyframes'],
191
+ })
192
+ ),
193
+ value: Schema.Union(
194
+ AnimationValueSchema,
195
+ DurationTokensSchema,
196
+ EasingTokensSchema,
197
+ KeyframesTokensSchema
198
+ ),
199
+ }).pipe(
200
+ Schema.annotations({
201
+ title: 'Animation Configuration',
202
+ description: 'Animation and transition design tokens',
203
+ })
204
+ )
205
+
206
+ export type AnimationConfigObject = Schema.Schema.Type<typeof AnimationConfigObjectSchema>
207
+ export type AnimationValue = Schema.Schema.Type<typeof AnimationValueSchema>
208
+ export type AnimationsConfig = Schema.Schema.Type<typeof AnimationsConfigSchema>
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Copyright (c) 2025 ESSENTIAL SERVICES
3
+ *
4
+ * This source code is licensed under the Business Source License 1.1
5
+ * found in the LICENSE.md file in the root directory of this source tree.
6
+ */
7
+
8
+ import { Schema } from 'effect'
9
+
10
+ /**
11
+ * Border radius configuration (design tokens for rounded corners)
12
+ *
13
+ * Map of semantic radius names to CSS border-radius values.
14
+ * Supports progressive rounding scale:
15
+ * - none: 0 (sharp corners)
16
+ * - sm, md, lg, xl, 2xl, 3xl: progressive rounding
17
+ * - full: 9999px (perfect circles/pills)
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const borderRadius = {
22
+ * none: '0',
23
+ * sm: '0.125rem',
24
+ * md: '0.375rem',
25
+ * lg: '0.5rem',
26
+ * full: '9999px',
27
+ * }
28
+ * ```
29
+ *
30
+ * @see specs/app/theme/border-radius/border-radius.schema.json
31
+ */
32
+ export const BorderRadiusConfigSchema = Schema.Record({
33
+ key: Schema.String.pipe(
34
+ Schema.pattern(/^(DEFAULT|[a-z0-9]+(-[a-z0-9]+)*)$/, {
35
+ message: () =>
36
+ 'Border radius key must be DEFAULT or use kebab-case format (lowercase letters/numbers)',
37
+ }),
38
+ Schema.annotations({
39
+ title: 'Border Radius Key',
40
+ description: 'Semantic radius name (kebab-case with numbers) or DEFAULT for base radius',
41
+ examples: ['DEFAULT', 'none', 'sm', 'md', 'lg', '2xl', '3xl', 'full'],
42
+ })
43
+ ),
44
+ value: Schema.String.pipe(
45
+ Schema.annotations({
46
+ title: 'Border Radius Value',
47
+ description: 'CSS border-radius value',
48
+ examples: ['0', '0.125rem', '0.5rem', '9999px'],
49
+ })
50
+ ),
51
+ }).pipe(
52
+ Schema.annotations({
53
+ title: 'Border Radius',
54
+ description: 'Border radius design tokens',
55
+ })
56
+ )
57
+
58
+ export type BorderRadiusConfig = Schema.Schema.Type<typeof BorderRadiusConfigSchema>
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Copyright (c) 2025 ESSENTIAL SERVICES
3
+ *
4
+ * This source code is licensed under the Business Source License 1.1
5
+ * found in the LICENSE.md file in the root directory of this source tree.
6
+ */
7
+
8
+ import { Schema } from 'effect'
9
+
10
+ /**
11
+ * Breakpoints configuration (responsive design breakpoints)
12
+ *
13
+ * Map of breakpoint names to pixel values.
14
+ * Standard Tailwind breakpoints:
15
+ * - sm: 640px (mobile)
16
+ * - md: 768px (tablet)
17
+ * - lg: 1024px (laptop)
18
+ * - xl: 1280px (desktop)
19
+ * - 2xl: 1536px (large desktop)
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const breakpoints = {
24
+ * sm: '640px',
25
+ * md: '768px',
26
+ * lg: '1024px',
27
+ * xl: '1280px',
28
+ * '2xl': '1536px',
29
+ * }
30
+ * ```
31
+ *
32
+ * @see specs/app/theme/breakpoints/breakpoints.schema.json
33
+ */
34
+ export const BreakpointsConfigSchema = Schema.Record({
35
+ key: Schema.String.pipe(
36
+ Schema.pattern(/^[a-z0-9]+$/, {
37
+ message: () => 'Breakpoint key must be lowercase alphanumeric',
38
+ }),
39
+ Schema.annotations({
40
+ title: 'Breakpoint Key',
41
+ description: 'Breakpoint name (lowercase alphanumeric)',
42
+ examples: ['sm', 'md', 'lg', 'xl', '2xl'],
43
+ })
44
+ ),
45
+ value: Schema.String.pipe(
46
+ Schema.pattern(/^[0-9]+px$/, {
47
+ message: () => 'Breakpoint value must be in pixels (e.g., "640px")',
48
+ }),
49
+ Schema.annotations({
50
+ title: 'Breakpoint Value',
51
+ description: 'Breakpoint value in pixels',
52
+ examples: ['640px', '768px', '1024px', '1280px'],
53
+ })
54
+ ),
55
+ }).pipe(
56
+ Schema.annotations({
57
+ title: 'Breakpoints',
58
+ description: 'Responsive design breakpoints',
59
+ })
60
+ )
61
+
62
+ export type BreakpointsConfig = Schema.Schema.Type<typeof BreakpointsConfigSchema>
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Copyright (c) 2025 ESSENTIAL SERVICES
3
+ *
4
+ * This source code is licensed under the Business Source License 1.1
5
+ * found in the LICENSE.md file in the root directory of this source tree.
6
+ */
7
+
8
+ import { Schema } from 'effect'
9
+
10
+ /**
11
+ * Color name in kebab-case format
12
+ *
13
+ * Supports semantic naming (primary, secondary) and variants:
14
+ * - Base colors: primary, secondary, success, danger
15
+ * - Variants: primary-hover, primary-light, primary-dark
16
+ * - Numbered scales: gray-100, gray-200, ..., gray-900
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const base = 'primary'
21
+ * const variant = 'primary-hover'
22
+ * const scale = 'gray-500'
23
+ * ```
24
+ *
25
+ * @see specs/app/theme/colors/colors.schema.json#/patternProperties
26
+ */
27
+ export const ColorNameSchema = Schema.String.pipe(
28
+ Schema.pattern(/^[a-z]+[a-z0-9]*(-[a-z0-9]+)*$/, {
29
+ message: () =>
30
+ 'Color name must use kebab-case format: lowercase letters and numbers separated by hyphens (e.g., "primary", "text-muted", "gray-500")',
31
+ }),
32
+ Schema.annotations({
33
+ title: 'Color Name',
34
+ description: 'Color name in kebab-case format',
35
+ examples: ['primary', 'primary-hover', 'gray-500', 'text-muted'],
36
+ })
37
+ )
38
+
39
+ /**
40
+ * Color value in various CSS formats
41
+ *
42
+ * Supports multiple color formats:
43
+ * - Hex 6-digit: #007bff (standard)
44
+ * - Hex 8-digit: #007bff80 (with alpha channel)
45
+ * - RGB: rgb(255, 0, 0)
46
+ * - RGBA: rgba(255, 0, 0, 0.5)
47
+ * - HSL: hsl(210, 100%, 50%)
48
+ * - HSLA: hsla(210, 100%, 50%, 0.8)
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * const hex6 = '#007bff'
53
+ * const hex8 = '#007bff80' // 50% opacity
54
+ * const rgb = 'rgb(0, 123, 255)'
55
+ * const hsl = 'hsl(210, 100%, 50%)'
56
+ * ```
57
+ *
58
+ * @see specs/app/theme/colors/colors.schema.json#/patternProperties/.../pattern
59
+ */
60
+ export const ColorValueSchema = Schema.String.pipe(
61
+ Schema.pattern(/^#[0-9A-Fa-f]{6}$|^#[0-9A-Fa-f]{8}$|^rgb\(|^rgba\(|^hsl\(|^hsla\(/, {
62
+ message: () => 'Color value must be in hex (#RRGGBB or #RRGGBBAA), rgb(a), or hsl(a) format',
63
+ }),
64
+ Schema.annotations({
65
+ title: 'Color Value',
66
+ description: 'Color value in hex, rgb, rgba, hsl, or hsla format',
67
+ examples: ['#007bff', '#007bff80', 'rgb(0, 123, 255)', 'hsl(210, 100%, 50%)'],
68
+ })
69
+ )
70
+
71
+ /**
72
+ * Color palette (design tokens)
73
+ *
74
+ * Map of semantic color names to CSS color values.
75
+ * Supports comprehensive color systems with:
76
+ * - Semantic colors (primary, secondary, success, danger, warning, info)
77
+ * - Variants (hover states, light/dark tints)
78
+ * - Numbered scales (gray-100 to gray-900)
79
+ * - Multiple formats (hex, rgb, hsl with optional alpha)
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const colors = {
84
+ * primary: '#007bff',
85
+ * 'primary-hover': '#0056b3',
86
+ * 'primary-light': '#e7f1ff',
87
+ * secondary: '#6c757d',
88
+ * success: '#28a745',
89
+ * danger: '#dc3545',
90
+ * 'gray-100': '#f8f9fa',
91
+ * 'gray-500': '#adb5bd',
92
+ * 'gray-900': '#212529',
93
+ * }
94
+ * ```
95
+ *
96
+ * @see specs/app/theme/colors/colors.schema.json
97
+ */
98
+ export const ColorsConfigSchema = Schema.Record({
99
+ key: ColorNameSchema,
100
+ value: ColorValueSchema,
101
+ }).pipe(
102
+ Schema.annotations({
103
+ title: 'Color Palette',
104
+ description: 'Color design tokens with support for semantic naming and variants',
105
+ })
106
+ )
107
+
108
+ export type ColorName = Schema.Schema.Type<typeof ColorNameSchema>
109
+ export type ColorValue = Schema.Schema.Type<typeof ColorValueSchema>
110
+ export type ColorsConfig = Schema.Schema.Type<typeof ColorsConfigSchema>
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Copyright (c) 2025 ESSENTIAL SERVICES
3
+ *
4
+ * This source code is licensed under the Business Source License 1.1
5
+ * found in the LICENSE.md file in the root directory of this source tree.
6
+ */
7
+
8
+ import { Schema } from 'effect'
9
+
10
+ /**
11
+ * Font weight (100-900 in increments of 100)
12
+ */
13
+ export const FontWeightSchema = Schema.Literal(100, 200, 300, 400, 500, 600, 700, 800, 900).pipe(
14
+ Schema.annotations({
15
+ title: 'Font Weight',
16
+ description: 'Font weight value (100-900 in increments of 100)',
17
+ })
18
+ )
19
+
20
+ /**
21
+ * Font style (normal, italic, oblique)
22
+ */
23
+ export const FontStyleSchema = Schema.Literal('normal', 'italic', 'oblique').pipe(
24
+ Schema.annotations({
25
+ title: 'Font Style',
26
+ description: 'Font style',
27
+ })
28
+ )
29
+
30
+ /**
31
+ * Text transformation (none, uppercase, lowercase, capitalize)
32
+ */
33
+ export const FontTransformSchema = Schema.Literal(
34
+ 'none',
35
+ 'uppercase',
36
+ 'lowercase',
37
+ 'capitalize'
38
+ ).pipe(
39
+ Schema.annotations({
40
+ title: 'Text Transform',
41
+ description: 'Text transformation',
42
+ })
43
+ )
44
+
45
+ /**
46
+ * Font category name (alphabetic characters only: title, body, mono, etc.)
47
+ */
48
+ export const FontCategoryKeySchema = Schema.String.pipe(
49
+ Schema.pattern(/^[a-zA-Z]+$/, {
50
+ message: () => 'Font category key must contain only alphabetic characters (a-zA-Z)',
51
+ }),
52
+ Schema.annotations({
53
+ title: 'Font Category Key',
54
+ description: 'Semantic font category name (alphabetic characters only)',
55
+ examples: ['title', 'body', 'mono', 'heading', 'label'],
56
+ })
57
+ )
58
+
59
+ /**
60
+ * Individual font configuration (family, fallback, weights, style, size, lineHeight, letterSpacing, transform, url)
61
+ *
62
+ * @see specs/app/theme/fonts/fonts.schema.json#/patternProperties/...
63
+ */
64
+ export const FontConfigItemSchema = Schema.Struct({
65
+ family: Schema.String.pipe(
66
+ Schema.annotations({
67
+ title: 'Font Family',
68
+ description: 'Primary font family name',
69
+ })
70
+ ),
71
+ fallback: Schema.optional(
72
+ Schema.String.pipe(
73
+ Schema.annotations({
74
+ title: 'Fallback Font Stack',
75
+ description: 'Fallback font stack',
76
+ examples: ['system-ui, sans-serif', 'Georgia, serif', 'monospace'],
77
+ })
78
+ )
79
+ ),
80
+ weights: Schema.optional(
81
+ Schema.Array(FontWeightSchema).pipe(
82
+ Schema.annotations({
83
+ title: 'Font Weights',
84
+ description: 'Available font weights',
85
+ examples: [
86
+ [400, 700],
87
+ [300, 400, 500, 600, 700],
88
+ ],
89
+ })
90
+ )
91
+ ),
92
+ style: Schema.optional(
93
+ FontStyleSchema.pipe(
94
+ Schema.annotations({
95
+ default: 'normal',
96
+ })
97
+ )
98
+ ),
99
+ size: Schema.optional(
100
+ Schema.String.pipe(
101
+ Schema.annotations({
102
+ title: 'Font Size',
103
+ description: 'Default font size',
104
+ examples: ['16px', '1rem', '14px'],
105
+ })
106
+ )
107
+ ),
108
+ lineHeight: Schema.optional(
109
+ Schema.String.pipe(
110
+ Schema.annotations({
111
+ title: 'Line Height',
112
+ description: 'Default line height',
113
+ examples: ['1.5', '1.75', '24px'],
114
+ })
115
+ )
116
+ ),
117
+ letterSpacing: Schema.optional(
118
+ Schema.String.pipe(
119
+ Schema.annotations({
120
+ title: 'Letter Spacing',
121
+ description: 'Letter spacing',
122
+ examples: ['0', '0.05em', '-0.01em'],
123
+ })
124
+ )
125
+ ),
126
+ transform: Schema.optional(FontTransformSchema),
127
+ url: Schema.optional(
128
+ Schema.String.pipe(
129
+ Schema.annotations({
130
+ title: 'Font URL',
131
+ description: 'Font file URL or Google Fonts URL',
132
+ examples: ['https://fonts.googleapis.com/css2?family=Inter', '/fonts/bely-display.woff2'],
133
+ })
134
+ )
135
+ ),
136
+ }).pipe(
137
+ Schema.annotations({
138
+ title: 'Font Configuration Item',
139
+ description: 'Individual font configuration with family and optional properties',
140
+ })
141
+ )
142
+
143
+ /**
144
+ * Font configuration (map of semantic font categories to font configurations)
145
+ *
146
+ * @see specs/app/theme/fonts/fonts.schema.json
147
+ */
148
+ export const FontsConfigSchema = Schema.Record({
149
+ key: FontCategoryKeySchema,
150
+ value: FontConfigItemSchema,
151
+ }).pipe(
152
+ Schema.annotations({
153
+ title: 'Font Configuration',
154
+ description: 'Typography design tokens for font families and styles',
155
+ })
156
+ )
157
+
158
+ // Type exports
159
+ export type FontWeight = Schema.Schema.Type<typeof FontWeightSchema>
160
+ export type FontStyle = Schema.Schema.Type<typeof FontStyleSchema>
161
+ export type FontTransform = Schema.Schema.Type<typeof FontTransformSchema>
162
+ export type FontCategoryKey = Schema.Schema.Type<typeof FontCategoryKeySchema>
163
+ export type FontConfigItem = Schema.Schema.Type<typeof FontConfigItemSchema>
164
+ export type FontsConfig = Schema.Schema.Type<typeof FontsConfigSchema>
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Copyright (c) 2025 ESSENTIAL SERVICES
3
+ *
4
+ * This source code is licensed under the Business Source License 1.1
5
+ * found in the LICENSE.md file in the root directory of this source tree.
6
+ */
7
+
8
+ import { Schema } from 'effect'
9
+
10
+ /**
11
+ * Shadow configuration (box shadow design tokens)
12
+ *
13
+ * Map of semantic shadow names to CSS box-shadow values.
14
+ * Supports elevation system:
15
+ * - sm, md, lg, xl, 2xl: progressive depth
16
+ * - inner: inset shadows
17
+ * - none: no shadow
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const shadows = {
22
+ * sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',
23
+ * md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',
24
+ * lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',
25
+ * inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)',
26
+ * none: '0 0 #0000',
27
+ * }
28
+ * ```
29
+ *
30
+ * @see specs/app/theme/shadows/shadows.schema.json
31
+ */
32
+ export const ShadowsConfigSchema = Schema.Record({
33
+ key: Schema.String.pipe(
34
+ Schema.pattern(/^[a-z0-9]+(-[a-z0-9]+)*$/, {
35
+ message: () => 'Shadow key must use kebab-case format (lowercase letters/numbers)',
36
+ }),
37
+ Schema.annotations({
38
+ title: 'Shadow Key',
39
+ description: 'Semantic shadow name (kebab-case with numbers)',
40
+ examples: ['sm', 'md', 'lg', 'xl', '2xl', 'inner', 'none'],
41
+ })
42
+ ),
43
+ value: Schema.String.pipe(
44
+ Schema.annotations({
45
+ title: 'Shadow Value',
46
+ description: 'CSS box-shadow value',
47
+ examples: [
48
+ '0 1px 2px 0 rgb(0 0 0 / 0.05)',
49
+ '0 4px 6px -1px rgb(0 0 0 / 0.1)',
50
+ 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)',
51
+ ],
52
+ })
53
+ ),
54
+ }).pipe(
55
+ Schema.annotations({
56
+ title: 'Shadows',
57
+ description: 'Box shadow design tokens',
58
+ })
59
+ )
60
+
61
+ export type ShadowsConfig = Schema.Schema.Type<typeof ShadowsConfigSchema>