@vamos-ui/react 0.0.0-stage → 0.2.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 (665) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -2
  3. package/dist/blocks/block-heading.d.ts +29 -0
  4. package/dist/blocks/block-heading.js +39 -0
  5. package/dist/blocks/block-image.d.ts +52 -0
  6. package/dist/blocks/block-image.js +48 -0
  7. package/dist/blocks/block-link.d.ts +30 -0
  8. package/dist/blocks/block-link.js +36 -0
  9. package/dist/blocks/create-blocks.d.ts +54 -0
  10. package/dist/blocks/create-blocks.js +52 -0
  11. package/dist/blocks/index.d.ts +55 -0
  12. package/dist/blocks/index.js +59 -0
  13. package/dist/blocks/json-ld.d.ts +18 -0
  14. package/dist/blocks/json-ld.js +44 -0
  15. package/dist/blocks/labels.d.ts +20 -0
  16. package/dist/blocks/labels.js +43 -0
  17. package/dist/blocks/rich-text.d.ts +36 -0
  18. package/dist/blocks/rich-text.js +106 -0
  19. package/dist/blocks/schema/define-block.d.ts +151 -0
  20. package/dist/blocks/schema/define-block.js +120 -0
  21. package/dist/blocks/schema/emphasis.d.ts +17 -0
  22. package/dist/blocks/schema/emphasis.js +69 -0
  23. package/dist/blocks/schema/fields.d.ts +497 -0
  24. package/dist/blocks/schema/fields.js +240 -0
  25. package/dist/blocks/schema/icons.d.ts +2 -0
  26. package/dist/blocks/schema/icons.js +26 -0
  27. package/dist/blocks/schema/index.d.ts +18 -0
  28. package/dist/blocks/schema/index.js +21 -0
  29. package/dist/blocks/schema/lint-types.d.ts +16 -0
  30. package/dist/blocks/schema/lint-types.js +2 -0
  31. package/dist/blocks/schema/lint.d.ts +32 -0
  32. package/dist/blocks/schema/lint.js +164 -0
  33. package/dist/blocks/schema/localize.d.ts +20 -0
  34. package/dist/blocks/schema/localize.js +29 -0
  35. package/dist/blocks/schema/localized.d.ts +25 -0
  36. package/dist/blocks/schema/localized.js +53 -0
  37. package/dist/blocks/schema/migrate.d.ts +24 -0
  38. package/dist/blocks/schema/migrate.js +75 -0
  39. package/dist/blocks/schema/nodes.d.ts +196 -0
  40. package/dist/blocks/schema/nodes.js +78 -0
  41. package/dist/blocks/schema/rich-doc-schema.d.ts +32 -0
  42. package/dist/blocks/schema/rich-doc-schema.js +66 -0
  43. package/dist/blocks/schema/rich-doc.d.ts +90 -0
  44. package/dist/blocks/schema/rich-doc.js +62 -0
  45. package/dist/blocks/schema/safety.d.ts +20 -0
  46. package/dist/blocks/schema/safety.js +49 -0
  47. package/dist/blocks/schema/types.d.ts +172 -0
  48. package/dist/blocks/schema/types.js +3 -0
  49. package/dist/blocks/schema/validate.d.ts +17 -0
  50. package/dist/blocks/schema/validate.js +32 -0
  51. package/dist/blocks/schema/walk.d.ts +22 -0
  52. package/dist/blocks/schema/walk.js +60 -0
  53. package/dist/blocks/section-header.d.ts +38 -0
  54. package/dist/blocks/section-header.js +22 -0
  55. package/dist/blocks/section.d.ts +59 -0
  56. package/dist/blocks/section.js +66 -0
  57. package/dist/blocks/site/_kit-1.d.ts +100 -0
  58. package/dist/blocks/site/_kit-1.js +135 -0
  59. package/dist/blocks/site/_site-icon-1.d.ts +6 -0
  60. package/dist/blocks/site/_site-icon-1.js +15 -0
  61. package/dist/blocks/site/announcement-bar.d.ts +42 -0
  62. package/dist/blocks/site/announcement-bar.js +38 -0
  63. package/dist/blocks/site/announcement-dismiss.d.ts +18 -0
  64. package/dist/blocks/site/announcement-dismiss.js +28 -0
  65. package/dist/blocks/site/article-layout.d.ts +65 -0
  66. package/dist/blocks/site/article-layout.js +88 -0
  67. package/dist/blocks/site/blog-list.d.ts +79 -0
  68. package/dist/blocks/site/blog-list.js +78 -0
  69. package/dist/blocks/site/comparison-table.d.ts +54 -0
  70. package/dist/blocks/site/comparison-table.js +38 -0
  71. package/dist/blocks/site/consent-banner.d.ts +52 -0
  72. package/dist/blocks/site/consent-banner.js +33 -0
  73. package/dist/blocks/site/contact-dock.d.ts +52 -0
  74. package/dist/blocks/site/contact-dock.js +55 -0
  75. package/dist/blocks/site/contact-form.d.ts +60 -0
  76. package/dist/blocks/site/contact-form.js +45 -0
  77. package/dist/blocks/site/cta-booking.d.ts +43 -0
  78. package/dist/blocks/site/cta-booking.js +69 -0
  79. package/dist/blocks/site/cta.d.ts +74 -0
  80. package/dist/blocks/site/cta.js +112 -0
  81. package/dist/blocks/site/embed-facade.d.ts +20 -0
  82. package/dist/blocks/site/embed-facade.js +21 -0
  83. package/dist/blocks/site/faq.d.ts +48 -0
  84. package/dist/blocks/site/faq.js +51 -0
  85. package/dist/blocks/site/feature-grid.d.ts +46 -0
  86. package/dist/blocks/site/feature-grid.js +49 -0
  87. package/dist/blocks/site/feature-tabs.d.ts +22 -0
  88. package/dist/blocks/site/feature-tabs.js +11 -0
  89. package/dist/blocks/site/footer.d.ts +68 -0
  90. package/dist/blocks/site/footer.js +61 -0
  91. package/dist/blocks/site/gallery-section.d.ts +42 -0
  92. package/dist/blocks/site/gallery-section.js +47 -0
  93. package/dist/blocks/site/hero-video.d.ts +15 -0
  94. package/dist/blocks/site/hero-video.js +31 -0
  95. package/dist/blocks/site/hero.d.ts +64 -0
  96. package/dist/blocks/site/hero.js +67 -0
  97. package/dist/blocks/site/logo-strip.d.ts +42 -0
  98. package/dist/blocks/site/logo-strip.js +26 -0
  99. package/dist/blocks/site/map-hours.d.ts +83 -0
  100. package/dist/blocks/site/map-hours.js +125 -0
  101. package/dist/blocks/site/media-text.d.ts +45 -0
  102. package/dist/blocks/site/media-text.js +55 -0
  103. package/dist/blocks/site/menu-list.d.ts +74 -0
  104. package/dist/blocks/site/menu-list.js +84 -0
  105. package/dist/blocks/site/navbar-submenu.d.ts +18 -0
  106. package/dist/blocks/site/navbar-submenu.js +51 -0
  107. package/dist/blocks/site/navbar.d.ts +67 -0
  108. package/dist/blocks/site/navbar.js +64 -0
  109. package/dist/blocks/site/not-found.d.ts +40 -0
  110. package/dist/blocks/site/not-found.js +38 -0
  111. package/dist/blocks/site/page-intro.d.ts +46 -0
  112. package/dist/blocks/site/page-intro.js +44 -0
  113. package/dist/blocks/site/pricing-table.d.ts +67 -0
  114. package/dist/blocks/site/pricing-table.js +82 -0
  115. package/dist/blocks/site/process.d.ts +36 -0
  116. package/dist/blocks/site/process.js +41 -0
  117. package/dist/blocks/site/registry-1.d.ts +720 -0
  118. package/dist/blocks/site/registry-1.js +783 -0
  119. package/dist/blocks/site/registry-2.d.ts +914 -0
  120. package/dist/blocks/site/registry-2.js +563 -0
  121. package/dist/blocks/site/rich-text-section.d.ts +34 -0
  122. package/dist/blocks/site/rich-text-section.js +32 -0
  123. package/dist/blocks/site/shared/brand-icons.d.ts +21 -0
  124. package/dist/blocks/site/shared/brand-icons.js +56 -0
  125. package/dist/blocks/site/shared/consent-gate.d.ts +41 -0
  126. package/dist/blocks/site/shared/consent-gate.js +43 -0
  127. package/dist/blocks/site/shared/consent-island.d.ts +38 -0
  128. package/dist/blocks/site/shared/consent-island.js +63 -0
  129. package/dist/blocks/site/shared/consent.d.ts +49 -0
  130. package/dist/blocks/site/shared/consent.js +130 -0
  131. package/dist/blocks/site/shared/contact-form-island.d.ts +41 -0
  132. package/dist/blocks/site/shared/contact-form-island.js +100 -0
  133. package/dist/blocks/site/shared/copy-link.d.ts +10 -0
  134. package/dist/blocks/site/shared/copy-link.js +25 -0
  135. package/dist/blocks/site/shared/dock-avoid.d.ts +15 -0
  136. package/dist/blocks/site/shared/dock-avoid.js +107 -0
  137. package/dist/blocks/site/shared/dock-hours.d.ts +13 -0
  138. package/dist/blocks/site/shared/dock-hours.js +25 -0
  139. package/dist/blocks/site/shared/gallery-lightbox.d.ts +12 -0
  140. package/dist/blocks/site/shared/gallery-lightbox.js +10 -0
  141. package/dist/blocks/site/shared/island-keys.d.ts +10 -0
  142. package/dist/blocks/site/shared/island-keys.js +44 -0
  143. package/dist/blocks/site/shared/kit-2.d.ts +55 -0
  144. package/dist/blocks/site/shared/kit-2.js +84 -0
  145. package/dist/blocks/site/shared/labels-2.d.ts +209 -0
  146. package/dist/blocks/site/shared/labels-2.js +427 -0
  147. package/dist/blocks/site/shared/open-now.d.ts +22 -0
  148. package/dist/blocks/site/shared/open-now.js +27 -0
  149. package/dist/blocks/site/shared/opening-hours.d.ts +117 -0
  150. package/dist/blocks/site/shared/opening-hours.js +245 -0
  151. package/dist/blocks/site/shared/site-accent.d.ts +48 -0
  152. package/dist/blocks/site/shared/site-accent.js +249 -0
  153. package/dist/blocks/site/shared/site-form.d.ts +79 -0
  154. package/dist/blocks/site/shared/site-form.js +111 -0
  155. package/dist/blocks/site/shared/site-routing.d.ts +54 -0
  156. package/dist/blocks/site/shared/site-routing.js +86 -0
  157. package/dist/blocks/site/shared/testimonials-carousel.d.ts +17 -0
  158. package/dist/blocks/site/shared/testimonials-carousel.js +64 -0
  159. package/dist/blocks/site/site-shell.d.ts +97 -0
  160. package/dist/blocks/site/site-shell.js +227 -0
  161. package/dist/blocks/site/stats-band.d.ts +40 -0
  162. package/dist/blocks/site/stats-band.js +41 -0
  163. package/dist/blocks/site/team.d.ts +44 -0
  164. package/dist/blocks/site/team.js +48 -0
  165. package/dist/blocks/site/testimonials.d.ts +68 -0
  166. package/dist/blocks/site/testimonials.js +65 -0
  167. package/dist/blocks/types.d.ts +63 -0
  168. package/dist/blocks/types.js +2 -0
  169. package/dist/business/approval-flow.d.ts +152 -0
  170. package/dist/business/approval-flow.js +221 -0
  171. package/dist/business/export-core.d.ts +55 -0
  172. package/dist/business/export-core.js +101 -0
  173. package/dist/business/export.d.ts +148 -0
  174. package/dist/business/export.js +264 -0
  175. package/dist/business/import-core.d.ts +104 -0
  176. package/dist/business/import-core.js +281 -0
  177. package/dist/business/import-wizard.d.ts +186 -0
  178. package/dist/business/import-wizard.js +401 -0
  179. package/dist/business/index.d.ts +11 -0
  180. package/dist/business/index.js +20 -0
  181. package/dist/business/line-items-core.d.ts +129 -0
  182. package/dist/business/line-items-core.js +183 -0
  183. package/dist/business/line-items.d.ts +119 -0
  184. package/dist/business/line-items.js +299 -0
  185. package/dist/business/multi-step-form.d.ts +131 -0
  186. package/dist/business/multi-step-form.js +337 -0
  187. package/dist/business/permission-core.d.ts +59 -0
  188. package/dist/business/permission-core.js +99 -0
  189. package/dist/business/permission-matrix.d.ts +158 -0
  190. package/dist/business/permission-matrix.js +341 -0
  191. package/dist/business/setup-checklist.d.ts +80 -0
  192. package/dist/business/setup-checklist.js +92 -0
  193. package/dist/charts/area-chart.d.ts +35 -0
  194. package/dist/charts/area-chart.js +33 -0
  195. package/dist/charts/bar-chart.d.ts +27 -0
  196. package/dist/charts/bar-chart.js +42 -0
  197. package/dist/charts/bar-list.d.ts +47 -0
  198. package/dist/charts/bar-list.js +60 -0
  199. package/dist/charts/chart-shell.d.ts +173 -0
  200. package/dist/charts/chart-shell.js +205 -0
  201. package/dist/charts/chart.d.ts +73 -0
  202. package/dist/charts/chart.js +106 -0
  203. package/dist/charts/combo-chart.d.ts +29 -0
  204. package/dist/charts/combo-chart.js +47 -0
  205. package/dist/charts/donut-chart.d.ts +33 -0
  206. package/dist/charts/donut-chart.js +113 -0
  207. package/dist/charts/funnel.d.ts +51 -0
  208. package/dist/charts/funnel.js +69 -0
  209. package/dist/charts/gauge.d.ts +62 -0
  210. package/dist/charts/gauge.js +104 -0
  211. package/dist/charts/heatmap.d.ts +81 -0
  212. package/dist/charts/heatmap.js +338 -0
  213. package/dist/charts/index.d.ts +12 -0
  214. package/dist/charts/index.js +14 -0
  215. package/dist/charts/line-chart.d.ts +21 -0
  216. package/dist/charts/line-chart.js +36 -0
  217. package/dist/charts/test-utils.d.ts +2 -0
  218. package/dist/charts/test-utils.js +38 -0
  219. package/dist/charts/utils.d.ts +130 -0
  220. package/dist/charts/utils.js +262 -0
  221. package/dist/components/accordion.d.ts +47 -0
  222. package/dist/components/accordion.js +70 -0
  223. package/dist/components/activity-timeline.d.ts +149 -0
  224. package/dist/components/activity-timeline.js +122 -0
  225. package/dist/components/address-field.d.ts +116 -0
  226. package/dist/components/address-field.js +219 -0
  227. package/dist/components/alert-dialog.d.ts +99 -0
  228. package/dist/components/alert-dialog.js +192 -0
  229. package/dist/components/alert.d.ts +42 -0
  230. package/dist/components/alert.js +82 -0
  231. package/dist/components/app-shell.d.ts +159 -0
  232. package/dist/components/app-shell.js +289 -0
  233. package/dist/components/attachment-list.d.ts +96 -0
  234. package/dist/components/attachment-list.js +196 -0
  235. package/dist/components/audit-log.d.ts +150 -0
  236. package/dist/components/audit-log.js +205 -0
  237. package/dist/components/avatar.d.ts +87 -0
  238. package/dist/components/avatar.js +126 -0
  239. package/dist/components/badge.d.ts +41 -0
  240. package/dist/components/badge.js +68 -0
  241. package/dist/components/breadcrumb.d.ts +78 -0
  242. package/dist/components/breadcrumb.js +106 -0
  243. package/dist/components/button-group.d.ts +52 -0
  244. package/dist/components/button-group.js +77 -0
  245. package/dist/components/button.d.ts +58 -0
  246. package/dist/components/button.js +107 -0
  247. package/dist/components/calendar.d.ts +240 -0
  248. package/dist/components/calendar.js +483 -0
  249. package/dist/components/card.d.ts +66 -0
  250. package/dist/components/card.js +76 -0
  251. package/dist/components/carousel.d.ts +170 -0
  252. package/dist/components/carousel.js +348 -0
  253. package/dist/components/checkbox.d.ts +78 -0
  254. package/dist/components/checkbox.js +138 -0
  255. package/dist/components/color-picker.d.ts +112 -0
  256. package/dist/components/color-picker.js +235 -0
  257. package/dist/components/combobox.d.ts +136 -0
  258. package/dist/components/combobox.js +294 -0
  259. package/dist/components/command.d.ts +275 -0
  260. package/dist/components/command.js +493 -0
  261. package/dist/components/comment-thread.d.ts +252 -0
  262. package/dist/components/comment-thread.js +449 -0
  263. package/dist/components/context-menu.d.ts +77 -0
  264. package/dist/components/context-menu.js +82 -0
  265. package/dist/components/currency-input.d.ts +43 -0
  266. package/dist/components/currency-input.js +85 -0
  267. package/dist/components/date-picker.d.ts +141 -0
  268. package/dist/components/date-picker.js +241 -0
  269. package/dist/components/date-range-picker.d.ts +91 -0
  270. package/dist/components/date-range-picker.js +251 -0
  271. package/dist/components/description-list.d.ts +92 -0
  272. package/dist/components/description-list.js +42 -0
  273. package/dist/components/dialog.d.ts +139 -0
  274. package/dist/components/dialog.js +185 -0
  275. package/dist/components/dropdown-menu.d.ts +100 -0
  276. package/dist/components/dropdown-menu.js +102 -0
  277. package/dist/components/editor-layout.d.ts +166 -0
  278. package/dist/components/editor-layout.js +237 -0
  279. package/dist/components/empty-state.d.ts +49 -0
  280. package/dist/components/empty-state.js +68 -0
  281. package/dist/components/entity-card.d.ts +83 -0
  282. package/dist/components/entity-card.js +92 -0
  283. package/dist/components/file-upload.d.ts +256 -0
  284. package/dist/components/file-upload.js +490 -0
  285. package/dist/components/formatted-input.d.ts +177 -0
  286. package/dist/components/formatted-input.js +399 -0
  287. package/dist/components/hierarchy-chart.d.ts +190 -0
  288. package/dist/components/hierarchy-chart.js +890 -0
  289. package/dist/components/hover-card.d.ts +21 -0
  290. package/dist/components/hover-card.js +32 -0
  291. package/dist/components/iban-input.d.ts +38 -0
  292. package/dist/components/iban-input.js +112 -0
  293. package/dist/components/id-input.d.ts +65 -0
  294. package/dist/components/id-input.js +130 -0
  295. package/dist/components/image.d.ts +130 -0
  296. package/dist/components/image.js +168 -0
  297. package/dist/components/input-otp.d.ts +62 -0
  298. package/dist/components/input-otp.js +73 -0
  299. package/dist/components/input.d.ts +141 -0
  300. package/dist/components/input.js +187 -0
  301. package/dist/components/item.d.ts +96 -0
  302. package/dist/components/item.js +113 -0
  303. package/dist/components/kbd.d.ts +64 -0
  304. package/dist/components/kbd.js +119 -0
  305. package/dist/components/list-layout.d.ts +144 -0
  306. package/dist/components/list-layout.js +210 -0
  307. package/dist/components/native-select.d.ts +33 -0
  308. package/dist/components/native-select.js +48 -0
  309. package/dist/components/navigation-menu.d.ts +127 -0
  310. package/dist/components/navigation-menu.js +129 -0
  311. package/dist/components/notification-center.d.ts +164 -0
  312. package/dist/components/notification-center.js +399 -0
  313. package/dist/components/page-header.d.ts +60 -0
  314. package/dist/components/page-header.js +60 -0
  315. package/dist/components/pagination.d.ts +121 -0
  316. package/dist/components/pagination.js +174 -0
  317. package/dist/components/phone-input.d.ts +49 -0
  318. package/dist/components/phone-input.js +266 -0
  319. package/dist/components/popover.d.ts +38 -0
  320. package/dist/components/popover.js +69 -0
  321. package/dist/components/progress.d.ts +79 -0
  322. package/dist/components/progress.js +97 -0
  323. package/dist/components/radio-group.d.ts +43 -0
  324. package/dist/components/radio-group.js +81 -0
  325. package/dist/components/record-detail-layout.d.ts +167 -0
  326. package/dist/components/record-detail-layout.js +233 -0
  327. package/dist/components/record-picker.d.ts +199 -0
  328. package/dist/components/record-picker.js +650 -0
  329. package/dist/components/resizable.d.ts +50 -0
  330. package/dist/components/resizable.js +88 -0
  331. package/dist/components/scroll-area.d.ts +40 -0
  332. package/dist/components/scroll-area.js +56 -0
  333. package/dist/components/select.d.ts +126 -0
  334. package/dist/components/select.js +137 -0
  335. package/dist/components/separator.d.ts +31 -0
  336. package/dist/components/separator.js +41 -0
  337. package/dist/components/settings-layout.d.ts +134 -0
  338. package/dist/components/settings-layout.js +180 -0
  339. package/dist/components/sheet.d.ts +103 -0
  340. package/dist/components/sheet.js +165 -0
  341. package/dist/components/sidebar.d.ts +171 -0
  342. package/dist/components/sidebar.js +421 -0
  343. package/dist/components/signature-pad.d.ts +85 -0
  344. package/dist/components/signature-pad.js +283 -0
  345. package/dist/components/skeleton.d.ts +64 -0
  346. package/dist/components/skeleton.js +53 -0
  347. package/dist/components/slider.d.ts +57 -0
  348. package/dist/components/slider.js +133 -0
  349. package/dist/components/slug-input.d.ts +69 -0
  350. package/dist/components/slug-input.js +201 -0
  351. package/dist/components/sparkline.d.ts +54 -0
  352. package/dist/components/sparkline.js +122 -0
  353. package/dist/components/spinner.d.ts +34 -0
  354. package/dist/components/spinner.js +34 -0
  355. package/dist/components/stat.d.ts +135 -0
  356. package/dist/components/stat.js +130 -0
  357. package/dist/components/status-picker.d.ts +107 -0
  358. package/dist/components/status-picker.js +175 -0
  359. package/dist/components/stepper.d.ts +86 -0
  360. package/dist/components/stepper.js +103 -0
  361. package/dist/components/switch.d.ts +34 -0
  362. package/dist/components/switch.js +70 -0
  363. package/dist/components/table.d.ts +101 -0
  364. package/dist/components/table.js +72 -0
  365. package/dist/components/tabs.d.ts +103 -0
  366. package/dist/components/tabs.js +173 -0
  367. package/dist/components/tag-input.d.ts +77 -0
  368. package/dist/components/tag-input.js +305 -0
  369. package/dist/components/task-list.d.ts +89 -0
  370. package/dist/components/task-list.js +238 -0
  371. package/dist/components/time-picker.d.ts +119 -0
  372. package/dist/components/time-picker.js +399 -0
  373. package/dist/components/toast.d.ts +87 -0
  374. package/dist/components/toast.js +142 -0
  375. package/dist/components/toggle.d.ts +77 -0
  376. package/dist/components/toggle.js +109 -0
  377. package/dist/components/tooltip.d.ts +69 -0
  378. package/dist/components/tooltip.js +105 -0
  379. package/dist/components/top-bar.d.ts +87 -0
  380. package/dist/components/top-bar.js +99 -0
  381. package/dist/components/tree-select.d.ts +89 -0
  382. package/dist/components/tree-select.js +243 -0
  383. package/dist/components/tree-view.d.ts +109 -0
  384. package/dist/components/tree-view.js +170 -0
  385. package/dist/components/typography.d.ts +107 -0
  386. package/dist/components/typography.js +128 -0
  387. package/dist/components/user-picker.d.ts +89 -0
  388. package/dist/components/user-picker.js +162 -0
  389. package/dist/components/version-history.d.ts +191 -0
  390. package/dist/components/version-history.js +431 -0
  391. package/dist/data-table/csv.d.ts +27 -0
  392. package/dist/data-table/csv.js +68 -0
  393. package/dist/data-table/data-table.d.ts +423 -0
  394. package/dist/data-table/data-table.js +1259 -0
  395. package/dist/data-table/filter-bar.d.ts +146 -0
  396. package/dist/data-table/filter-bar.js +569 -0
  397. package/dist/data-table/filter-fns.d.ts +65 -0
  398. package/dist/data-table/filter-fns.js +382 -0
  399. package/dist/data-table/index.d.ts +8 -0
  400. package/dist/data-table/index.js +9 -0
  401. package/dist/data-table/saved-views.d.ts +100 -0
  402. package/dist/data-table/saved-views.js +251 -0
  403. package/dist/data-table/types.d.ts +168 -0
  404. package/dist/data-table/types.js +87 -0
  405. package/dist/data-table/url-state.d.ts +94 -0
  406. package/dist/data-table/url-state.js +303 -0
  407. package/dist/data-table/view-state.d.ts +16 -0
  408. package/dist/data-table/view-state.js +81 -0
  409. package/dist/editor/_test-setup.d.ts +1 -0
  410. package/dist/editor/_test-setup.js +33 -0
  411. package/dist/editor/block-editor.d.ts +137 -0
  412. package/dist/editor/block-editor.js +280 -0
  413. package/dist/editor/commands.d.ts +31 -0
  414. package/dist/editor/commands.js +150 -0
  415. package/dist/editor/context.d.ts +108 -0
  416. package/dist/editor/context.js +30 -0
  417. package/dist/editor/convert.d.ts +66 -0
  418. package/dist/editor/convert.js +567 -0
  419. package/dist/editor/drag-handle.d.ts +10 -0
  420. package/dist/editor/drag-handle.js +69 -0
  421. package/dist/editor/extensions.d.ts +34 -0
  422. package/dist/editor/extensions.js +239 -0
  423. package/dist/editor/index.d.ts +14 -0
  424. package/dist/editor/index.js +17 -0
  425. package/dist/editor/inserter.d.ts +12 -0
  426. package/dist/editor/inserter.js +88 -0
  427. package/dist/editor/inspector.d.ts +17 -0
  428. package/dist/editor/inspector.js +65 -0
  429. package/dist/editor/items.d.ts +62 -0
  430. package/dist/editor/items.js +195 -0
  431. package/dist/editor/labels.d.ts +119 -0
  432. package/dist/editor/labels.js +130 -0
  433. package/dist/editor/markdown.d.ts +14 -0
  434. package/dist/editor/markdown.js +209 -0
  435. package/dist/editor/menus.d.ts +20 -0
  436. package/dist/editor/menus.js +236 -0
  437. package/dist/editor/nodes.d.ts +14 -0
  438. package/dist/editor/nodes.js +201 -0
  439. package/dist/editor/outline.d.ts +11 -0
  440. package/dist/editor/outline.js +52 -0
  441. package/dist/editor/schema-form.d.ts +64 -0
  442. package/dist/editor/schema-form.js +290 -0
  443. package/dist/editor/slash-menu.d.ts +15 -0
  444. package/dist/editor/slash-menu.js +119 -0
  445. package/dist/fonts/catalog.d.ts +53 -0
  446. package/dist/fonts/catalog.js +121 -0
  447. package/dist/fonts/font-picker.d.ts +70 -0
  448. package/dist/fonts/font-picker.js +225 -0
  449. package/dist/fonts/index.d.ts +6 -0
  450. package/dist/fonts/index.js +7 -0
  451. package/dist/fonts/loader.d.ts +66 -0
  452. package/dist/fonts/loader.js +161 -0
  453. package/dist/fonts/pairing-picker.d.ts +31 -0
  454. package/dist/fonts/pairing-picker.js +81 -0
  455. package/dist/fonts/pairings.d.ts +84 -0
  456. package/dist/fonts/pairings.js +149 -0
  457. package/dist/fonts/provider.d.ts +34 -0
  458. package/dist/fonts/provider.js +51 -0
  459. package/dist/form/index.d.ts +1 -0
  460. package/dist/form/index.js +1 -0
  461. package/dist/format/core.d.ts +149 -0
  462. package/dist/format/core.js +357 -0
  463. package/dist/format/index.d.ts +4 -0
  464. package/dist/format/index.js +5 -0
  465. package/dist/format/use-format.d.ts +1 -0
  466. package/dist/format/use-format.js +3 -0
  467. package/dist/index.d.ts +86 -0
  468. package/dist/index.js +87 -0
  469. package/dist/lib/cn.d.ts +3 -0
  470. package/dist/lib/cn.js +16 -0
  471. package/dist/lib/color.d.ts +64 -0
  472. package/dist/lib/color.js +177 -0
  473. package/dist/lib/compose-refs.d.ts +24 -0
  474. package/dist/lib/compose-refs.js +45 -0
  475. package/dist/lib/data-islands.d.ts +194 -0
  476. package/dist/lib/data-islands.js +368 -0
  477. package/dist/lib/date.d.ts +129 -0
  478. package/dist/lib/date.js +386 -0
  479. package/dist/lib/field-context.d.ts +64 -0
  480. package/dist/lib/field-context.js +62 -0
  481. package/dist/lib/floating-arrow.d.ts +18 -0
  482. package/dist/lib/floating-arrow.js +15 -0
  483. package/dist/lib/islands.d.ts +38 -0
  484. package/dist/lib/islands.js +40 -0
  485. package/dist/lib/labels.d.ts +51 -0
  486. package/dist/lib/labels.js +56 -0
  487. package/dist/lib/layer.d.ts +36 -0
  488. package/dist/lib/layer.js +42 -0
  489. package/dist/lib/locale.d.ts +85 -0
  490. package/dist/lib/locale.js +105 -0
  491. package/dist/lib/menu.d.ts +58 -0
  492. package/dist/lib/menu.js +99 -0
  493. package/dist/lib/message-format.d.ts +20 -0
  494. package/dist/lib/message-format.js +116 -0
  495. package/dist/lib/nav.d.ts +132 -0
  496. package/dist/lib/nav.js +178 -0
  497. package/dist/lib/provider.d.ts +100 -0
  498. package/dist/lib/provider.js +105 -0
  499. package/dist/lib/public.d.ts +22 -0
  500. package/dist/lib/public.js +33 -0
  501. package/dist/lib/sr-name.d.ts +18 -0
  502. package/dist/lib/sr-name.js +17 -0
  503. package/dist/lib/text.d.ts +100 -0
  504. package/dist/lib/text.js +233 -0
  505. package/dist/lib/theme-scope.d.ts +58 -0
  506. package/dist/lib/theme-scope.js +59 -0
  507. package/dist/lib/use-async-list.d.ts +60 -0
  508. package/dist/lib/use-async-list.js +119 -0
  509. package/dist/lib/use-container-width.d.ts +19 -0
  510. package/dist/lib/use-container-width.js +39 -0
  511. package/dist/lib/use-controllable-state.d.ts +33 -0
  512. package/dist/lib/use-controllable-state.js +56 -0
  513. package/dist/lib/use-edge-fade.d.ts +13 -0
  514. package/dist/lib/use-edge-fade.js +43 -0
  515. package/dist/lib/use-formatted-input.d.ts +69 -0
  516. package/dist/lib/use-formatted-input.js +152 -0
  517. package/dist/lib/use-hotkeys.d.ts +80 -0
  518. package/dist/lib/use-hotkeys.js +221 -0
  519. package/dist/lib/use-hover-intent.d.ts +44 -0
  520. package/dist/lib/use-hover-intent.js +119 -0
  521. package/dist/lib/use-media-query.d.ts +21 -0
  522. package/dist/lib/use-media-query.js +28 -0
  523. package/dist/lib/use-reduced-motion.d.ts +8 -0
  524. package/dist/lib/use-reduced-motion.js +13 -0
  525. package/dist/lib/use-tree.d.ts +153 -0
  526. package/dist/lib/use-tree.js +534 -0
  527. package/dist/lib/value-format.d.ts +25 -0
  528. package/dist/lib/value-format.js +56 -0
  529. package/dist/lib/variants.d.ts +131 -0
  530. package/dist/lib/variants.js +109 -0
  531. package/dist/locale-data/core/date.d.ts +24 -0
  532. package/dist/locale-data/core/date.js +68 -0
  533. package/dist/locale-data/core/decimal.d.ts +19 -0
  534. package/dist/locale-data/core/decimal.js +79 -0
  535. package/dist/locale-data/core/holidays.d.ts +30 -0
  536. package/dist/locale-data/core/holidays.js +79 -0
  537. package/dist/locale-data/core/iban.d.ts +29 -0
  538. package/dist/locale-data/core/iban.js +74 -0
  539. package/dist/locale-data/core/index.d.ts +7 -0
  540. package/dist/locale-data/core/index.js +6 -0
  541. package/dist/locale-data/core/types.d.ts +173 -0
  542. package/dist/locale-data/core/types.js +6 -0
  543. package/dist/locale-data/core/week-info.d.ts +23 -0
  544. package/dist/locale-data/core/week-info.js +85 -0
  545. package/dist/locale-data/core/working-days.d.ts +27 -0
  546. package/dist/locale-data/core/working-days.js +133 -0
  547. package/dist/locale-data/index.d.ts +2 -0
  548. package/dist/locale-data/index.js +4 -0
  549. package/dist/locale-data/tr/address-tr.json +1 -0
  550. package/dist/locale-data/tr/address.d.ts +23 -0
  551. package/dist/locale-data/tr/address.js +52 -0
  552. package/dist/locale-data/tr/holidays.d.ts +31 -0
  553. package/dist/locale-data/tr/holidays.js +81 -0
  554. package/dist/locale-data/tr/iban.d.ts +21 -0
  555. package/dist/locale-data/tr/iban.js +45 -0
  556. package/dist/locale-data/tr/id.d.ts +36 -0
  557. package/dist/locale-data/tr/id.js +120 -0
  558. package/dist/locale-data/tr/index.d.ts +12 -0
  559. package/dist/locale-data/tr/index.js +33 -0
  560. package/dist/locale-data/tr/kdv.d.ts +91 -0
  561. package/dist/locale-data/tr/kdv.js +222 -0
  562. package/dist/locales/en.d.ts +2102 -0
  563. package/dist/locales/en.js +2088 -0
  564. package/dist/locales/tr.d.ts +2086 -0
  565. package/dist/locales/tr.js +2087 -0
  566. package/dist/media/focal-point.d.ts +42 -0
  567. package/dist/media/focal-point.js +96 -0
  568. package/dist/media/gallery-layout.d.ts +19 -0
  569. package/dist/media/gallery-layout.js +61 -0
  570. package/dist/media/gallery.d.ts +64 -0
  571. package/dist/media/gallery.js +138 -0
  572. package/dist/media/image-cropper.d.ts +86 -0
  573. package/dist/media/image-cropper.js +170 -0
  574. package/dist/media/image-field.d.ts +115 -0
  575. package/dist/media/image-field.js +212 -0
  576. package/dist/media/index.d.ts +19 -0
  577. package/dist/media/index.js +23 -0
  578. package/dist/media/lightbox.d.ts +82 -0
  579. package/dist/media/lightbox.js +171 -0
  580. package/dist/media/link-preview.d.ts +97 -0
  581. package/dist/media/link-preview.js +177 -0
  582. package/dist/media/media-library.d.ts +244 -0
  583. package/dist/media/media-library.js +776 -0
  584. package/dist/media/media-picker.d.ts +96 -0
  585. package/dist/media/media-picker.js +209 -0
  586. package/dist/media/media-provider.d.ts +23 -0
  587. package/dist/media/media-provider.js +44 -0
  588. package/dist/media/media-utils.d.ts +39 -0
  589. package/dist/media/media-utils.js +145 -0
  590. package/dist/media/memory-adapter.d.ts +22 -0
  591. package/dist/media/memory-adapter.js +162 -0
  592. package/dist/media/rest-adapter.d.ts +90 -0
  593. package/dist/media/rest-adapter.js +208 -0
  594. package/dist/media/serp.d.ts +62 -0
  595. package/dist/media/serp.js +108 -0
  596. package/dist/media/test-fixtures.d.ts +3 -0
  597. package/dist/media/test-fixtures.js +37 -0
  598. package/dist/media/types.d.ts +183 -0
  599. package/dist/media/types.js +3 -0
  600. package/dist/media/use-pan-zoom.d.ts +51 -0
  601. package/dist/media/use-pan-zoom.js +156 -0
  602. package/dist/media/use-upload-queue.d.ts +64 -0
  603. package/dist/media/use-upload-queue.js +115 -0
  604. package/dist/media/video-player.d.ts +135 -0
  605. package/dist/media/video-player.js +319 -0
  606. package/dist/next/index.d.ts +42 -0
  607. package/dist/next/index.js +36 -0
  608. package/dist/render/block-renderer.d.ts +56 -0
  609. package/dist/render/block-renderer.js +137 -0
  610. package/dist/render/index.d.ts +6 -0
  611. package/dist/render/index.js +7 -0
  612. package/dist/render/prepare.d.ts +61 -0
  613. package/dist/render/prepare.js +119 -0
  614. package/dist/scheduler/core/duration.d.ts +83 -0
  615. package/dist/scheduler/core/duration.js +174 -0
  616. package/dist/scheduler/core/gantt.d.ts +63 -0
  617. package/dist/scheduler/core/gantt.js +226 -0
  618. package/dist/scheduler/core/index.d.ts +6 -0
  619. package/dist/scheduler/core/index.js +7 -0
  620. package/dist/scheduler/core/layout.d.ts +97 -0
  621. package/dist/scheduler/core/layout.js +249 -0
  622. package/dist/scheduler/core/time-scale.d.ts +89 -0
  623. package/dist/scheduler/core/time-scale.js +173 -0
  624. package/dist/scheduler/gantt.d.ts +125 -0
  625. package/dist/scheduler/gantt.js +532 -0
  626. package/dist/scheduler/index.d.ts +6 -0
  627. package/dist/scheduler/index.js +7 -0
  628. package/dist/scheduler/resource-calendar.d.ts +218 -0
  629. package/dist/scheduler/resource-calendar.js +661 -0
  630. package/dist/scheduler/scheduler.d.ts +168 -0
  631. package/dist/scheduler/scheduler.js +768 -0
  632. package/dist/scheduler/shared.d.ts +63 -0
  633. package/dist/scheduler/shared.js +145 -0
  634. package/dist/scheduler/time-tracker.d.ts +138 -0
  635. package/dist/scheduler/time-tracker.js +403 -0
  636. package/dist/sortable/core.d.ts +67 -0
  637. package/dist/sortable/core.js +167 -0
  638. package/dist/sortable/index.d.ts +8 -0
  639. package/dist/sortable/index.js +10 -0
  640. package/dist/sortable/kanban-core.d.ts +70 -0
  641. package/dist/sortable/kanban-core.js +67 -0
  642. package/dist/sortable/kanban.d.ts +147 -0
  643. package/dist/sortable/kanban.js +472 -0
  644. package/dist/sortable/sortable-list.d.ts +71 -0
  645. package/dist/sortable/sortable-list.js +76 -0
  646. package/dist/sortable/sortable-tree.d.ts +101 -0
  647. package/dist/sortable/sortable-tree.js +450 -0
  648. package/dist/sortable/sortable.d.ts +188 -0
  649. package/dist/sortable/sortable.js +485 -0
  650. package/dist/sortable/use-pointer-drag.d.ts +75 -0
  651. package/dist/sortable/use-pointer-drag.js +173 -0
  652. package/dist/sortable/use-time-scale.d.ts +11 -0
  653. package/dist/sortable/use-time-scale.js +19 -0
  654. package/dist/styles/base.css +51 -0
  655. package/dist/styles/blocks.css +949 -0
  656. package/dist/styles/calendar.css +642 -0
  657. package/dist/styles/charts.css +264 -0
  658. package/dist/styles/data.css +474 -0
  659. package/dist/styles/editors.css +1022 -0
  660. package/dist/styles/forms.css +406 -0
  661. package/dist/styles/media.css +515 -0
  662. package/dist/styles/navigation.css +293 -0
  663. package/dist/styles/overlays.css +244 -0
  664. package/dist/styles.css +742 -0
  665. package/package.json +156 -4
@@ -0,0 +1,111 @@
1
+ // Contact-form contract: field config, the action state, and a validator the app's server action
2
+ // calls with the same config the form was rendered from. React-free, zod-free, server-safe.
3
+ import { formatMessage } from "../../../lib/message-format.js";
4
+ import { site2Labels } from "./labels-2.js";
5
+ /** Name of the honeypot input. Real visitors never see or fill it. */
6
+ export const HONEYPOT_FIELD = "website";
7
+ /** Hidden render timestamp for the time trap. */
8
+ export const TIMESTAMP_FIELD = "_ts";
9
+ export const PRIVACY_FIELD = "privacy";
10
+ export const MARKETING_FIELD = "marketing";
11
+ const LABEL_KEY = {
12
+ name: "fieldName",
13
+ email: "fieldEmail",
14
+ phone: "fieldPhone",
15
+ company: "fieldCompany",
16
+ subject: "fieldSubject",
17
+ budget: "fieldBudget",
18
+ message: "fieldMessage",
19
+ date: "fieldDate",
20
+ };
21
+ /** The label shown for a field: config label → `labels` → English. */
22
+ export function contactFieldLabel(field, labels) {
23
+ if (field.label)
24
+ return field.label;
25
+ const k = LABEL_KEY[field.name];
26
+ const v = labels ? labels[k] : undefined;
27
+ return typeof v === "string" ? v : site2Labels[k];
28
+ }
29
+ /** True for honeypot hits and submits faster than `minMs` after render (bots). */
30
+ export function isSpam(data, opts = {}) {
31
+ const trap = data.get(HONEYPOT_FIELD);
32
+ if (typeof trap === "string" && trap.trim() !== "")
33
+ return true;
34
+ const ts = Number(data.get(TIMESTAMP_FIELD));
35
+ if (ts > 0 && (opts.now ?? Date.now()) - ts < (opts.minMs ?? 2500))
36
+ return true;
37
+ return false;
38
+ }
39
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/;
40
+ const PHONE_RE = /^\+?[\d\s().-]{7,20}$/;
41
+ /**
42
+ * Validates a submission against the field config the form was rendered with. Call it first in
43
+ * the app's server action — the browser runs it too, but only the server's verdict counts.
44
+ *
45
+ * ```ts
46
+ * "use server";
47
+ * export async function contact(prev: SiteFormState, data: FormData) {
48
+ * const v = validateContactForm(fields, data, { privacyCheckbox: true });
49
+ * if (v.spam) return { status: "success" };
50
+ * if (!v.ok) return v.state;
51
+ * await crm.createLead(v.values);
52
+ * return { status: "success" };
53
+ * }
54
+ * ```
55
+ */
56
+ export function validateContactForm(fields, data, opts = {}) {
57
+ const merged = { ...site2Labels };
58
+ if (opts.labels)
59
+ for (const [k, v] of Object.entries(opts.labels))
60
+ if (typeof v === "string")
61
+ merged[k] = v;
62
+ const t = (k, vars) => formatMessage(merged[k] ?? k, vars, opts.locale ?? "en-US");
63
+ const values = {};
64
+ const errors = {};
65
+ for (const f of fields) {
66
+ const raw = data.get(f.name);
67
+ const v = typeof raw === "string" ? raw.trim() : "";
68
+ values[f.name] = v;
69
+ const label = contactFieldLabel(f, merged);
70
+ const max = f.max ?? (f.name === "message" ? 2000 : 160);
71
+ if (!v) {
72
+ if (f.required)
73
+ errors[f.name] = t("errorRequired", { field: label.toLowerCase() });
74
+ continue;
75
+ }
76
+ if (v.length > max)
77
+ errors[f.name] = t("errorTooLong", { field: label.toLowerCase(), max });
78
+ else if (f.name === "email" && !EMAIL_RE.test(v))
79
+ errors[f.name] = t("errorEmail");
80
+ else if (f.name === "phone" && !PHONE_RE.test(v))
81
+ errors[f.name] = t("errorPhone");
82
+ else if (f.options?.length && !f.options.includes(v))
83
+ errors[f.name] = t("errorRequired", { field: label.toLowerCase() });
84
+ }
85
+ const privacy = data.get(PRIVACY_FIELD) === "on" || data.get(PRIVACY_FIELD) === "true";
86
+ const marketing = data.get(MARKETING_FIELD) === "on" || data.get(MARKETING_FIELD) === "true";
87
+ if (opts.privacyCheckbox && !privacy)
88
+ errors[PRIVACY_FIELD] = t("privacyRequired");
89
+ const spam = isSpam(data, { minMs: opts.spamMinMs });
90
+ const ok = Object.keys(errors).length === 0;
91
+ const state = spam ? { status: "success", ts: Date.now() } : ok ? { status: "success", ts: Date.now() } : { status: "invalid", errors, values, ts: Date.now() };
92
+ return { ok, spam, values, errors, privacy, marketing, state };
93
+ }
94
+ /** HTML constraints for a field (the no-JS path relies on these). */
95
+ export function fieldConstraints(f) {
96
+ const maxLength = f.max ?? (f.name === "message" ? 2000 : 160);
97
+ switch (f.name) {
98
+ case "name":
99
+ return { type: "text", autoComplete: "name", maxLength };
100
+ case "email":
101
+ return { type: "email", autoComplete: "email", inputMode: "email", maxLength };
102
+ case "phone":
103
+ return { type: "tel", autoComplete: "tel", inputMode: "tel", maxLength };
104
+ case "company":
105
+ return { type: "text", autoComplete: "organization", maxLength };
106
+ case "date":
107
+ return { type: "date", maxLength };
108
+ default:
109
+ return { type: "text", maxLength };
110
+ }
111
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * URL helpers of the Site shell: which page and locale a URL (or a link's href) points to,
3
+ * and the href for a page. Pure and server-safe, so server components can build links.
4
+ *
5
+ * ?page=pricing → page "pricing" (search routing, the default)
6
+ * ?page=home#faq → page "home", then scroll to #faq
7
+ * #page=pricing → page "pricing" (hash routing)
8
+ * ?lang=tr → locale "tr", page unchanged
9
+ */
10
+ export type SiteRouting = "search" | "hash" | "memory";
11
+ export interface SiteLocation {
12
+ page?: string;
13
+ locale?: string;
14
+ /** In-page anchor after the page switch (`faq` for `#faq`). */
15
+ anchor?: string;
16
+ }
17
+ export interface SiteRouteParams {
18
+ /** Query/hash key for the page. Default `"page"`. */
19
+ pageParam?: string;
20
+ /** Query key for the locale. Default `"lang"`. */
21
+ localeParam?: string;
22
+ }
23
+ /**
24
+ * The href for an inner page, merged into nothing (relative to the current URL):
25
+ * `sitePageHref("pricing")` → `"?page=pricing"`, `sitePageHref("home", "faq")` → `"?page=home#faq"`.
26
+ */
27
+ export declare function sitePageHref(page: string, anchor?: string, options?: SiteRouteParams & {
28
+ routing?: SiteRouting;
29
+ }): string;
30
+ /** The href that switches the locale: `siteLocaleHref("tr")` → `"?lang=tr"`. */
31
+ export declare const siteLocaleHref: (locale: string, options?: SiteRouteParams) => string;
32
+ /**
33
+ * Reads a link's href as a site location, or `null` when it is not a shell link (a path, an
34
+ * external URL, a plain `#anchor`). Only relative hrefs that start with `?` or `#<pageParam>=`.
35
+ */
36
+ export declare function parseSiteHref(href: string | null | undefined, options?: SiteRouteParams): SiteLocation | null;
37
+ /** Reads the current location (`search` + `hash`) as page and locale. */
38
+ export declare function readSiteLocation(search: string, hash: string, routing: SiteRouting, options?: SiteRouteParams): SiteLocation;
39
+ /**
40
+ * The URL after a change: other query params are kept, the default page and locale are left out
41
+ * so the home page stays at a clean URL.
42
+ */
43
+ export declare function writeSiteLocation(current: {
44
+ pathname: string;
45
+ search: string;
46
+ hash: string;
47
+ }, next: {
48
+ page: string;
49
+ locale: string;
50
+ anchor?: string;
51
+ }, defaults: {
52
+ page: string;
53
+ locale: string;
54
+ }, routing: SiteRouting, options?: SiteRouteParams): string;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * URL helpers of the Site shell: which page and locale a URL (or a link's href) points to,
3
+ * and the href for a page. Pure and server-safe, so server components can build links.
4
+ *
5
+ * ?page=pricing → page "pricing" (search routing, the default)
6
+ * ?page=home#faq → page "home", then scroll to #faq
7
+ * #page=pricing → page "pricing" (hash routing)
8
+ * ?lang=tr → locale "tr", page unchanged
9
+ */
10
+ /**
11
+ * The href for an inner page, merged into nothing (relative to the current URL):
12
+ * `sitePageHref("pricing")` → `"?page=pricing"`, `sitePageHref("home", "faq")` → `"?page=home#faq"`.
13
+ */
14
+ export function sitePageHref(page, anchor, options = {}) {
15
+ const key = options.pageParam ?? "page";
16
+ const enc = encodeURIComponent(page);
17
+ if (options.routing === "hash")
18
+ return `#${key}=${enc}`;
19
+ return `?${key}=${enc}${anchor ? `#${anchor}` : ""}`;
20
+ }
21
+ /** The href that switches the locale: `siteLocaleHref("tr")` → `"?lang=tr"`. */
22
+ export const siteLocaleHref = (locale, options = {}) => `?${options.localeParam ?? "lang"}=${encodeURIComponent(locale)}`;
23
+ /**
24
+ * Reads a link's href as a site location, or `null` when it is not a shell link (a path, an
25
+ * external URL, a plain `#anchor`). Only relative hrefs that start with `?` or `#<pageParam>=`.
26
+ */
27
+ export function parseSiteHref(href, options = {}) {
28
+ if (!href)
29
+ return null;
30
+ const pageKey = options.pageParam ?? "page";
31
+ const langKey = options.localeParam ?? "lang";
32
+ if (href.startsWith(`#${pageKey}=`)) {
33
+ const page = decodeURIComponent(href.slice(pageKey.length + 2));
34
+ return page ? { page } : null;
35
+ }
36
+ if (!href.startsWith("?"))
37
+ return null;
38
+ const hashAt = href.indexOf("#");
39
+ const query = new URLSearchParams(hashAt === -1 ? href.slice(1) : href.slice(1, hashAt));
40
+ const anchor = hashAt === -1 ? undefined : href.slice(hashAt + 1) || undefined;
41
+ const page = query.get(pageKey) ?? undefined;
42
+ const locale = query.get(langKey) ?? undefined;
43
+ if (!page && !locale)
44
+ return null;
45
+ return { page, locale, anchor };
46
+ }
47
+ /** Reads the current location (`search` + `hash`) as page and locale. */
48
+ export function readSiteLocation(search, hash, routing, options = {}) {
49
+ const pageKey = options.pageParam ?? "page";
50
+ const q = new URLSearchParams(search);
51
+ const locale = q.get(options.localeParam ?? "lang") ?? undefined;
52
+ let page;
53
+ if (routing === "hash") {
54
+ const m = new RegExp(`^#${pageKey}=([^&]*)`).exec(hash);
55
+ page = m?.[1] ? decodeURIComponent(m[1]) : undefined;
56
+ }
57
+ else if (routing === "search") {
58
+ page = q.get(pageKey) ?? undefined;
59
+ }
60
+ return { page, locale };
61
+ }
62
+ /**
63
+ * The URL after a change: other query params are kept, the default page and locale are left out
64
+ * so the home page stays at a clean URL.
65
+ */
66
+ export function writeSiteLocation(current, next, defaults, routing, options = {}) {
67
+ const pageKey = options.pageParam ?? "page";
68
+ const langKey = options.localeParam ?? "lang";
69
+ const q = new URLSearchParams(current.search);
70
+ if (next.locale === defaults.locale)
71
+ q.delete(langKey);
72
+ else
73
+ q.set(langKey, next.locale);
74
+ let hash = next.anchor ? `#${next.anchor}` : "";
75
+ if (routing === "search") {
76
+ if (next.page === defaults.page)
77
+ q.delete(pageKey);
78
+ else
79
+ q.set(pageKey, next.page);
80
+ }
81
+ else if (routing === "hash") {
82
+ hash = next.page === defaults.page ? "" : `#${pageKey}=${encodeURIComponent(next.page)}`;
83
+ }
84
+ const qs = q.toString();
85
+ return `${current.pathname}${qs ? `?${qs}` : ""}${hash}`;
86
+ }
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ import type { CarouselLabels } from "./island-keys.js";
3
+ export interface TestimonialsCarouselProps {
4
+ /** Section header, rendered beside the arrows. */
5
+ header?: React.ReactNode;
6
+ count: number;
7
+ labels: CarouselLabels;
8
+ locale?: string;
9
+ /** One child per slide (server-rendered quotes). */
10
+ children: React.ReactNode;
11
+ className?: string;
12
+ }
13
+ /**
14
+ * Scroll-snap carousel island (~1 KB): native swipe/scroll, arrow buttons, a "3 / 8" counter,
15
+ * ←/→ keys on the track. No autoplay. Slides are labelled groups (WAI-ARIA carousel pattern).
16
+ */
17
+ export declare function TestimonialsCarousel({ header, count, labels, locale, children, className }: TestimonialsCarouselProps): React.JSX.Element;
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { ArrowLeft, ArrowRight } from "lucide-react";
5
+ import { cn2 as cn } from "./kit-2.js";
6
+ import { formatMessage } from "../../../lib/message-format.js";
7
+ /**
8
+ * Scroll-snap carousel island (~1 KB): native swipe/scroll, arrow buttons, a "3 / 8" counter,
9
+ * ←/→ keys on the track. No autoplay. Slides are labelled groups (WAI-ARIA carousel pattern).
10
+ */
11
+ export function TestimonialsCarousel({ header, count, labels, locale = "en-US", children, className }) {
12
+ const track = React.useRef(null);
13
+ const [current, setCurrent] = React.useState(0);
14
+ const f = (k, v) => formatMessage(labels[k], v, locale);
15
+ const slides = React.Children.toArray(children);
16
+ const slideEls = () => Array.from(track.current?.children ?? []);
17
+ const go = React.useCallback((i) => {
18
+ const el = track.current;
19
+ const target = Array.from(el?.children ?? [])[Math.max(0, Math.min(count - 1, i))];
20
+ if (!el || !target)
21
+ return;
22
+ const rtl = getComputedStyle(el).direction === "rtl";
23
+ const left = rtl ? target.offsetLeft + target.offsetWidth - el.clientWidth : target.offsetLeft - el.offsetLeft;
24
+ const reduce = typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
25
+ if (typeof el.scrollTo === "function")
26
+ el.scrollTo({ left, behavior: reduce ? "auto" : "smooth" });
27
+ setCurrent(Math.max(0, Math.min(count - 1, i)));
28
+ }, [count]);
29
+ React.useEffect(() => {
30
+ const el = track.current;
31
+ if (!el || typeof IntersectionObserver === "undefined")
32
+ return;
33
+ const io = new IntersectionObserver((entries) => {
34
+ const visible = entries.filter((e) => e.isIntersecting && e.intersectionRatio > 0.6);
35
+ if (visible.length) {
36
+ const first = visible.map((e) => slideEls().indexOf(e.target)).sort((a, b) => a - b)[0];
37
+ if (first !== undefined && first >= 0)
38
+ setCurrent(first);
39
+ }
40
+ }, { root: el, threshold: [0.6] });
41
+ for (const s of slideEls())
42
+ io.observe(s);
43
+ return () => io.disconnect();
44
+ }, [count]);
45
+ return (_jsxs("div", { role: "region", "aria-roledescription": labels.carousel, "aria-label": labels.carousel, className: cn("vb-carousel flex flex-col gap-10", className), children: [_jsxs("div", { className: "flex flex-col gap-6 @2xl:flex-row @2xl:items-end @2xl:justify-between", children: [header ?? _jsx("span", {}), _jsxs("div", { className: "flex shrink-0 items-center gap-4", children: [_jsx("span", { className: "font-mono text-eyebrow tabular uppercase tracking-[0.08em] text-fg-muted", "aria-live": "polite", children: f("slideCounter", { index: current + 1, total: count }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx("button", { type: "button", "aria-label": labels.previous, disabled: current === 0, onClick: () => go(current - 1), className: "vb-carousel-btn", children: _jsx(ArrowLeft, { "aria-hidden": true, strokeWidth: 1.5, className: "size-[18px] rtl:-scale-x-100" }) }), _jsx("button", { type: "button", "aria-label": labels.next, disabled: current >= count - 1, onClick: () => go(current + 1), className: "vb-carousel-btn", children: _jsx(ArrowRight, { "aria-hidden": true, strokeWidth: 1.5, className: "size-[18px] rtl:-scale-x-100" }) })] })] })] }), _jsx("div", { ref: track, tabIndex: 0, "aria-label": labels.carousel, onKeyDown: (e) => {
46
+ const rtl = getComputedStyle(e.currentTarget).direction === "rtl";
47
+ if (e.key === (rtl ? "ArrowLeft" : "ArrowRight")) {
48
+ e.preventDefault();
49
+ go(current + 1);
50
+ }
51
+ else if (e.key === (rtl ? "ArrowRight" : "ArrowLeft")) {
52
+ e.preventDefault();
53
+ go(current - 1);
54
+ }
55
+ else if (e.key === "Home") {
56
+ e.preventDefault();
57
+ go(0);
58
+ }
59
+ else if (e.key === "End") {
60
+ e.preventDefault();
61
+ go(count - 1);
62
+ }
63
+ }, className: "vb-carousel-track scrollbar-none -mx-1 flex snap-x snap-mandatory gap-(--gutter) overflow-x-auto px-1 pb-1 focus-ring rounded-ui-sm", children: slides.map((child, i) => (_jsx("div", { role: "group", "aria-roledescription": labels.slide, "aria-label": f("slideLabel", { index: i + 1, total: count }), className: "w-full shrink-0 snap-start border-t border-line pt-6 @2xl:w-[calc((100%-var(--gutter))/2)]", children: child }, i))) })] }));
64
+ }
@@ -0,0 +1,97 @@
1
+ import * as React from "react";
2
+ import { type SiteLocation, type SiteRouting } from "./shared/site-routing.js";
3
+ export interface SiteShellProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "dir"> {
4
+ /**
5
+ * The site's accent: a built-in preset (`"lime"`, `"ocean"`, `"ember"`, `"rose"`, `"graphite"`)
6
+ * or one brand colour (`"#B4532A"`, `rgb()`, `oklch()`). A colour becomes the four accent
7
+ * variables on the site root, contrast-checked (text on the fill and accent ink ≥ 4.5:1).
8
+ */
9
+ accent?: string;
10
+ /** Explicit dark-mode fill for a custom accent. Derived when the colour is too dark. */
11
+ accentDark?: string;
12
+ /** Type pairing → `data-font` (editorial, grotesk, corporate, system or your own). */
13
+ font?: string;
14
+ /** Surface material → `data-material`. */
15
+ material?: "glass" | "solid";
16
+ /** → `data-density`. */
17
+ density?: "comfortable" | "compact" | "spacious";
18
+ /** Force a mode for the whole site. Default: inherit the page's. */
19
+ theme?: "light" | "dark";
20
+ dir?: "ltr" | "rtl";
21
+ /** Locale codes, default first. Default `["en", "tr"]`. */
22
+ locales?: string[];
23
+ /** Controlled locale. */
24
+ locale?: string;
25
+ defaultLocale?: string;
26
+ onLocaleChange?: (locale: string) => void;
27
+ /** Page ids, home first. Default `["home"]`. */
28
+ pages?: string[];
29
+ /** Controlled page. */
30
+ page?: string;
31
+ defaultPage?: string;
32
+ onPageChange?: (page: string) => void;
33
+ /** Where the page lives in the URL: `?page=` (default), `#page=`, or nowhere. The locale always uses `?lang=`. */
34
+ routing?: SiteRouting;
35
+ /** Query/hash key for the page. Default `"page"`. */
36
+ pageParam?: string;
37
+ /** Query key for the locale. Default `"lang"`. */
38
+ localeParam?: string;
39
+ }
40
+ export interface SiteShellContextValue {
41
+ page: string;
42
+ locale: string;
43
+ pages: readonly string[];
44
+ locales: readonly string[];
45
+ /** Go to a page and/or locale (and optionally an anchor on it). */
46
+ navigate: (to: SiteLocation) => void;
47
+ /** The href for a page (respects `routing` and `pageParam`). */
48
+ hrefFor: (page: string, anchor?: string) => string;
49
+ }
50
+ /** Page, locale and navigation of the closest Site shell. Throws outside one. */
51
+ export declare function useSiteShell(): SiteShellContextValue;
52
+ /**
53
+ * The frame of a demo or single-route website: EN/TR switch, inner-page switching and the
54
+ * site's own look (accent from one colour, font, material, density), scoped to its root.
55
+ *
56
+ * Every language and page is rendered on the server as plain blocks; the shell shows one of
57
+ * each and swaps on links like `?page=pricing`, `?page=home#faq` or `?lang=tr` inside it —
58
+ * so server-rendered Navbar and Footer links work as they are. On a page change it scrolls to
59
+ * the top of the site, moves focus to the page's `h1` and marks matching links
60
+ * `aria-current="page"`. Back/forward follow the URL. Overlays opened inside keep its theme.
61
+ *
62
+ * ```tsx
63
+ * <SiteShell accent="#B4532A" font="editorial" material="solid" pages={["home", "shop"]}>
64
+ * <Navbar items={[{ label: "Shop", href: "?page=shop" }]} … />
65
+ * <SiteShellPage id="home"><Hero … /></SiteShellPage>
66
+ * <SiteShellPage id="shop"><PageIntro title="Shop" … /></SiteShellPage>
67
+ * </SiteShell>
68
+ * ```
69
+ */
70
+ export declare const SiteShell: React.ForwardRefExoticComponent<SiteShellProps & React.RefAttributes<HTMLDivElement>>;
71
+ export interface SiteShellPageProps {
72
+ /** Page id from the shell's `pages`. */
73
+ id: string;
74
+ /** Document title while this page is shown (set after navigating, not on first load). */
75
+ title?: string;
76
+ children?: React.ReactNode;
77
+ }
78
+ /** One inner page: rendered only while it is the shell's current page. */
79
+ export declare function SiteShellPage({ id, title, children }: SiteShellPageProps): React.JSX.Element | null;
80
+ export interface SiteShellLocaleProps {
81
+ /** Locale code from the shell's `locales`. */
82
+ code: string;
83
+ children?: React.ReactNode;
84
+ }
85
+ /** One language version: rendered only while it is the shell's current locale (with `lang`). */
86
+ export declare function SiteShellLocale({ code, children }: SiteShellLocaleProps): React.JSX.Element | null;
87
+ export interface SiteShellLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href"> {
88
+ /** Target page id. */
89
+ page: string;
90
+ /** In-page anchor on that page (`"faq"`). */
91
+ anchor?: string;
92
+ }
93
+ /**
94
+ * A link to an inner page for client code. Server components can use a plain
95
+ * `href={sitePageHref("pricing")}` instead; the shell handles both.
96
+ */
97
+ export declare const SiteShellLink: React.ForwardRefExoticComponent<SiteShellLinkProps & React.RefAttributes<HTMLAnchorElement>>;
@@ -0,0 +1,227 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { ThemeScope } from "../../lib/theme-scope.js";
6
+ import { useControllableState } from "../../lib/use-controllable-state.js";
7
+ import { isBuiltInAccent, siteAccent, siteAccentCss, siteAccentKey } from "./shared/site-accent.js";
8
+ import { parseSiteHref, readSiteLocation, sitePageHref, writeSiteLocation } from "./shared/site-routing.js";
9
+ const SiteShellContext = React.createContext(null);
10
+ /** Page, locale and navigation of the closest Site shell. Throws outside one. */
11
+ export function useSiteShell() {
12
+ const ctx = React.useContext(SiteShellContext);
13
+ if (!ctx)
14
+ throw new Error("useSiteShell must be used inside <SiteShell>.");
15
+ return ctx;
16
+ }
17
+ /**
18
+ * The frame of a demo or single-route website: EN/TR switch, inner-page switching and the
19
+ * site's own look (accent from one colour, font, material, density), scoped to its root.
20
+ *
21
+ * Every language and page is rendered on the server as plain blocks; the shell shows one of
22
+ * each and swaps on links like `?page=pricing`, `?page=home#faq` or `?lang=tr` inside it —
23
+ * so server-rendered Navbar and Footer links work as they are. On a page change it scrolls to
24
+ * the top of the site, moves focus to the page's `h1` and marks matching links
25
+ * `aria-current="page"`. Back/forward follow the URL. Overlays opened inside keep its theme.
26
+ *
27
+ * ```tsx
28
+ * <SiteShell accent="#B4532A" font="editorial" material="solid" pages={["home", "shop"]}>
29
+ * <Navbar items={[{ label: "Shop", href: "?page=shop" }]} … />
30
+ * <SiteShellPage id="home"><Hero … /></SiteShellPage>
31
+ * <SiteShellPage id="shop"><PageIntro title="Shop" … /></SiteShellPage>
32
+ * </SiteShell>
33
+ * ```
34
+ */
35
+ export const SiteShell = React.forwardRef(function SiteShell({ accent, accentDark, font, material, density, theme, dir, locales = ["en", "tr"], locale: localeProp, defaultLocale, onLocaleChange, pages = ["home"], page: pageProp, defaultPage, onPageChange, routing = "search", pageParam = "page", localeParam = "lang", className, onClick, children, ...props }, ref) {
36
+ const homeLocale = defaultLocale ?? locales[0] ?? "en";
37
+ const homePage = defaultPage ?? pages[0] ?? "home";
38
+ const [locale, setLocale] = useControllableState({ value: localeProp, defaultValue: homeLocale, onChange: onLocaleChange, name: "SiteShell" });
39
+ const [page, setPage] = useControllableState({ value: pageProp, defaultValue: homePage, onChange: onPageChange, name: "SiteShell" });
40
+ const rootRef = React.useRef(null);
41
+ const setRoot = React.useCallback((node) => {
42
+ rootRef.current = node;
43
+ if (typeof ref === "function")
44
+ ref(node);
45
+ else if (ref)
46
+ ref.current = node;
47
+ }, [ref]);
48
+ /** What to do after the next render: focus the h1, scroll to the top or to an anchor. */
49
+ const pending = React.useRef(null);
50
+ const pageKey = pages.join("|");
51
+ const localeKey = locales.join("|");
52
+ const params = React.useMemo(() => ({ pageParam, localeParam }), [pageParam, localeParam]);
53
+ const apply = React.useCallback((to, mode) => {
54
+ const nextPage = to.page && pages.includes(to.page) ? to.page : page;
55
+ const nextLocale = to.locale && locales.includes(to.locale) ? to.locale : locale;
56
+ const pageChanged = nextPage !== page;
57
+ if (mode !== "none" && routing !== "memory" && typeof window !== "undefined") {
58
+ const url = writeSiteLocation(window.location, { page: nextPage, locale: nextLocale, anchor: to.anchor }, { page: homePage, locale: homeLocale }, routing, params);
59
+ if (mode === "push")
60
+ window.history.pushState(null, "", url);
61
+ else
62
+ window.history.replaceState(null, "", url);
63
+ }
64
+ if (pageChanged)
65
+ pending.current = { focus: !to.anchor, scroll: true, anchor: to.anchor };
66
+ if (nextLocale !== locale)
67
+ setLocale(nextLocale);
68
+ if (pageChanged)
69
+ setPage(nextPage);
70
+ else if (to.anchor)
71
+ scrollToAnchor(rootRef.current, to.anchor, false);
72
+ // The Navbar's mobile menu is a native popover: close it after any switch.
73
+ rootRef.current?.querySelectorAll("[popover]").forEach((p) => {
74
+ try {
75
+ p.hidePopover();
76
+ }
77
+ catch {
78
+ /* not open */
79
+ }
80
+ });
81
+ },
82
+ // eslint-disable-next-line react-hooks/exhaustive-deps
83
+ [page, locale, pageKey, localeKey, routing, homePage, homeLocale, params, setLocale, setPage]);
84
+ // URL → state on mount and on back/forward.
85
+ React.useEffect(() => {
86
+ if (routing === "memory")
87
+ return;
88
+ const sync = (initial) => {
89
+ const loc = readSiteLocation(window.location.search, window.location.hash, routing, params);
90
+ const nextPage = loc.page && pages.includes(loc.page) ? loc.page : homePage;
91
+ const nextLocale = loc.locale && locales.includes(loc.locale) ? loc.locale : homeLocale;
92
+ const anchor = routing === "search" && window.location.hash.length > 1 ? decodeURIComponent(window.location.hash.slice(1)) : undefined;
93
+ setLocale(nextLocale);
94
+ setPage((prev) => {
95
+ if (prev !== nextPage)
96
+ pending.current = { focus: !initial && !anchor, scroll: !initial, anchor: initial ? anchor : undefined };
97
+ return nextPage;
98
+ });
99
+ };
100
+ // A deep link (`?page=order`) is server-rendered as home and switched here. As a transition,
101
+ // React finishes hydrating the home tree (and any Suspense boundary still dehydrated) before
102
+ // swapping pages, instead of re-rendering mid-hydration — which shifted useId values.
103
+ React.startTransition(() => sync(true));
104
+ const onPop = () => sync(false);
105
+ window.addEventListener("popstate", onPop);
106
+ if (routing === "hash")
107
+ window.addEventListener("hashchange", onPop);
108
+ return () => {
109
+ window.removeEventListener("popstate", onPop);
110
+ window.removeEventListener("hashchange", onPop);
111
+ };
112
+ // eslint-disable-next-line react-hooks/exhaustive-deps
113
+ }, [routing, pageKey, localeKey, homePage, homeLocale, params]);
114
+ // After a page change: scroll, focus the h1, and mark the current links.
115
+ React.useEffect(() => {
116
+ const root = rootRef.current;
117
+ if (!root)
118
+ return;
119
+ const todo = pending.current;
120
+ pending.current = null;
121
+ if (todo?.anchor)
122
+ scrollToAnchor(root, todo.anchor, true);
123
+ else if (todo?.scroll) {
124
+ const top = root.getBoundingClientRect().top + window.scrollY;
125
+ if (window.scrollY > top)
126
+ window.scrollTo({ top: Math.max(0, top), behavior: "instant" });
127
+ }
128
+ if (todo?.focus) {
129
+ const h1 = root.querySelector(`[data-site-page="${cssString(page)}"] h1`) ?? root.querySelector("h1");
130
+ if (h1) {
131
+ if (!h1.hasAttribute("tabindex"))
132
+ h1.setAttribute("tabindex", "-1");
133
+ h1.focus({ preventScroll: true });
134
+ }
135
+ }
136
+ root.querySelectorAll("a[href]").forEach((a) => {
137
+ const loc = parseSiteHref(a.getAttribute("href"), params);
138
+ if (!loc?.page || loc.anchor)
139
+ return;
140
+ if (loc.page === page)
141
+ a.setAttribute("aria-current", "page");
142
+ else if (a.getAttribute("aria-current") === "page")
143
+ a.removeAttribute("aria-current");
144
+ });
145
+ }, [page, locale, params]);
146
+ const handleClick = (e) => {
147
+ onClick?.(e);
148
+ if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)
149
+ return;
150
+ const a = e.target?.closest?.("a[href]");
151
+ if (!a || (a.target && a.target !== "_self") || a.hasAttribute("download"))
152
+ return;
153
+ const loc = parseSiteHref(a.getAttribute("href"), params);
154
+ if (!loc)
155
+ return;
156
+ if (loc.page && !pages.includes(loc.page))
157
+ return;
158
+ if (loc.locale && !locales.includes(loc.locale))
159
+ return;
160
+ e.preventDefault();
161
+ apply(loc, "push");
162
+ };
163
+ const ctx = React.useMemo(() => ({
164
+ page,
165
+ locale,
166
+ pages,
167
+ locales,
168
+ navigate: (to) => apply(to, "push"),
169
+ hrefFor: (p, anchor) => sitePageHref(p, anchor, { routing, pageParam }),
170
+ }),
171
+ // eslint-disable-next-line react-hooks/exhaustive-deps
172
+ [page, locale, pageKey, localeKey, apply, routing, pageParam]);
173
+ // A colour → scoped variables. A name (built-in preset or your own, like "brand") goes
174
+ // straight to data-accent.
175
+ const custom = accent && !isBuiltInAccent(accent) && looksLikeColour(accent) ? accent : undefined;
176
+ const accentStyle = React.useMemo(() => {
177
+ if (!custom)
178
+ return null;
179
+ try {
180
+ const key = siteAccentKey(`${custom}${accentDark ? `-${accentDark}` : ""}`);
181
+ return { key, css: siteAccentCss(siteAccent(custom, { dark: accentDark }), key) };
182
+ }
183
+ catch (err) {
184
+ if (process.env.NODE_ENV !== "production")
185
+ console.warn(`[vamos-ui] SiteShell: ${err.message}`);
186
+ return null;
187
+ }
188
+ }, [custom, accentDark]);
189
+ return (_jsx(SiteShellContext.Provider, { value: ctx, children: _jsxs(ThemeScope, { ref: setRoot, theme: theme, material: material, density: density, font: font, dir: dir, accent: accentStyle ? "site" : custom ? undefined : accent, "data-site-accent": accentStyle?.key, "data-site-shell": "", "data-page": page, lang: locale, className: cn("vb-scope font-sans text-fg", className), onClick: handleClick, ...props, children: [accentStyle ? _jsx("style", { children: accentStyle.css }) : null, children] }) }));
190
+ });
191
+ const looksLikeColour = (v) => v.trim().startsWith("#") || v.includes("(");
192
+ const cssString = (s) => s.replace(/["\\]/g, "\\$&");
193
+ function scrollToAnchor(root, anchor, instant) {
194
+ const el = root?.ownerDocument.getElementById(anchor);
195
+ if (!el)
196
+ return;
197
+ el.scrollIntoView?.({ block: "start", behavior: instant ? "instant" : undefined });
198
+ }
199
+ /** One inner page: rendered only while it is the shell's current page. */
200
+ export function SiteShellPage({ id, title, children }) {
201
+ const { page } = useSiteShell();
202
+ const active = page === id;
203
+ const first = React.useRef(true);
204
+ React.useEffect(() => {
205
+ if (active && title && !first.current)
206
+ document.title = title;
207
+ first.current = false;
208
+ }, [active, title]);
209
+ if (!active)
210
+ return null;
211
+ return (_jsx("div", { "data-site-page": id, className: "contents", children: children }));
212
+ }
213
+ /** One language version: rendered only while it is the shell's current locale (with `lang`). */
214
+ export function SiteShellLocale({ code, children }) {
215
+ const { locale } = useSiteShell();
216
+ if (locale !== code)
217
+ return null;
218
+ return (_jsx("div", { lang: code, className: "contents", children: children }));
219
+ }
220
+ /**
221
+ * A link to an inner page for client code. Server components can use a plain
222
+ * `href={sitePageHref("pricing")}` instead; the shell handles both.
223
+ */
224
+ export const SiteShellLink = React.forwardRef(function SiteShellLink({ page, anchor, ...props }, ref) {
225
+ const { hrefFor, page: current } = useSiteShell();
226
+ return _jsx("a", { ref: ref, href: hrefFor(page, anchor), "aria-current": !anchor && current === page ? "page" : undefined, ...props });
227
+ });