@prestack/thread-ui 0.1.8 → 0.1.9

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/CHANGELOG.md CHANGED
@@ -1,5 +1,190 @@
1
1
  # @prestack/thread-ui
2
2
 
3
+ ## 0.1.8
4
+
5
+ it only added, so everything built against the last one still works.
6
+
7
+ ### Added
8
+
9
+ - `compositions` now exports `ui/compositions#SCREENED_BY`.
10
+
11
+ ### Fixed
12
+
13
+ - `react-writer` — its code moved and what it exports did not.
14
+ - `screens` — its code moved and what it exports did not.
15
+ - `styles-writer` — its code moved and what it exports did not.
16
+ - `ui-attach` — its code moved and what it exports did not.
17
+
18
+ <!-- release 0.1.8 -->
19
+ <!-- holds
20
+ accordion 315747ae9d69 ui/elements/accordion#AccordionProps:73ce472833d3 ui/elements/accordion#Accordion:83e995f2269f ui/elements/accordion.works#uses:5d3b00d92875 ui/elements/accordion.works#section:4ae99f778938 ui/elements/accordion.works#header:4ae99f778938 ui/elements/accordion.works#region:4ae99f778938 ui/elements/accordion.works#shown:2b4a0795f92f
21
+ animations-writer 6b745ed8eb50 ui/animations#BOUND:903de4e047f6 ui/animations#AnimationSetting:e4c302183d8e ui/animations#Animation:5212a1aa8d74 ui/animations#keyframeName:ff8fa0760be2 ui/animations#stopsOf:b2c6e0e60a68 ui/animations#shorthandOf:6a990de10b41 ui/animations#declares:cad46cab877c ui/animations#ANIMATIONS:a836915082b0 ui/animations#nameOf:ff8fa0760be2 ui/animations#seeds:e5c803f28183 ui/animations#mismatched:5679b09f6252 ui/animations#orphaned:8865319ec4c3
22
+ appear f2488319c0c9 ui/animations/anm_appear#APPEAR:301afe9bf4dc
23
+ aspect-ratio 4a4c4ec6e61d ui/elements/aspect-ratio#AspectRatioProps:0847ecebf249 ui/elements/aspect-ratio#AspectRatio:080b92fde974 ui/elements/aspect-ratio.works#measured:c68e17838e54
24
+ avatar 3c5e9c201758 ui/elements/avatar#AvatarProps:036f319489f5 ui/elements/avatar#Avatar:0aa8f982e898 ui/elements/avatar.works#shown:71384a69d3af
25
+ avatar-round da7acf061c62 ui/variants/var_avatar-round#AVATAR_ROUND:ccce1a17f0bf
26
+ badge 5b2fdfcfbcf3 ui/elements/badge#BadgeProps:735de9042fa4 ui/elements/badge#Badge:2e5b7c04041c ui/elements/badge.works#shows:fdabcaaa1a37
27
+ bars a728d4c0efc7 ui/elements/bars#BarsProps:429c72e96da9 ui/elements/bars#Bars:45ece6c69851 ui/elements/bars.works#uses:21c0411bcd1a ui/elements/bars.works#sized:4fbc468fd612 ui/elements/bars.works#shown:71800d3c3261
28
+ blur-in 1311ce3a3fda ui/animations/anm_blur_in#BLUR_IN:6892dfe198c0
29
+ blur-out f8c4f2cdff1e ui/animations/anm_blur_out#BLUR_OUT:bf564f95f617
30
+ bordered ed33d5c9bcd8 ui/materials/mat_bordered#BORDERED:ae68626a835b
31
+ box 9135e63049fc ui/elements/box#BoxProps:bc6d4d90848d ui/elements/box#Box:71451d7d0d75
32
+ breadcrumb 66bf516f8183 ui/elements/breadcrumb#BreadcrumbProps:90326c0e741c ui/elements/breadcrumb#Breadcrumb:7fa664c4c672 ui/elements/breadcrumb.works#steps:1143e7397f7e ui/elements/breadcrumb.works#crumb:2d47ada157f0
33
+ bubble-me 5a742c2ed7a7 ui/variants/var_bubble-me#BUBBLE_ME:ad950ac45abe
34
+ bubble-them 728e1129e2a9 ui/variants/var_bubble-them#BUBBLE_THEM:e4ca2cde9739
35
+ button 29cf957dbfa1 ui/elements/button#ButtonProps:3dd153481c9c ui/elements/button#Button:5c5b34292c8c ui/elements/button.works#uses:3e0750aa8681 ui/elements/button.works#wires:0b5df5218d63 ui/elements/button.works#iconed:c2caebd886f9 ui/elements/button.works#worded:c2caebd886f9 ui/elements/button.works#shown:2d2723ffce9f
36
+ button-border 6e6bf634e1c6 ui/variants/var_button-border#BUTTON_BORDER:5c178d7beb57
37
+ button-cta 01e30d4ec68d ui/variants/var_button-cta#BUTTON_CTA:970026cce345
38
+ button-destructive 96ec12dd1acf ui/variants/var_button-destructive#BUTTON_DESTRUCTIVE:1a01bdef3004
39
+ button-destructive-ghost 50791a7ec41c ui/variants/var_button-destructive-ghost#BUTTON_DESTRUCTIVE_GHOST:6418dad96469
40
+ button-fill 7f6509f2bcd8 ui/variants/var_button-fill#BUTTON_FILL:01446b8623cb
41
+ button-ghost 81ab88717b77 ui/variants/var_button-ghost#BUTTON_GHOST:4629e6de0279
42
+ button-glass da9a524fd64d ui/variants/var_button-glass#BUTTON_GLASS:bb95b54e94b6
43
+ button-normal 79d08fe4779f ui/variants/var_button-normal#BUTTON_NORMAL:8e300f205850
44
+ button-quiet 3ad6cdd1794e ui/variants/var_button-quiet#BUTTON_QUIET:015eee9c6a9d
45
+ card cd72fc4eb250 ui/variants/var_card#CARD:11d65ea74e1e
46
+ ceramic 4922d7156e24 ui/materials/mat_ceramic#CERAMIC:a1df3c22029a
47
+ charts 799a8177e784 ui/charts#Row:eee0c117177a ui/charts#WhenTight:17ade237b678 ui/charts#ChartBase:5c23cd2a9e3f ui/charts#num:bf021c1a2c8c ui/charts#str:28fd80e9f148 ui/charts#useRamp:f6fdb5be0c84 ui/charts#placed:fe15c30aa6bf ui/charts#measured:4d39d48edd1d ui/charts#SeriesProps:0fa5db4164e4 ui/charts#polyline:ccbb1fdf9a3a ui/charts#CategoryProps:9c091b968226 ui/charts#TwoAxisProps:6d05ba489e28
48
+ checked b3db1ccbae77 ui/checked#Wearing:deebde0237b4 ui/checked#Dispatching:deebde0237b4 ui/checked#VariantsFor:20a411132cb6 ui/checked#ArrangementElement:4d32298786d2 ui/checked#idOf:7ad5f68e2c86
49
+ chip c23cc6dce38c ui/variants/var_chip#CHIP:65c2396c3be4
50
+ choice 96d8c5e8912a ui/variants/var_choice#CHOICE:be45a6463762
51
+ clay c0a2c9b526fc ui/materials/mat_clay#CLAY:720ba7ce183e
52
+ collector b1cb143bbc9d ui/collector#ClientEvent:eb3074274552 ui/collector#CollectorOptions:5c022ee3fd3b ui/collector#RecordedEvent:edd6c51b46bd ui/collector#Collector:bc3c96c74f1e ui/collector#INERT_COLLECTOR:50752f61c393 ui/collector#createCollector:e8bf723f970e
53
+ column 5c1a7eb179ea ui/elements/column#ColumnProps:ad269764b266 ui/elements/column#Column:1b9550e6a545
54
+ compositions d319b3db9286 ui/compositions#REACHES:09aa52ab5287 ui/compositions#declares:cad46cab877c ui/compositions#COMPOSITIONS:2412f9a2cc25 ui/compositions#PASCAL:72b4c80878b8 ui/compositions#nameOf:38eeb450b217 ui/compositions#Listed:ebe67be9ab8b ui/compositions#sheetOf:7e68e5aa528f ui/compositions#composed:bf363b830157 ui/compositions#HOME:16475c413846 ui/compositions#DOORS:75b7a7c39b95 ui/compositions#reaching:f772a3f7a0e9 ui/compositions#compiledAt:38eeb450b217 ui/compositions#settled:c2671abe553d ui/compositions#RUNTIME:4de2138e3a11 ui/compositions#emitting:12075f4c4f66 ui/compositions#stale:081f906ac9d3 ui/compositions#SCREENED_BY:3ef18e747f92 ui/compositions#handing:c2ba7db38c14 ui/compositions#undeclared:b84deaf1f67c ui/compositions#seeds:950628166bbd
55
+ consent e9a8de05e23c ui/elements/consent#ConsentProps:4d2e2c5c74ae ui/elements/consent#Consent:f288ab8ee1af
56
+ consent-categories 063d79030614 ui/consent#ConsentCategorySchema:e3521eb40a21 ui/consent#ConsentCategory:d495db30ead2 ui/consent#defineConsentCategory:dc7375e62187 ui/consent#consentCategories:fc75fbe08af8 ui/consent#consentCategory:b515e4d050f9 ui/consent#ConsentDecisionSchema:f29793770bb3 ui/consent#ConsentDecision:37669319ada2 ui/consent#consentAllows:2ce94d59b747
57
+ consent-element fa8efc39cb87 ui/elements/consent.works#uses:408a55ef20fc ui/elements/consent.works#categories:cab969c5fa8b ui/elements/consent.works#hasPolicy:41e8cd1e14fe ui/elements/consent.works#withdrawable:27a86b8e1345 ui/elements/consent.works#optional:1d0be2d81bca ui/elements/consent.works#required:1d0be2d81bca ui/elements/consent.works#title:8bb7d2c23113 ui/elements/consent.works#policy:ff8839910ba9 ui/elements/consent.works#label:b88c8ee4712f ui/elements/consent.works#describe:b88c8ee4712f ui/elements/consent.works#fixed:efa0c3794a4c ui/elements/consent.works#chooser:f06207471636 ui/elements/consent.works#withdraw:e7c5c7c955e4 ui/elements/consent.works#decline:e7c5c7c955e4 ui/elements/consent.works#accept:e7c5c7c955e4 ui/elements/consent.works#acceptAll:e7c5c7c955e4
58
+ content 46197c590f10 ui/content#MessageKey:bb3a9997b027 ui/content#ValueProps:9decf576db80 ui/content#renderValue:26dafdf7eb3f
59
+ contrast d58eef8241a7 ui/contrast#CONTRAST_LARGE:319ea26151c0 ui/contrast#luminance:7b446b9fed05 ui/contrast#contrast:8ad383dc8043
60
+ controls e64de1d19cf3 ui/controls#PressProps:d7b2a109483b ui/controls#Option:bb867d0c2790 ui/controls#Menu:99af6606ff9d ui/controls#MenuProps:e64bf652667a ui/controls#MenuItem:e6972b78d002
61
+ dev-runner 5ba2ec07b456 ui/generators/dev#unrunnable:a00d94275089
62
+ disclosure 64d2ffbff21d ui/disclosure#TabItem:5637034a9966 ui/disclosure#AccordionItem:5637034a9966
63
+ dismiss 1062fb6d8d49 ui/animations/anm_dismiss#DISMISS:44547e6662ab
64
+ dismiss-layer c81dadfa632c ui/dismiss-layer#Layer:1739bdeed158 ui/dismiss-layer#useDismissLayer:fc45673b9550 ui/dismiss-layer#openLayers:dbe6494f9d41
65
+ donut 778a867b06e0 ui/elements/donut#DonutProps:3b9e7fde51af ui/elements/donut#Donut:394c3abab12b ui/elements/donut.works#uses:f8d2db81931c ui/elements/donut.works#slice:1c42064c095a
66
+ drag 0ef5149ec5b9 ui/drag#EDGE_SCROLL_DEFAULTS:162de3815f33 ui/drag#Subject:c27b664a52fd ui/drag#DragSession:6af215ec8136 ui/drag#dragSession:e84fc1b5ed17 ui/drag#subscribeDrag:c456c983029f ui/drag#DragStatus:4440e8c46de5 ui/drag#dragStatusOf:df66d31d913f ui/drag#Scroller:038eab5f1ca9 ui/drag#Layout:8a03934bc399 ui/drag#DOM_LAYOUT:a4ae951f0933 ui/drag#setLayout:5e8ae80ca924 ui/drag#currentLayout:23ed529a101a ui/drag#claimGesture:d7ff15860d3c ui/drag#releaseGesture:48d5e5330326 ui/drag#gestureClaim:65fda728778f ui/drag#DropTarget:bff392b218d8 ui/drag#registerTarget:8a22941d233a ui/drag#targetFor:ca512db492ae ui/drag#innermostTarget:8f13034f8379 ui/drag#BeginDrag:06a945bd02b8 ui/drag#beginDrag:8993a12ea898 ui/drag#MoveDrag:40d697607f2c ui/drag#moveDrag:5e744e28a670 ui/drag#collect:87adb0b806fb ui/drag#endDrag:e84fc1b5ed17 ui/drag#resetDrag:a3965c1dfabe ui/drag#dwell:696612acada0 ui/drag#accepted:b2c139a84a5a ui/drag#EdgeScrollTuning:8656a344cfa0 ui/drag#edgeScroll:54f1744007c7 ui/drag#pullEdges:93e827aaa0b8
67
+ drop 07bbafbbbfa5 ui/animations/anm_drop#DROP:28d834809d56
68
+ each 99eb68bf0b39 ui/elements/each#EachProps:83129dd2b3ac ui/elements/each#Each:e6f142a2d09c ui/elements/each.works#shows:ad356e86f65d
69
+ element-rows 17e6806e3269 ui/elements#ELEMENTS:8f09f1d86714
70
+ elements-writer 07ccd1b33b73 ui/generators/elements#pascal:ff8fa0760be2 ui/generators/elements#OWNED_AT:7fac350f2d5d ui/generators/elements#owned:19dbe2a693ea ui/generators/elements#translated:0ee7c254775e ui/generators/elements#CARRIES:4de2138e3a11 ui/generators/elements#READINGS:4de2138e3a11 ui/generators/elements#declared:74cde91fc910 ui/generators/elements#wears:a91b72bd4390
71
+ elevated 498ed7e13271 ui/materials/mat_elevated#ELEVATED:f1d54bdaf726
72
+ empty 408cc55e3924 ui/elements/empty#EmptyProps:e89b67d88a13 ui/elements/empty#Empty:02e6deb405b0
73
+ en-catalog 975f32111040 ui/i18n/catalogs/en#en:f72fd845118b ui/i18n/catalogs/en#EnCatalog:07aac6125d69
74
+ fall b9051b59c4eb ui/animations/anm_fall#FALL:de7c5232ae66
75
+ field d0f76e98261b ui/elements/field#FieldProps:f6208a53a0dd ui/elements/field#Field:38e7e6136c67 ui/elements/field.works#uses:b460b57a1079 ui/elements/field.works#entry:ed11af6bd73c ui/elements/field.works#shown:450fd3b336bc
76
+ flash 069f70cedec1 ui/animations/anm_flash#FLASH:bb0d6061b2a8
77
+ flat b77b9e10eb88 ui/materials/mat_flat#FLAT:45034ea327e8
78
+ focus-scope c872a7d46e1b ui/focus-scope#tabbables:6dc1a8ed6338 ui/focus-scope#useFocusScope:4c9b51943dba
79
+ fonts b0a63e294524 ui/fonts#FACES:d0c818c9b4e2 ui/fonts#Face:65b392495807 ui/fonts#FontFamily:a5184b2dfb4c ui/fonts#FontSet:9f12cc81549d ui/fonts#defineFontSet:28d60920ecaf ui/fonts#fontSets:b79664265bb8 ui/fonts#fontSet:d3b23f97c463 ui/fonts#fontFaces:3ccbfc44dc32 ui/fonts#fontModules:3ccbfc44dc32 ui/fonts#fontIn:947791605637 ui/fonts#fontVariable:0b2ea3f92138 ui/fonts#fontStack:0bb08ee73396 ui/fonts#fontFor:1ed2cf132c34 ui/fonts#FontRole:bcde61774ad8 ui/fonts#FontRoleId:df296a09b71d ui/fonts#ROLE_IDS:11cdcc1f7f95 ui/fonts#DEFAULT_ROLE:60b8b8b397b0 ui/fonts#SET_ROW:00b33e3ffbf1 ui/fonts#holds:66da16a1d8a6 ui/fonts#FONTS:a4cd8dbc5c1b ui/fonts#classOfRole:ff8fa0760be2 ui/fonts#settingsOf:a2e6277c42f5 ui/fonts#roleClass:b3e7d41fde38 ui/fonts#familyFor:68125aabf80b ui/fonts#setNamed:c3ef0235837e
80
+ framed 36372f49dd19 ui/variants/var_framed#FRAMED:7603b136eda5
81
+ funnel f40085ae814c ui/elements/funnel#FunnelProps:429c72e96da9 ui/elements/funnel#Funnel:346fda430d23 ui/elements/funnel.works#uses:75344a7846bb ui/elements/funnel.works#sized:26f9281d9d39 ui/elements/funnel.works#shown:cc4f256199ff
82
+ gauge cd51dc0a77fe ui/elements/gauge#GaugeProps:69bb45d0d458 ui/elements/gauge#Gauge:f3902bbbcb90 ui/elements/gauge.works#uses:1ea30b999ca0 ui/elements/gauge.works#track:9017e22c6cd9 ui/elements/gauge.works#needle:ffb05fac60d7
83
+ glass 4f712c474709 ui/materials/mat_glass#GLASS:e8983a778649
84
+ glow f27e9c60847a ui/animations/anm_glow#GLOW:b75cde1c65e8
85
+ glyph d7479eeda99b ui/elements/glyph#GlyphProps:4106330e88f5 ui/elements/glyph#Glyph:b49fddd10040 ui/elements/glyph.works#drawn:f45ca9f62049 ui/elements/glyph.works#shows:881db1c0701a
86
+ glyph-plain db2198da017a ui/variants/var_glyph-plain#GLYPH_PLAIN:d6228326b2bf
87
+ grid 3abfdec9d4bb ui/elements/grid#GridProps:ad269764b266 ui/elements/grid#Grid:8e4ad19dcc06
88
+ heatmap 9521d967dd16 ui/elements/heatmap#HeatmapProps:b147106482f2 ui/elements/heatmap#Heatmap:4eed2b5e160c ui/elements/heatmap.works#uses:a0768529ca8f ui/elements/heatmap.works#sized:55318f305b27
89
+ hit-box f48ff72bbe1f ui/elements/hit-box#HitBoxProps:3edc4ed422b1 ui/elements/hit-box#HitBox:d778244710bb ui/elements/hit-box.works#Axis:33c35b0ffe72 ui/elements/hit-box.works#uses:2a6d2c718e38 ui/elements/hit-box.works#wires:1cddad8cf225 ui/elements/hit-box.works#shown:82f106431cdf
90
+ i18n-types 2b3358461d33 ui/i18n/types#Money:5ccc2e8715d7 ui/i18n/types#Locale:bb3a9997b027 ui/i18n/types#MessageParams:c8b98c9ef662 ui/i18n/types#DeclaredMessage:15146945b7f9 ui/i18n/types#msg:6f4ce4ea0ad1 ui/i18n/types#MessageEntry:a3011654f357 ui/i18n/types#RequiresExplicitParams:9afc22df209f ui/i18n/types#ValidEntry:55d6c8d1b432 ui/i18n/types#CatalogShape:035eff70ed94 ui/i18n/types#ParamsOf:f11c778e63a5 ui/i18n/types#Translator:bc6ce843db37 ui/i18n/types#entryText:8f7f9b6fb21b ui/i18n/types#defineCatalog:67309cff79a2
91
+ i18n-writer 7326af36633d ui/generators/i18n#walk:2b0caf2efd3b ui/generators/i18n#keyProps:2c319c8c1507 ui/generators/i18n#keysIn:4c2dd7de01b6 ui/generators/i18n#readWording:97cf5049ec86 ui/generators/i18n#wordingFile:40969fbfabda
92
+ icon-sets 2ee5c4cf60f4 ui/icons#IconSet:7d3af541078c ui/icons#ICON_TARGET:0693728301e7 ui/icons#DEFAULT_ICON:b343f4fca562 ui/icons#sizeRows:6a8284e80b30 ui/icons#sizeNamed:7ad5f68e2c86 ui/icons#strokeFor:d15243b42f12 ui/icons#BRAND_MODULE:696f4addc79d ui/icons#defineIconSet:8e7d61a3595e ui/icons#defineIcon:6722a9c4f6e3 ui/icons#iconSets:2e3d0c4f422e ui/icons#iconSet:77161f6cbc87 ui/icons#iconNames:3ccbfc44dc32 ui/icons#iconIn:a393ee7ee7f8 ui/icons#brandExport:b872f6e302c0 ui/icons#SET_ROW:dcaa0bb52c1b ui/icons#SIZE_PREFIX:0ca5e5e4c9eb ui/icons#holds:66da16a1d8a6 ui/icons#ICONS:a4cd8dbc5c1b ui/icons#drawnAs:39b2d0b66e76 ui/icons#setNamed:b78f1dfb90c3 ui/icons#IconComponent:3519fd0448c9 ui/icons#installIcons:4bca1126f326 ui/icons#installedSet:ea11a029b2ff ui/icons#iconSize:051b1f5bfa93 ui/icons#drawnFor:77cf59fc0e97
93
+ icons-writer 580af8ee6f97
94
+ image 967499e9a772 ui/elements/image#ImageProps:a32890747c93 ui/elements/image#Image:cec94eb7378c
95
+ input ae7068e4a182 ui/variants/var_input#INPUT:27581d657b96
96
+ lift 8464180c5da1 ui/animations/anm_lift#LIFT:a63fd1fc6227
97
+ line-chart 6863d667c0e7 ui/elements/line-chart#LineChartProps:dae99c7ce631 ui/elements/line-chart#LineChart:15cfdd29751a ui/elements/line-chart.works#lines:68f3cc937de0 ui/elements/line-chart.works#uses:ca3cae02625f ui/elements/line-chart.works#drawing:4fc88b6eb2c8
98
+ link 13b71587b0be ui/elements/link#LinkProps:f8e3636cb290 ui/elements/link#Link:fa8f20713d7c ui/elements/link.works#uses:bafbafc2c328
99
+ link-inline 2336d8bdc7ef ui/variants/var_link-inline#LINK_INLINE:828401d1d8fc
100
+ list-row a59bce53118a ui/variants/var_list-row#LIST_ROW:002f108b821a
101
+ lit dca654b7cfdb ui/materials/mat_lit#LIT:1355d07bd5ec
102
+ locales 81f3eca3ddf7 ui/i18n/locales#REFERENCE_LOCALE:ec7df020bf1e ui/i18n/locales#LocaleDecl:bc1f89b83d74 ui/i18n/locales#defineLocale:79994004ee18 ui/i18n/locales#locales:b65c2631bfae ui/i18n/locales#locale:a1be3346f05c ui/i18n/locales#resetLocales:a3965c1dfabe
103
+ localizations 3f9e0fbb2fda ui/localizations#fileFor:ea4183b63099 ui/localizations#SOURCE_ROW:0b2b038d7a60 ui/localizations#holds:66da16a1d8a6 ui/localizations#declares:44fc181d2f2e ui/localizations#LOCALIZATIONS:5aa81ac1526e ui/localizations#languagesIn:3c191d1da982 ui/localizations#sourceIn:ca722c0439bb
104
+ material-shape 355d5d618b85 ui/material#Setting:426554dca885 ui/material#BOUND:60b3bf658f7c ui/material#Material:10384161b39a ui/material#FREE:e3380039b05d ui/material#material:1cf1cf5e74a4 ui/material#composed:40eef03784ab ui/material#compose:e3e390f844a8 ui/material#keyframesOf:d2489886fde6
105
+ materials 94fd1918bc51 ui/materials#MATERIALS:d99dbff5a125 ui/materials#nameOf:ff8fa0760be2 ui/materials#seeds:950628166bbd ui/materials#mismatched:5679b09f6252 ui/materials#orphaned:8865319ec4c3 ui/materials#unguarded:2402578021fc ui/materials#guarding:b0bd4f259649
106
+ media f10dbbca543f ui/elements/media#MediaProps:a6f78a4b17e9 ui/elements/media#Media:dcaabbc68839
107
+ menu 4f69ea6a415f ui/elements/menu#MenuProps:d36936ad43b5 ui/elements/menu#Menu:fba867d9c33c ui/elements/menu.works#MenuItem:02e633272dfb ui/elements/menu.works#Presented:5e5067bd5ae0 ui/elements/menu.works#MenuRow:a802423247f1 ui/elements/menu.works#uses:d6ce5f7df945 ui/elements/menu.works#opener:c69eaabd4bec ui/elements/menu.works#portal:52c185db8c74 ui/elements/menu.works#listing:f17800975fbc ui/elements/menu.works#row:565839797be7 ui/elements/menu.works#measured:f814b8fb25f8
108
+ message-format 093c4f86bcb3 ui/i18n/format#MissingParamError:aa7e44c63280 ui/i18n/format#ParamTypeError:c68d491e4531 ui/i18n/format#FormatOptions:78186c114b44 ui/i18n/format#formatMessage:8bcdb57eb68c
109
+ message-parse 8bed438a6add ui/i18n/parse#Money:a00bde948c6d ui/i18n/parse#Node:fb8f1cd0fbe1 ui/i18n/parse#MessageSyntaxError:f55480cb6fe5 ui/i18n/parse#parseMessage:789d981d91a9 ui/i18n/parse#messageArgs:9c3bae9eeab2
110
+ modes 8637df698b4f ui/modes#holds:09551d35202f ui/modes#MODES:bc3de2fdf92a
111
+ money 41ccdd66db7c ui/elements/money#MoneyProps:bfccaebe6f06 ui/elements/money#Money:32e4d81b941e ui/elements/money.works#shows:7ad4291b35f4
112
+ moulded 882a86e690d3 ui/materials/mat_moulded#MOULDED:f4751a918421
113
+ navigation 0e47d978cd87 ui/navigation#ScreenName:bbfc0371f587 ui/navigation#trailTo:0fb587559b4b
114
+ nudge 7f4195c8619c ui/animations/anm_nudge#NUDGE:35f48565000a
115
+ pagination c62506f06693 ui/elements/pagination#PaginationProps:ccf8727f774b ui/elements/pagination#Pagination:1c1e9106ea48 ui/elements/pagination.works#steps:61d0370471b4 ui/elements/pagination.works#step:ffee64ebf86f
116
+ pop-in 0f5ed5f1732d ui/animations/anm_pop_in#POP_IN:99aab36dd6e6
117
+ pop-out bdb26827c938 ui/animations/anm_pop_out#POP_OUT:09d7a8b68046
118
+ positioning 3a289987f9e8 ui/positioning#AnchorOptions:4c3402cd1a69 ui/positioning#Position:9c70539bcb3d ui/positioning#positionOf:3c3c43bfe549 ui/positioning#useAnchored:593ec514203e
119
+ presentation 8ed76916e8ba ui/door#PRESENTATIONS:0b4b6dd8a649 ui/door#Presentation:5378f3ae7da7 ui/door#PRESENTATION_BEHAVIOUR:11cc9a11a516 ui/door#ClockSubscriber:cd2a448da470 ui/door#Ticker:f3fd8773c688 ui/door#Clock:da7deb95122a ui/door#Surface:7d312cda7a5a
120
+ presented 67a05bb9e520 ui/presented#PresentedProps:ed075c0f7d0b ui/presented#Presented:b5610082d862
121
+ press 8570528dfb22 ui/animations/anm_press#PRESS:93f066007712
122
+ progress f79fdd4eb7bf ui/elements/progress#ProgressProps:754b505c5be3 ui/elements/progress#Progress:1072cc0de3a1 ui/elements/progress.works#measured:56dd5b194e54
123
+ provider 1ea77f0a6489 ui/provider#ThreadUiProps:f9e8a8ef7cb8 ui/provider#ThreadUi:e310895b7a7c
124
+ pulse f90915f67e93 ui/animations/anm_pulse#PULSE:6c5cbf0c4759
125
+ radio-group c903bacce153 ui/elements/radio-group#RadioGroupProps:a44a0a13b29e ui/elements/radio-group#RadioGroup:e53bf0a781d6 ui/elements/radio-group.works#uses:93b2bbc321ab ui/elements/radio-group.works#option:a16909c8c8c1 ui/elements/radio-group.works#shown:5e7a9552c0ad
126
+ react-writer b60e49e2ab21 ui/generators/react#compiled:59c5d77cc186 ui/generators/react#ungated:6de55407f5b9 ui/generators/react#loader:08e5438231dd ui/generators/react#plugin:b70a97bb6556
127
+ render-loop be960ec1a828 ui/render-loop#RenderLoop:26cd3aa222be ui/render-loop#RenderLoopError:79c4d40f96f7 ui/render-loop#useRenderLoopDetector:90e66afe4c82
128
+ rise 61ded997838c ui/animations/anm_rise#RISE:d178eebd2d96
129
+ route-grammar 908017e6633d ui/islands/map#ViewId:1803b726a3f2 ui/islands/map#ScreenName:1803b726a3f2 ui/islands/map#ScreenSchema:e34dac772797 ui/islands/map#Screen:d89925503325 ui/islands/map#LinkSchema:2cffc4530649 ui/islands/map#Link:cddf1e8c9a89 ui/islands/map#MapSchema:7534b09abac3 ui/islands/map#MapIsland:cd73cbe9975f
130
+ routes-writer 1a61f420f66e ui/generators/routes#typedRoute:b0bd4f259649 ui/generators/routes#viewsIn:9945a607f187 ui/generators/routes#holding:d2af8731dc6b
131
+ roving-focus cb0ac52a89ee ui/roving-focus#ITEM_ATTR:8b73d7f449d1 ui/roving-focus#RovingOptions:99d861749f5e ui/roving-focus#typeaheadMatch:03faca7fba5b ui/roving-focus#useRovingFocus:3b7852d6152b
132
+ row 3edfc1bb496b ui/elements/row#RowProps:ad269764b266 ui/elements/row#Row:569a64b06443
133
+ rule 378160180b5b ui/variants/var_rule#RULE:27e702157c9c
134
+ scatter 22d298a2efa2 ui/elements/scatter#ScatterProps:91be4e563d68 ui/elements/scatter#Scatter:601a9061ff54 ui/elements/scatter.works#uses:4fc5950fb41d ui/elements/scatter.works#point:d986d6e7e804
135
+ screens 87e6882810a4 ui/screens#declares:cad46cab877c ui/screens#SCREENS:2412f9a2cc25 ui/screens#nameOf:38eeb450b217 ui/screens#PAGE:b7bbe39b7b35 ui/screens#presentedIn:cb083ae57ffe ui/screens#routeFor:9212f2e08bc1 ui/screens#pageAt:8accc096b285 ui/screens#entryAmong:e8e913cd736e ui/screens#seeds:950628166bbd
136
+ scroll-lock 0f916058a352 ui/scroll-lock#lockScroll:1ebfb8414d04 ui/scroll-lock#scrollLocks:dbe6494f9d41
137
+ select 97ead0eb87a4 ui/elements/select#SelectProps:e5720f21652e ui/elements/select#Select:304fef768983 ui/elements/select.works#does:eae69973c066
138
+ separator 03aeb2b5f1bb ui/elements/separator#SeparatorProps:39c0ed47c8a0 ui/elements/separator#Separator:ef292b7118cf
139
+ series c57f94d44322 ui/series#Oklch:c89405845570 ui/series#hexToOklch:4789883600c4 ui/series#oklchToHex:addb0ebe3e77 ui/series#seriesRamp:dcbdba1604ca ui/series#seriesColour:59e2788e6eda
140
+ shadow-token a853481182c9 ui/tokens/shadow#SHADOW:4be3d61d7b28
141
+ shake 823853a54116 ui/animations/anm_shake#SHAKE:0fa001de0cc4
142
+ show-reader 265e7f6c23c6 ui/generators/show#namedBy:512bfc15cc9b
143
+ signals 71b9ca638d39 ui/signals#SignalEntry:c4df440da285 ui/signals#holds:09920a64717d ui/signals#selectorOf:3760cece0feb ui/signals#SIGNALS:1e4ed72981ce ui/signals#EXCLUSIVE:9246e03a89ae ui/signals#coexist:40aac7cabc7c ui/signals#knowSignals:d809925e46fd ui/signals#signalNames:3ccbfc44dc32 ui/signals#isSignal:7ec24fea5b8b ui/signals#PointerSample:5d35cad46706 ui/signals#GestureFrame:eaf70a3d7781 ui/signals#GesturePhase:b48b44476bac ui/signals#Recognition:5803e495593d ui/signals#IDLE:8343023bcafc ui/signals#GestureEntry:2a90384c0121 ui/signals#defineGesture:f1b67e16a59e ui/signals#gestures:19649f79edf5 ui/signals#gestureFor:978e6ce3869c ui/signals#isGesture:7ec24fea5b8b ui/signals#gestureNames:3ccbfc44dc32 ui/signals#recognise:fac5ccc84865 ui/signals#SignalIssue:4165faba45aa ui/signals#checkInteractions:09d6e5b4183b
144
+ skeleton c3c54fdabacc ui/elements/skeleton#SkeletonProps:4757f547cc95 ui/elements/skeleton#Skeleton:37f365492a9d
145
+ skeleton-block 1d031eb6fe66 ui/variants/var_skeleton-block#SKELETON_BLOCK:c18f7e7cf3dc
146
+ slide-in-left a2090e0e36e3 ui/animations/anm_slide_in_left#SLIDE_IN_LEFT:3f466d0564c7
147
+ slide-in-right 03201522158d ui/animations/anm_slide_in_right#SLIDE_IN_RIGHT:0c4d922d831e
148
+ slide-out-left e770370b0540 ui/animations/anm_slide_out_left#SLIDE_OUT_LEFT:880a18c52b89
149
+ slide-out-right c2a861af9c90 ui/animations/anm_slide_out_right#SLIDE_OUT_RIGHT:a7faf4d2b78c
150
+ slider 29d634b58d3f ui/elements/slider#SliderProps:53c464f32e4b ui/elements/slider#Slider:29e115f5629b ui/elements/slider.works#does:1c10d363e445
151
+ sparkline d000a9f40102 ui/elements/sparkline#SparklineProps:30103b965675 ui/elements/sparkline#Sparkline:541243ee9db2 ui/elements/sparkline.works#uses:b6cc82bd5732 ui/elements/sparkline.works#drawing:62c65ae3b123
152
+ spin 49b33c0bd6ae ui/animations/anm_spin#SPIN:30e735ce0bd4
153
+ spinner dc5d9825ce24 ui/elements/spinner#SpinnerProps:e89b67d88a13 ui/elements/spinner#Spinner:e38e42d0b0c5
154
+ spinner-turning 59556dee7c9f ui/variants/var_spinner-turning#SPINNER_TURNING:0c7bdb2fdf29
155
+ stack 2eeddd1a72a3 ui/elements/stack#StackProps:ad269764b266 ui/elements/stack#Stack:fdd85c412df6
156
+ stat c691e09c06e7 ui/elements/stat#StatProps:96cd57b2e8e4 ui/elements/stat#Stat:fa6a34480102 ui/elements/stat.works#shown:25c9bae03897
157
+ stat-tile c8717d893ac4 ui/variants/var_stat-tile#STAT_TILE:1b611bad8d11
158
+ styleguide-shape fc172d4e9545 ui/styleguide#StyleGuide:872bb558460e ui/styleguide#themedBy:b1e17b642d8c ui/styleguide#kindsHeld:3ccbfc44dc32 ui/styleguide#shapeOf:0191a88f5272 ui/styleguide#chosen:98aeef39cf52 ui/styleguide#shifted:9fa8d7f1bbec
159
+ styleguides c783e16f6e2e ui/styleguides#holds:66da16a1d8a6 ui/styleguides#STYLEGUIDES:e8e2b9e43e3d
160
+ styles-writer 7757e1aed2a5
161
+ surface fedb1c18423f ui/elements/surface#SurfaceProps:ad269764b266 ui/elements/surface#Surface:553e947ae889 ui/elements/surface.works#uses:8b8e3a9fe8d0
162
+ swell 55b58053ed5a ui/animations/anm_swell#SWELL:e66f7cdef31a
163
+ tab-bar 27306b5f110a ui/variants/var_tab-bar#TAB_BAR:5b7295b1d4a0
164
+ table 45e6a6608811 ui/elements/table#TableProps:96fb88caf788 ui/elements/table#Table:42c3ac158f4e ui/elements/table.works#uses:3085121fd6b4 ui/elements/table.works#shown:75fca49b7d63 ui/elements/table.works#heading:d9482c8fbf24
165
+ tabs c7b67f52b340 ui/elements/tabs#TabsProps:cf28cb6ed29f ui/elements/tabs#Tabs:bdf4c5c4a04a ui/elements/tabs.works#uses:1e91366e992b ui/elements/tabs.works#strip:24729769900c ui/elements/tabs.works#tab:13a2e9b7ad30 ui/elements/tabs.works#opened:768544dc2ba6 ui/elements/tabs.works#panel:a066bd3e1ba8 ui/elements/tabs.works#shown:c14c6452def5
166
+ tap-target 3b1d83984a4c ui/variants/var_tap-target#TAP_TARGET:f83b88aa706b
167
+ text 0f03b3b5bce7 ui/elements/text#TextProps:81c96ab6243e ui/elements/text#Text:7e9a751cc97c
168
+ textarea 76880dee05ad ui/elements/textarea#TextareaProps:9004657bc84f ui/elements/textarea#Textarea:e9304e28d0e9 ui/elements/textarea.works#does:9fddd3177d22
169
+ themes 578150eec4c9 ui/themes#holds:e5c0c9297825 ui/themes#THEMES:66852c882bbe
170
+ time 9a277ad00e23 ui/elements/time#TimeProps:c654fa2d8b40 ui/elements/time#Time:f1090f04bc57 ui/elements/time.works#uses:a10fbc45685b ui/elements/time.works#shows:c92126ddc36e
171
+ toggle 9db23c69b51c ui/elements/toggle#ToggleProps:fefe061bcc79 ui/elements/toggle#Toggle:5e938057fbfe ui/elements/toggle.works#does:9ca75ef2795c
172
+ token-shape d072589be2f5 ui/token#Token:8d672efc335b ui/token#Wearing:10a6833bf679 ui/token#Holds:e30cbdfece90 ui/token#nameOf:7ad5f68e2c86 ui/token#naming:107c722f7b02 ui/token#held:a2b8fff9fbaa ui/token#sheeted:f0b5eed68e64
173
+ tokens 8d3bdf2dc147 ui/tokens#holds:da8687a09455 ui/tokens#declares:040f49b399ed ui/tokens#TOKENS:9e4c1275ec9c ui/tokens#nameOf:ff8fa0760be2 ui/tokens#seeds:950628166bbd ui/tokens#mismatched:5679b09f6252 ui/tokens#orphaned:579e61bf7b35
174
+ tooltip c41d8c367003 ui/elements/tooltip#TooltipProps:c49189b9f17a ui/elements/tooltip#Tooltip:dea7727a0321 ui/elements/tooltip.works#uses:d00d3ada96f8 ui/elements/tooltip.works#showing:cae65122fed6 ui/elements/tooltip.works#bubble:90bd36385377 ui/elements/tooltip.works#measured:2df010cbbfb8
175
+ translator 2e6486cb17d5 ui/i18n/translator#UnknownMessageKeyError:8dd90403c7fe ui/i18n/translator#TranslatorOptions:78186c114b44 ui/i18n/translator#createTranslator:4eb69b879704
176
+ ui-attach e92c55e3f26b ui/attach#ATTACH_HOME:16475c413846 ui/attach#ATTACH:8b0b999ca5c9
177
+ validators e648b6cfc317 ui/validators#ENTRY_MODES:6238d04fe5a8 ui/validators#KEYBOARDS:38e63312aeee ui/validators#EntryMode:18d83f0e69e6 ui/validators#Keyboard:2316810a5de3 ui/validators#ValidateResult:530bdd02c4e4 ui/validators#valid:3ce6786a6b1c ui/validators#invalid:46bcfbeb6f8e ui/validators#ValidatorContext:cf494e7f96b8 ui/validators#validators:0fd6015be8fa ui/validators#hasValidator:7ec24fea5b8b ui/validators#validatorFor:eaa1acab74f0 ui/validators#runValidator:3fc93347d97f ui/validators#formatValue:062cca5c1239 ui/validators#EntryConstraints:a5662931f360 ui/validators#entryConstraints:676ee3d7fbda ui/validators#acceptsKeystroke:cb848d0041fa ui/validators#applyMask:3f93a2d6184a ui/validators#minorUnits:921fda509ea5 ui/validators#evaluateMoney:e710eca6aed8 ui/validators#limited:77aa553c4b7a
178
+ value f85e6f17b76b ui/elements/value#ValueProps:3346fb6b4e16 ui/elements/value#Value:59ceafd2bbba ui/elements/value.works#shows:07daabb6f547
179
+ variant-rows 601640ae7284 ui/variants#VARIANTS:054eaa012e24
180
+ variant-shape 175a5b8b3821 ui/variant#Variant:c9fa1bded409 ui/variant#propertiesHeld:f2f795682efa ui/variant#freeHeld:3ccbfc44dc32 ui/variant#structural:74cde91fc910 ui/variant#looking:25ed76b8a1b8 ui/variant#variant:58068a021fa3 ui/variant#boundHeld:f2f795682efa ui/variant#camel:ff8fa0760be2 ui/variant#classOf:ff8fa0760be2 ui/variant#classOfElement:ff8fa0760be2 ui/variant#classOfComposition:ff8fa0760be2 ui/variant#classOfScreen:ff8fa0760be2 ui/variant#unreacted:c61cf4383338 ui/variant#complete:068de9765c79 ui/variant#statesOf:c8962010907d ui/variant#under:265eab85913f ui/variant#undeclaredStates:11961d12ec9d
181
+ variants-seeder 5d37b937c531 ui/generators/variants#nameOf:ff8fa0760be2 ui/generators/variants#seeds:e5c803f28183 ui/generators/variants#mismatched:5679b09f6252 ui/generators/variants#orphaned:8865319ec4c3 ui/generators/variants#unguarded:2402578021fc ui/generators/variants#guarding:b0bd4f259649
182
+ wobble edf6e636810f ui/animations/anm_wobble#WOBBLE:6d3b15f44665
183
+ wrappers 0328fc1efdb7 ui/wrappers#Appearance:ec3028b4b84a ui/wrappers#UiConfig:d899ce533c78 ui/wrappers#UiContext:96dbef1bc6b9 ui/wrappers#UiProvider:49c08762a14c ui/wrappers#useUi:0734231ecf54 ui/wrappers#SurfaceRequest:c8015cd4cd32 ui/wrappers#useSurface:4b8b39afaf79 ui/wrappers#Press:77733f69fb6e ui/wrappers#pressOf:4bdd7232323b ui/wrappers#PressOrigin:3daa7623dd12 ui/wrappers#pressing:65fa29c030f0 ui/wrappers#usePress:486493cd9a8b ui/wrappers#useVisibility:4d1b5ddb676e ui/wrappers#ScreenOptions:244dc14dd3b0 ui/wrappers#ElementBody:71817b4c2a87 ui/wrappers#Element:ab34dbdc55be ui/wrappers#element:a7e4708803dc ui/wrappers#composition:d129e11ec13b ui/wrappers#ScreenControls:6b17634c6ed4 ui/wrappers#useView:97298a47e810 ui/wrappers#screen:80f46a5e3cda ui/wrappers#behaviourOf:5841f6ad0abe
184
+ zoom-in de9f521f292c ui/animations/anm_zoom_in#ZOOM_IN:e39ceba8428e
185
+ zoom-out 841dc6cd15af ui/animations/anm_zoom_out#ZOOM_OUT:0c67b3faf366
186
+ -->
187
+
3
188
  ## 0.1.7
4
189
 
5
190
  something it shipped is gone or is not the shape it was, so taking this one can stop your code compiling.
@@ -1,9 +1,9 @@
1
1
  import { releases, starts } from '@prestack/thread/integrations/cli';
2
2
  import { basename } from 'node:path';
3
- import { argv, execPath, stdout } from 'node:process';
4
- import { generators, settling } from '@prestack/thread/core/chain';
3
+ import { argv, stdout } from 'node:process';
4
+ import { batched, generators, settling } from '@prestack/thread/core/chain';
5
5
  import { existsSync } from '@prestack/thread/integrations/disk';
6
- import { CLI, exit, invoked } from '@prestack/thread/core/invoked';
6
+ import { exit, invoked } from '@prestack/thread/core/invoked';
7
7
  import { named } from '@prestack/thread/core/scope';
8
8
  import { findTree } from '@prestack/thread/core/tree';
9
9
  import { programOf } from '@prestack/thread/integrations/target';
@@ -11,7 +11,7 @@ const SERVER = 'next';
11
11
  const SHIP = '--ship';
12
12
  const ENTRY = 'dev';
13
13
  const SHIPPED = 'build';
14
- const GATE = 'gate';
14
+ const GATE = 'thread gate';
15
15
  const say = (line) => {
16
16
  stdout.write(line);
17
17
  };
@@ -38,10 +38,13 @@ async function run() {
38
38
  return 1;
39
39
  }
40
40
  say('thread: ' + basename(tree.at) + ' settled in ' + String(settled.rounds) + ' round(s); running the gate\n');
41
- const gated = starts(execPath, [...CLI, GATE], { at: tree.at, shows: true });
42
- if (!gated.ok) {
41
+ const gated = batched(tree.at, [GATE]);
42
+ for (const one of gated)
43
+ if (one.said !== '')
44
+ say(one.said + '\n');
45
+ if (!gated.every((one) => one.ok)) {
43
46
  say('thread: the gate refused this tree, and nothing is served over a red gate. What it refused is printed above.\n');
44
- return gated.code === 0 ? 1 : gated.code;
47
+ return 1;
45
48
  }
46
49
  say('thread: the gate passed; running ' + SERVER + ' ' + entry + '\n');
47
50
  const extra = argv.slice(2).filter((one) => one !== SHIP);
@@ -1,10 +1,10 @@
1
1
  import { releases, starts } from '@prestack/thread/integrations/cli'
2
2
  import { basename } from 'node:path'
3
- import { argv, execPath, stdout } from 'node:process'
3
+ import { argv, stdout } from 'node:process'
4
4
 
5
- import { generators, settling } from '@prestack/thread/core/chain'
5
+ import { batched, generators, settling } from '@prestack/thread/core/chain'
6
6
  import { existsSync } from '@prestack/thread/integrations/disk'
7
- import { CLI, exit, invoked } from '@prestack/thread/core/invoked'
7
+ import { exit, invoked } from '@prestack/thread/core/invoked'
8
8
  import { named } from '@prestack/thread/core/scope'
9
9
  import { findTree } from '@prestack/thread/core/tree'
10
10
  import { programOf } from '@prestack/thread/integrations/target'
@@ -17,7 +17,7 @@ const ENTRY = 'dev'
17
17
 
18
18
  const SHIPPED = 'build'
19
19
 
20
- const GATE = 'gate'
20
+ const GATE = 'thread gate'
21
21
 
22
22
  const say = (line: string): void => {
23
23
  stdout.write(line)
@@ -53,10 +53,11 @@ async function run(): Promise<number> {
53
53
  }
54
54
 
55
55
  say('thread: ' + basename(tree.at) + ' settled in ' + String(settled.rounds) + ' round(s); running the gate\n')
56
- const gated = starts(execPath, [...CLI, GATE], { at: tree.at, shows: true })
57
- if (!gated.ok) {
56
+ const gated = batched(tree.at, [GATE])
57
+ for (const one of gated) if (one.said !== '') say(one.said + '\n')
58
+ if (!gated.every((one) => one.ok)) {
58
59
  say('thread: the gate refused this tree, and nothing is served over a red gate. What it refused is printed above.\n')
59
- return gated.code === 0 ? 1 : gated.code
60
+ return 1
60
61
  }
61
62
 
62
63
  say('thread: the gate passed; running ' + SERVER + ' ' + entry + '\n')
@@ -1,12 +1,13 @@
1
1
  import { dirname, join, relative } from 'node:path';
2
2
  import { argv, stderr, stdout } from 'node:process';
3
3
  import ts from 'typescript';
4
- import { existsSync, readFileSync, realpathSync, writeFileSync } from '@prestack/thread/integrations/disk';
4
+ import { existsSync, readFileSync, readdirSync, realpathSync, rmSync, writeFileSync } from '@prestack/thread/integrations/disk';
5
5
  import { exit, invoked } from '@prestack/thread/core/invoked';
6
- import { valuesIn } from '@prestack/thread/core/rows';
6
+ import { listBounds, nestedBounds, rowsIn, valuesIn, withField, withRow, withoutField, withoutRow } from '@prestack/thread/core/rows';
7
7
  import { named as packageOf } from '@prestack/thread/core/scope';
8
8
  import { findTree, inTree } from '@prestack/thread/core/tree';
9
9
  import { PERMITS_AT } from '@prestack/thread/operations/access';
10
+ import { said } from '@prestack/thread/operations/attach';
10
11
  import { ACTOR_AT, COMPILED } from '@prestack/thread/operations/capabilities';
11
12
  import { compiledAt, nameOf as compositionOf } from '../compositions.js';
12
13
  import { PRESENTATIONS } from '../door.js';
@@ -21,6 +22,11 @@ const MAP = `app/_generated/map.${'ts'}`;
21
22
  const PROVIDER = `${COMPILED}/ui/provider.tsx`;
22
23
  const GRAMMAR = `${COMPILED}/ui/islands/map.ts`;
23
24
  const MOVES = 'navigateTo';
25
+ const PAGE_ROW = 'page';
26
+ const WRITER = 'thread routes';
27
+ const PAGE_SAID = 'The page a browser gets at the address of this screen: `/` when it is the first page this app declares, and its own ' +
28
+ 'name otherwise. `thread routes` writes the page and this row from where the screen sits, and moves or deletes both ' +
29
+ 'when that changes.';
24
30
  function served(at) {
25
31
  try {
26
32
  const held = JSON.parse(readFileSync(join(at, 'package.json'), 'utf8'));
@@ -316,6 +322,40 @@ function page(name, at, route) {
316
322
  '',
317
323
  ].join('\n');
318
324
  }
325
+ const pageShaped = (path) => path === pageAt(`/${path.split('/').slice(1, -1).join('/')}`);
326
+ function unpaged(one) {
327
+ if (one.where === undefined) {
328
+ return (`\`${one.id}\` is presented as a ${one.shown}, so it has no page, and its row still derives ${String(one.was)}. ` +
329
+ `Run \`${WRITER}\`, which takes that row out and deletes the page.`);
330
+ }
331
+ return (`\`${one.id}\` answers ${String(one.route)}, so its page is ${one.where}, and its row ` +
332
+ `${one.was === undefined ? 'derives no page' : `says ${one.was}`}. Run \`${WRITER}\`, which writes that row from ` +
333
+ 'where the screen now sits and puts the page there.');
334
+ }
335
+ function repaged(text, moved) {
336
+ let next = text;
337
+ for (const one of moved) {
338
+ const list = listBounds(next, 'declares');
339
+ const inside = list === undefined ? undefined : nestedBounds(next, list, one.id, 'derives');
340
+ if (inside !== undefined)
341
+ next = withoutRow(next, inside, PAGE_ROW);
342
+ const rows = listBounds(next, 'declares');
343
+ if (rows === undefined)
344
+ return undefined;
345
+ const within = nestedBounds(next, rows, one.id, 'derives');
346
+ if (one.where === undefined) {
347
+ if (within !== undefined && rowsIn(next, within).length === 0)
348
+ next = withoutField(next, rows, one.id, 'derives');
349
+ continue;
350
+ }
351
+ const row = said({ id: PAGE_ROW, at: one.where, describes: PAGE_SAID, version: 1, by: WRITER, runs: `${WRITER} --check` }, ' ');
352
+ const put = within === undefined ? withField(next, rows, one.id, 'derives', `[\n${row}\n ]`) : withRow(next, within, row);
353
+ if (put === undefined)
354
+ return undefined;
355
+ next = put;
356
+ }
357
+ return next;
358
+ }
319
359
  function gate(typed) {
320
360
  const said = typed ? ' as { of?: Record<string, string> }' : '';
321
361
  return [
@@ -532,6 +572,7 @@ async function run() {
532
572
  const shownOf = (id) => presentedIn(texts.get(id) ?? '');
533
573
  const entry = entryAmong(rows, shownOf);
534
574
  const made = [];
575
+ const moved = [];
535
576
  const routes = new Map();
536
577
  const screens = [];
537
578
  const reaches = reachable(at);
@@ -541,7 +582,7 @@ async function run() {
541
582
  if (typed !== undefined) {
542
583
  stderr.write(`routes: ${row.at} states \`route: '${typed}'\`, and a route is never typed: the first page an app declares ` +
543
584
  'answers `/`, every other page answers its own name, and a sheet has no route. Take `route:` out of the ' +
544
- 'file — `thread create screen edit` rewrites it without one when it is given the body.\n');
585
+ `file with \`thread edit ${row.at} --find <text> --replace <text>\`, which changes that one stretch of it.\n`);
545
586
  return 1;
546
587
  }
547
588
  const name = nameOf(row.at);
@@ -576,18 +617,19 @@ async function run() {
576
617
  entry: row.id === entry,
577
618
  shows: [...shows],
578
619
  });
579
- if (route === undefined)
620
+ const where = route === undefined ? undefined : pageAt(route);
621
+ const was = (row.derives ?? []).find((one) => one.id === PAGE_ROW)?.at;
622
+ if (was !== where)
623
+ moved.push({ id: row.id, shown: shownAs, route, was, where });
624
+ if (route === undefined || where === undefined)
580
625
  continue;
581
- const where = pageAt(route);
582
- const stated = (row.derives ?? []).find((one) => one.id === 'page')?.at;
583
- if (stated !== where) {
584
- stderr.write(`routes: \`${row.id}\` answers ${route}, so its page is ${where}, and its row ` +
585
- `${stated === undefined ? 'derives no page' : `says ${stated}`}. Run \`thread create screen edit\` on it — ` +
586
- 'the row is rewritten from where the screen now lives.\n');
587
- return 1;
588
- }
589
626
  made.push({ path: where, text: page(name, row.at, route) });
590
627
  }
628
+ if (moved.length > 0 && argv.includes('--check')) {
629
+ for (const one of moved)
630
+ stderr.write(`routes: ${unpaged(one)}\n`);
631
+ return 1;
632
+ }
591
633
  const { links, wrong } = linksOf(at, rows, compositions, routes, wordingFirst(keyProps(at)));
592
634
  if (wrong.length > 0) {
593
635
  for (const one of wrong)
@@ -611,6 +653,30 @@ async function run() {
611
653
  });
612
654
  const paged = map.screens.filter((one) => one.path !== undefined).length;
613
655
  const counted = `${String(map.screens.length)} screen(s), ${String(paged)} route(s), ${String(map.links.length)} link(s)`;
656
+ if (moved.length > 0) {
657
+ const declaredIn = relative(at, screensAt);
658
+ const rewritten = repaged(readFileSync(screensAt, 'utf8'), moved);
659
+ if (rewritten === undefined) {
660
+ stderr.write(`routes: ${declaredIn} could not be given the page row of each screen, so nothing was written. ` +
661
+ `\`thread read ${declaredIn}\` prints what it states now.\n`);
662
+ return 1;
663
+ }
664
+ writeFileSync(screensAt, rewritten, 'utf8');
665
+ const answered = new Set(made.map((one) => one.path));
666
+ const home = dirname(join(at, pageAt('/')));
667
+ for (const one of moved) {
668
+ stdout.write(one.where === undefined
669
+ ? `routes: \`${one.id}\` has no route, so its row no longer derives ${String(one.was)}\n`
670
+ : `routes: \`${one.id}\` answers ${String(one.route)}, so its row now derives ${one.where}\n`);
671
+ if (one.was === undefined || answered.has(one.was) || !pageShaped(one.was) || !existsSync(join(at, one.was)))
672
+ continue;
673
+ rmSync(join(at, one.was));
674
+ const folder = dirname(join(at, one.was));
675
+ if (folder !== home && readdirSync(folder).length === 0)
676
+ rmSync(folder, { recursive: true, force: true });
677
+ stdout.write(`routes: deleted ${one.was}, because no screen answers there any more\n`);
678
+ }
679
+ }
614
680
  const refused = landed(at, made);
615
681
  if (refused !== undefined)
616
682
  return refused;
@@ -3,12 +3,13 @@ import { argv, stderr, stdout } from 'node:process'
3
3
 
4
4
  import ts from 'typescript'
5
5
 
6
- import { existsSync, readFileSync, realpathSync, writeFileSync } from '@prestack/thread/integrations/disk'
6
+ import { existsSync, readFileSync, readdirSync, realpathSync, rmSync, writeFileSync } from '@prestack/thread/integrations/disk'
7
7
  import { exit, invoked } from '@prestack/thread/core/invoked'
8
- import { valuesIn } from '@prestack/thread/core/rows'
8
+ import { listBounds, nestedBounds, rowsIn, valuesIn, withField, withRow, withoutField, withoutRow } from '@prestack/thread/core/rows'
9
9
  import { named as packageOf } from '@prestack/thread/core/scope'
10
10
  import { findTree, inTree } from '@prestack/thread/core/tree'
11
11
  import { PERMITS_AT } from '@prestack/thread/operations/access'
12
+ import { said } from '@prestack/thread/operations/attach'
12
13
  import { ACTOR_AT, COMPILED } from '@prestack/thread/operations/capabilities'
13
14
 
14
15
  import { compiledAt, nameOf as compositionOf } from '../compositions.ts'
@@ -36,6 +37,15 @@ const GRAMMAR = `${COMPILED}/ui/islands/map.ts`
36
37
 
37
38
  const MOVES = 'navigateTo'
38
39
 
40
+ const PAGE_ROW = 'page'
41
+
42
+ const WRITER = 'thread routes'
43
+
44
+ const PAGE_SAID =
45
+ 'The page a browser gets at the address of this screen: `/` when it is the first page this app declares, and its own ' +
46
+ 'name otherwise. `thread routes` writes the page and this row from where the screen sits, and moves or deletes both ' +
47
+ 'when that changes.'
48
+
39
49
  function served(at: string): boolean {
40
50
  try {
41
51
  const held = JSON.parse(readFileSync(join(at, 'package.json'), 'utf8')) as {
@@ -386,6 +396,51 @@ function page(name: string, at: string, route: string): string {
386
396
  ].join('\n')
387
397
  }
388
398
 
399
+ interface Repaged {
400
+ readonly id: string
401
+ readonly shown: string
402
+ readonly route: string | undefined
403
+ readonly was: string | undefined
404
+ readonly where: string | undefined
405
+ }
406
+
407
+ const pageShaped = (path: string): boolean => path === pageAt(`/${path.split('/').slice(1, -1).join('/')}`)
408
+
409
+ function unpaged(one: Repaged): string {
410
+ if (one.where === undefined) {
411
+ return (
412
+ `\`${one.id}\` is presented as a ${one.shown}, so it has no page, and its row still derives ${String(one.was)}. ` +
413
+ `Run \`${WRITER}\`, which takes that row out and deletes the page.`
414
+ )
415
+ }
416
+ return (
417
+ `\`${one.id}\` answers ${String(one.route)}, so its page is ${one.where}, and its row ` +
418
+ `${one.was === undefined ? 'derives no page' : `says ${one.was}`}. Run \`${WRITER}\`, which writes that row from ` +
419
+ 'where the screen now sits and puts the page there.'
420
+ )
421
+ }
422
+
423
+ function repaged(text: string, moved: readonly Repaged[]): string | undefined {
424
+ let next = text
425
+ for (const one of moved) {
426
+ const list = listBounds(next, 'declares')
427
+ const inside = list === undefined ? undefined : nestedBounds(next, list, one.id, 'derives')
428
+ if (inside !== undefined) next = withoutRow(next, inside, PAGE_ROW)
429
+ const rows = listBounds(next, 'declares')
430
+ if (rows === undefined) return undefined
431
+ const within = nestedBounds(next, rows, one.id, 'derives')
432
+ if (one.where === undefined) {
433
+ if (within !== undefined && rowsIn(next, within).length === 0) next = withoutField(next, rows, one.id, 'derives')
434
+ continue
435
+ }
436
+ const row = said({ id: PAGE_ROW, at: one.where, describes: PAGE_SAID, version: 1, by: WRITER, runs: `${WRITER} --check` }, ' ')
437
+ const put = within === undefined ? withField(next, rows, one.id, 'derives', `[\n${row}\n ]`) : withRow(next, within, row)
438
+ if (put === undefined) return undefined
439
+ next = put
440
+ }
441
+ return next
442
+ }
443
+
389
444
  function gate(typed: boolean): readonly string[] {
390
445
  const said = typed ? ' as { of?: Record<string, string> }' : ''
391
446
  return [
@@ -647,6 +702,7 @@ async function run(): Promise<number> {
647
702
  const entry = entryAmong(rows, shownOf)
648
703
 
649
704
  const made: { readonly path: string; readonly text: string }[] = []
705
+ const moved: Repaged[] = []
650
706
  const routes = new Map<string, string | undefined>()
651
707
  const screens: MapIsland['screens'][number][] = []
652
708
  const reaches = reachable(at)
@@ -658,7 +714,7 @@ async function run(): Promise<number> {
658
714
  stderr.write(
659
715
  `routes: ${row.at} states \`route: '${typed}'\`, and a route is never typed: the first page an app declares ` +
660
716
  'answers `/`, every other page answers its own name, and a sheet has no route. Take `route:` out of the ' +
661
- 'file — `thread create screen edit` rewrites it without one when it is given the body.\n',
717
+ `file with \`thread edit ${row.at} --find <text> --replace <text>\`, which changes that one stretch of it.\n`,
662
718
  )
663
719
  return 1
664
720
  }
@@ -700,20 +756,18 @@ async function run(): Promise<number> {
700
756
  entry: row.id === entry,
701
757
  shows: [...shows],
702
758
  })
703
- if (route === undefined) continue
704
- const where = pageAt(route)
705
- const stated = (row.derives ?? []).find((one) => one.id === 'page')?.at
706
- if (stated !== where) {
707
- stderr.write(
708
- `routes: \`${row.id}\` answers ${route}, so its page is ${where}, and its row ` +
709
- `${stated === undefined ? 'derives no page' : `says ${stated}`}. Run \`thread create screen edit\` on it — ` +
710
- 'the row is rewritten from where the screen now lives.\n',
711
- )
712
- return 1
713
- }
759
+ const where = route === undefined ? undefined : pageAt(route)
760
+ const was = (row.derives ?? []).find((one) => one.id === PAGE_ROW)?.at
761
+ if (was !== where) moved.push({ id: row.id, shown: shownAs, route, was, where })
762
+ if (route === undefined || where === undefined) continue
714
763
  made.push({ path: where, text: page(name, row.at, route) })
715
764
  }
716
765
 
766
+ if (moved.length > 0 && argv.includes('--check')) {
767
+ for (const one of moved) stderr.write(`routes: ${unpaged(one)}\n`)
768
+ return 1
769
+ }
770
+
717
771
  const { links, wrong } = linksOf(at, rows, compositions, routes, wordingFirst(keyProps(at)))
718
772
  if (wrong.length > 0) {
719
773
  for (const one of wrong) stderr.write(`routes: ${one}\n`)
@@ -749,6 +803,33 @@ async function run(): Promise<number> {
749
803
  const paged = map.screens.filter((one) => one.path !== undefined).length
750
804
  const counted = `${String(map.screens.length)} screen(s), ${String(paged)} route(s), ${String(map.links.length)} link(s)`
751
805
 
806
+ if (moved.length > 0) {
807
+ const declaredIn = relative(at, screensAt)
808
+ const rewritten = repaged(readFileSync(screensAt, 'utf8'), moved)
809
+ if (rewritten === undefined) {
810
+ stderr.write(
811
+ `routes: ${declaredIn} could not be given the page row of each screen, so nothing was written. ` +
812
+ `\`thread read ${declaredIn}\` prints what it states now.\n`,
813
+ )
814
+ return 1
815
+ }
816
+ writeFileSync(screensAt, rewritten, 'utf8')
817
+ const answered = new Set(made.map((one) => one.path))
818
+ const home = dirname(join(at, pageAt('/')))
819
+ for (const one of moved) {
820
+ stdout.write(
821
+ one.where === undefined
822
+ ? `routes: \`${one.id}\` has no route, so its row no longer derives ${String(one.was)}\n`
823
+ : `routes: \`${one.id}\` answers ${String(one.route)}, so its row now derives ${one.where}\n`,
824
+ )
825
+ if (one.was === undefined || answered.has(one.was) || !pageShaped(one.was) || !existsSync(join(at, one.was))) continue
826
+ rmSync(join(at, one.was))
827
+ const folder = dirname(join(at, one.was))
828
+ if (folder !== home && readdirSync(folder).length === 0) rmSync(folder, { recursive: true, force: true })
829
+ stdout.write(`routes: deleted ${one.was}, because no screen answers there any more\n`)
830
+ }
831
+ }
832
+
752
833
  const refused = landed(at, made)
753
834
  if (refused !== undefined) return refused
754
835
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prestack/thread-ui",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -17,6 +17,6 @@
17
17
  "react-dom": "^19.0.0",
18
18
  "typescript": "^6.0.0",
19
19
  "zod": "^4.5.4",
20
- "@prestack/thread": "^0.1.19"
20
+ "@prestack/thread": "^0.1.20"
21
21
  }
22
22
  }