@zio.dev/zio-blocks 0.0.33 → 0.0.51
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/guides/compile-time-resource-safety-with-scope.md +16 -17
- package/guides/getting-started-with-mux.md +1507 -0
- package/guides/query-dsl-extending.md +161 -102
- package/guides/query-dsl-fluent-builder.md +217 -157
- package/guides/query-dsl-reified-optics.md +12 -10
- package/guides/query-dsl-sql.md +246 -165
- package/guides/telemetry-guide.md +1069 -0
- package/guides/zio-schema-migration.md +29 -22
- package/index.md +292 -50
- package/package.json +1 -1
- package/plans/config-follow-up-prs.md +188 -0
- package/plans/config-pr-assessment-roadmap.md +310 -0
- package/reference/MuxDataFlow.jsx +250 -0
- package/reference/async.md +651 -0
- package/reference/chunk.md +3533 -308
- package/reference/codegen/case-class.md +436 -0
- package/reference/codegen/emitter-config.md +383 -0
- package/reference/codegen/examples.md +664 -0
- package/reference/codegen/field.md +316 -0
- package/reference/codegen/index.md +317 -0
- package/reference/codegen/scala-emitter.md +392 -0
- package/reference/codegen/scala-file.md +276 -0
- package/reference/codegen/sealed-trait.md +408 -0
- package/reference/codegen/type-definition.md +340 -0
- package/reference/codegen/type-ref.md +201 -0
- package/reference/combinators.md +347 -117
- package/reference/config.md +158 -0
- package/reference/context.md +4 -4
- package/reference/datastar.md +346 -0
- package/reference/docs.md +1461 -345
- package/reference/endpoint/auth-type.md +146 -0
- package/reference/endpoint/endpoint.md +297 -0
- package/reference/endpoint/http-codec.md +249 -0
- package/reference/endpoint/index.md +825 -0
- package/reference/endpoint/path-codec.md +237 -0
- package/reference/endpoint/route-pattern.md +196 -0
- package/reference/endpoint/route-tree.md +111 -0
- package/reference/endpoint/segment-codec.md +212 -0
- package/reference/html.md +1120 -0
- package/reference/htmx/attribute-values.md +359 -0
- package/reference/htmx/hx-encoding.md +111 -0
- package/reference/htmx/hx-params.md +204 -0
- package/reference/htmx/hx-swap.md +276 -0
- package/reference/htmx/hx-sync.md +251 -0
- package/reference/htmx/hx-target.md +314 -0
- package/reference/htmx/hx-trigger.md +457 -0
- package/reference/htmx/hx-url-update.md +239 -0
- package/reference/htmx/index.md +855 -0
- package/reference/http-model/index.md +47 -0
- package/reference/http-model/model.md +1481 -0
- package/reference/http-model/schema.md +747 -0
- package/reference/maybe.md +826 -0
- package/reference/media-type.md +2 -2
- package/reference/mux.mdx +823 -0
- package/reference/openapi.md +1351 -0
- package/reference/resource-management/defer-handle.md +1 -1
- package/reference/resource-management/resource.md +31 -2
- package/reference/resource-management/scope.md +28 -12
- package/reference/resource-management/wire.md +3 -7
- package/reference/ringbuffer/MpmcDiagram.jsx +717 -0
- package/reference/ringbuffer/MpscDiagram.jsx +618 -0
- package/reference/ringbuffer/SpmcDiagram.jsx +680 -0
- package/reference/ringbuffer/SpscDiagram.jsx +677 -0
- package/reference/ringbuffer/advanced.mdx +109 -0
- package/reference/ringbuffer/index.mdx +145 -0
- package/reference/ringbuffer/mpmc.mdx +151 -0
- package/reference/ringbuffer/mpsc.mdx +132 -0
- package/reference/ringbuffer/spmc.mdx +108 -0
- package/reference/ringbuffer/spsc.mdx +344 -0
- package/reference/{allows.md → schema/allows.md} +4 -4
- package/reference/{binding-resolver.md → schema/binding-resolver.md} +1 -1
- package/reference/{binding.md → schema/binding.md} +2 -3
- package/reference/schema/built-in-codecs/avro.md +451 -0
- package/reference/schema/built-in-codecs/bson.md +480 -0
- package/reference/schema/built-in-codecs/csv.md +564 -0
- package/reference/schema/built-in-codecs/index.md +77 -0
- package/reference/schema/built-in-codecs/json/index.md +295 -0
- package/reference/schema/built-in-codecs/json/json-config.md +217 -0
- package/reference/{json-patch.md → schema/built-in-codecs/json/json-patch.md} +5 -5
- package/reference/{json-schema.md → schema/built-in-codecs/json/json-schema.md} +14 -47
- package/reference/schema/built-in-codecs/json/json-selection.md +322 -0
- package/reference/{json.md → schema/built-in-codecs/json/json.md} +32 -64
- package/reference/schema/built-in-codecs/messagepack.md +508 -0
- package/reference/schema/built-in-codecs/thrift.md +433 -0
- package/reference/schema/built-in-codecs/toon.md +1078 -0
- package/reference/{xml.md → schema/built-in-codecs/xml.md} +13 -9
- package/reference/schema/built-in-codecs/yaml.md +552 -0
- package/reference/{codec.md → schema/codec.md} +10 -10
- package/reference/{dynamic-optic.md → schema/dynamic-optic.md} +151 -5
- package/reference/{dynamic-schema.md → schema/dynamic-schema.md} +8 -8
- package/reference/schema/format.md +92 -0
- package/reference/schema/index.md +50 -0
- package/reference/schema/migration.md +297 -0
- package/reference/{modifier.md → schema/modifier.md} +58 -7
- package/reference/{optics.md → schema/optics.md} +2 -2
- package/reference/{patch.md → schema/patch.md} +1 -1
- package/{path-interpolator.md → reference/schema/path-interpolator.md} +165 -72
- package/reference/{schema-evolution → schema/schema-evolution}/as.md +8 -8
- package/reference/{schema-evolution → schema/schema-evolution}/index.md +2 -2
- package/reference/{schema-evolution → schema/schema-evolution}/into.md +8 -8
- package/reference/{schema-expr.md → schema/schema-expr.md} +110 -175
- package/reference/{schema.md → schema/schema.md} +12 -0
- package/reference/{structural-types.md → schema/structural-types.md} +1 -1
- package/reference/{type-class-derivation.md → schema/type-class-derivation.md} +63 -1
- package/reference/smithy.md +533 -0
- package/reference/sql/db-codec-deriver.md +71 -0
- package/reference/sql/db-codec.md +687 -0
- package/reference/sql/db-con.md +271 -0
- package/reference/sql/db-connection.md +153 -0
- package/reference/sql/db-param-writer.md +77 -0
- package/reference/sql/db-param.md +66 -0
- package/reference/sql/db-result-reader.md +146 -0
- package/reference/sql/db-tx.md +82 -0
- package/reference/sql/db-value.md +41 -0
- package/reference/sql/ddl.md +85 -0
- package/reference/sql/frag.md +254 -0
- package/reference/sql/index.md +341 -0
- package/reference/sql/repo.md +600 -0
- package/reference/sql/sql-dialect.md +73 -0
- package/reference/sql/sql-logger.md +62 -0
- package/reference/sql/sql-name-mapper.md +70 -0
- package/reference/sql/table-metadata.md +134 -0
- package/reference/sql/table.md +448 -0
- package/reference/sql/transactor-zio.md +399 -0
- package/reference/sql/transactor.md +353 -0
- package/reference/sql-zio.md +112 -0
- package/reference/streams/concurrent-operators.md +106 -0
- package/reference/streams/index.md +653 -0
- package/reference/streams/pipeline.md +718 -0
- package/reference/streams/reader.md +1284 -0
- package/reference/streams/scala-2-compatibility.md +55 -0
- package/reference/streams/sink.md +1426 -0
- package/reference/streams/stream.md +2526 -0
- package/reference/streams/writer.md +1045 -0
- package/reference/streams/zero-boxing.md +275 -0
- package/reference/telemetry.md +693 -0
- package/reference/typeid.md +5 -19
- package/sidebars.js +238 -43
- package/reference/formats.md +0 -694
- package/reference/http-model.md +0 -1716
- package/reference/streams.md +0 -989
- package/ringbuffer.md +0 -249
- /package/reference/{json-differ.md → schema/built-in-codecs/json/json-differ.md} +0 -0
- /package/reference/{dynamic-value.md → schema/dynamic-value.md} +0 -0
- /package/reference/{lazy.md → schema/lazy.md} +0 -0
- /package/reference/{reflect.md → schema/reflect.md} +0 -0
- /package/reference/{registers.md → schema/registers.md} +0 -0
- /package/reference/{schema-error.md → schema/schema-error.md} +0 -0
- /package/reference/{syntax.md → schema/syntax.md} +0 -0
- /package/reference/{validation.md → schema/validation.md} +0 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: hx-target
|
|
3
|
+
title: HxTarget
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`HxTarget` represents the `hx-target` attribute and related selector-based attributes, declaring where HTMX applies the swap. It supports DOM traversal patterns like "closest ancestor," "first descendant," "next sibling," and raw CSS selectors, eliminating stringly mistakes in selector construction.
|
|
7
|
+
|
|
8
|
+
Use `HxTarget.This` for the current element, or call traversal methods like `closest()`, `find()`, `next()`, and `previous()` for common patterns. For arbitrary CSS selectors, use `css()`. Here are the core patterns:
|
|
9
|
+
|
|
10
|
+
```scala
|
|
11
|
+
import zio.http.htmx._
|
|
12
|
+
|
|
13
|
+
// Current element
|
|
14
|
+
HxTarget.This
|
|
15
|
+
|
|
16
|
+
// Closest ancestor matching selector
|
|
17
|
+
HxTarget.closest("form")
|
|
18
|
+
|
|
19
|
+
// First descendant matching selector
|
|
20
|
+
HxTarget.find(".results")
|
|
21
|
+
|
|
22
|
+
// Next sibling
|
|
23
|
+
HxTarget.next
|
|
24
|
+
|
|
25
|
+
// Next sibling matching selector
|
|
26
|
+
HxTarget.next(".item")
|
|
27
|
+
|
|
28
|
+
// Raw CSS selector
|
|
29
|
+
HxTarget.css("#results")
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Common Targets
|
|
33
|
+
|
|
34
|
+
**`HxTarget.This`** targets the element itself (the `this` keyword in HTMX). Backtick-friendly and identifier-friendly aliases are available:
|
|
35
|
+
|
|
36
|
+
```scala
|
|
37
|
+
import zio.blocks.html._
|
|
38
|
+
import zio.http.htmx._
|
|
39
|
+
|
|
40
|
+
button(
|
|
41
|
+
hxPost := "/api/action",
|
|
42
|
+
hxTarget := HxTarget.This,
|
|
43
|
+
"Update Me"
|
|
44
|
+
)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```scala
|
|
48
|
+
import zio.http.htmx._
|
|
49
|
+
|
|
50
|
+
HxTarget.`this` // backtick-friendly
|
|
51
|
+
HxTarget.this_ // identifier-friendly (underscore avoids Scala keyword)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## DOM Traversal Patterns
|
|
55
|
+
|
|
56
|
+
**`closest(selector: String)`** traverses up the DOM tree to find the closest ancestor matching the selector:
|
|
57
|
+
|
|
58
|
+
```scala
|
|
59
|
+
import zio.blocks.html._
|
|
60
|
+
import zio.http.htmx._
|
|
61
|
+
|
|
62
|
+
// Update the closest form ancestor
|
|
63
|
+
input(
|
|
64
|
+
hxPost := "/validate",
|
|
65
|
+
hxTarget := HxTarget.closest("form")
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
// Update the closest .card ancestor
|
|
69
|
+
button(
|
|
70
|
+
hxGet := "/refresh",
|
|
71
|
+
hxTarget := HxTarget.closest(".card")
|
|
72
|
+
)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**`find(selector: String)`** finds the first descendant matching the selector:
|
|
76
|
+
|
|
77
|
+
```scala
|
|
78
|
+
import zio.blocks.html._
|
|
79
|
+
import zio.http.htmx._
|
|
80
|
+
|
|
81
|
+
// Update the first .results div inside this element
|
|
82
|
+
div(
|
|
83
|
+
hxGet := "/search-results",
|
|
84
|
+
hxTarget := HxTarget.find(".results")
|
|
85
|
+
)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**`next`** targets the next sibling element without filtering:
|
|
89
|
+
|
|
90
|
+
```scala
|
|
91
|
+
import zio.blocks.html._
|
|
92
|
+
import zio.http.htmx._
|
|
93
|
+
|
|
94
|
+
// Update the next sibling
|
|
95
|
+
button(
|
|
96
|
+
hxPost := "/action",
|
|
97
|
+
hxTarget := HxTarget.next,
|
|
98
|
+
"Go"
|
|
99
|
+
)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**`next(selector: String)`** targets the next sibling matching the selector:
|
|
103
|
+
|
|
104
|
+
```scala
|
|
105
|
+
import zio.blocks.html._
|
|
106
|
+
import zio.http.htmx._
|
|
107
|
+
|
|
108
|
+
// Update the next .row sibling
|
|
109
|
+
div(
|
|
110
|
+
hxGet := "/row-data",
|
|
111
|
+
hxTarget := HxTarget.next(".row")
|
|
112
|
+
)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**`HxTarget.previous`** targets the previous sibling element:
|
|
116
|
+
|
|
117
|
+
```scala
|
|
118
|
+
import zio.blocks.html._
|
|
119
|
+
import zio.http.htmx._
|
|
120
|
+
|
|
121
|
+
button(
|
|
122
|
+
hxPost := "/action",
|
|
123
|
+
hxTarget := HxTarget.previous
|
|
124
|
+
)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**`previous(selector: String)`** targets the previous sibling matching the selector:
|
|
128
|
+
|
|
129
|
+
```scala
|
|
130
|
+
import zio.blocks.html._
|
|
131
|
+
import zio.http.htmx._
|
|
132
|
+
|
|
133
|
+
div(
|
|
134
|
+
hxGet := "/prev-data",
|
|
135
|
+
hxTarget := HxTarget.previous(".section")
|
|
136
|
+
)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## CSS Selectors
|
|
140
|
+
|
|
141
|
+
**`css(selector: String)`** uses a raw CSS selector string. Validation ensures the selector is non-empty but otherwise accepts any string:
|
|
142
|
+
|
|
143
|
+
```scala
|
|
144
|
+
import zio.blocks.html._
|
|
145
|
+
import zio.http.htmx._
|
|
146
|
+
|
|
147
|
+
div(
|
|
148
|
+
hxGet := "/data",
|
|
149
|
+
hxTarget := HxTarget.css("#results")
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
// Complex CSS selector
|
|
153
|
+
div(
|
|
154
|
+
hxPost := "/search",
|
|
155
|
+
hxTarget := HxTarget.css("div.container > .results:first-child")
|
|
156
|
+
)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**`css(selector: CssSelector)`** accepts a typed `CssSelector` from `zio.blocks.html`, providing type-safe selector construction:
|
|
160
|
+
|
|
161
|
+
```scala
|
|
162
|
+
import zio.blocks.html._
|
|
163
|
+
import zio.http.htmx._
|
|
164
|
+
|
|
165
|
+
div(
|
|
166
|
+
hxGet := "/update",
|
|
167
|
+
hxTarget := HxTarget.css(selector".results")
|
|
168
|
+
)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Rendering & Parsing
|
|
172
|
+
|
|
173
|
+
**`render: String`** produces the literal HTMX target selector string:
|
|
174
|
+
|
|
175
|
+
```scala
|
|
176
|
+
import zio.http.htmx._
|
|
177
|
+
|
|
178
|
+
HxTarget.This.render // "this"
|
|
179
|
+
HxTarget.closest("form").render // "closest form"
|
|
180
|
+
HxTarget.find(".results").render // "find .results"
|
|
181
|
+
HxTarget.next.render // "next"
|
|
182
|
+
HxTarget.next(".item").render // "next .item"
|
|
183
|
+
HxTarget.previous(".row").render // "previous .row"
|
|
184
|
+
HxTarget.css("#results").render // "#results"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**`HxTarget.parse(value: String): Either[String, HxTarget]`** parses a rendered selector string back into a typed `HxTarget`:
|
|
188
|
+
|
|
189
|
+
```scala
|
|
190
|
+
import zio.http.htmx._
|
|
191
|
+
|
|
192
|
+
HxTarget.parse("this") // Right(HxTarget.This)
|
|
193
|
+
HxTarget.parse("closest form") // Right(HxTarget.closest("form"))
|
|
194
|
+
HxTarget.parse("find .results") // Right(HxTarget.find(".results"))
|
|
195
|
+
HxTarget.parse("next") // Right(HxTarget.next)
|
|
196
|
+
HxTarget.parse("next .item") // Right(HxTarget.next(".item"))
|
|
197
|
+
HxTarget.parse("#results") // Right(HxTarget.css("#results"))
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Parse failures return a descriptive `Left`:
|
|
201
|
+
|
|
202
|
+
```scala
|
|
203
|
+
import zio.http.htmx._
|
|
204
|
+
|
|
205
|
+
HxTarget.parse("") // Left("HTMX target selector must be non-empty")
|
|
206
|
+
HxTarget.parse(" ") // Left("HTMX target selector must be non-empty")
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Common Patterns
|
|
210
|
+
|
|
211
|
+
Selecting the right target element is essential for HTMX interactions. Here are practical patterns for common scenarios:
|
|
212
|
+
|
|
213
|
+
### Update a Form Container
|
|
214
|
+
|
|
215
|
+
When a button inside a form fires a request, target the form to replace all its content:
|
|
216
|
+
|
|
217
|
+
```scala
|
|
218
|
+
import zio.blocks.html._
|
|
219
|
+
import zio.http.htmx._
|
|
220
|
+
|
|
221
|
+
form(
|
|
222
|
+
id := "search-form",
|
|
223
|
+
input(placeholder := "Search..."),
|
|
224
|
+
button(
|
|
225
|
+
hxPost := "/search",
|
|
226
|
+
hxTarget := HxTarget.closest("form"),
|
|
227
|
+
"Search"
|
|
228
|
+
)
|
|
229
|
+
)
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Update a Results Section
|
|
233
|
+
|
|
234
|
+
Target a specific div outside the trigger element:
|
|
235
|
+
|
|
236
|
+
```scala
|
|
237
|
+
import zio.blocks.html._
|
|
238
|
+
import zio.http.htmx._
|
|
239
|
+
|
|
240
|
+
div(
|
|
241
|
+
input(
|
|
242
|
+
hxPost := "/search",
|
|
243
|
+
hxTarget := HxTarget.find(".results"),
|
|
244
|
+
placeholder := "Search..."
|
|
245
|
+
),
|
|
246
|
+
div(id := "results", "Results here")
|
|
247
|
+
)
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Append to a List
|
|
251
|
+
|
|
252
|
+
Use `AfterBegin` or `BeforeEnd` with a target on the list container:
|
|
253
|
+
|
|
254
|
+
```scala
|
|
255
|
+
import zio.blocks.html._
|
|
256
|
+
import zio.http.htmx._
|
|
257
|
+
|
|
258
|
+
ul(
|
|
259
|
+
id := "items",
|
|
260
|
+
li(
|
|
261
|
+
button(
|
|
262
|
+
hxPost := "/add-item",
|
|
263
|
+
hxTarget := HxTarget.closest("ul"),
|
|
264
|
+
hxSwap := HxSwap.BeforeEnd,
|
|
265
|
+
"Add Item"
|
|
266
|
+
)
|
|
267
|
+
),
|
|
268
|
+
li("Item 1")
|
|
269
|
+
)
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Target the Next Row in a Table
|
|
273
|
+
|
|
274
|
+
Each row has an "edit" button that updates the next row:
|
|
275
|
+
|
|
276
|
+
```scala
|
|
277
|
+
import zio.blocks.html._
|
|
278
|
+
import zio.http.htmx._
|
|
279
|
+
|
|
280
|
+
tr(
|
|
281
|
+
td("Data 1"),
|
|
282
|
+
td(button(
|
|
283
|
+
hxGet := "/edit",
|
|
284
|
+
hxTarget := HxTarget.next("tr"),
|
|
285
|
+
"Edit"
|
|
286
|
+
))
|
|
287
|
+
)
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## Integration with Other Attributes
|
|
291
|
+
|
|
292
|
+
Multiple HTMX attributes accept `HxTarget` values:
|
|
293
|
+
|
|
294
|
+
- `hxTarget` — Where to apply the swap
|
|
295
|
+
- `hxInclude` — Which elements to include in the request (uses similar selector patterns)
|
|
296
|
+
- `hxSync` — Which element to synchronize with
|
|
297
|
+
|
|
298
|
+
All accept the same `HxTarget` type:
|
|
299
|
+
|
|
300
|
+
```scala
|
|
301
|
+
import zio.blocks.html._
|
|
302
|
+
import zio.http.htmx._
|
|
303
|
+
import scala.concurrent.duration._
|
|
304
|
+
|
|
305
|
+
form(
|
|
306
|
+
hxPost := "/submit",
|
|
307
|
+
hxTarget := HxTarget.closest("form"),
|
|
308
|
+
hxInclude := HxTarget.closest("form"),
|
|
309
|
+
hxSync := HxSync(HxTarget.This, HxSyncStrategy.Queue),
|
|
310
|
+
button("Submit")
|
|
311
|
+
)
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
The `ToHtmxValue[HxTarget]` instance handles rendering automatically, so `HxTarget` values work seamlessly with all attribute keys that accept selectors.
|