@exponential_app/eui 0.2.1 → 0.3.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 (66) hide show
  1. package/catalog/a11y.json +15 -1
  2. package/catalog/core.catalog.json +142 -0
  3. package/catalog/core.schema.json +198 -1
  4. package/catalog/host.json +10 -0
  5. package/catalog/macros.json +541 -1
  6. package/catalog/recipes.json +2 -2
  7. package/catalog/strings.json +5 -0
  8. package/catalog/theme.schema.json +2066 -212
  9. package/conformance/manifest.json +5 -5
  10. package/dist/chunks/{index-gtk2gwsb.js → index-4z7f2bp1.js} +160 -33
  11. package/dist/chunks/{index-gtk2gwsb.js.map → index-4z7f2bp1.js.map} +6 -5
  12. package/dist/chunks/{index-5fmaa0xq.js → index-abcjanhc.js} +629 -3
  13. package/dist/chunks/{index-5fmaa0xq.js.map → index-abcjanhc.js.map} +2 -2
  14. package/dist/chunks/{index-62yzr94z.js → index-dx45asrf.js} +99 -3
  15. package/dist/chunks/{index-62yzr94z.js.map → index-dx45asrf.js.map} +2 -2
  16. package/dist/chunks/{index-bg2jsgjq.js → index-h3zgfghf.js} +304 -6
  17. package/dist/chunks/{index-bg2jsgjq.js.map → index-h3zgfghf.js.map} +2 -2
  18. package/dist/conformance.js +7901 -614
  19. package/dist/conformance.js.map +2 -2
  20. package/dist/entries/prompt.js +2 -2
  21. package/dist/entries/schema.js +2 -2
  22. package/dist/host/index.js +20 -4
  23. package/dist/host/index.js.map +1 -1
  24. package/dist/index.js +35 -5
  25. package/dist/index.js.map +2 -2
  26. package/dist/types/src/catalog.generated.d.ts +23 -3
  27. package/dist/types/src/host/contract.d.ts +17 -0
  28. package/dist/types/src/host/exposes.d.ts +68 -0
  29. package/dist/types/src/host/index.d.ts +1 -0
  30. package/dist/types/src/host/package.d.ts +8 -0
  31. package/dist/types/src/web/primitives/carousel.d.ts +17 -0
  32. package/dist/types/src/web/primitives/index.d.ts +3 -0
  33. package/dist/types/src/web/primitives/mosaic.d.ts +30 -0
  34. package/dist/types/src/web/primitives/outline.d.ts +22 -0
  35. package/dist/web/index.js +8 -2
  36. package/dist/web/index.js.map +4 -4
  37. package/dist/web/primitives/index.js +59 -1
  38. package/dist/web/primitives/index.js.map +6 -3
  39. package/docs/components.generated.json +150 -1
  40. package/docs/package-format.md +56 -1
  41. package/docs/round-6-contract.md +108 -0
  42. package/docs/themes.generated.json +39 -2
  43. package/fixtures/bind-time.json +1464 -0
  44. package/fixtures/catalog-components.json +96 -0
  45. package/fixtures/catalog-macros.json +1159 -48
  46. package/fixtures/conformance-baseline.json +46073 -44448
  47. package/fixtures/conformance-known.json +76 -64
  48. package/fixtures/host-router.json +539 -1
  49. package/fixtures/kitchen-sink.expanded.json +614 -1
  50. package/fixtures/kitchen-sink.json +69 -1
  51. package/fixtures/primitive-specimens.json +3 -0
  52. package/fixtures/prompt-budget.json +14 -14
  53. package/fixtures/specimens.json +122 -0
  54. package/fixtures/theme-recipes.json +4617 -1691
  55. package/fixtures/theme-resolved.json +1154 -2
  56. package/generated/ExponentialUICatalog.generated.kt +13 -13
  57. package/generated/ExponentialUICatalog.generated.swift +13 -13
  58. package/generated/ExponentialUIThemes.generated.kt +7 -7
  59. package/generated/ExponentialUIThemes.generated.swift +7 -7
  60. package/generated/catalog.descriptions.generated.rs +1 -1
  61. package/generated/catalog.generated.rs +18 -18
  62. package/generated/catalog.themes.generated.rs +8 -8
  63. package/generated/core.descriptions.json +96 -0
  64. package/generated/core.runtime.json +86 -0
  65. package/package.json +1 -1
  66. package/themes/neutral.theme.json +288 -0
@@ -620,6 +620,34 @@ var core_runtime_default = {
620
620
  enum: "traceStatus"
621
621
  }
622
622
  }
623
+ },
624
+ outlineItem: {
625
+ properties: {
626
+ id: {
627
+ type: "string",
628
+ required: true
629
+ },
630
+ title: {
631
+ type: "string",
632
+ required: true,
633
+ bindable: true
634
+ },
635
+ count: {
636
+ type: "number",
637
+ bindable: true
638
+ }
639
+ }
640
+ },
641
+ picture: {
642
+ properties: {
643
+ src: {
644
+ type: "url",
645
+ required: true
646
+ },
647
+ alt: {
648
+ type: "string"
649
+ }
650
+ }
623
651
  }
624
652
  },
625
653
  functions: {
@@ -1709,12 +1737,44 @@ var core_runtime_default = {
1709
1737
  indicators: {
1710
1738
  type: "boolean",
1711
1739
  default: true
1740
+ },
1741
+ counter: {
1742
+ type: "boolean",
1743
+ default: false
1744
+ },
1745
+ thumbnails: {
1746
+ type: "array",
1747
+ items: {
1748
+ type: "url"
1749
+ }
1712
1750
  }
1713
1751
  },
1714
1752
  events: [
1715
1753
  "change"
1716
1754
  ]
1717
1755
  },
1756
+ Mosaic: {
1757
+ kind: "macro",
1758
+ group: "media",
1759
+ lite: false,
1760
+ children: "none",
1761
+ props: {
1762
+ pictures: {
1763
+ type: "array",
1764
+ items: {
1765
+ type: "object",
1766
+ shape: "picture"
1767
+ },
1768
+ required: true
1769
+ },
1770
+ label: {
1771
+ type: "string"
1772
+ }
1773
+ },
1774
+ events: [
1775
+ "select"
1776
+ ]
1777
+ },
1718
1778
  Tabs: {
1719
1779
  kind: "native",
1720
1780
  group: "navigation",
@@ -1994,6 +2054,32 @@ var core_runtime_default = {
1994
2054
  "select"
1995
2055
  ]
1996
2056
  },
2057
+ Outline: {
2058
+ kind: "macro",
2059
+ group: "navigation",
2060
+ lite: true,
2061
+ children: "none",
2062
+ props: {
2063
+ items: {
2064
+ type: "array",
2065
+ items: {
2066
+ type: "object",
2067
+ shape: "outlineItem"
2068
+ },
2069
+ required: true
2070
+ },
2071
+ value: {
2072
+ type: "string",
2073
+ bindable: true
2074
+ },
2075
+ caption: {
2076
+ type: "string"
2077
+ }
2078
+ },
2079
+ events: [
2080
+ "select"
2081
+ ]
2082
+ },
1997
2083
  Stepper: {
1998
2084
  kind: "macro",
1999
2085
  group: "navigation",
@@ -4146,7 +4232,7 @@ var basic_map_default = {
4146
4232
  };
4147
4233
  // packages/exponential-ui/catalog/macros.json
4148
4234
  var macros_default = {
4149
- $comment: 'VAPP-85: the ONE declarative macro table. A macro component (core.catalog.json `kind: macro`) expands into this template before painting; the TS reference expander (src/macros.ts) and the Rust core apply the same table and fixtures/catalog-macros.json locks the output. Template node = { part, component, props?, style?, children?, slots?, $if?, $any?, $each?, $as?, $on?, $context?, $set?, $recipe?, $a11y? }. Values: `"{props.x}"` alone = the raw prop (a data BINDING passes through untouched, so two-way binding survives); `"{props.x|fallback}"` = with a default; `{…}` inside a longer string interpolates; `{id}` = the macro node\'s id; `{len(props.rows)}` = an array length; `{range(props.max|5)}` = the indexes 0..n-1 (for `$each`); `{index}` = the current $each index; `{!path}` negates. Value objects: $map {from, cases, default}, $cond [condition, then, else], $eq [a, b] (a number equals a string spelling it), $lt [a, b], $add [a, b], $sub [a, b], $clamp [value, min, max] (a missing bound does not clamp), $percent [value, max] (→ "N%"), $coalesce [a, b, …], $text value (→ the value as a string, absent when missing), $not condition, $fill [template, {name: value}] (ALWAYS emits the core `fill` call: the template is usually a `$string.<id>` sentence with `{name}` placeholders the surface\'s string table resolves at bind time). Object KEYS interpolate too (`"@media (max-width: $breakpoint.{props.collapseBelow|md})"`). `$if` = a condition or an array of conditions (all must hold); `$any` = an array where one must hold. `$each` repeats a part per item of an array (`$as` names the item, default `item`). Children: `"$children"` splices the author\'s children, `"$slot:name"` splices an author slot in place; `slots: {"trigger": "$slot:trigger"}` copies an author slot, `slots: {"footer": {template node}}` builds one as a part. `$on: {"press": "change"}` routes the author\'s `on.change` handler to this part\'s `press` (merging `$context` into an event action\'s context); without `$on` the author\'s `on` map stays on the root. `$set: {"press": {"prop": "open", "value": "{!props.open}"}}` = TWO-WAY BINDING (round 1): when the author\'s `props.open` is a data binding `{path}`, this part\'s `press` action also carries `functionCall: {call: "set", args: {path, value}}` (the value evaluated like any template value, so usually a call), key order `event` then `functionCall`; a literal prop adds nothing (the host owns the state through the routed event); when the author\'s routed handler is itself a FUNCTION (an Action carries one), it wins, no `set` is added and the reducer reports an issue. `$a11y: {role, label, description, level, expanded, current, selected, pressed, checked, valueNow, valueMin, valueMax, hidden, autoFocus}` = the part\'s ACCESSIBILITY (docs/round-1-contract.md §6): evaluated like props (a bound input emits a call) into the expanded node\'s `accessibility`; `role` is one of catalog/a11y.json `roles`; on the root the author\'s `accessibility` label/description win. Ids: the root keeps the author\'s id, parts get `<id>.<part>` and `<id>.<part>.<index>` under `$each`. Every expanded node carries `recipe: {macro, part, props}` where props = `recipeProps` evaluated from the author\'s props (+ a part\'s `$recipe`); the THEME (VAPP-92) keys its visual recipes on that, so nothing here states a colour, a border or a font — only structure and token-named spacing, radius and control heights. VAPP-163: the expansion ROOT\'s recipe also carries `authored` = the top-level keys of the style written ON the macro node (condition blocks count as one key), SORTED, omitted when none; painters apply native recipe < node style < part recipe < those authored keys, so an author\'s colour or size on a Heading/Badge beats the theme\'s part recipe while the template\'s own structure does not (only the author\'s keys count: a macro node an outer template drew passes on just its root\'s `authored`, never template style). Macros may use other macros (Row → TreeGuides); expansion recurses until every node is native (innermost recipe wins). ROUND 1 (docs/round-1-contract.md §1, BOUND INPUTS): when an expression input is a data binding `{path}` or a function call, the expander does NOT evaluate — it EMITS an A2UI function call the renderer evaluates at bind time, over the core functions: interpolation → concat, `|fallback` → fallback (as an operand; a whole-string MEMBER of props/style/context passes the binding itself through, so two-way binding survives), `!` → not, len → len, $map → map, $cond → cond, $eq → eq, $lt → lt, $add → add, $sub → sub, $percent → percent, $text → text, $coalesce → coalesce, $not → not; a `$if`/`$any` whose conditions are bound emits the part WITH `visible` = the bound condition (`and{values}` over several bound `$if`s, `or{values}` over several bound `$any`s; literal conditions still decide at expansion); `$each` over a bound array emits nothing (use List with a template); a `$recipe` value may therefore be a call too (renderers resolve recipe props like props). RESPONSIVE PROPS: an author prop `{base, sm?, md?, lg?, xl?}` on a `responsive` prop is evaluated per breakpoint: a part\'s style is computed with the `base` values, then once per breakpoint named (ascending sm<md<lg<xl, each key inheriting the last smaller one) and every key that changed lands in a `"@media (min-width: $breakpoint.<bp>)"` block of that part; props and conditions see the `base` value. Strings of the form `$string.<id>` (catalog/strings.json) are built-in UI copy the renderer shows in the surface locale. Round 3 (VAPP-102): AFTER the table is applied the core runs ONE post-expansion pass, src/tree-guides.ts applyTreeGuides (Rust: tree_guides::apply): over every node\'s children in order, each Row root (`recipe.macro` Row, part root) contributes its numeric `recipe.props.depth` (anything else counts as depth 0 and ends every subtree), the ×4 treeGuides rule (elbow at depth-1, tee while a later sibling follows, pass-through for every ancestor level that continues) fills the Row\'s `guides` part (a TreeGuides) with `elbowAt`/`tee`/`passThrough`; fixtures/tree-guides.json locks the rule, catalog-macros.json the filled trees.',
4235
+ $comment: 'VAPP-85: the ONE declarative macro table. A macro component (core.catalog.json `kind: macro`) expands into this template before painting; the TS reference expander (src/macros.ts) and the Rust core apply the same table and fixtures/catalog-macros.json locks the output. Template node = { part, component, props?, style?, children?, slots?, $if?, $any?, $each?, $as?, $on?, $context?, $set?, $recipe?, $a11y? }. Values: `"{props.x}"` alone = the raw prop (a data BINDING passes through untouched, so two-way binding survives); `"{props.x|fallback}"` = with a default; `{…}` inside a longer string interpolates; `{id}` = the macro node\'s id; `{len(props.rows)}` = an array length; `{range(props.max|5)}` = the indexes 0..n-1 (for `$each`); `{index}` = the current $each index; `{!path}` negates. Value objects: $map {from, cases, default}, $cond [condition, then, else], $eq [a, b] (a number equals a string spelling it), $lt [a, b], $add [a, b], $sub [a, b], $clamp [value, min, max] (a missing bound does not clamp), $percent [value, max] (→ "N%"), $coalesce [a, b, …], $text value (→ the value as a string, absent when missing), $not condition, $fill [template, {name: value}] (ALWAYS emits the core `fill` call: the template is usually a `$string.<id>` sentence with `{name}` placeholders the surface\'s string table resolves at bind time). Object KEYS interpolate too (`"@media (max-width: $breakpoint.{props.collapseBelow|md})"`). `$if` = a condition or an array of conditions (all must hold); `$any` = an array where one must hold. `$each` repeats a part per item of an array (`$as` names the item, default `item`). Children: `"$children"` splices the author\'s children, `"$slot:name"` splices an author slot in place; `slots: {"trigger": "$slot:trigger"}` copies an author slot, `slots: {"footer": {template node}}` builds one as a part. `$on: {"press": "change"}` routes the author\'s `on.change` handler to this part\'s `press` (merging `$context` into an event action\'s context); without `$on` the author\'s `on` map stays on the root. `$set: {"press": {"prop": "open", "value": "{!props.open}"}}` = TWO-WAY BINDING (round 1): when the author\'s `props.open` is a data binding `{path}`, this part\'s `press` action also carries `functionCall: {call: "set", args: {path, value}}` (the value evaluated like any template value, so usually a call), key order `event` then `functionCall`; a literal prop adds nothing (the host owns the state through the routed event); when the author\'s routed handler is itself a FUNCTION (an Action carries one), it wins, no `set` is added and the reducer reports an issue. `$a11y: {role, label, description, level, expanded, current, selected, pressed, checked, valueNow, valueMin, valueMax, hidden, autoFocus}` = the part\'s ACCESSIBILITY (docs/round-1-contract.md §6): evaluated like props (a bound input emits a call) into the expanded node\'s `accessibility`; `role` is one of catalog/a11y.json `roles`; on the root the author\'s `accessibility` label/description win. Ids: the root keeps the author\'s id, parts get `<id>.<part>` and `<id>.<part>.<index>` under `$each`. Every expanded node carries `recipe: {macro, part, props}` where props = `recipeProps` evaluated from the author\'s props (+ a part\'s `$recipe`); the THEME (VAPP-92) keys its visual recipes on that, so nothing here states a colour, a border or a font — only structure and token-named spacing, radius and control heights. VAPP-163: the expansion ROOT\'s recipe also carries `authored` = the top-level keys of the style written ON the macro node (condition blocks count as one key), SORTED, omitted when none; painters apply native recipe < node style < part recipe < those authored keys, so an author\'s colour or size on a Heading/Badge beats the theme\'s part recipe while the template\'s own structure does not (only the author\'s keys count: a macro node an outer template drew passes on just its root\'s `authored`, never template style). Macros may use other macros (Row → TreeGuides); expansion recurses until every node is native (innermost recipe wins). ROUND 1 (docs/round-1-contract.md §1, BOUND INPUTS): when an expression input is a data binding `{path}` or a function call, the expander does NOT evaluate — it EMITS an A2UI function call the renderer evaluates at bind time, over the core functions: interpolation → concat, `|fallback` → fallback (as an operand; a whole-string MEMBER of props/style/context passes the binding itself through, so two-way binding survives), `!` → not, len → len, $map → map, $cond → cond, $eq → eq, $lt → lt, $add → add, $sub → sub, $percent → percent, $text → text, $coalesce → coalesce, $not → not; a `$if`/`$any` whose conditions are bound emits the part WITH `visible` = the bound condition (`and{values}` over several bound `$if`s, `or{values}` over several bound `$any`s; literal conditions still decide at expansion); `$each` over a bound array emits nothing (use List with a template); a `$recipe` value may therefore be a call too (renderers resolve recipe props like props). RESPONSIVE PROPS: an author prop `{base, sm?, md?, lg?, xl?}` on a `responsive` prop is evaluated per breakpoint: a part\'s style is computed with the `base` values, then once per breakpoint named (ascending sm<md<lg<xl, each key inheriting the last smaller one) and every key that changed lands in a `"@media (min-width: $breakpoint.<bp>)"` block of that part; props and conditions see the `base` value. Strings of the form `$string.<id>` (catalog/strings.json) are built-in UI copy the renderer shows in the surface locale. Round 3 (VAPP-102): AFTER the table is applied the core runs ONE post-expansion pass, src/tree-guides.ts applyTreeGuides (Rust: tree_guides::apply): over every node\'s children in order, each Row root (`recipe.macro` Row, part root) contributes its numeric `recipe.props.depth` (anything else counts as depth 0 and ends every subtree), the ×4 treeGuides rule (elbow at depth-1, tee while a later sibling follows, pass-through for every ancestor level that continues) fills the Row\'s `guides` part (a TreeGuides) with `elbowAt`/`tee`/`passThrough`; fixtures/tree-guides.json locks the rule, catalog-macros.json the filled trees. EXP-1495 (docs/round-6-contract.md): Outline (the anchor list) and Mosaic (the wide picture group) are macros over Box/Text/Image.',
4150
4236
  macros: {
4151
4237
  Stack: {
4152
4238
  recipeProps: [],
@@ -6480,6 +6566,169 @@ var macros_default = {
6480
6566
  ]
6481
6567
  }
6482
6568
  },
6569
+ Outline: {
6570
+ recipeProps: [],
6571
+ root: {
6572
+ part: "root",
6573
+ component: "Box",
6574
+ $a11y: {
6575
+ role: "navigation",
6576
+ label: "{props.caption|$string.outline}"
6577
+ },
6578
+ style: {
6579
+ display: "flex",
6580
+ flexDirection: "column",
6581
+ gap: "$spacing.xxs",
6582
+ minWidth: 0
6583
+ },
6584
+ children: [
6585
+ {
6586
+ part: "caption",
6587
+ component: "Text",
6588
+ $if: "props.caption",
6589
+ props: {
6590
+ text: "{props.caption}",
6591
+ variant: "caption",
6592
+ lines: 1
6593
+ },
6594
+ $a11y: {
6595
+ hidden: true
6596
+ }
6597
+ },
6598
+ {
6599
+ part: "row",
6600
+ component: "Box",
6601
+ $each: "props.items",
6602
+ $as: "item",
6603
+ props: {
6604
+ pressable: true
6605
+ },
6606
+ style: {
6607
+ display: "flex",
6608
+ flexDirection: "row",
6609
+ alignItems: "center",
6610
+ gap: "$spacing.xs",
6611
+ position: "relative",
6612
+ height: "$control.rowCompact",
6613
+ paddingHorizontal: "$spacing.sm",
6614
+ minWidth: 0,
6615
+ overflow: "hidden",
6616
+ cursor: "pointer"
6617
+ },
6618
+ $recipe: {
6619
+ active: {
6620
+ $eq: [
6621
+ "{item.id}",
6622
+ "{props.value}"
6623
+ ]
6624
+ }
6625
+ },
6626
+ $a11y: {
6627
+ role: "link",
6628
+ label: {
6629
+ $cond: [
6630
+ "item.count",
6631
+ {
6632
+ $fill: [
6633
+ "$string.outlineRow",
6634
+ {
6635
+ title: "{item.title}",
6636
+ count: "{item.count}"
6637
+ }
6638
+ ]
6639
+ },
6640
+ "{item.title}"
6641
+ ]
6642
+ },
6643
+ current: {
6644
+ $cond: [
6645
+ {
6646
+ $eq: [
6647
+ "{item.id}",
6648
+ "{props.value}"
6649
+ ]
6650
+ },
6651
+ "location",
6652
+ false
6653
+ ]
6654
+ }
6655
+ },
6656
+ $on: {
6657
+ press: "select"
6658
+ },
6659
+ $context: {
6660
+ id: "{item.id}"
6661
+ },
6662
+ $set: {
6663
+ press: {
6664
+ prop: "value",
6665
+ value: "{item.id}"
6666
+ }
6667
+ },
6668
+ children: [
6669
+ {
6670
+ part: "bar",
6671
+ component: "Box",
6672
+ $if: {
6673
+ $eq: [
6674
+ "{item.id}",
6675
+ "{props.value}"
6676
+ ]
6677
+ },
6678
+ $a11y: {
6679
+ hidden: true
6680
+ },
6681
+ style: {
6682
+ position: "absolute",
6683
+ insetInlineStart: 0,
6684
+ top: 0,
6685
+ bottom: 0,
6686
+ width: 2
6687
+ }
6688
+ },
6689
+ {
6690
+ part: "title",
6691
+ component: "Text",
6692
+ props: {
6693
+ text: "{item.title}",
6694
+ lines: 1
6695
+ },
6696
+ $recipe: {
6697
+ active: {
6698
+ $eq: [
6699
+ "{item.id}",
6700
+ "{props.value}"
6701
+ ]
6702
+ }
6703
+ },
6704
+ style: {
6705
+ flexGrow: 1,
6706
+ flexShrink: 1,
6707
+ flexBasis: 0,
6708
+ minWidth: 0
6709
+ }
6710
+ },
6711
+ {
6712
+ part: "count",
6713
+ component: "Text",
6714
+ $if: "item.count",
6715
+ props: {
6716
+ text: "· {item.count}",
6717
+ variant: "caption",
6718
+ lines: 1
6719
+ },
6720
+ $a11y: {
6721
+ hidden: true
6722
+ },
6723
+ style: {
6724
+ flexShrink: 0
6725
+ }
6726
+ }
6727
+ ]
6728
+ }
6729
+ ]
6730
+ }
6731
+ },
6483
6732
  Stepper: {
6484
6733
  recipeProps: [
6485
6734
  "orientation"
@@ -8294,6 +8543,383 @@ var macros_default = {
8294
8543
  }
8295
8544
  ]
8296
8545
  }
8546
+ },
8547
+ Mosaic: {
8548
+ recipeProps: [],
8549
+ root: {
8550
+ part: "root",
8551
+ component: "Box",
8552
+ $a11y: {
8553
+ role: "group",
8554
+ label: "{props.label}"
8555
+ },
8556
+ style: {
8557
+ display: "flex",
8558
+ flexDirection: "row",
8559
+ width: "100%",
8560
+ aspectRatio: 1.6,
8561
+ minWidth: 0
8562
+ },
8563
+ children: [
8564
+ {
8565
+ part: "lead",
8566
+ component: "Box",
8567
+ $if: "props.pictures.0",
8568
+ props: {
8569
+ pressable: true
8570
+ },
8571
+ style: {
8572
+ position: "relative",
8573
+ overflow: "hidden",
8574
+ minWidth: 0,
8575
+ minHeight: 0,
8576
+ cursor: "pointer",
8577
+ flexGrow: {
8578
+ $cond: [
8579
+ {
8580
+ $lt: [
8581
+ 2,
8582
+ "{len(props.pictures)}"
8583
+ ]
8584
+ },
8585
+ 0,
8586
+ 1
8587
+ ]
8588
+ },
8589
+ flexShrink: {
8590
+ $cond: [
8591
+ {
8592
+ $lt: [
8593
+ 2,
8594
+ "{len(props.pictures)}"
8595
+ ]
8596
+ },
8597
+ 0,
8598
+ 1
8599
+ ]
8600
+ },
8601
+ flexBasis: {
8602
+ $cond: [
8603
+ {
8604
+ $lt: [
8605
+ 2,
8606
+ "{len(props.pictures)}"
8607
+ ]
8608
+ },
8609
+ "60%",
8610
+ 0
8611
+ ]
8612
+ },
8613
+ height: "100%"
8614
+ },
8615
+ $recipe: {
8616
+ size: {
8617
+ $cond: [
8618
+ {
8619
+ $lt: [
8620
+ 2,
8621
+ "{len(props.pictures)}"
8622
+ ]
8623
+ },
8624
+ "large",
8625
+ {
8626
+ $cond: [
8627
+ {
8628
+ $lt: [
8629
+ 1,
8630
+ "{len(props.pictures)}"
8631
+ ]
8632
+ },
8633
+ "half",
8634
+ "large"
8635
+ ]
8636
+ }
8637
+ ]
8638
+ }
8639
+ },
8640
+ $a11y: {
8641
+ role: "button",
8642
+ label: "{props.pictures.0.alt}"
8643
+ },
8644
+ $on: {
8645
+ press: "select"
8646
+ },
8647
+ $context: {
8648
+ index: 0
8649
+ },
8650
+ children: [
8651
+ {
8652
+ part: "image",
8653
+ component: "Image",
8654
+ props: {
8655
+ src: "{props.pictures.0.src}",
8656
+ alt: "{props.pictures.0.alt}",
8657
+ fit: "cover"
8658
+ },
8659
+ $a11y: {
8660
+ hidden: true
8661
+ },
8662
+ style: {
8663
+ position: "absolute",
8664
+ inset: 0,
8665
+ width: "100%",
8666
+ height: "100%"
8667
+ }
8668
+ }
8669
+ ]
8670
+ },
8671
+ {
8672
+ part: "pair",
8673
+ component: "Box",
8674
+ $if: [
8675
+ {
8676
+ $eq: [
8677
+ "{len(props.pictures)}",
8678
+ 2
8679
+ ]
8680
+ }
8681
+ ],
8682
+ props: {
8683
+ pressable: true
8684
+ },
8685
+ style: {
8686
+ position: "relative",
8687
+ overflow: "hidden",
8688
+ minWidth: 0,
8689
+ minHeight: 0,
8690
+ cursor: "pointer",
8691
+ flexGrow: 1,
8692
+ flexShrink: 1,
8693
+ flexBasis: 0,
8694
+ height: "100%"
8695
+ },
8696
+ $recipe: {
8697
+ size: "half"
8698
+ },
8699
+ $a11y: {
8700
+ role: "button",
8701
+ label: "{props.pictures.1.alt}"
8702
+ },
8703
+ $on: {
8704
+ press: "select"
8705
+ },
8706
+ $context: {
8707
+ index: 1
8708
+ },
8709
+ children: [
8710
+ {
8711
+ part: "image",
8712
+ component: "Image",
8713
+ props: {
8714
+ src: "{props.pictures.1.src}",
8715
+ alt: "{props.pictures.1.alt}",
8716
+ fit: "cover"
8717
+ },
8718
+ $a11y: {
8719
+ hidden: true
8720
+ },
8721
+ style: {
8722
+ position: "absolute",
8723
+ inset: 0,
8724
+ width: "100%",
8725
+ height: "100%"
8726
+ }
8727
+ }
8728
+ ]
8729
+ },
8730
+ {
8731
+ part: "side",
8732
+ component: "Box",
8733
+ $if: {
8734
+ $lt: [
8735
+ 2,
8736
+ "{len(props.pictures)}"
8737
+ ]
8738
+ },
8739
+ style: {
8740
+ display: "flex",
8741
+ flexDirection: "column",
8742
+ flexGrow: 1,
8743
+ flexShrink: 1,
8744
+ flexBasis: 0,
8745
+ minWidth: 0,
8746
+ height: "100%"
8747
+ },
8748
+ children: [
8749
+ {
8750
+ part: "top",
8751
+ component: "Box",
8752
+ $if: "props.pictures.1",
8753
+ props: {
8754
+ pressable: true
8755
+ },
8756
+ style: {
8757
+ position: "relative",
8758
+ overflow: "hidden",
8759
+ minWidth: 0,
8760
+ minHeight: 0,
8761
+ cursor: "pointer",
8762
+ flexGrow: 1,
8763
+ flexShrink: 1,
8764
+ flexBasis: 0,
8765
+ width: "100%"
8766
+ },
8767
+ $recipe: {
8768
+ size: "small"
8769
+ },
8770
+ $a11y: {
8771
+ role: "button",
8772
+ label: "{props.pictures.1.alt}"
8773
+ },
8774
+ $on: {
8775
+ press: "select"
8776
+ },
8777
+ $context: {
8778
+ index: 1
8779
+ },
8780
+ children: [
8781
+ {
8782
+ part: "image",
8783
+ component: "Image",
8784
+ props: {
8785
+ src: "{props.pictures.1.src}",
8786
+ alt: "{props.pictures.1.alt}",
8787
+ fit: "cover"
8788
+ },
8789
+ $a11y: {
8790
+ hidden: true
8791
+ },
8792
+ style: {
8793
+ position: "absolute",
8794
+ inset: 0,
8795
+ width: "100%",
8796
+ height: "100%"
8797
+ }
8798
+ }
8799
+ ]
8800
+ },
8801
+ {
8802
+ part: "bottom",
8803
+ component: "Box",
8804
+ $if: "props.pictures.2",
8805
+ props: {
8806
+ pressable: true
8807
+ },
8808
+ style: {
8809
+ position: "relative",
8810
+ overflow: "hidden",
8811
+ minWidth: 0,
8812
+ minHeight: 0,
8813
+ cursor: "pointer",
8814
+ flexGrow: 1,
8815
+ flexShrink: 1,
8816
+ flexBasis: 0,
8817
+ width: "100%"
8818
+ },
8819
+ $recipe: {
8820
+ size: "small"
8821
+ },
8822
+ $a11y: {
8823
+ role: "button",
8824
+ label: {
8825
+ $cond: [
8826
+ {
8827
+ $lt: [
8828
+ 3,
8829
+ "{len(props.pictures)}"
8830
+ ]
8831
+ },
8832
+ {
8833
+ $fill: [
8834
+ "$string.morePicturesLabel",
8835
+ {
8836
+ alt: "{props.pictures.2.alt}",
8837
+ count: {
8838
+ $sub: [
8839
+ "{len(props.pictures)}",
8840
+ 3
8841
+ ]
8842
+ }
8843
+ }
8844
+ ]
8845
+ },
8846
+ "{props.pictures.2.alt}"
8847
+ ]
8848
+ }
8849
+ },
8850
+ $on: {
8851
+ press: "select"
8852
+ },
8853
+ $context: {
8854
+ index: 2
8855
+ },
8856
+ children: [
8857
+ {
8858
+ part: "image",
8859
+ component: "Image",
8860
+ props: {
8861
+ src: "{props.pictures.2.src}",
8862
+ alt: "{props.pictures.2.alt}",
8863
+ fit: "cover"
8864
+ },
8865
+ $a11y: {
8866
+ hidden: true
8867
+ },
8868
+ style: {
8869
+ position: "absolute",
8870
+ inset: 0,
8871
+ width: "100%",
8872
+ height: "100%"
8873
+ }
8874
+ },
8875
+ {
8876
+ part: "more",
8877
+ component: "Box",
8878
+ $if: {
8879
+ $lt: [
8880
+ 3,
8881
+ "{len(props.pictures)}"
8882
+ ]
8883
+ },
8884
+ $a11y: {
8885
+ hidden: true
8886
+ },
8887
+ style: {
8888
+ position: "absolute",
8889
+ inset: 0,
8890
+ display: "flex",
8891
+ alignItems: "center",
8892
+ justifyContent: "center"
8893
+ },
8894
+ children: [
8895
+ {
8896
+ part: "moreLabel",
8897
+ component: "Text",
8898
+ props: {
8899
+ text: {
8900
+ $fill: [
8901
+ "$string.morePictures",
8902
+ {
8903
+ count: {
8904
+ $sub: [
8905
+ "{len(props.pictures)}",
8906
+ 3
8907
+ ]
8908
+ }
8909
+ }
8910
+ ]
8911
+ },
8912
+ lines: 1
8913
+ }
8914
+ }
8915
+ ]
8916
+ }
8917
+ ]
8918
+ }
8919
+ ]
8920
+ }
8921
+ ]
8922
+ }
8297
8923
  }
8298
8924
  }
8299
8925
  };
@@ -8380,5 +9006,5 @@ function coreLite2() {
8380
9006
 
8381
9007
  export { basic_map_default, coreCatalog2, CORE_CATALOG_ID2, CORE_LITE_CATALOG_ID2, A2UI_BASIC_CATALOG_ID2, A2UI_VERSION2, SUPPORTED_CATALOG_IDS2, UNKNOWN_COMPONENT2, coreMacros2, TOKEN_GROUPS2, parseTokenRef2, isKnownToken2, catalogView2, sharedCatalogView2, componentDef2, isOffered2, componentNames2, coreLite2 };
8382
9008
 
8383
- //# debugId=9AAC1D5C9F2B466E64756E2164756E21
8384
- //# sourceMappingURL=index-5fmaa0xq.js.map
9009
+ //# debugId=A1A315F6C68A2DA064756E2164756E21
9010
+ //# sourceMappingURL=index-abcjanhc.js.map