@almadar/std 16.228.0 → 16.230.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 (170) hide show
  1. package/behaviors/behaviors-registry.json +97602 -98073
  2. package/behaviors/lolo/infra/atoms/std-notify-on-event.lolo +2 -2
  3. package/behaviors/lolo/ui/core/atoms/std-book-reader.lolo +316 -0
  4. package/behaviors/lolo/ui/core/atoms/std-card-grid.lolo +172 -0
  5. package/behaviors/lolo/ui/core/atoms/std-hero.lolo +247 -0
  6. package/behaviors/lolo/ui/core/atoms/std-media-section.lolo +154 -0
  7. package/behaviors/lolo/ui/core/atoms/std-pricing.lolo +177 -0
  8. package/behaviors/lolo/ui/core/atoms/std-prose.lolo +85 -0
  9. package/behaviors/lolo/ui/core/atoms/std-site-footer.lolo +159 -0
  10. package/behaviors/lolo/ui/core/atoms/std-site-header.lolo +131 -0
  11. package/behaviors/lolo/ui/core/atoms/std-stat-band.lolo +83 -0
  12. package/behaviors/lolo/ui/core/atoms/std-stats.lolo +4 -5
  13. package/behaviors/lolo/ui/core/atoms/std-steps.lolo +124 -0
  14. package/behaviors/lolo/ui/core/atoms/ui-box.lolo +5 -0
  15. package/behaviors/lolo/ui/core/atoms/ui-button.lolo +6 -1
  16. package/behaviors/lolo/ui/core/atoms/ui-image.lolo +64 -0
  17. package/behaviors/lolo/ui/{marketing/atoms → core/molecules}/ui-animated-counter.lolo +11 -6
  18. package/behaviors/lolo/ui/core/organisms/ui-chat-bar.lolo +5 -0
  19. package/behaviors/lolo/ui/game/atoms/ui-canvas-2d.lolo +1 -1
  20. package/behaviors/lolo-behavior-contracts.json +1 -1
  21. package/behaviors/registry/factory-signatures.json +1 -1
  22. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +45 -9
  23. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +1269 -0
  24. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +826 -0
  25. package/behaviors/registry/ui/core/atoms/std-hero.orb +811 -0
  26. package/behaviors/registry/ui/core/atoms/std-media-section.orb +740 -0
  27. package/behaviors/registry/ui/core/atoms/std-pricing.orb +751 -0
  28. package/behaviors/registry/ui/core/atoms/std-prose.orb +264 -0
  29. package/behaviors/registry/ui/core/atoms/std-site-footer.orb +589 -0
  30. package/behaviors/registry/ui/core/atoms/std-site-header.orb +530 -0
  31. package/behaviors/registry/ui/core/atoms/std-stat-band.orb +311 -0
  32. package/behaviors/registry/ui/core/atoms/std-stats.orb +4 -5
  33. package/behaviors/registry/ui/core/atoms/std-steps.orb +532 -0
  34. package/behaviors/registry/ui/{marketing → core}/atoms/ui-animated-graphic.orb +20 -20
  35. package/behaviors/registry/ui/{marketing → core}/atoms/ui-animated-reveal.orb +20 -20
  36. package/behaviors/registry/ui/core/atoms/ui-box.orb +7 -0
  37. package/behaviors/registry/ui/core/atoms/ui-button.orb +9 -1
  38. package/behaviors/registry/ui/core/atoms/ui-image.orb +231 -0
  39. package/behaviors/registry/ui/{marketing → core}/atoms/ui-pattern-tile.orb +20 -20
  40. package/behaviors/registry/ui/{marketing/atoms → core/molecules}/ui-animated-counter.orb +33 -26
  41. package/behaviors/registry/ui/{marketing/atoms → core/molecules}/ui-feature-card.orb +20 -20
  42. package/behaviors/registry/ui/{marketing/atoms → core/molecules}/ui-geometric-pattern.orb +20 -20
  43. package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +7 -0
  44. package/behaviors/registry/ui/{marketing → core}/templates/ui-auth-layout.orb +20 -20
  45. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +1 -1
  46. package/behaviors/signatures.lolo +1070 -2984
  47. package/canonical-operators.json +3 -3
  48. package/dist/behaviors/exports-reader.js +3818 -10339
  49. package/dist/behaviors/functions/index.d.ts +3965 -6984
  50. package/dist/behaviors/functions/index.js +3786 -10195
  51. package/dist/behaviors/index.d.ts +1 -1
  52. package/dist/behaviors/index.js +3819 -10340
  53. package/dist/behaviors/query.js +3818 -10339
  54. package/dist/behaviors-embeddings.hash.json +3 -3
  55. package/dist/behaviors-embeddings.json +77 -237
  56. package/dist/behaviors-registry.json +97602 -98073
  57. package/dist/index.d.ts +1 -1
  58. package/dist/index.js +3821 -10342
  59. package/dist/knob-embeddings.hash.json +3 -3
  60. package/dist/knob-embeddings.json +352 -1212
  61. package/dist/modules/core.js +2 -2
  62. package/dist/modules/index.js +2 -2
  63. package/dist/registry/factory-signatures.json +1 -1
  64. package/dist/registry.js +2 -2
  65. package/i18n/ar.json +8 -4
  66. package/i18n/en.json +4 -0
  67. package/i18n/sl.json +8 -4
  68. package/package.json +4 -6
  69. package/behaviors/lolo/ui/marketing/atoms/std-marketing-article.lolo +0 -31
  70. package/behaviors/lolo/ui/marketing/atoms/std-marketing-cta.lolo +0 -93
  71. package/behaviors/lolo/ui/marketing/atoms/std-marketing-features.lolo +0 -83
  72. package/behaviors/lolo/ui/marketing/atoms/std-marketing-footer.lolo +0 -72
  73. package/behaviors/lolo/ui/marketing/atoms/std-marketing-hero.lolo +0 -131
  74. package/behaviors/lolo/ui/marketing/atoms/std-marketing-nav.lolo +0 -86
  75. package/behaviors/lolo/ui/marketing/atoms/std-marketing-pricing.lolo +0 -85
  76. package/behaviors/lolo/ui/marketing/atoms/std-marketing-showcase.lolo +0 -87
  77. package/behaviors/lolo/ui/marketing/atoms/std-marketing-split.lolo +0 -50
  78. package/behaviors/lolo/ui/marketing/atoms/std-marketing-stats.lolo +0 -43
  79. package/behaviors/lolo/ui/marketing/atoms/std-marketing-steps.lolo +0 -48
  80. package/behaviors/lolo/ui/marketing/atoms/std-marketing-team.lolo +0 -51
  81. package/behaviors/lolo/ui/marketing/atoms/ui-article-section.lolo +0 -44
  82. package/behaviors/lolo/ui/marketing/atoms/ui-case-study-card.lolo +0 -60
  83. package/behaviors/lolo/ui/marketing/atoms/ui-community-links.lolo +0 -67
  84. package/behaviors/lolo/ui/marketing/atoms/ui-content-section.lolo +0 -44
  85. package/behaviors/lolo/ui/marketing/atoms/ui-cta-banner.lolo +0 -68
  86. package/behaviors/lolo/ui/marketing/atoms/ui-hero-section.lolo +0 -112
  87. package/behaviors/lolo/ui/marketing/atoms/ui-install-box.lolo +0 -39
  88. package/behaviors/lolo/ui/marketing/atoms/ui-marketing-footer.lolo +0 -58
  89. package/behaviors/lolo/ui/marketing/atoms/ui-marketing-stat-card.lolo +0 -45
  90. package/behaviors/lolo/ui/marketing/atoms/ui-pricing-card.lolo +0 -70
  91. package/behaviors/lolo/ui/marketing/atoms/ui-pricing-grid.lolo +0 -49
  92. package/behaviors/lolo/ui/marketing/atoms/ui-pull-quote.lolo +0 -34
  93. package/behaviors/lolo/ui/marketing/atoms/ui-service-catalog.lolo +0 -40
  94. package/behaviors/lolo/ui/marketing/atoms/ui-showcase-card.lolo +0 -64
  95. package/behaviors/lolo/ui/marketing/atoms/ui-split-section.lolo +0 -69
  96. package/behaviors/lolo/ui/marketing/atoms/ui-stats-grid.lolo +0 -44
  97. package/behaviors/lolo/ui/marketing/atoms/ui-step-flow.lolo +0 -51
  98. package/behaviors/lolo/ui/marketing/atoms/ui-tag-cloud.lolo +0 -45
  99. package/behaviors/lolo/ui/marketing/atoms/ui-team-card.lolo +0 -54
  100. package/behaviors/lolo/ui/marketing/organisms/ui-book-chapter-view.lolo +0 -63
  101. package/behaviors/lolo/ui/marketing/organisms/ui-book-cover-page.lolo +0 -54
  102. package/behaviors/lolo/ui/marketing/organisms/ui-book-nav-bar.lolo +0 -49
  103. package/behaviors/lolo/ui/marketing/organisms/ui-book-table-of-contents.lolo +0 -70
  104. package/behaviors/lolo/ui/marketing/organisms/ui-book-viewer.lolo +0 -161
  105. package/behaviors/lolo/ui/marketing/organisms/ui-case-study-organism.lolo +0 -153
  106. package/behaviors/lolo/ui/marketing/organisms/ui-feature-grid-organism.lolo +0 -159
  107. package/behaviors/lolo/ui/marketing/organisms/ui-hero-organism.lolo +0 -162
  108. package/behaviors/lolo/ui/marketing/organisms/ui-pricing-organism.lolo +0 -155
  109. package/behaviors/lolo/ui/marketing/organisms/ui-showcase-organism.lolo +0 -164
  110. package/behaviors/lolo/ui/marketing/organisms/ui-stats-organism.lolo +0 -142
  111. package/behaviors/lolo/ui/marketing/organisms/ui-step-flow-organism.lolo +0 -165
  112. package/behaviors/lolo/ui/marketing/organisms/ui-team-organism.lolo +0 -152
  113. package/behaviors/lolo/ui/marketing/templates/ui-about-page-template.lolo +0 -105
  114. package/behaviors/lolo/ui/marketing/templates/ui-feature-detail-page-template.lolo +0 -93
  115. package/behaviors/lolo/ui/marketing/templates/ui-landing-page-template.lolo +0 -144
  116. package/behaviors/lolo/ui/marketing/templates/ui-pricing-page-template.lolo +0 -89
  117. package/behaviors/registry/ui/marketing/atoms/std-marketing-article.orb +0 -121
  118. package/behaviors/registry/ui/marketing/atoms/std-marketing-cta.orb +0 -360
  119. package/behaviors/registry/ui/marketing/atoms/std-marketing-features.orb +0 -305
  120. package/behaviors/registry/ui/marketing/atoms/std-marketing-footer.orb +0 -265
  121. package/behaviors/registry/ui/marketing/atoms/std-marketing-hero.orb +0 -424
  122. package/behaviors/registry/ui/marketing/atoms/std-marketing-nav.orb +0 -288
  123. package/behaviors/registry/ui/marketing/atoms/std-marketing-pricing.orb +0 -366
  124. package/behaviors/registry/ui/marketing/atoms/std-marketing-showcase.orb +0 -415
  125. package/behaviors/registry/ui/marketing/atoms/std-marketing-split.orb +0 -152
  126. package/behaviors/registry/ui/marketing/atoms/std-marketing-stats.orb +0 -151
  127. package/behaviors/registry/ui/marketing/atoms/std-marketing-steps.orb +0 -221
  128. package/behaviors/registry/ui/marketing/atoms/std-marketing-team.orb +0 -239
  129. package/behaviors/registry/ui/marketing/atoms/ui-article-section.orb +0 -176
  130. package/behaviors/registry/ui/marketing/atoms/ui-case-study-card.orb +0 -195
  131. package/behaviors/registry/ui/marketing/atoms/ui-community-links.orb +0 -254
  132. package/behaviors/registry/ui/marketing/atoms/ui-content-section.orb +0 -182
  133. package/behaviors/registry/ui/marketing/atoms/ui-cta-banner.orb +0 -254
  134. package/behaviors/registry/ui/marketing/atoms/ui-hero-section.orb +0 -345
  135. package/behaviors/registry/ui/marketing/atoms/ui-install-box.orb +0 -163
  136. package/behaviors/registry/ui/marketing/atoms/ui-marketing-footer.orb +0 -298
  137. package/behaviors/registry/ui/marketing/atoms/ui-marketing-stat-card.orb +0 -177
  138. package/behaviors/registry/ui/marketing/atoms/ui-pricing-card.orb +0 -237
  139. package/behaviors/registry/ui/marketing/atoms/ui-pricing-grid.orb +0 -313
  140. package/behaviors/registry/ui/marketing/atoms/ui-pull-quote.orb +0 -156
  141. package/behaviors/registry/ui/marketing/atoms/ui-service-catalog.orb +0 -205
  142. package/behaviors/registry/ui/marketing/atoms/ui-showcase-card.orb +0 -221
  143. package/behaviors/registry/ui/marketing/atoms/ui-split-section.orb +0 -239
  144. package/behaviors/registry/ui/marketing/atoms/ui-stats-grid.orb +0 -202
  145. package/behaviors/registry/ui/marketing/atoms/ui-step-flow.orb +0 -236
  146. package/behaviors/registry/ui/marketing/atoms/ui-tag-cloud.orb +0 -217
  147. package/behaviors/registry/ui/marketing/atoms/ui-team-card.orb +0 -186
  148. package/behaviors/registry/ui/marketing/organisms/ui-book-chapter-view.orb +0 -277
  149. package/behaviors/registry/ui/marketing/organisms/ui-book-cover-page.orb +0 -190
  150. package/behaviors/registry/ui/marketing/organisms/ui-book-nav-bar.orb +0 -183
  151. package/behaviors/registry/ui/marketing/organisms/ui-book-table-of-contents.orb +0 -286
  152. package/behaviors/registry/ui/marketing/organisms/ui-book-viewer.orb +0 -553
  153. package/behaviors/registry/ui/marketing/organisms/ui-case-study-organism.orb +0 -507
  154. package/behaviors/registry/ui/marketing/organisms/ui-feature-grid-organism.orb +0 -504
  155. package/behaviors/registry/ui/marketing/organisms/ui-hero-organism.orb +0 -635
  156. package/behaviors/registry/ui/marketing/organisms/ui-pricing-organism.orb +0 -539
  157. package/behaviors/registry/ui/marketing/organisms/ui-showcase-organism.orb +0 -542
  158. package/behaviors/registry/ui/marketing/organisms/ui-stats-organism.orb +0 -447
  159. package/behaviors/registry/ui/marketing/organisms/ui-step-flow-organism.orb +0 -505
  160. package/behaviors/registry/ui/marketing/organisms/ui-team-organism.orb +0 -494
  161. package/behaviors/registry/ui/marketing/templates/ui-about-page-template.orb +0 -752
  162. package/behaviors/registry/ui/marketing/templates/ui-feature-detail-page-template.orb +0 -638
  163. package/behaviors/registry/ui/marketing/templates/ui-landing-page-template.orb +0 -1028
  164. package/behaviors/registry/ui/marketing/templates/ui-pricing-page-template.orb +0 -603
  165. /package/behaviors/lolo/ui/{marketing → core}/atoms/ui-animated-graphic.lolo +0 -0
  166. /package/behaviors/lolo/ui/{marketing → core}/atoms/ui-animated-reveal.lolo +0 -0
  167. /package/behaviors/lolo/ui/{marketing → core}/atoms/ui-pattern-tile.lolo +0 -0
  168. /package/behaviors/lolo/ui/{marketing/atoms → core/molecules}/ui-feature-card.lolo +0 -0
  169. /package/behaviors/lolo/ui/{marketing/atoms → core/molecules}/ui-geometric-pattern.lolo +0 -0
  170. /package/behaviors/lolo/ui/{marketing → core}/templates/ui-auth-layout.lolo +0 -0
@@ -0,0 +1,247 @@
1
+ app std-hero "1.0.0"
2
+ "std-hero — the headline block at the top of a page, or a call-to-action banner further down. Optional eyebrow badge, headline, supporting text, up to two link actions, an optional copyable command, and optional media below or beside the copy. `look: banner` turns it into a contained call-to-action card. Links follow `href` (in-app path, #anchor, or absolute URL); each click also emits CTA_PRIMARY / CTA_SECONDARY with the href. Pick for landing, product, pricing and campaign pages."
3
+ orbital HeroOrbital {
4
+ entity HeroView [runtime] {
5
+ id : string!
6
+ }
7
+
8
+ trait HeroRender -> @rebindable HeroView [interaction, instance] {
9
+ initial: idle
10
+
11
+ state idle {
12
+ INIT -> idle
13
+ (if (== @config.mediaPosition side)
14
+ (render-ui main @config.sideContent)
15
+ (render-ui main @config.stackedContent))
16
+ HERO_PRIMARY -> idle
17
+ (emit CTA_PRIMARY { href: ?href })
18
+ HERO_SECONDARY -> idle
19
+ (emit CTA_SECONDARY { href: ?href })
20
+ }
21
+
22
+ emits {
23
+ CTA_PRIMARY -> external {
24
+ href : string
25
+ }
26
+ @description "The primary action was clicked; carries its href."
27
+ @synonyms "primary cta, main button, get started click"
28
+ @tier "domain"
29
+ CTA_SECONDARY -> external {
30
+ href : string
31
+ }
32
+ @description "The secondary action was clicked; carries its href."
33
+ @synonyms "secondary cta, second button, learn more click"
34
+ @tier "domain"
35
+ }
36
+
37
+ listens {
38
+ HERO_PRIMARY {
39
+ href : string
40
+ }
41
+ @description "Primary action button click."
42
+ @tier "internal"
43
+ HERO_SECONDARY {
44
+ href : string
45
+ }
46
+ @description "Secondary action button click."
47
+ @tier "internal"
48
+ }
49
+
50
+ config {
51
+ look : "hero" | "banner" = hero
52
+ @label "Look"
53
+ @description "hero = full-width page opener with an h1; banner = contained call-to-action card with an h2"
54
+ @synonyms "cta banner, call to action, callout, page header, masthead"
55
+ @tier "presentation"
56
+ eyebrow : string = ""
57
+ @label "Eyebrow"
58
+ @description "Small badge above the headline; empty hides it"
59
+ @synonyms "tag, kicker, label above title"
60
+ @tier "presentation"
61
+ headline : string = "Build what you mean"
62
+ @label "Headline"
63
+ @description "Main headline"
64
+ @synonyms "title, heading"
65
+ @tier "presentation"
66
+ lede : string = ""
67
+ @label "Supporting text"
68
+ @description "One or two sentences under the headline; empty hides it"
69
+ @synonyms "subtitle, subheading, description, tagline"
70
+ @tier "presentation"
71
+ alignment : "center" | "start" = center
72
+ @label "Alignment"
73
+ @description "Center the copy, or align it to the start edge"
74
+ @tier "presentation"
75
+ primaryLabel : string = "Get started"
76
+ @label "Primary action label"
77
+ @description "Empty hides the primary action"
78
+ @tier "presentation"
79
+ primaryHref : string = "#"
80
+ @label "Primary action link"
81
+ @description "In-app path, #anchor, or absolute URL"
82
+ @tier "presentation"
83
+ secondaryLabel : string = ""
84
+ @label "Secondary action label"
85
+ @description "Empty hides the secondary action"
86
+ @tier "presentation"
87
+ secondaryHref : string = ""
88
+ @label "Secondary action link"
89
+ @description "In-app path, #anchor, or absolute URL"
90
+ @tier "presentation"
91
+ command : string = ""
92
+ @label "Command"
93
+ @description "A shell command shown in a copyable code box under the actions, e.g. an install one-liner; empty hides it"
94
+ @synonyms "install command, cli, terminal snippet"
95
+ @tier "presentation"
96
+ mediaSrc : string = ""
97
+ @label "Media image"
98
+ @description "Screenshot or illustration URL; empty hides it"
99
+ @synonyms "hero image, screenshot, picture"
100
+ @tier "presentation"
101
+ mediaAlt : string = ""
102
+ @label "Media alt text"
103
+ @tier "presentation"
104
+ mediaPosition : "below" | "side" = below
105
+ @label "Media position"
106
+ @description "Below the copy, or beside it on wide screens"
107
+ @tier "presentation"
108
+ surface : "plain" | "muted" = plain
109
+ @label "Surface"
110
+ @description "Background behind the block"
111
+ @tier "presentation"
112
+ copyContent : render-ui = {
113
+ type: stack
114
+ direction: vertical
115
+ gap: lg
116
+ align: (if (== @config.alignment center) center start)
117
+ children: [{
118
+ type: badge
119
+ label: @config.eyebrow
120
+ variant: primary
121
+ size: md
122
+ }, {
123
+ type: typography
124
+ content: @config.headline
125
+ variant: (if (== @config.look banner) h2 h1)
126
+ weight: bold
127
+ align: (if (== @config.alignment center) center left)
128
+ className: "tracking-tight text-balance"
129
+ }, {
130
+ type: typography
131
+ content: @config.lede
132
+ variant: large
133
+ color: muted
134
+ align: (if (== @config.alignment center) center left)
135
+ className: (if (== @config.lede "") hidden "max-w-2xl text-pretty")
136
+ }, {
137
+ type: stack
138
+ direction: horizontal
139
+ gap: md
140
+ wrap: true
141
+ justify: (if (== @config.alignment center) center start)
142
+ className: (if (== @config.primaryLabel "") (if (== @config.secondaryLabel "") hidden "pt-2") "pt-2")
143
+ children: [{
144
+ type: button
145
+ label: @config.primaryLabel
146
+ href: @config.primaryHref
147
+ variant: primary
148
+ size: lg
149
+ action: HERO_PRIMARY
150
+ actionPayload: { href: @config.primaryHref }
151
+ className: (if (== @config.primaryLabel "") hidden "")
152
+ }, {
153
+ type: button
154
+ label: @config.secondaryLabel
155
+ href: @config.secondaryHref
156
+ variant: secondary
157
+ size: lg
158
+ action: HERO_SECONDARY
159
+ actionPayload: { href: @config.secondaryHref }
160
+ className: (if (== @config.secondaryLabel "") hidden "")
161
+ }]
162
+ }, {
163
+ type: box
164
+ fullWidth: true
165
+ className: (if (== @config.command "") hidden "max-w-xl")
166
+ children: [{
167
+ type: code-block
168
+ code: @config.command
169
+ language: bash
170
+ showLanguageBadge: false
171
+ showCopyButton: true
172
+ }]
173
+ }]
174
+ }
175
+ @label "Copy block"
176
+ @tier "internal"
177
+ mediaContent : render-ui = {
178
+ type: image
179
+ src: @config.mediaSrc
180
+ alt: @config.mediaAlt
181
+ rounded: xl
182
+ bordered: true
183
+ loading: eager
184
+ }
185
+ @label "Media block"
186
+ @tier "internal"
187
+ stackedContent : render-ui = {
188
+ type: box
189
+ paddingY: (if (== @config.look banner) xl "2xl")
190
+ bg: (if (== @config.surface muted) muted transparent)
191
+ fullWidth: true
192
+ children: [{
193
+ type: container
194
+ size: xl
195
+ maxWidth: xl
196
+ padding: lg
197
+ children: [{
198
+ type: box
199
+ padding: (if (== @config.look banner) xl none)
200
+ rounded: (if (== @config.look banner) "2xl" none)
201
+ border: (== @config.look banner)
202
+ bg: (if (== @config.look banner) muted transparent)
203
+ children: [{
204
+ type: stack
205
+ direction: vertical
206
+ gap: "2xl"
207
+ align: (if (== @config.alignment center) center stretch)
208
+ children: [@config.copyContent, @config.mediaContent]
209
+ }]
210
+ }]
211
+ }]
212
+ }
213
+ @label "Stacked body"
214
+ @tier "internal"
215
+ sideContent : render-ui = {
216
+ type: box
217
+ paddingY: (if (== @config.look banner) xl "2xl")
218
+ bg: (if (== @config.surface muted) muted transparent)
219
+ fullWidth: true
220
+ children: [{
221
+ type: container
222
+ size: xl
223
+ maxWidth: xl
224
+ padding: lg
225
+ children: [{
226
+ type: box
227
+ padding: (if (== @config.look banner) xl none)
228
+ rounded: (if (== @config.look banner) "2xl" none)
229
+ border: (== @config.look banner)
230
+ bg: (if (== @config.look banner) muted transparent)
231
+ children: [{
232
+ type: split
233
+ ratio: "1:1"
234
+ gap: xl
235
+ align: center
236
+ children: [@config.copyContent, @config.mediaContent]
237
+ }]
238
+ }]
239
+ }]
240
+ }
241
+ @label "Side-by-side body"
242
+ @tier "internal"
243
+ }
244
+ }
245
+
246
+ page "/hero" as HeroPage -> HeroRender
247
+ }
@@ -0,0 +1,154 @@
1
+ app std-media-section "1.0.0"
2
+ "std-media-section — content rows that pair copy with a screenshot or illustration: each row has an eyebrow, heading, body text, a short bullet list and an optional link action on one side and its media on the other, and consecutive rows alternate sides. A row without media sits alone at reading width. Stacks on small screens. Pick for 'how it works', product tours and feature-detail pages."
3
+ type MediaRow = { eyebrow : string, heading : string!, body : string, bullets : [string], mediaSrc : string, mediaAlt : string, actionLabel : string, actionHref : string }
4
+ orbital MediaSectionOrbital {
5
+ entity MediaSectionView [runtime] {
6
+ id : string!
7
+ }
8
+
9
+ trait MediaSectionRender -> @rebindable MediaSectionView [interaction, instance] {
10
+ initial: idle
11
+
12
+ state idle {
13
+ INIT -> idle
14
+ (render-ui main {
15
+ type: box
16
+ paddingY: xl
17
+ bg: (if (== @config.surface muted) muted transparent)
18
+ fullWidth: true
19
+ children: [{
20
+ type: container
21
+ size: xl
22
+ maxWidth: xl
23
+ padding: lg
24
+ children: [{
25
+ type: stack
26
+ direction: vertical
27
+ gap: "2xl"
28
+ children: (array/map @config.rows (fn row (if (== (object/get @row mediaSrc "") "") {
29
+ type: box
30
+ className: "mx-auto w-full max-w-3xl"
31
+ children: [{
32
+ type: stack
33
+ direction: vertical
34
+ gap: md
35
+ align: start
36
+ children: [{
37
+ type: badge
38
+ label: (object/get @row eyebrow "")
39
+ variant: primary
40
+ }, {
41
+ type: typography
42
+ content: (object/get @row heading "")
43
+ variant: h2
44
+ weight: bold
45
+ }, {
46
+ type: typography
47
+ content: (object/get @row body "")
48
+ variant: large
49
+ color: muted
50
+ className: (if (== (object/get @row body "") "") hidden "")
51
+ }, {
52
+ type: markdown-content
53
+ content: (if (== (array/len (object/get @row bullets [])) 0) "" (str/concat "- " (str/join (object/get @row bullets []) "\n- ")))
54
+ className: (if (== (array/len (object/get @row bullets [])) 0) hidden "")
55
+ }, {
56
+ type: button
57
+ label: (object/get @row actionLabel "")
58
+ href: (object/get @row actionHref "")
59
+ variant: secondary
60
+ action: SECTION_ACTION
61
+ actionPayload: { href: (object/get @row actionHref "") }
62
+ className: (if (== (object/get @row actionLabel "") "") hidden "")
63
+ }]
64
+ }]
65
+ } {
66
+ type: split
67
+ ratio: "1:1"
68
+ gap: xl
69
+ align: center
70
+ reverse: (== (math/mod (+ @index (if (== @config.firstMediaSide start) 1 0)) 2) 1)
71
+ children: [{
72
+ type: stack
73
+ direction: vertical
74
+ gap: md
75
+ align: start
76
+ children: [{
77
+ type: badge
78
+ label: (object/get @row eyebrow "")
79
+ variant: primary
80
+ }, {
81
+ type: typography
82
+ content: (object/get @row heading "")
83
+ variant: h2
84
+ weight: bold
85
+ }, {
86
+ type: typography
87
+ content: (object/get @row body "")
88
+ variant: large
89
+ color: muted
90
+ className: (if (== (object/get @row body "") "") hidden "")
91
+ }, {
92
+ type: markdown-content
93
+ content: (if (== (array/len (object/get @row bullets [])) 0) "" (str/concat "- " (str/join (object/get @row bullets []) "\n- ")))
94
+ className: (if (== (array/len (object/get @row bullets [])) 0) hidden "")
95
+ }, {
96
+ type: button
97
+ label: (object/get @row actionLabel "")
98
+ href: (object/get @row actionHref "")
99
+ variant: secondary
100
+ action: SECTION_ACTION
101
+ actionPayload: { href: (object/get @row actionHref "") }
102
+ className: (if (== (object/get @row actionLabel "") "") hidden "")
103
+ }]
104
+ }, {
105
+ type: image
106
+ src: (object/get @row mediaSrc "")
107
+ alt: (object/get @row mediaAlt "")
108
+ rounded: xl
109
+ bordered: true
110
+ }]
111
+ })))
112
+ }]
113
+ }]
114
+ })
115
+ SECTION_ACTION -> idle
116
+ (emit SECTION_ACTION_CLICKED { href: ?href })
117
+ }
118
+
119
+ emits {
120
+ SECTION_ACTION_CLICKED -> external {
121
+ href : string
122
+ }
123
+ @description "A row's link action was clicked; carries its href."
124
+ @tier "domain"
125
+ }
126
+
127
+ listens {
128
+ SECTION_ACTION {
129
+ href : string
130
+ }
131
+ @description "Row link action click."
132
+ @tier "internal"
133
+ }
134
+
135
+ config {
136
+ rows : [MediaRow] = [{ heading: "Everything in one place", body: "Say what you want and see it take shape.", bullets: ["Fast", "Verified", "Yours"] }]
137
+ @label "Rows"
138
+ @description "One row per entry: eyebrow, heading, body, bullets, media (mediaSrc + mediaAlt) and an optional link action (actionLabel + actionHref)"
139
+ @synonyms "feature rows, product tour, split sections, alternating sections, how it works"
140
+ @tier "presentation"
141
+ firstMediaSide : "start" | "end" = end
142
+ @label "First row media side"
143
+ @description "Which side the first row's media sits on; later rows alternate"
144
+ @synonyms "image position, image left, image right, flip"
145
+ @tier "presentation"
146
+ surface : "plain" | "muted" = plain
147
+ @label "Surface"
148
+ @description "Background behind the rows"
149
+ @tier "presentation"
150
+ }
151
+ }
152
+
153
+ page "/media-section" as MediaSectionPage -> MediaSectionRender
154
+ }
@@ -0,0 +1,177 @@
1
+ app std-pricing "1.0.0"
2
+ "std-pricing — side-by-side plan cards from a config list: plan name, price and billing period, a one-line summary, the included features, and a link action per plan; one plan can be highlighted as recommended with a badge. Optional heading and footnote. Clicking a plan's action follows its href and emits PLAN_SELECTED. Pick for pricing pages, subscription tiers and service packages."
3
+ type PricingPlan = { name : string!, price : string!, period : string, summary : string, features : [string], actionLabel : string, actionHref : string, highlighted : boolean, badge : string }
4
+ orbital PricingOrbital {
5
+
6
+ entity PricingView [runtime] {
7
+ id : string!
8
+ }
9
+
10
+ trait PricingRender -> @rebindable PricingView [interaction, instance] {
11
+ initial: idle
12
+
13
+ state idle {
14
+ INIT -> idle
15
+ (render-ui main {
16
+ type: box
17
+ paddingY: xl
18
+ bg: (if (== @config.surface muted) muted transparent)
19
+ fullWidth: true
20
+ children: [{
21
+ type: container
22
+ size: xl
23
+ maxWidth: xl
24
+ padding: lg
25
+ children: [{ type: stack, direction: vertical, gap: xl, children: [{
26
+ type: stack
27
+ direction: vertical
28
+ gap: sm
29
+ align: center
30
+ className: (if (== @config.heading "") (if (== @config.lede "") hidden "") "")
31
+ children: [{
32
+ type: typography
33
+ content: @config.heading
34
+ variant: h2
35
+ weight: bold
36
+ align: center
37
+ className: (if (== @config.heading "") hidden "tracking-tight text-balance")
38
+ }, {
39
+ type: typography
40
+ content: @config.lede
41
+ variant: large
42
+ color: muted
43
+ align: center
44
+ className: (if (== @config.lede "") hidden "max-w-2xl text-pretty")
45
+ }]
46
+ }, {
47
+ type: simple-grid
48
+ cols: (math/min (math/max (array/len @config.plans) 1) 4)
49
+ gap: lg
50
+ className: "items-stretch"
51
+ children: (array/map @config.plans (fn plan {
52
+ type: card
53
+ look: elevated
54
+ padding: lg
55
+ className: (if (object/get @plan highlighted false) "h-full ring-2 ring-primary" "h-full")
56
+ children: [{
57
+ type: stack
58
+ direction: vertical
59
+ gap: md
60
+ className: "h-full"
61
+ children: [{
62
+ type: stack
63
+ direction: horizontal
64
+ gap: sm
65
+ align: center
66
+ justify: between
67
+ children: [{
68
+ type: typography
69
+ content: (object/get @plan name "")
70
+ variant: h4
71
+ weight: semibold
72
+ }, {
73
+ type: badge
74
+ label: (object/get @plan badge "")
75
+ variant: primary
76
+ }]
77
+ }, {
78
+ type: stack
79
+ direction: horizontal
80
+ gap: xs
81
+ align: baseline
82
+ children: [{
83
+ type: typography
84
+ content: (object/get @plan price "")
85
+ variant: h2
86
+ weight: bold
87
+ className: "tracking-tight"
88
+ }, {
89
+ type: typography
90
+ content: (object/get @plan period "")
91
+ variant: body
92
+ color: muted
93
+ className: (if (== (object/get @plan period "") "") hidden "")
94
+ }]
95
+ }, {
96
+ type: typography
97
+ content: (object/get @plan summary "")
98
+ variant: body
99
+ color: muted
100
+ className: (if (== (object/get @plan summary "") "") hidden "text-pretty")
101
+ }, {
102
+ type: divider
103
+ }, {
104
+ type: markdown-content
105
+ content: (if (== (array/len (object/get @plan features [])) 0) "" (str/concat "- " (str/join (object/get @plan features []) "\n- ")))
106
+ className: "flex-1"
107
+ }, {
108
+ type: button
109
+ label: (object/get @plan actionLabel "")
110
+ href: (object/get @plan actionHref "")
111
+ variant: (if (object/get @plan highlighted false) primary secondary)
112
+ size: lg
113
+ action: PLAN_CHOOSE
114
+ actionPayload: { plan: (object/get @plan name ""), href: (object/get @plan actionHref "") }
115
+ className: (if (== (object/get @plan actionLabel "") "") hidden "w-full")
116
+ }]
117
+ }]
118
+ }))
119
+ }, {
120
+ type: typography
121
+ content: @config.footnote
122
+ variant: caption
123
+ color: muted
124
+ align: center
125
+ className: (if (== @config.footnote "") hidden "")
126
+ }] }]
127
+ }]
128
+ })
129
+ PLAN_CHOOSE -> idle
130
+ (emit PLAN_SELECTED { plan: ?plan, href: ?href })
131
+ }
132
+
133
+ emits {
134
+ PLAN_SELECTED -> external {
135
+ plan : string
136
+ href : string
137
+ }
138
+ @description "A plan's action was clicked; carries the plan name and its href."
139
+ @synonyms "choose plan, select tier, subscribe click"
140
+ @tier "domain"
141
+ }
142
+
143
+ listens {
144
+ PLAN_CHOOSE {
145
+ plan : string
146
+ href : string
147
+ }
148
+ @description "Plan action click."
149
+ @tier "internal"
150
+ }
151
+
152
+ config {
153
+ heading : string = ""
154
+ @label "Heading"
155
+ @description "Section heading above the plans; empty hides it"
156
+ @synonyms "title"
157
+ @tier "presentation"
158
+ lede : string = ""
159
+ @label "Supporting text"
160
+ @tier "presentation"
161
+ plans : [PricingPlan] = [{ name: "Starter", price: "$0", period: "/month", summary: "For trying things out.", features: ["1 project", "Community support"], actionLabel: "Start free", actionHref: "#" }, { name: "Team", price: "$29", period: "/month", summary: "For teams shipping every week.", features: ["Unlimited projects", "Shared workspace", "Priority support"], actionLabel: "Choose Team", actionHref: "#", highlighted: true, badge: "Popular" }]
162
+ @label "Plans"
163
+ @description "One card per plan: name, price, period, summary, features, action; `highlighted` marks the recommended plan"
164
+ @synonyms "tiers, packages, subscriptions, pricing table"
165
+ @tier "presentation"
166
+ footnote : string = ""
167
+ @label "Footnote"
168
+ @description "Small print under the plans, e.g. taxes or billing terms"
169
+ @tier "presentation"
170
+ surface : "plain" | "muted" = plain
171
+ @label "Surface"
172
+ @tier "presentation"
173
+ }
174
+ }
175
+
176
+ page "/pricing" as PricingPage -> PricingRender
177
+ }
@@ -0,0 +1,85 @@
1
+ app std-prose "1.0.0"
2
+ "std-prose — a block of long-form text at a comfortable reading width: optional eyebrow, heading and meta line (date, author), then markdown body with headings, lists, links and code blocks. Supports right-to-left text. Pick for articles, blog posts, about and mission pages, policy text and install notes."
3
+ orbital ProseOrbital {
4
+
5
+ entity ProseView [runtime] {
6
+ id : string!
7
+ }
8
+
9
+ trait ProseRender -> @rebindable ProseView [interaction, instance] {
10
+ initial: idle
11
+
12
+ state idle {
13
+ INIT -> idle
14
+ (render-ui main {
15
+ type: box
16
+ paddingY: xl
17
+ bg: (if (== @config.surface muted) muted transparent)
18
+ fullWidth: true
19
+ dir: @config.direction
20
+ children: [{
21
+ type: container
22
+ size: md
23
+ maxWidth: md
24
+ padding: lg
25
+ children: [{
26
+ type: stack
27
+ direction: vertical
28
+ gap: md
29
+ children: [{
30
+ type: badge
31
+ label: @config.eyebrow
32
+ variant: primary
33
+ }, {
34
+ type: typography
35
+ content: @config.heading
36
+ variant: h2
37
+ weight: bold
38
+ className: (if (== @config.heading "") hidden "tracking-tight text-balance")
39
+ }, {
40
+ type: typography
41
+ content: @config.meta
42
+ variant: caption
43
+ color: muted
44
+ className: (if (== @config.meta "") hidden "")
45
+ }, {
46
+ type: markdown-content
47
+ content: @config.body
48
+ direction: @config.direction
49
+ }]
50
+ }]
51
+ }]
52
+ })
53
+ }
54
+
55
+ config {
56
+ eyebrow : string = ""
57
+ @label "Eyebrow"
58
+ @description "Small badge above the heading; empty hides it"
59
+ @tier "presentation"
60
+ heading : string = ""
61
+ @label "Heading"
62
+ @description "Empty hides it"
63
+ @synonyms "title"
64
+ @tier "presentation"
65
+ meta : string = ""
66
+ @label "Meta line"
67
+ @description "Date, author or reading time under the heading; empty hides it"
68
+ @synonyms "byline, date, author"
69
+ @tier "presentation"
70
+ body : string = "Write the text here in **markdown**."
71
+ @label "Body"
72
+ @description "Markdown text"
73
+ @synonyms "content, article, text, copy"
74
+ @tier "presentation"
75
+ direction : "ltr" | "rtl" = ltr
76
+ @label "Text direction"
77
+ @tier "presentation"
78
+ surface : "plain" | "muted" = plain
79
+ @label "Surface"
80
+ @tier "presentation"
81
+ }
82
+ }
83
+
84
+ page "/prose" as ProsePage -> ProseRender
85
+ }