protos 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +213 -8
- data/examples/navbar.rb +2 -0
- data/lib/protos/breadcrumbs/crumb.rb +11 -0
- data/lib/protos/breadcrumbs.rb +23 -0
- data/lib/protos/carousel/actions.rb +28 -0
- data/lib/protos/carousel/item.rb +19 -0
- data/lib/protos/carousel.rb +47 -0
- data/lib/protos/chat_bubble/content.rb +46 -0
- data/lib/protos/chat_bubble/footer.rb +19 -0
- data/lib/protos/chat_bubble/header.rb +19 -0
- data/lib/protos/chat_bubble/image.rb +19 -0
- data/lib/protos/chat_bubble.rb +48 -0
- data/lib/protos/hero/content.rb +19 -0
- data/lib/protos/hero/overlay.rb +19 -0
- data/lib/protos/hero.rb +25 -0
- data/lib/protos/stats/actions.rb +19 -0
- data/lib/protos/stats/description.rb +19 -0
- data/lib/protos/stats/figure.rb +19 -0
- data/lib/protos/stats/stat.rb +19 -0
- data/lib/protos/stats/title.rb +19 -0
- data/lib/protos/stats/value.rb +19 -0
- data/lib/protos/stats.rb +17 -0
- data/lib/protos/swap/off.rb +19 -0
- data/lib/protos/swap/on.rb +19 -0
- data/lib/protos/swap.rb +28 -0
- data/lib/protos/table/cell.rb +30 -0
- data/lib/protos/table/head.rb +30 -0
- data/lib/protos/tabs/tab.rb +42 -0
- data/lib/protos/tabs.rb +64 -0
- data/lib/protos/toast/close_button.rb +18 -0
- data/lib/protos/toast.rb +42 -0
- data/lib/protos/version.rb +1 -1
- data/lib/protos.rb +35 -0
- metadata +29 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d640442007a4c04a5706286fb3073495ba0bcea036f543c112865d4b8f96646f
|
4
|
+
data.tar.gz: 03ee33c002aee6e033ecebda12bab9db1fe74ac2d989213da013a96e79598ceb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 496fc272a6606ab50281cab0cc434bd8c8e8607b6efa976ce2a671b9fdc2ed818c19d41b97c0d9831a835473d37e1846d56ffa0d85791c35d698dedd2521400b
|
7
|
+
data.tar.gz: 18a8d1f2f496c47a85a41b84a54c108a889d954c9bead99b1547819b813538d9c8d124ca3e4b4f94bb8ac05ca3121cd56adaf63e79e132c59656bea31473190d
|
data/README.md
CHANGED
@@ -1,9 +1,37 @@
|
|
1
1
|
# Protos
|
2
2
|
|
3
|
-
A UI component library for Phlex using
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
A UI component library for [Phlex](https://www.phlex.fun/) using
|
4
|
+
[tailwindcss](https://tailwindcss.com/) and
|
5
|
+
[daisyUI](https://daisyui.com/).
|
6
|
+
|
7
|
+
This library avoids re-making Protos components for extremely simple daisyui
|
8
|
+
components such as:
|
9
|
+
|
10
|
+
- Badge
|
11
|
+
- Buttons
|
12
|
+
- Checkbox
|
13
|
+
- File input
|
14
|
+
- Indicator
|
15
|
+
- Join
|
16
|
+
- Kbd
|
17
|
+
- Link
|
18
|
+
- Loading
|
19
|
+
- Mask
|
20
|
+
- Progress
|
21
|
+
- Radial progress
|
22
|
+
- Radio
|
23
|
+
- Range
|
24
|
+
- Select
|
25
|
+
- Skeleton
|
26
|
+
- Stack
|
27
|
+
- Text input
|
28
|
+
- Textarea
|
29
|
+
- Toggle
|
30
|
+
- Tooltip
|
31
|
+
|
32
|
+
All components avoid using
|
33
|
+
[`Phlex::DeferredRender`](https://www.phlex.fun/#slots)
|
34
|
+
so you can reorder components exactly how you like them.
|
7
35
|
|
8
36
|
Components are easy to style, positioning them is usually done through the
|
9
37
|
`class` option which applies the style to the outer most container of the
|
@@ -206,6 +234,8 @@ render Protos::Card.new(class: "bg-base-100") do |card|
|
|
206
234
|
end
|
207
235
|
```
|
208
236
|
|
237
|
+
## Building your own components
|
238
|
+
|
209
239
|
A good idea would be to encapsulate these proto components with your own
|
210
240
|
components as a wrapper. For example you could use `Proto::List` to create your
|
211
241
|
own list and even use `Phlex::DeferredRender` to make the API more convenient.
|
@@ -216,20 +246,195 @@ module Ui
|
|
216
246
|
include Protos::Typography
|
217
247
|
include Phlex::DeferredRender
|
218
248
|
|
249
|
+
option :title, default: -> {}
|
250
|
+
option :ordered, default: -> { false }
|
251
|
+
option :items, default: -> { [] }, reader: false
|
252
|
+
option :actions, default: -> { [] }, reader: false
|
253
|
+
|
219
254
|
def template
|
220
255
|
article(**attrs) do
|
221
256
|
header class: css[:header] do
|
222
257
|
h3(size: :md) { title }
|
223
|
-
nav
|
258
|
+
nav(class: css[:actions]) do
|
259
|
+
@actions.each do |action|
|
260
|
+
render action
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
render Protos::List.new(ordered:, class: css[:list]) do
|
266
|
+
@items.each { |item| render item }
|
267
|
+
li(&@empty) if @items.empty?
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
def with_item(*, **, &block)
|
273
|
+
theme = { container: css[:item] }
|
274
|
+
@items << Protos::List::Item.new(*, theme:, **, &block)
|
275
|
+
end
|
276
|
+
|
277
|
+
def with_action(&block)
|
278
|
+
@actions << block
|
279
|
+
end
|
280
|
+
|
281
|
+
def with_empty(&block)
|
282
|
+
@empty = block
|
283
|
+
end
|
284
|
+
|
285
|
+
private
|
286
|
+
|
287
|
+
def theme
|
288
|
+
{
|
289
|
+
container: tokens("space-y-xs"),
|
290
|
+
header: tokens("flex", "justify-between", "items-end", "gap-sm"),
|
291
|
+
list: tokens("divide-y", "border", "w-full"),
|
292
|
+
actions: tokens("space-x-xs"),
|
293
|
+
item: tokens("p-sm")
|
294
|
+
}
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
```
|
299
|
+
|
300
|
+
Now the component is specific to our application, and the styles are still
|
301
|
+
overridable at all levels:
|
302
|
+
|
303
|
+
```ruby
|
304
|
+
render Ui::List.new(title: "Project Names") do |list|
|
305
|
+
list.with_action { link_to("Add item", "#") }
|
306
|
+
list.with_item { "Project 1" }
|
307
|
+
list.with_item { "Project 2" }
|
308
|
+
list.with_item { "Project 3" }
|
309
|
+
end
|
310
|
+
```
|
311
|
+
|
312
|
+
Or here is another example of a table:
|
313
|
+
|
314
|
+
```ruby
|
315
|
+
module Ui
|
316
|
+
class Table < ApplicationComponent
|
317
|
+
include Protos::Typography
|
318
|
+
include Phlex::DeferredRender
|
319
|
+
include Actionable
|
320
|
+
|
321
|
+
class Column
|
322
|
+
attr_reader :title
|
323
|
+
|
324
|
+
def initialize(title, &block)
|
325
|
+
@title = title
|
326
|
+
@block = block
|
327
|
+
end
|
328
|
+
|
329
|
+
def call(item)
|
330
|
+
@block.call(item)
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
option :title, default: -> {}
|
335
|
+
option :collection, default: -> { [] }, reader: false
|
336
|
+
option :columns, default: -> { [] }, reader: false
|
337
|
+
|
338
|
+
def template
|
339
|
+
article(**attrs) do
|
340
|
+
header class: css[:header] do
|
341
|
+
h3(size: :md) { title } if title.present?
|
342
|
+
nav(class: css[:actions]) do
|
343
|
+
@actions.each do |action|
|
344
|
+
render action
|
345
|
+
end
|
346
|
+
end
|
224
347
|
end
|
225
348
|
|
226
|
-
render Protos::
|
227
|
-
|
228
|
-
|
349
|
+
render Protos::Table.new(class: css[:table]) do |table|
|
350
|
+
render(table.caption(class: css[:caption]), &@caption) if @caption
|
351
|
+
render table.header do
|
352
|
+
render table.row do
|
353
|
+
@columns.each do |column|
|
354
|
+
render table.head do
|
355
|
+
plain(column.title)
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
render table.body do
|
362
|
+
@collection.each do |item|
|
363
|
+
render table.row do
|
364
|
+
@columns.each do |column|
|
365
|
+
render table.cell do
|
366
|
+
column.call(item)
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
if @collection.empty?
|
373
|
+
render table.row do
|
374
|
+
render table.cell(colspan: @columns.length) do
|
375
|
+
@empty&.call
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
229
379
|
end
|
230
380
|
end
|
231
381
|
end
|
232
382
|
end
|
383
|
+
|
384
|
+
def with_column(...)
|
385
|
+
@columns << Column.new(...)
|
386
|
+
end
|
387
|
+
|
388
|
+
def with_empty(&block)
|
389
|
+
@empty = block
|
390
|
+
end
|
391
|
+
|
392
|
+
def with_caption(&block)
|
393
|
+
@caption = block
|
394
|
+
end
|
395
|
+
|
396
|
+
def with_action(&block)
|
397
|
+
@actions << block
|
398
|
+
end
|
399
|
+
|
400
|
+
private
|
401
|
+
|
402
|
+
def theme
|
403
|
+
{
|
404
|
+
container: tokens("space-y-sm"),
|
405
|
+
header: tokens("flex", "justify-between", "items-end", "gap-sm"),
|
406
|
+
table: tokens("border"),
|
407
|
+
caption: tokens("text-muted")
|
408
|
+
}
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|
412
|
+
```
|
413
|
+
|
414
|
+
Which lets you have a very nice table builder:
|
415
|
+
|
416
|
+
```ruby
|
417
|
+
collection = [
|
418
|
+
{
|
419
|
+
name: "John Doe",
|
420
|
+
status: "Active",
|
421
|
+
location: "New York"
|
422
|
+
}
|
423
|
+
]
|
424
|
+
|
425
|
+
render Ui::Table.new(title: "A table", collection:) do |table|
|
426
|
+
table.with_caption { "Users" }
|
427
|
+
table.with_action do
|
428
|
+
a(href: "#") { "Add new" }
|
429
|
+
end
|
430
|
+
|
431
|
+
table.with_column("Name") { |row| row[:name] }
|
432
|
+
table.with_column("Location") { |row| row[:location] }
|
433
|
+
table.with_column("Status") do |row|
|
434
|
+
span(class: "badge badge-info") { row[:status] }
|
435
|
+
end
|
436
|
+
table.with_column("Actions") do
|
437
|
+
a(href: "#") { "View" }
|
233
438
|
end
|
234
439
|
end
|
235
440
|
```
|
data/examples/navbar.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Breadcrumbs < Component
|
5
|
+
def template(&block)
|
6
|
+
nav(**attrs) do
|
7
|
+
ul(class: css[:list], &block)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def crumb(...)
|
12
|
+
Crumb.new(...)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def theme
|
18
|
+
{
|
19
|
+
container: tokens("breadcrumbs")
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Carousel
|
5
|
+
class Actions < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens(
|
15
|
+
"absolute",
|
16
|
+
"flex",
|
17
|
+
"justify-between",
|
18
|
+
"transform",
|
19
|
+
"-translate-y-1/2",
|
20
|
+
"left-sm",
|
21
|
+
"right-sm",
|
22
|
+
"top-1/2"
|
23
|
+
)
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Carousel
|
5
|
+
class Item < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens("carousel-item")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Carousel < Component
|
5
|
+
option :vertical, type: Types::Bool, default: -> { false }
|
6
|
+
option :snap_to,
|
7
|
+
default: -> { :none },
|
8
|
+
reader: false,
|
9
|
+
type: Types::Coercible::Symbol.enum(
|
10
|
+
:none,
|
11
|
+
:center,
|
12
|
+
:end
|
13
|
+
)
|
14
|
+
|
15
|
+
def template(&block)
|
16
|
+
div(**attrs, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def item(...)
|
20
|
+
Item.new(...)
|
21
|
+
end
|
22
|
+
|
23
|
+
def actions(...)
|
24
|
+
Actions.new(...)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def snap_to
|
30
|
+
{
|
31
|
+
none: "",
|
32
|
+
center: "carousel-center",
|
33
|
+
end: "carousel-end"
|
34
|
+
}.fetch(@snap_to)
|
35
|
+
end
|
36
|
+
|
37
|
+
def theme
|
38
|
+
{
|
39
|
+
container: tokens(
|
40
|
+
"carousel",
|
41
|
+
snap_to,
|
42
|
+
vertical: "carousel-vertical"
|
43
|
+
)
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class ChatBubble
|
5
|
+
class Content < Component
|
6
|
+
option :type,
|
7
|
+
default: -> { :none },
|
8
|
+
reader: false,
|
9
|
+
type: Types::Coercible::Symbol.enum(
|
10
|
+
:none,
|
11
|
+
:primary,
|
12
|
+
:secondary,
|
13
|
+
:accent,
|
14
|
+
:info,
|
15
|
+
:success,
|
16
|
+
:warning,
|
17
|
+
:error
|
18
|
+
)
|
19
|
+
|
20
|
+
def template(&block)
|
21
|
+
div(**attrs, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def type
|
27
|
+
{
|
28
|
+
none: "",
|
29
|
+
primary: "chat-bubble-primary",
|
30
|
+
secondary: "chat-bubble-secondary",
|
31
|
+
accent: "chat-bubble-accent",
|
32
|
+
info: "chat-bubble-info",
|
33
|
+
success: "chat-bubble-success",
|
34
|
+
warning: "chat-bubble-warning",
|
35
|
+
error: "chat-bubble-error"
|
36
|
+
}.fetch(@type)
|
37
|
+
end
|
38
|
+
|
39
|
+
def theme
|
40
|
+
{
|
41
|
+
container: tokens("chat-bubble", type)
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class ChatBubble
|
5
|
+
class Footer < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens("chat-footer")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class ChatBubble
|
5
|
+
class Header < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens("chat-header")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class ChatBubble
|
5
|
+
class Image < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens("chat-image")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class ChatBubble < Component
|
5
|
+
option :align,
|
6
|
+
default: -> { :start },
|
7
|
+
reader: false,
|
8
|
+
type: Types::Coercible::Symbol.enum(
|
9
|
+
:start,
|
10
|
+
:end
|
11
|
+
)
|
12
|
+
|
13
|
+
def template(&block)
|
14
|
+
div(**attrs, &block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def image(...)
|
18
|
+
Image.new(...)
|
19
|
+
end
|
20
|
+
|
21
|
+
def header(...)
|
22
|
+
Header.new(...)
|
23
|
+
end
|
24
|
+
|
25
|
+
def footer(...)
|
26
|
+
Footer.new(...)
|
27
|
+
end
|
28
|
+
|
29
|
+
def content(...)
|
30
|
+
Content.new(...)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def align
|
36
|
+
{
|
37
|
+
start: "chat-start",
|
38
|
+
end: "chat-end"
|
39
|
+
}.fetch(@align)
|
40
|
+
end
|
41
|
+
|
42
|
+
def theme
|
43
|
+
{
|
44
|
+
container: tokens("chat", align)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Hero
|
5
|
+
class Content < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens("hero-content")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Hero
|
5
|
+
class Overlay < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens("hero-overlay")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/protos/hero.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Hero < Component
|
5
|
+
def template(&block)
|
6
|
+
div(**attrs, &block)
|
7
|
+
end
|
8
|
+
|
9
|
+
def content(...)
|
10
|
+
Content.new(...)
|
11
|
+
end
|
12
|
+
|
13
|
+
def overlay(...)
|
14
|
+
Overlay.new(...)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def theme
|
20
|
+
{
|
21
|
+
container: tokens("hero")
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Stats
|
5
|
+
class Actions < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens("stat-actions")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Stats
|
5
|
+
class Description < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens("stat-desc")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Stats
|
5
|
+
class Figure < Component
|
6
|
+
def template(&block)
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def theme
|
13
|
+
{
|
14
|
+
container: tokens("stat-figure")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/protos/stats.rb
ADDED
data/lib/protos/swap.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Swap < Component
|
5
|
+
def template
|
6
|
+
label(**attrs) do
|
7
|
+
input(type: :checkbox)
|
8
|
+
yield if block_given?
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def on(...)
|
13
|
+
On.new(...)
|
14
|
+
end
|
15
|
+
|
16
|
+
def off(...)
|
17
|
+
Off.new(...)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def theme
|
23
|
+
{
|
24
|
+
container: tokens("swap")
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/protos/table/cell.rb
CHANGED
@@ -3,9 +3,39 @@
|
|
3
3
|
module Protos
|
4
4
|
class Table
|
5
5
|
class Cell < Component
|
6
|
+
option :align,
|
7
|
+
type: Types::Coercible::Symbol.enum(:left, :center, :right),
|
8
|
+
default: -> {
|
9
|
+
:left
|
10
|
+
}
|
11
|
+
|
6
12
|
def template(&block)
|
7
13
|
td(**attrs, &block)
|
8
14
|
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def left?
|
19
|
+
align == :left
|
20
|
+
end
|
21
|
+
|
22
|
+
def center?
|
23
|
+
align == :center
|
24
|
+
end
|
25
|
+
|
26
|
+
def right?
|
27
|
+
align == :right
|
28
|
+
end
|
29
|
+
|
30
|
+
def theme
|
31
|
+
{
|
32
|
+
container: tokens(
|
33
|
+
left?: "text-left",
|
34
|
+
right?: "text-right",
|
35
|
+
center?: "text-center"
|
36
|
+
)
|
37
|
+
}
|
38
|
+
end
|
9
39
|
end
|
10
40
|
end
|
11
41
|
end
|
data/lib/protos/table/head.rb
CHANGED
@@ -3,9 +3,39 @@
|
|
3
3
|
module Protos
|
4
4
|
class Table
|
5
5
|
class Head < Component
|
6
|
+
option :align,
|
7
|
+
type: Types::Coercible::Symbol.enum(:left, :center, :right),
|
8
|
+
default: -> {
|
9
|
+
:left
|
10
|
+
}
|
11
|
+
|
6
12
|
def template(&block)
|
7
13
|
th(**attrs, &block)
|
8
14
|
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def left?
|
19
|
+
align == :left
|
20
|
+
end
|
21
|
+
|
22
|
+
def center?
|
23
|
+
align == :center
|
24
|
+
end
|
25
|
+
|
26
|
+
def right?
|
27
|
+
align == :right
|
28
|
+
end
|
29
|
+
|
30
|
+
def theme
|
31
|
+
{
|
32
|
+
container: tokens(
|
33
|
+
left?: "text-left",
|
34
|
+
right?: "text-right",
|
35
|
+
center?: "text-center"
|
36
|
+
)
|
37
|
+
}
|
38
|
+
end
|
9
39
|
end
|
10
40
|
end
|
11
41
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Tabs
|
5
|
+
class Tab < Component
|
6
|
+
param :id
|
7
|
+
option :label
|
8
|
+
option :active, default: false
|
9
|
+
option :disabled, default: false
|
10
|
+
|
11
|
+
def template(&block)
|
12
|
+
input(
|
13
|
+
type: :radio,
|
14
|
+
class: css[:input],
|
15
|
+
name: id,
|
16
|
+
role: :tab,
|
17
|
+
aria_label: label
|
18
|
+
)
|
19
|
+
div(**attrs, &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def default_attrs
|
25
|
+
{
|
26
|
+
role: :tabpanel
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def theme
|
31
|
+
{
|
32
|
+
container: tokens("tab-content"),
|
33
|
+
input: tokens(
|
34
|
+
"tab",
|
35
|
+
disabled: "tab-disabled",
|
36
|
+
active: "tab-active"
|
37
|
+
)
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/protos/tabs.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Tabs < Component
|
5
|
+
option :type,
|
6
|
+
type: Types::Coercible::Symbol.enum(
|
7
|
+
:default,
|
8
|
+
:boxed,
|
9
|
+
:bordered,
|
10
|
+
:lifted
|
11
|
+
),
|
12
|
+
default: -> { :default },
|
13
|
+
reader: false
|
14
|
+
option :size,
|
15
|
+
type: Types::Coercible::Symbol.enum(
|
16
|
+
:xs,
|
17
|
+
:sm,
|
18
|
+
:md,
|
19
|
+
:lg
|
20
|
+
),
|
21
|
+
default: -> { :md },
|
22
|
+
reader: false
|
23
|
+
|
24
|
+
def template(&block)
|
25
|
+
div(**attrs, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def tab(...)
|
29
|
+
Tab.new(...)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def size
|
35
|
+
{
|
36
|
+
xs: "tabs-xs",
|
37
|
+
sm: "tabs-sm",
|
38
|
+
md: "tabs-md",
|
39
|
+
lg: "tabs-lg"
|
40
|
+
}.fetch(@size)
|
41
|
+
end
|
42
|
+
|
43
|
+
def type
|
44
|
+
{
|
45
|
+
bordered: "tabs-bordered",
|
46
|
+
boxed: "tabs-boxed",
|
47
|
+
lifted: "tabs-lifted",
|
48
|
+
default: ""
|
49
|
+
}.fetch(@type)
|
50
|
+
end
|
51
|
+
|
52
|
+
def default_attrs
|
53
|
+
{
|
54
|
+
role: :tablist
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
def theme
|
59
|
+
{
|
60
|
+
container: tokens("tabs", size, type)
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Toast
|
5
|
+
class CloseButton < Component
|
6
|
+
def template(&block)
|
7
|
+
form(method: :dialog, class: css[:form]) do
|
8
|
+
button(
|
9
|
+
autofocus: true,
|
10
|
+
formmethod: :dialog,
|
11
|
+
**attrs,
|
12
|
+
&block
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/protos/toast.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Protos
|
4
|
+
class Toast < Component
|
5
|
+
Positions = Types::Symbol.enum(
|
6
|
+
:start,
|
7
|
+
:center,
|
8
|
+
:end,
|
9
|
+
:top,
|
10
|
+
:middle,
|
11
|
+
:bottom
|
12
|
+
)
|
13
|
+
|
14
|
+
option :position, type: Positions, default: -> { :end }
|
15
|
+
|
16
|
+
def template(&block)
|
17
|
+
dialog(**attrs, &block)
|
18
|
+
end
|
19
|
+
|
20
|
+
def close_button(...)
|
21
|
+
CloseButton.new(...)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def default_attrs
|
27
|
+
{
|
28
|
+
open: true
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def theme
|
33
|
+
{
|
34
|
+
container: tokens(
|
35
|
+
"toast",
|
36
|
+
"toast-end",
|
37
|
+
"[&:not([open])]:hidden"
|
38
|
+
)
|
39
|
+
}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/protos/version.rb
CHANGED
data/lib/protos.rb
CHANGED
@@ -27,12 +27,25 @@ module Protos
|
|
27
27
|
|
28
28
|
require_relative "protos/avatar"
|
29
29
|
|
30
|
+
require_relative "protos/breadcrumbs"
|
31
|
+
require_relative "protos/breadcrumbs/crumb"
|
32
|
+
|
30
33
|
require_relative "protos/card"
|
31
34
|
require_relative "protos/card/body"
|
32
35
|
require_relative "protos/card/title"
|
33
36
|
require_relative "protos/card/actions"
|
34
37
|
require_relative "protos/card/image"
|
35
38
|
|
39
|
+
require_relative "protos/carousel"
|
40
|
+
require_relative "protos/carousel/item"
|
41
|
+
require_relative "protos/carousel/actions"
|
42
|
+
|
43
|
+
require_relative "protos/chat_bubble"
|
44
|
+
require_relative "protos/chat_bubble/content"
|
45
|
+
require_relative "protos/chat_bubble/image"
|
46
|
+
require_relative "protos/chat_bubble/header"
|
47
|
+
require_relative "protos/chat_bubble/footer"
|
48
|
+
|
36
49
|
require_relative "protos/collapse"
|
37
50
|
require_relative "protos/collapse/title"
|
38
51
|
require_relative "protos/collapse/content"
|
@@ -59,6 +72,10 @@ module Protos
|
|
59
72
|
require_relative "protos/dropdown/menu"
|
60
73
|
require_relative "protos/dropdown/trigger"
|
61
74
|
|
75
|
+
require_relative "protos/hero"
|
76
|
+
require_relative "protos/hero/content"
|
77
|
+
require_relative "protos/hero/overlay"
|
78
|
+
|
62
79
|
require_relative "protos/list"
|
63
80
|
require_relative "protos/list/item"
|
64
81
|
|
@@ -71,6 +88,21 @@ module Protos
|
|
71
88
|
require_relative "protos/popover/trigger"
|
72
89
|
require_relative "protos/popover/content"
|
73
90
|
|
91
|
+
require_relative "protos/stats"
|
92
|
+
require_relative "protos/stats/actions"
|
93
|
+
require_relative "protos/stats/description"
|
94
|
+
require_relative "protos/stats/figure"
|
95
|
+
require_relative "protos/stats/stat"
|
96
|
+
require_relative "protos/stats/title"
|
97
|
+
require_relative "protos/stats/value"
|
98
|
+
|
99
|
+
require_relative "protos/swap"
|
100
|
+
require_relative "protos/swap/on"
|
101
|
+
require_relative "protos/swap/off"
|
102
|
+
|
103
|
+
require_relative "protos/tabs"
|
104
|
+
require_relative "protos/tabs/tab"
|
105
|
+
|
74
106
|
require_relative "protos/table"
|
75
107
|
require_relative "protos/table/caption"
|
76
108
|
require_relative "protos/table/header"
|
@@ -80,6 +112,9 @@ module Protos
|
|
80
112
|
require_relative "protos/table/row"
|
81
113
|
require_relative "protos/table/cell"
|
82
114
|
|
115
|
+
require_relative "protos/toast"
|
116
|
+
require_relative "protos/toast/close_button"
|
117
|
+
|
83
118
|
require_relative "protos/timeline"
|
84
119
|
require_relative "protos/timeline/item"
|
85
120
|
require_relative "protos/timeline/left"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nolan J Tait
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-core
|
@@ -88,11 +88,21 @@ files:
|
|
88
88
|
- lib/protos/alert/icon.rb
|
89
89
|
- lib/protos/attributes.rb
|
90
90
|
- lib/protos/avatar.rb
|
91
|
+
- lib/protos/breadcrumbs.rb
|
92
|
+
- lib/protos/breadcrumbs/crumb.rb
|
91
93
|
- lib/protos/card.rb
|
92
94
|
- lib/protos/card/actions.rb
|
93
95
|
- lib/protos/card/body.rb
|
94
96
|
- lib/protos/card/image.rb
|
95
97
|
- lib/protos/card/title.rb
|
98
|
+
- lib/protos/carousel.rb
|
99
|
+
- lib/protos/carousel/actions.rb
|
100
|
+
- lib/protos/carousel/item.rb
|
101
|
+
- lib/protos/chat_bubble.rb
|
102
|
+
- lib/protos/chat_bubble/content.rb
|
103
|
+
- lib/protos/chat_bubble/footer.rb
|
104
|
+
- lib/protos/chat_bubble/header.rb
|
105
|
+
- lib/protos/chat_bubble/image.rb
|
96
106
|
- lib/protos/collapse.rb
|
97
107
|
- lib/protos/collapse/content.rb
|
98
108
|
- lib/protos/collapse/title.rb
|
@@ -116,6 +126,9 @@ files:
|
|
116
126
|
- lib/protos/dropdown/menu.rb
|
117
127
|
- lib/protos/dropdown/trigger.rb
|
118
128
|
- lib/protos/engine.rb
|
129
|
+
- lib/protos/hero.rb
|
130
|
+
- lib/protos/hero/content.rb
|
131
|
+
- lib/protos/hero/overlay.rb
|
119
132
|
- lib/protos/list.rb
|
120
133
|
- lib/protos/list/item.rb
|
121
134
|
- lib/protos/modal.rb
|
@@ -125,6 +138,16 @@ files:
|
|
125
138
|
- lib/protos/popover.rb
|
126
139
|
- lib/protos/popover/content.rb
|
127
140
|
- lib/protos/popover/trigger.rb
|
141
|
+
- lib/protos/stats.rb
|
142
|
+
- lib/protos/stats/actions.rb
|
143
|
+
- lib/protos/stats/description.rb
|
144
|
+
- lib/protos/stats/figure.rb
|
145
|
+
- lib/protos/stats/stat.rb
|
146
|
+
- lib/protos/stats/title.rb
|
147
|
+
- lib/protos/stats/value.rb
|
148
|
+
- lib/protos/swap.rb
|
149
|
+
- lib/protos/swap/off.rb
|
150
|
+
- lib/protos/swap/on.rb
|
128
151
|
- lib/protos/table.rb
|
129
152
|
- lib/protos/table/body.rb
|
130
153
|
- lib/protos/table/caption.rb
|
@@ -133,12 +156,16 @@ files:
|
|
133
156
|
- lib/protos/table/head.rb
|
134
157
|
- lib/protos/table/header.rb
|
135
158
|
- lib/protos/table/row.rb
|
159
|
+
- lib/protos/tabs.rb
|
160
|
+
- lib/protos/tabs/tab.rb
|
136
161
|
- lib/protos/theme.rb
|
137
162
|
- lib/protos/timeline.rb
|
138
163
|
- lib/protos/timeline/center.rb
|
139
164
|
- lib/protos/timeline/item.rb
|
140
165
|
- lib/protos/timeline/left.rb
|
141
166
|
- lib/protos/timeline/right.rb
|
167
|
+
- lib/protos/toast.rb
|
168
|
+
- lib/protos/toast/close_button.rb
|
142
169
|
- lib/protos/token_list.rb
|
143
170
|
- lib/protos/types.rb
|
144
171
|
- lib/protos/typography.rb
|