@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.
- package/behaviors/behaviors-registry.json +97602 -98073
- package/behaviors/lolo/infra/atoms/std-notify-on-event.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/std-book-reader.lolo +316 -0
- package/behaviors/lolo/ui/core/atoms/std-card-grid.lolo +172 -0
- package/behaviors/lolo/ui/core/atoms/std-hero.lolo +247 -0
- package/behaviors/lolo/ui/core/atoms/std-media-section.lolo +154 -0
- package/behaviors/lolo/ui/core/atoms/std-pricing.lolo +177 -0
- package/behaviors/lolo/ui/core/atoms/std-prose.lolo +85 -0
- package/behaviors/lolo/ui/core/atoms/std-site-footer.lolo +159 -0
- package/behaviors/lolo/ui/core/atoms/std-site-header.lolo +131 -0
- package/behaviors/lolo/ui/core/atoms/std-stat-band.lolo +83 -0
- package/behaviors/lolo/ui/core/atoms/std-stats.lolo +4 -5
- package/behaviors/lolo/ui/core/atoms/std-steps.lolo +124 -0
- package/behaviors/lolo/ui/core/atoms/ui-box.lolo +5 -0
- package/behaviors/lolo/ui/core/atoms/ui-button.lolo +6 -1
- package/behaviors/lolo/ui/core/atoms/ui-image.lolo +64 -0
- package/behaviors/lolo/ui/{marketing/atoms → core/molecules}/ui-animated-counter.lolo +11 -6
- package/behaviors/lolo/ui/core/organisms/ui-chat-bar.lolo +5 -0
- package/behaviors/lolo/ui/game/atoms/ui-canvas-2d.lolo +1 -1
- package/behaviors/lolo-behavior-contracts.json +1 -1
- package/behaviors/registry/factory-signatures.json +1 -1
- package/behaviors/registry/infra/atoms/std-notify-on-event.orb +45 -9
- package/behaviors/registry/ui/core/atoms/std-book-reader.orb +1269 -0
- package/behaviors/registry/ui/core/atoms/std-card-grid.orb +826 -0
- package/behaviors/registry/ui/core/atoms/std-hero.orb +811 -0
- package/behaviors/registry/ui/core/atoms/std-media-section.orb +740 -0
- package/behaviors/registry/ui/core/atoms/std-pricing.orb +751 -0
- package/behaviors/registry/ui/core/atoms/std-prose.orb +264 -0
- package/behaviors/registry/ui/core/atoms/std-site-footer.orb +589 -0
- package/behaviors/registry/ui/core/atoms/std-site-header.orb +530 -0
- package/behaviors/registry/ui/core/atoms/std-stat-band.orb +311 -0
- package/behaviors/registry/ui/core/atoms/std-stats.orb +4 -5
- package/behaviors/registry/ui/core/atoms/std-steps.orb +532 -0
- package/behaviors/registry/ui/{marketing → core}/atoms/ui-animated-graphic.orb +20 -20
- package/behaviors/registry/ui/{marketing → core}/atoms/ui-animated-reveal.orb +20 -20
- package/behaviors/registry/ui/core/atoms/ui-box.orb +7 -0
- package/behaviors/registry/ui/core/atoms/ui-button.orb +9 -1
- package/behaviors/registry/ui/core/atoms/ui-image.orb +231 -0
- package/behaviors/registry/ui/{marketing → core}/atoms/ui-pattern-tile.orb +20 -20
- package/behaviors/registry/ui/{marketing/atoms → core/molecules}/ui-animated-counter.orb +33 -26
- package/behaviors/registry/ui/{marketing/atoms → core/molecules}/ui-feature-card.orb +20 -20
- package/behaviors/registry/ui/{marketing/atoms → core/molecules}/ui-geometric-pattern.orb +20 -20
- package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +7 -0
- package/behaviors/registry/ui/{marketing → core}/templates/ui-auth-layout.orb +20 -20
- package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +1 -1
- package/behaviors/signatures.lolo +1070 -2984
- package/canonical-operators.json +3 -3
- package/dist/behaviors/exports-reader.js +3818 -10339
- package/dist/behaviors/functions/index.d.ts +3965 -6984
- package/dist/behaviors/functions/index.js +3786 -10195
- package/dist/behaviors/index.d.ts +1 -1
- package/dist/behaviors/index.js +3819 -10340
- package/dist/behaviors/query.js +3818 -10339
- package/dist/behaviors-embeddings.hash.json +3 -3
- package/dist/behaviors-embeddings.json +77 -237
- package/dist/behaviors-registry.json +97602 -98073
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3821 -10342
- package/dist/knob-embeddings.hash.json +3 -3
- package/dist/knob-embeddings.json +352 -1212
- package/dist/modules/core.js +2 -2
- package/dist/modules/index.js +2 -2
- package/dist/registry/factory-signatures.json +1 -1
- package/dist/registry.js +2 -2
- package/i18n/ar.json +8 -4
- package/i18n/en.json +4 -0
- package/i18n/sl.json +8 -4
- package/package.json +4 -6
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-article.lolo +0 -31
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-cta.lolo +0 -93
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-features.lolo +0 -83
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-footer.lolo +0 -72
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-hero.lolo +0 -131
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-nav.lolo +0 -86
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-pricing.lolo +0 -85
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-showcase.lolo +0 -87
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-split.lolo +0 -50
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-stats.lolo +0 -43
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-steps.lolo +0 -48
- package/behaviors/lolo/ui/marketing/atoms/std-marketing-team.lolo +0 -51
- package/behaviors/lolo/ui/marketing/atoms/ui-article-section.lolo +0 -44
- package/behaviors/lolo/ui/marketing/atoms/ui-case-study-card.lolo +0 -60
- package/behaviors/lolo/ui/marketing/atoms/ui-community-links.lolo +0 -67
- package/behaviors/lolo/ui/marketing/atoms/ui-content-section.lolo +0 -44
- package/behaviors/lolo/ui/marketing/atoms/ui-cta-banner.lolo +0 -68
- package/behaviors/lolo/ui/marketing/atoms/ui-hero-section.lolo +0 -112
- package/behaviors/lolo/ui/marketing/atoms/ui-install-box.lolo +0 -39
- package/behaviors/lolo/ui/marketing/atoms/ui-marketing-footer.lolo +0 -58
- package/behaviors/lolo/ui/marketing/atoms/ui-marketing-stat-card.lolo +0 -45
- package/behaviors/lolo/ui/marketing/atoms/ui-pricing-card.lolo +0 -70
- package/behaviors/lolo/ui/marketing/atoms/ui-pricing-grid.lolo +0 -49
- package/behaviors/lolo/ui/marketing/atoms/ui-pull-quote.lolo +0 -34
- package/behaviors/lolo/ui/marketing/atoms/ui-service-catalog.lolo +0 -40
- package/behaviors/lolo/ui/marketing/atoms/ui-showcase-card.lolo +0 -64
- package/behaviors/lolo/ui/marketing/atoms/ui-split-section.lolo +0 -69
- package/behaviors/lolo/ui/marketing/atoms/ui-stats-grid.lolo +0 -44
- package/behaviors/lolo/ui/marketing/atoms/ui-step-flow.lolo +0 -51
- package/behaviors/lolo/ui/marketing/atoms/ui-tag-cloud.lolo +0 -45
- package/behaviors/lolo/ui/marketing/atoms/ui-team-card.lolo +0 -54
- package/behaviors/lolo/ui/marketing/organisms/ui-book-chapter-view.lolo +0 -63
- package/behaviors/lolo/ui/marketing/organisms/ui-book-cover-page.lolo +0 -54
- package/behaviors/lolo/ui/marketing/organisms/ui-book-nav-bar.lolo +0 -49
- package/behaviors/lolo/ui/marketing/organisms/ui-book-table-of-contents.lolo +0 -70
- package/behaviors/lolo/ui/marketing/organisms/ui-book-viewer.lolo +0 -161
- package/behaviors/lolo/ui/marketing/organisms/ui-case-study-organism.lolo +0 -153
- package/behaviors/lolo/ui/marketing/organisms/ui-feature-grid-organism.lolo +0 -159
- package/behaviors/lolo/ui/marketing/organisms/ui-hero-organism.lolo +0 -162
- package/behaviors/lolo/ui/marketing/organisms/ui-pricing-organism.lolo +0 -155
- package/behaviors/lolo/ui/marketing/organisms/ui-showcase-organism.lolo +0 -164
- package/behaviors/lolo/ui/marketing/organisms/ui-stats-organism.lolo +0 -142
- package/behaviors/lolo/ui/marketing/organisms/ui-step-flow-organism.lolo +0 -165
- package/behaviors/lolo/ui/marketing/organisms/ui-team-organism.lolo +0 -152
- package/behaviors/lolo/ui/marketing/templates/ui-about-page-template.lolo +0 -105
- package/behaviors/lolo/ui/marketing/templates/ui-feature-detail-page-template.lolo +0 -93
- package/behaviors/lolo/ui/marketing/templates/ui-landing-page-template.lolo +0 -144
- package/behaviors/lolo/ui/marketing/templates/ui-pricing-page-template.lolo +0 -89
- package/behaviors/registry/ui/marketing/atoms/std-marketing-article.orb +0 -121
- package/behaviors/registry/ui/marketing/atoms/std-marketing-cta.orb +0 -360
- package/behaviors/registry/ui/marketing/atoms/std-marketing-features.orb +0 -305
- package/behaviors/registry/ui/marketing/atoms/std-marketing-footer.orb +0 -265
- package/behaviors/registry/ui/marketing/atoms/std-marketing-hero.orb +0 -424
- package/behaviors/registry/ui/marketing/atoms/std-marketing-nav.orb +0 -288
- package/behaviors/registry/ui/marketing/atoms/std-marketing-pricing.orb +0 -366
- package/behaviors/registry/ui/marketing/atoms/std-marketing-showcase.orb +0 -415
- package/behaviors/registry/ui/marketing/atoms/std-marketing-split.orb +0 -152
- package/behaviors/registry/ui/marketing/atoms/std-marketing-stats.orb +0 -151
- package/behaviors/registry/ui/marketing/atoms/std-marketing-steps.orb +0 -221
- package/behaviors/registry/ui/marketing/atoms/std-marketing-team.orb +0 -239
- package/behaviors/registry/ui/marketing/atoms/ui-article-section.orb +0 -176
- package/behaviors/registry/ui/marketing/atoms/ui-case-study-card.orb +0 -195
- package/behaviors/registry/ui/marketing/atoms/ui-community-links.orb +0 -254
- package/behaviors/registry/ui/marketing/atoms/ui-content-section.orb +0 -182
- package/behaviors/registry/ui/marketing/atoms/ui-cta-banner.orb +0 -254
- package/behaviors/registry/ui/marketing/atoms/ui-hero-section.orb +0 -345
- package/behaviors/registry/ui/marketing/atoms/ui-install-box.orb +0 -163
- package/behaviors/registry/ui/marketing/atoms/ui-marketing-footer.orb +0 -298
- package/behaviors/registry/ui/marketing/atoms/ui-marketing-stat-card.orb +0 -177
- package/behaviors/registry/ui/marketing/atoms/ui-pricing-card.orb +0 -237
- package/behaviors/registry/ui/marketing/atoms/ui-pricing-grid.orb +0 -313
- package/behaviors/registry/ui/marketing/atoms/ui-pull-quote.orb +0 -156
- package/behaviors/registry/ui/marketing/atoms/ui-service-catalog.orb +0 -205
- package/behaviors/registry/ui/marketing/atoms/ui-showcase-card.orb +0 -221
- package/behaviors/registry/ui/marketing/atoms/ui-split-section.orb +0 -239
- package/behaviors/registry/ui/marketing/atoms/ui-stats-grid.orb +0 -202
- package/behaviors/registry/ui/marketing/atoms/ui-step-flow.orb +0 -236
- package/behaviors/registry/ui/marketing/atoms/ui-tag-cloud.orb +0 -217
- package/behaviors/registry/ui/marketing/atoms/ui-team-card.orb +0 -186
- package/behaviors/registry/ui/marketing/organisms/ui-book-chapter-view.orb +0 -277
- package/behaviors/registry/ui/marketing/organisms/ui-book-cover-page.orb +0 -190
- package/behaviors/registry/ui/marketing/organisms/ui-book-nav-bar.orb +0 -183
- package/behaviors/registry/ui/marketing/organisms/ui-book-table-of-contents.orb +0 -286
- package/behaviors/registry/ui/marketing/organisms/ui-book-viewer.orb +0 -553
- package/behaviors/registry/ui/marketing/organisms/ui-case-study-organism.orb +0 -507
- package/behaviors/registry/ui/marketing/organisms/ui-feature-grid-organism.orb +0 -504
- package/behaviors/registry/ui/marketing/organisms/ui-hero-organism.orb +0 -635
- package/behaviors/registry/ui/marketing/organisms/ui-pricing-organism.orb +0 -539
- package/behaviors/registry/ui/marketing/organisms/ui-showcase-organism.orb +0 -542
- package/behaviors/registry/ui/marketing/organisms/ui-stats-organism.orb +0 -447
- package/behaviors/registry/ui/marketing/organisms/ui-step-flow-organism.orb +0 -505
- package/behaviors/registry/ui/marketing/organisms/ui-team-organism.orb +0 -494
- package/behaviors/registry/ui/marketing/templates/ui-about-page-template.orb +0 -752
- package/behaviors/registry/ui/marketing/templates/ui-feature-detail-page-template.orb +0 -638
- package/behaviors/registry/ui/marketing/templates/ui-landing-page-template.orb +0 -1028
- package/behaviors/registry/ui/marketing/templates/ui-pricing-page-template.orb +0 -603
- /package/behaviors/lolo/ui/{marketing → core}/atoms/ui-animated-graphic.lolo +0 -0
- /package/behaviors/lolo/ui/{marketing → core}/atoms/ui-animated-reveal.lolo +0 -0
- /package/behaviors/lolo/ui/{marketing → core}/atoms/ui-pattern-tile.lolo +0 -0
- /package/behaviors/lolo/ui/{marketing/atoms → core/molecules}/ui-feature-card.lolo +0 -0
- /package/behaviors/lolo/ui/{marketing/atoms → core/molecules}/ui-geometric-pattern.lolo +0 -0
- /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
|
+
}
|