@marktiderman/genesis-sites 0.1.0 → 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 (47) hide show
  1. package/README.md +152 -8
  2. package/dist/assets/islands.77d11f5697.js +1 -0
  3. package/dist/assets/sites-forms.4e6aa42497.css +10 -0
  4. package/dist/assets/sites-forms.css +1 -1
  5. package/dist/assets/sites.css +1 -1
  6. package/dist/assets/sites.e1ffd2708b.css +2 -0
  7. package/dist/blocks.d.ts +1 -1
  8. package/dist/blocks.js +5 -1
  9. package/dist/blocks.js.map +1 -1
  10. package/dist/chunk-3VKTBE7S.js +69 -0
  11. package/dist/chunk-3VKTBE7S.js.map +1 -0
  12. package/dist/chunk-C375ZPU2.js +2241 -0
  13. package/dist/chunk-C375ZPU2.js.map +1 -0
  14. package/dist/{chunk-GA7U3CIN.js → chunk-IXMY4B56.js} +229 -10
  15. package/dist/chunk-IXMY4B56.js.map +1 -0
  16. package/dist/chunk-VZUDRPFG.js +13 -0
  17. package/dist/chunk-VZUDRPFG.js.map +1 -0
  18. package/dist/{chunk-KEF3V5ZN.js → chunk-ZGWGQGT2.js} +169 -73
  19. package/dist/chunk-ZGWGQGT2.js.map +1 -0
  20. package/dist/import.d.ts +130 -0
  21. package/dist/import.js +330 -0
  22. package/dist/import.js.map +1 -0
  23. package/dist/index.d.ts +40 -7
  24. package/dist/index.js +5 -3
  25. package/dist/index.js.map +1 -1
  26. package/dist/{registry-CdgVymsu.d.ts → registry-D_DCWRTc.d.ts} +274 -8
  27. package/dist/sections.d.ts +422 -6
  28. package/dist/sections.js +4 -2
  29. package/dist/{store-BzGw2i5J.d.ts → store-DkSycDhq.d.ts} +119 -53
  30. package/dist/supabase.d.ts +5 -5
  31. package/dist/supabase.js +115 -6
  32. package/dist/supabase.js.map +1 -1
  33. package/dist/web.d.ts +26 -8
  34. package/dist/web.js +142 -18
  35. package/dist/web.js.map +1 -1
  36. package/migrations/0001_genesis_sites.sql +64 -6
  37. package/migrations/0002_genesis_sites_posts.sql +404 -0
  38. package/migrations/tests/0001_genesis_sites.test.sql +30 -1
  39. package/migrations/tests/0002_genesis_sites_posts.test.sql +242 -0
  40. package/package.json +18 -10
  41. package/dist/assets/islands.230b20b9c4.js +0 -1
  42. package/dist/assets/sites-forms.5e6ebf31c3.css +0 -10
  43. package/dist/assets/sites.b28b796c6f.css +0 -2
  44. package/dist/chunk-43XUAO63.js +0 -1255
  45. package/dist/chunk-43XUAO63.js.map +0 -1
  46. package/dist/chunk-GA7U3CIN.js.map +0 -1
  47. package/dist/chunk-KEF3V5ZN.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-mono:var(--font-mono);--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-accent:hsl(var(--accent));--font-display:var(--font-display)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px}img{max-width:100%;height:auto}}@layer components{[data-gs-schedule]:has(input[data-day="0"]:checked) [data-panel]:not([data-panel="0"]),[data-gs-schedule]:has(input[data-day="1"]:checked) [data-panel]:not([data-panel="1"]),[data-gs-schedule]:has(input[data-day="2"]:checked) [data-panel]:not([data-panel="2"]),[data-gs-schedule]:has(input[data-day="3"]:checked) [data-panel]:not([data-panel="3"]),[data-gs-schedule]:has(input[data-day="4"]:checked) [data-panel]:not([data-panel="4"]),[data-gs-schedule]:has(input[data-day="5"]:checked) [data-panel]:not([data-panel="5"]),[data-gs-schedule]:has(input[data-day="6"]:checked) [data-panel]:not([data-panel="6"]){display:none}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-0{inset-inline:0}.top-1\/3{top:33.3333%}.top-11{top:calc(var(--spacing) * 11)}.top-full{top:100%}.bottom-0{bottom:0}.left-1\/2{left:50%}.left-\[1\.375rem\]{left:1.375rem}.isolate{isolation:isolate}.-z-10{z-index:calc(10 * -1)}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:var(--spacing)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[16\/10\]{aspect-ratio:16/10}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-full{height:100%}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-10{width:calc(var(--spacing) * 10)}.w-24{width:calc(var(--spacing) * 24)}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-\[1180px\]{max-width:1180px}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-11{min-width:calc(var(--spacing) * 11)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)}.list-none{list-style-type:none}.columns-1{columns:1}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[2\.75rem_1fr\]{grid-template-columns:2.75rem 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-16{gap:calc(var(--spacing) * 16)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-10{column-gap:calc(var(--spacing) * 10)}.gap-x-12{column-gap:calc(var(--spacing) * 12)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.gap-y-6{row-gap:calc(var(--spacing) * 6)}.gap-y-8{row-gap:calc(var(--spacing) * 8)}.gap-y-10{row-gap:calc(var(--spacing) * 10)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:hsl(var(--border))}.self-start{align-self:flex-start}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-xl{border-top-left-radius:calc(var(--radius) + 4px);border-top-right-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-solid{--tw-border-style:solid;border-style:solid}.border-border{border-color:hsl(var(--border))}.border-current,.border-current\/20{border-color:currentColor}@supports (color:color-mix(in lab, red, red)){.border-current\/20{border-color:color-mix(in oklab, currentcolor 20%, transparent)}}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.bg-background{background-color:hsl(var(--background))}.bg-border{background-color:hsl(var(--border))}.bg-current{background-color:currentColor}.bg-destructive{background-color:hsl(var(--destructive))}.bg-foreground,.bg-foreground\/80{background-color:hsl(var(--foreground))}@supports (color:color-mix(in lab, red, red)){.bg-foreground\/80{background-color:color-mix(in oklab, hsl(var(--foreground)) 80%, transparent)}}.bg-muted{background-color:hsl(var(--muted))}.bg-primary{background-color:hsl(var(--primary))}.bg-secondary{background-color:hsl(var(--secondary))}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0{padding-block:0}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.align-top{vertical-align:top}.font-display{font-family:var(--font-display)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-balance{text-wrap:balance}.text-pretty{text-wrap:pretty}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-background{color:hsl(var(--background))}.text-current{color:currentColor}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-\[hsl\(var\(--primary\)\)\]{accent-color:hsl(var(--primary))}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.peer-checked\:border-primary:is(:where(.peer):checked~*){border-color:hsl(var(--primary))}.peer-checked\:bg-primary:is(:where(.peer):checked~*){background-color:hsl(var(--primary))}.peer-checked\:text-primary-foreground:is(:where(.peer):checked~*){color:hsl(var(--primary-foreground))}.peer-focus-visible\:outline-2:is(:where(.peer):focus-visible~*){outline-style:var(--tw-outline-style);outline-width:2px}.peer-focus-visible\:outline-offset-2:is(:where(.peer):focus-visible~*){outline-offset:2px}.peer-focus-visible\:outline-ring:is(:where(.peer):focus-visible~*){outline-color:hsl(var(--ring))}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.first\:pt-0:first-child{padding-top:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}@media (hover:hover){.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-background\/90:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-background\/90:hover{background-color:color-mix(in oklab, hsl(var(--background)) 90%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, hsl(var(--destructive)) 90%, transparent)}}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, hsl(var(--primary)) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, hsl(var(--secondary)) 80%, transparent)}}.hover\:bg-transparent:hover{background-color:#0000}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:underline:hover{text-decoration-line:underline}}.focus\:not-sr-only:focus{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.focus\:fixed:focus{position:fixed}.focus\:top-4:focus{top:calc(var(--spacing) * 4)}.focus\:left-4:focus{left:calc(var(--spacing) * 4)}.focus\:z-\[100\]:focus{z-index:100}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-ring:focus{outline-color:hsl(var(--ring))}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-ring:focus-visible{outline-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:hsl(var(--destructive))}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:hsl(var(--destructive))}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, hsl(var(--destructive)) 20%, transparent)}}.aria-\[current\=page\]\:underline[aria-current=page]{text-decoration-line:underline}.aria-\[current\=page\]\:underline-offset-8[aria-current=page]{text-underline-offset:8px}@media (prefers-reduced-motion:reduce){.motion-reduce\:transition-none{transition-property:none}}@media not all and (min-width:48rem){.max-md\:hidden{display:none}}@media (min-width:40rem){.sm\:columns-2{columns:2}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-center{justify-content:center}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-12{padding-inline:calc(var(--spacing) * 12)}.sm\:py-10{padding-block:calc(var(--spacing) * 10)}.sm\:py-16{padding-block:calc(var(--spacing) * 16)}.sm\:py-24{padding-block:calc(var(--spacing) * 24)}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:order-2{order:2}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:w-full{width:100%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[2fr_repeat\(3\,1fr\)\]{grid-template-columns:2fr repeat(3,1fr)}.md\:grid-cols-\[minmax\(0\,16rem\)_1fr\]{grid-template-columns:minmax(0,16rem) 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:justify-center{justify-content:center}.md\:justify-end{justify-content:flex-end}.md\:gap-10{gap:calc(var(--spacing) * 10)}.md\:gap-12{gap:calc(var(--spacing) * 12)}.md\:gap-16{gap:calc(var(--spacing) * 16)}.md\:py-4{padding-block:calc(var(--spacing) * 4)}.md\:text-left{text-align:left}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:64rem){.lg\:columns-3{columns:3}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:py-20{padding-block:calc(var(--spacing) * 20)}.lg\:py-32{padding-block:calc(var(--spacing) * 32)}.lg\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}}.\[\&_\[data-video-embed\]\]\:relative [data-video-embed]{position:relative}.\[\&_\[data-video-embed\]\]\:aspect-video [data-video-embed]{aspect-ratio:var(--aspect-video)}.\[\&_\[data-video-embed\]\]\:w-full [data-video-embed]{width:100%}.\[\&_\[data-video-embed\]\]\:overflow-hidden [data-video-embed]{overflow:hidden}.\[\&_\[data-video-embed\]\]\:rounded-md [data-video-embed]{border-radius:calc(var(--radius) - 2px)}.\[\&_\[data-video-embed\]\]\:bg-muted [data-video-embed]{background-color:hsl(var(--muted))}.\[\&_\[data-video-embed\]_iframe\]\:absolute [data-video-embed] iframe{position:absolute}.\[\&_\[data-video-embed\]_iframe\]\:inset-0 [data-video-embed] iframe{inset:0}.\[\&_\[data-video-embed\]_iframe\]\:h-full [data-video-embed] iframe{height:100%}.\[\&_\[data-video-embed\]_iframe\]\:w-full [data-video-embed] iframe{width:100%}.\[\&_\[data-video-embed\]_iframe\]\:border-0 [data-video-embed] iframe{border-style:var(--tw-border-style);border-width:0}.\[\&_a\]\:text-primary a{color:hsl(var(--primary))}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-4 a{text-underline-offset:4px}.\[\&_blockquote\]\:border-l-2 blockquote{border-left-style:var(--tw-border-style);border-left-width:2px}.\[\&_blockquote\]\:border-border blockquote{border-color:hsl(var(--border))}.\[\&_blockquote\]\:pl-4 blockquote{padding-left:calc(var(--spacing) * 4)}.\[\&_blockquote\]\:text-muted-foreground blockquote{color:hsl(var(--muted-foreground))}.\[\&_blockquote\]\:italic blockquote{font-style:italic}.\[\&_h2\]\:mt-6 h2{margin-top:calc(var(--spacing) * 6)}.\[\&_h2\]\:font-display h2{font-family:var(--font-display)}.\[\&_h2\]\:text-2xl h2{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.\[\&_h2\]\:text-xl h2{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.\[\&_h2\]\:font-semibold h2{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_h2\]\:tracking-tight h2{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.first\:\[\&_h2\]\:mt-0:first-child h2{margin-top:0}.\[\&_h3\]\:mt-5 h3{margin-top:calc(var(--spacing) * 5)}.\[\&_h3\]\:font-display h3{font-family:var(--font-display)}.\[\&_h3\]\:text-lg h3{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.\[\&_h3\]\:text-xl h3{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.\[\&_h3\]\:font-semibold h3{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.first\:\[\&_h3\]\:mt-0:first-child h3{margin-top:0}.\[\&_h4\]\:mt-4 h4{margin-top:calc(var(--spacing) * 4)}.\[\&_h4\]\:text-base h4{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.\[\&_h4\]\:font-semibold h4{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.first\:\[\&_h4\]\:mt-0:first-child h4{margin-top:0}.\[\&_li\]\:my-1 li{margin-block:var(--spacing)}.\[\&_li\>p\]\:m-0 li>p{margin:0}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:pl-6 ol{padding-left:calc(var(--spacing) * 6)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:pl-6 ul{padding-left:calc(var(--spacing) * 6)}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\>\*\+\*\]\:mt-3>*+*{margin-top:calc(var(--spacing) * 3)}.\[\&\>li\]\:mb-4>li{margin-bottom:calc(var(--spacing) * 4)}.\[\&\>li\]\:break-inside-avoid>li{break-inside:avoid}}:root{--background:0 0% 100%;--foreground:240 10% 3.9%;--card:0 0% 100%;--card-foreground:240 10% 3.9%;--popover:0 0% 100%;--popover-foreground:240 10% 3.9%;--primary:243 75% 59%;--primary-foreground:0 0% 100%;--secondary:240 4.8% 95.9%;--secondary-foreground:240 5.9% 10%;--muted:240 4.8% 95.9%;--muted-foreground:240 3.8% 46.1%;--accent:240 4.8% 95.9%;--accent-foreground:240 5.9% 10%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:240 5.9% 90%;--input:240 5.9% 90%;--ring:243 75% 59%;--radius:.625rem;--chart-1:12 76% 61%;--chart-2:173 58% 39%;--chart-3:197 37% 24%;--chart-4:43 74% 66%;--chart-5:27 87% 67%;--success:160 84.1% 39.4%;--success-foreground:0 0% 100%;--warning:38 92.1% 50.2%;--warning-foreground:0 0% 100%;--info:217 91.2% 59.8%;--info-foreground:0 0% 100%;--sidebar-background:0 0% 98%;--sidebar-foreground:240 5.3% 26.1%;--sidebar-primary:243 75% 59%;--sidebar-primary-foreground:0 0% 100%;--sidebar-accent:240 4.8% 95.9%;--sidebar-accent-foreground:240 5.9% 10%;--sidebar-border:220 13% 91%;--sidebar-ring:243 75% 59%;--font-sans:Inter, ui-sans-serif, system-ui, sans-serif;--font-display:"Space Grotesk", ui-sans-serif, system-ui, sans-serif;--font-mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace}.dark{--background:240 10% 3.9%;--foreground:0 0% 98%;--card:240 10% 3.9%;--card-foreground:0 0% 98%;--popover:240 10% 3.9%;--popover-foreground:0 0% 98%;--primary:243 75% 69%;--primary-foreground:240 10% 3.9%;--secondary:240 3.7% 15.9%;--secondary-foreground:0 0% 98%;--muted:240 3.7% 15.9%;--muted-foreground:240 5% 64.9%;--accent:240 3.7% 15.9%;--accent-foreground:0 0% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:240 3.7% 15.9%;--input:240 3.7% 15.9%;--ring:243 75% 69%;--radius:.625rem;--chart-1:220 70% 50%;--chart-2:160 60% 45%;--chart-3:30 80% 55%;--chart-4:280 65% 60%;--chart-5:340 75% 55%;--success:160 84.1% 49%;--success-foreground:0 0% 100%;--warning:38 92.1% 50.2%;--warning-foreground:0 0% 100%;--info:217 91.2% 59.8%;--info-foreground:0 0% 100%;--sidebar-background:240 5.9% 10%;--sidebar-foreground:240 4.8% 95.9%;--sidebar-primary:243 75% 69%;--sidebar-primary-foreground:240 10% 3.9%;--sidebar-accent:240 3.7% 15.9%;--sidebar-accent-foreground:240 4.8% 95.9%;--sidebar-border:240 3.7% 15.9%;--sidebar-ring:243 75% 69%;--font-sans:Inter, ui-sans-serif, system-ui, sans-serif;--font-display:"Space Grotesk", ui-sans-serif, system-ui, sans-serif;--font-mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
package/dist/blocks.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as _marktiderman_genesis_features_blocks from '@marktiderman/genesis-fe
2
2
 
3
3
  /**
4
4
  * Sites and landing pages: the `genesis_sites` schema (sites, pages,
5
- * releases, assets), drafts, publish and rollback. The pages are served by
5
+ * releases, assets, blog posts), drafts, publish and rollback. The pages are served by
6
6
  * `handleSiteRequest` from `@marktiderman/genesis-sites/web`, mounted by the
7
7
  * app on its own server.
8
8
  *
package/dist/blocks.js CHANGED
@@ -6,11 +6,15 @@ var sitesBlock = defineBlock({
6
6
  id: "sites",
7
7
  platforms: ["web", "server"],
8
8
  contributes: {
9
- migrations: [{ package: PACKAGE, file: "migrations/0001_genesis_sites.sql", test: "migrations/tests/0001_genesis_sites.test.sql" }],
9
+ migrations: [
10
+ { package: PACKAGE, file: "migrations/0001_genesis_sites.sql", test: "migrations/tests/0001_genesis_sites.test.sql" },
11
+ { package: PACKAGE, file: "migrations/0002_genesis_sites_posts.sql", test: "migrations/tests/0002_genesis_sites_posts.test.sql" }
12
+ ],
10
13
  privacy: {
11
14
  notes: [
12
15
  "Sites hold what their editors write and publish; a published site is public.",
13
16
  "Each release records who published it; a deleted person's releases stay, without the person.",
17
+ "Blog posts record who wrote them; a published post is public until it is taken down or deleted.",
14
18
  "Visitors' form answers go to the app's own forms endpoint, not to the site tables."
15
19
  ]
16
20
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/blocks.ts"],"names":[],"mappings":";;;AAOA,IAAM,OAAA,GAAU,6BAAA;AAUT,IAAM,aAAa,WAAA,CAAY;AAAA,EACpC,EAAA,EAAI,OAAA;AAAA,EACJ,SAAA,EAAW,CAAC,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC3B,WAAA,EAAa;AAAA,IACX,UAAA,EAAY,CAAC,EAAE,OAAA,EAAS,SAAS,IAAA,EAAM,mCAAA,EAAqC,IAAA,EAAM,8CAAA,EAAgD,CAAA;AAAA,IAClI,OAAA,EAAS;AAAA,MACP,KAAA,EAAO;AAAA,QACL,8EAAA;AAAA,QACA,8FAAA;AAAA,QACA;AAAA;AACF;AACF;AAEJ,CAAC","file":"blocks.js","sourcesContent":["/**\n * The sites block, as a `defineBlock` declaration: what `genesis add sites`\n * installs (the migration and its pgTAP test) and what it means for the\n * stores' privacy forms. Node-safe: no React, no Supabase client.\n */\nimport { defineBlock } from \"@marktiderman/genesis-features/blocks\";\n\nconst PACKAGE = \"@marktiderman/genesis-sites\";\n\n/**\n * Sites and landing pages: the `genesis_sites` schema (sites, pages,\n * releases, assets), drafts, publish and rollback. The pages are served by\n * `handleSiteRequest` from `@marktiderman/genesis-sites/web`, mounted by the\n * app on its own server.\n *\n * @stability Beta\n */\nexport const sitesBlock = defineBlock({\n id: \"sites\",\n platforms: [\"web\", \"server\"],\n contributes: {\n migrations: [{ package: PACKAGE, file: \"migrations/0001_genesis_sites.sql\", test: \"migrations/tests/0001_genesis_sites.test.sql\" }],\n privacy: {\n notes: [\n \"Sites hold what their editors write and publish; a published site is public.\",\n \"Each release records who published it; a deleted person's releases stay, without the person.\",\n \"Visitors' form answers go to the app's own forms endpoint, not to the site tables.\",\n ],\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/blocks.ts"],"names":[],"mappings":";;;AAOA,IAAM,OAAA,GAAU,6BAAA;AAUT,IAAM,aAAa,WAAA,CAAY;AAAA,EACpC,EAAA,EAAI,OAAA;AAAA,EACJ,SAAA,EAAW,CAAC,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC3B,WAAA,EAAa;AAAA,IACX,UAAA,EAAY;AAAA,MACV,EAAE,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,mCAAA,EAAqC,MAAM,8CAAA,EAA+C;AAAA,MACpH,EAAE,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,yCAAA,EAA2C,MAAM,oDAAA;AAAqD,KAClI;AAAA,IACA,OAAA,EAAS;AAAA,MACP,KAAA,EAAO;AAAA,QACL,8EAAA;AAAA,QACA,8FAAA;AAAA,QACA,iGAAA;AAAA,QACA;AAAA;AACF;AACF;AAEJ,CAAC","file":"blocks.js","sourcesContent":["/**\n * The sites block, as a `defineBlock` declaration: what `genesis add sites`\n * installs (the migration and its pgTAP test) and what it means for the\n * stores' privacy forms. Node-safe: no React, no Supabase client.\n */\nimport { defineBlock } from \"@marktiderman/genesis-features/blocks\";\n\nconst PACKAGE = \"@marktiderman/genesis-sites\";\n\n/**\n * Sites and landing pages: the `genesis_sites` schema (sites, pages,\n * releases, assets, blog posts), drafts, publish and rollback. The pages are served by\n * `handleSiteRequest` from `@marktiderman/genesis-sites/web`, mounted by the\n * app on its own server.\n *\n * @stability Beta\n */\nexport const sitesBlock = defineBlock({\n id: \"sites\",\n platforms: [\"web\", \"server\"],\n contributes: {\n migrations: [\n { package: PACKAGE, file: \"migrations/0001_genesis_sites.sql\", test: \"migrations/tests/0001_genesis_sites.test.sql\" },\n { package: PACKAGE, file: \"migrations/0002_genesis_sites_posts.sql\", test: \"migrations/tests/0002_genesis_sites_posts.test.sql\" },\n ],\n privacy: {\n notes: [\n \"Sites hold what their editors write and publish; a published site is public.\",\n \"Each release records who published it; a deleted person's releases stay, without the person.\",\n \"Blog posts record who wrote them; a published post is public until it is taken down or deleted.\",\n \"Visitors' form answers go to the app's own forms endpoint, not to the site tables.\",\n ],\n },\n },\n});\n"]}
@@ -0,0 +1,69 @@
1
+ // src/core/urls.ts
2
+ var MAX_URL_LENGTH = 2048;
3
+ var SAFE_SCHEMES = /* @__PURE__ */ new Set(["https:", "http:", "mailto:", "tel:"]);
4
+ var UNSAFE_CHARS = /[\u0000-\u001f\u007f\\\s]/;
5
+ function isSafeHref(value) {
6
+ if (typeof value !== "string" || value.length === 0 || value.length > MAX_URL_LENGTH) return false;
7
+ if (UNSAFE_CHARS.test(value)) return false;
8
+ if (value.startsWith("#")) return true;
9
+ if (value.startsWith("/")) return !value.startsWith("//");
10
+ let url;
11
+ try {
12
+ url = new URL(value);
13
+ } catch {
14
+ return false;
15
+ }
16
+ if (!SAFE_SCHEMES.has(url.protocol)) return false;
17
+ if (url.protocol === "http:" || url.protocol === "https:") return url.hostname.length > 0 && !url.username && !url.password;
18
+ return true;
19
+ }
20
+ function isSafeImageSrc(value) {
21
+ if (!isSafeHref(value)) return false;
22
+ if (value.startsWith("/")) return true;
23
+ return value.startsWith("https://");
24
+ }
25
+ function isExternalHref(href) {
26
+ return /^https?:\/\//i.test(href);
27
+ }
28
+ var PAGE_PATH = /^\/(?:[a-z0-9]+(?:-[a-z0-9]+)*(?:\/[a-z0-9]+(?:-[a-z0-9]+)*){0,7})?$/;
29
+ var MAX_PAGE_PATH_LENGTH = 200;
30
+ var DEFAULT_RESERVED_PATHS = Object.freeze(["/api", "/_server", "/auth", "/_gs"]);
31
+ function isReservedPath(path, reserved = DEFAULT_RESERVED_PATHS) {
32
+ if (typeof reserved === "function") return reserved(path);
33
+ const probe = path.toLowerCase();
34
+ return reserved.some((prefix) => {
35
+ const lower = prefix.toLowerCase();
36
+ const p = lower.endsWith("/") && lower.length > 1 ? lower.slice(0, -1) : lower;
37
+ return probe === p || probe.startsWith(`${p}/`);
38
+ });
39
+ }
40
+ function pagePathProblems(path, reserved = DEFAULT_RESERVED_PATHS) {
41
+ if (typeof path !== "string") return ["A page path is text."];
42
+ const problems = [];
43
+ if (path.length > MAX_PAGE_PATH_LENGTH) problems.push(`A page path has at most ${MAX_PAGE_PATH_LENGTH} characters.`);
44
+ if (!PAGE_PATH.test(path)) {
45
+ problems.push('A page path starts with "/" and uses lowercase letters, digits and single hyphens, with no trailing slash (for example "/about").');
46
+ }
47
+ if (isReservedPath(path, reserved)) problems.push(`"${path}" is reserved for the app this site shares its address with.`);
48
+ return problems;
49
+ }
50
+ function validatePagePath(path, reserved = DEFAULT_RESERVED_PATHS) {
51
+ const problems = pagePathProblems(path, reserved);
52
+ if (problems.length) throw new Error(problems.join(" "));
53
+ return path;
54
+ }
55
+ function normalizeRequestPath(pathname) {
56
+ let path;
57
+ try {
58
+ path = decodeURIComponent(pathname);
59
+ } catch {
60
+ return null;
61
+ }
62
+ if (UNSAFE_CHARS.test(path) || path.includes("//")) return null;
63
+ if (path.length > 1 && path.endsWith("/")) path = path.slice(0, -1);
64
+ return path.toLowerCase();
65
+ }
66
+
67
+ export { DEFAULT_RESERVED_PATHS, MAX_PAGE_PATH_LENGTH, MAX_URL_LENGTH, PAGE_PATH, isExternalHref, isReservedPath, isSafeHref, isSafeImageSrc, normalizeRequestPath, pagePathProblems, validatePagePath };
68
+ //# sourceMappingURL=chunk-3VKTBE7S.js.map
69
+ //# sourceMappingURL=chunk-3VKTBE7S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/urls.ts"],"names":[],"mappings":"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","file":"chunk-3VKTBE7S.js","sourcesContent":["/**\n * URL and path rules shared by the schemas, the renderer and the database.\n *\n * Every link a site renders comes from stored props, so every link is\n * untrusted. A link is safe when it is a site path (`/about`), a fragment\n * (`#pricing`), or an absolute `https:`, `http:`, `mailto:` or `tel:` URL.\n * Everything else (`javascript:`, `data:`, `vbscript:`, protocol-relative\n * `//host`, a backslash trick, a control character) is refused, both when a\n * document is parsed and again when it is rendered.\n */\n\n/** The longest URL a site stores. */\nexport const MAX_URL_LENGTH = 2048;\n\nconst SAFE_SCHEMES = new Set([\"https:\", \"http:\", \"mailto:\", \"tel:\"]);\n// C0 controls, DEL, whitespace other than a plain space, and the backslash\n// (browsers read `\\` as `/` in special URLs, so `/\\evil.test` is `//evil.test`).\n// eslint-disable-next-line no-control-regex\nconst UNSAFE_CHARS = /[\\u0000-\\u001f\\u007f\\\\\\s]/;\n\n/** Is this a link a site may render: a site path, a fragment, or an http(s), mailto or tel URL? */\nexport function isSafeHref(value: unknown): value is string {\n if (typeof value !== \"string\" || value.length === 0 || value.length > MAX_URL_LENGTH) return false;\n if (UNSAFE_CHARS.test(value)) return false;\n if (value.startsWith(\"#\")) return true;\n if (value.startsWith(\"/\")) return !value.startsWith(\"//\");\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n return false;\n }\n if (!SAFE_SCHEMES.has(url.protocol)) return false;\n if (url.protocol === \"http:\" || url.protocol === \"https:\") return url.hostname.length > 0 && !url.username && !url.password;\n return true;\n}\n\n/** Is this a URL an image may load from: a site path or an `https:` URL? */\nexport function isSafeImageSrc(value: unknown): value is string {\n if (!isSafeHref(value)) return false;\n if (value.startsWith(\"/\")) return true;\n return value.startsWith(\"https://\");\n}\n\n/** Is this an external (absolute) link, opened with `rel=\"noopener noreferrer\"`? */\nexport function isExternalHref(href: string): boolean {\n return /^https?:\\/\\//i.test(href);\n}\n\n/**\n * A page's path: `/`, or lowercase segments of letters, digits and hyphens\n * (`/about`, `/classes/strength`). No trailing slash, no dots, at most 8\n * segments and 200 characters. The database checks the same pattern.\n */\nexport const PAGE_PATH = /^\\/(?:[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*){0,7})?$/;\nexport const MAX_PAGE_PATH_LENGTH = 200;\n\n/**\n * Paths a site never owns, because it shares its hostname with the host app:\n * the app's API and server functions, its auth callbacks, and this package's\n * own assets. A host passes its own list (or a predicate) to\n * `handleSiteRequest` and `validatePagePath`; the database's default is the\n * same list (`genesis_sites.reserved_paths()`).\n */\nexport const DEFAULT_RESERVED_PATHS: readonly string[] = Object.freeze([\"/api\", \"/_server\", \"/auth\", \"/_gs\"]);\n\n/** A reserved-path rule: a list of path prefixes, or a predicate. */\nexport type ReservedPaths = readonly string[] | ((path: string) => boolean);\n\n/** Is `path` reserved: equal to a reserved prefix, or under it (`/api`, `/api/x`, not `/apiary`)? */\nexport function isReservedPath(path: string, reserved: ReservedPaths = DEFAULT_RESERVED_PATHS): boolean {\n if (typeof reserved === \"function\") return reserved(path);\n // Case-insensitive, like the database's check: /AUTH is the app's /auth on a case-insensitive router.\n const probe = path.toLowerCase();\n return reserved.some((prefix) => {\n const lower = prefix.toLowerCase();\n const p = lower.endsWith(\"/\") && lower.length > 1 ? lower.slice(0, -1) : lower;\n return probe === p || probe.startsWith(`${p}/`);\n });\n}\n\n/** Problems with a page path, empty when it is fine. */\nexport function pagePathProblems(path: unknown, reserved: ReservedPaths = DEFAULT_RESERVED_PATHS): string[] {\n if (typeof path !== \"string\") return [\"A page path is text.\"];\n const problems: string[] = [];\n if (path.length > MAX_PAGE_PATH_LENGTH) problems.push(`A page path has at most ${MAX_PAGE_PATH_LENGTH} characters.`);\n if (!PAGE_PATH.test(path)) {\n problems.push('A page path starts with \"/\" and uses lowercase letters, digits and single hyphens, with no trailing slash (for example \"/about\").');\n }\n if (isReservedPath(path, reserved)) problems.push(`\"${path}\" is reserved for the app this site shares its address with.`);\n return problems;\n}\n\n/** Throws when the path can't be a page's. */\nexport function validatePagePath(path: string, reserved: ReservedPaths = DEFAULT_RESERVED_PATHS): string {\n const problems = pagePathProblems(path, reserved);\n if (problems.length) throw new Error(problems.join(\" \"));\n return path;\n}\n\n/**\n * The page path a request path asks for: decoded, lowercase, without a\n * trailing slash. Returns null for a path that can't name a page (so the\n * caller falls through to the host app).\n */\nexport function normalizeRequestPath(pathname: string): string | null {\n let path: string;\n try {\n path = decodeURIComponent(pathname);\n } catch {\n return null;\n }\n if (UNSAFE_CHARS.test(path) || path.includes(\"//\")) return null;\n if (path.length > 1 && path.endsWith(\"/\")) path = path.slice(0, -1);\n return path.toLowerCase();\n}\n"]}