nanoui 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -0
  3. data/README.md +353 -15
  4. data/lib/generators/nanoui/component_generator.rb +49 -14
  5. data/lib/generators/nanoui/templates/css/components/accordion.css +58 -58
  6. data/lib/generators/nanoui/templates/css/components/alert.css +56 -56
  7. data/lib/generators/nanoui/templates/css/components/avatar.css +88 -0
  8. data/lib/generators/nanoui/templates/css/components/badge.css +30 -30
  9. data/lib/generators/nanoui/templates/css/components/breadcrumb.css +54 -0
  10. data/lib/generators/nanoui/templates/css/components/button.css +136 -115
  11. data/lib/generators/nanoui/templates/css/components/card.css +35 -35
  12. data/lib/generators/nanoui/templates/css/components/checkbox.css +74 -72
  13. data/lib/generators/nanoui/templates/css/components/checklist.css +133 -0
  14. data/lib/generators/nanoui/templates/css/components/code.css +80 -0
  15. data/lib/generators/nanoui/templates/css/components/copy.css +71 -0
  16. data/lib/generators/nanoui/templates/css/components/dialog.css +103 -103
  17. data/lib/generators/nanoui/templates/css/components/dropdown.css +71 -71
  18. data/lib/generators/nanoui/templates/css/components/empty.css +68 -0
  19. data/lib/generators/nanoui/templates/css/components/input.css +72 -83
  20. data/lib/generators/nanoui/templates/css/components/label.css +11 -5
  21. data/lib/generators/nanoui/templates/css/components/navbar.css +128 -0
  22. data/lib/generators/nanoui/templates/css/components/progress.css +53 -47
  23. data/lib/generators/nanoui/templates/css/components/radio.css +73 -71
  24. data/lib/generators/nanoui/templates/css/components/select.css +49 -22
  25. data/lib/generators/nanoui/templates/css/components/sidebar.css +145 -0
  26. data/lib/generators/nanoui/templates/css/components/skeleton.css +49 -0
  27. data/lib/generators/nanoui/templates/css/components/stat.css +91 -0
  28. data/lib/generators/nanoui/templates/css/components/switch.css +25 -25
  29. data/lib/generators/nanoui/templates/css/components/table.css +169 -29
  30. data/lib/generators/nanoui/templates/css/components/tabs.css +20 -20
  31. data/lib/generators/nanoui/templates/css/components/timeline.css +141 -0
  32. data/lib/generators/nanoui/templates/css/components/toast.css +119 -68
  33. data/lib/generators/nanoui/templates/css/components/tooltip.css +79 -72
  34. data/lib/generators/nanoui/templates/css/components/upload.css +161 -0
  35. data/lib/generators/nanoui/templates/css/layout/container.css +6 -6
  36. data/lib/generators/nanoui/templates/js/controllers/copy_controller.js +64 -0
  37. data/lib/generators/nanoui/templates/js/controllers/data_table_controller.js +75 -0
  38. data/lib/generators/nanoui/templates/js/controllers/navbar_controller.js +70 -0
  39. data/lib/generators/nanoui/templates/js/controllers/sidebar_controller.js +27 -0
  40. data/lib/generators/nanoui/templates/js/controllers/upload_controller.js +137 -0
  41. data/lib/nanoui/version.rb +1 -1
  42. metadata +47 -2
@@ -0,0 +1,137 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = [
5
+ "input",
6
+ "dropzone",
7
+ "preview",
8
+ "thumbnail",
9
+ "name",
10
+ "size",
11
+ "error"
12
+ ]
13
+
14
+ static values = {
15
+ accept: String,
16
+ maxSize: { type: Number, default: 0 }
17
+ }
18
+
19
+ connect() {
20
+ this.#setState(this.hasInputTarget && this.inputTarget.files.length > 0 ? "filled" : "empty")
21
+ }
22
+
23
+ openPicker(event) {
24
+ if (event?.target?.closest("button")) return
25
+ event?.preventDefault()
26
+ this.inputTarget?.click()
27
+ }
28
+
29
+ onChange() {
30
+ const file = this.inputTarget?.files?.[0]
31
+ if (!file) {
32
+ this.#setState("empty")
33
+ return
34
+ }
35
+ this.#consumeFile(file)
36
+ }
37
+
38
+ onDragover(event) {
39
+ event.preventDefault()
40
+ this.#setState("dragover")
41
+ }
42
+
43
+ onDragleave(event) {
44
+ event.preventDefault()
45
+ this.#setState(this.inputTarget?.files?.length ? "filled" : "empty")
46
+ }
47
+
48
+ onDrop(event) {
49
+ event.preventDefault()
50
+ const file = event.dataTransfer?.files?.[0]
51
+ if (!file) {
52
+ this.#setState("empty")
53
+ return
54
+ }
55
+
56
+ if (this.hasInputTarget) {
57
+ const dt = new DataTransfer()
58
+ dt.items.add(file)
59
+ this.inputTarget.files = dt.files
60
+ }
61
+ this.#consumeFile(file)
62
+ }
63
+
64
+ remove(event) {
65
+ event?.preventDefault()
66
+ if (this.hasInputTarget) this.inputTarget.value = ""
67
+ this.#clearError()
68
+ this.#setState("empty")
69
+ this.dispatch("removed")
70
+ }
71
+
72
+ #consumeFile(file) {
73
+ const error = this.#validate(file)
74
+ if (error) {
75
+ this.#showError(error)
76
+ this.remove()
77
+ return
78
+ }
79
+ this.#clearError()
80
+
81
+ if (this.hasNameTarget) this.nameTarget.textContent = file.name
82
+ if (this.hasSizeTarget) this.sizeTarget.textContent = this.#formatSize(file.size)
83
+
84
+ if (this.hasThumbnailTarget && file.type.startsWith("image/")) {
85
+ const reader = new FileReader()
86
+ reader.onload = (e) => { this.thumbnailTarget.src = e.target.result }
87
+ reader.readAsDataURL(file)
88
+ }
89
+
90
+ this.#setState("filled")
91
+ this.dispatch("selected", { detail: { file } })
92
+ }
93
+
94
+ #validate(file) {
95
+ if (this.maxSizeValue && file.size > this.maxSizeValue) {
96
+ return `File is too large. Max ${this.#formatSize(this.maxSizeValue)}.`
97
+ }
98
+ if (this.hasAcceptValue && this.acceptValue) {
99
+ const accepted = this.acceptValue.split(",").map((s) => s.trim()).filter(Boolean)
100
+ const ok = accepted.some((pattern) => {
101
+ if (pattern.startsWith(".")) {
102
+ return file.name.toLowerCase().endsWith(pattern.toLowerCase())
103
+ }
104
+ if (pattern.endsWith("/*")) {
105
+ return file.type.startsWith(pattern.slice(0, -1))
106
+ }
107
+ return file.type === pattern
108
+ })
109
+ if (!ok) return "File type not allowed."
110
+ }
111
+ return null
112
+ }
113
+
114
+ #formatSize(bytes) {
115
+ if (bytes < 1024) return `${bytes} B`
116
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`
117
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
118
+ }
119
+
120
+ #setState(state) {
121
+ this.element.dataset.state = state
122
+ }
123
+
124
+ #showError(message) {
125
+ if (this.hasErrorTarget) {
126
+ this.errorTarget.textContent = message
127
+ this.errorTarget.hidden = false
128
+ }
129
+ }
130
+
131
+ #clearError() {
132
+ if (this.hasErrorTarget) {
133
+ this.errorTarget.textContent = ""
134
+ this.errorTarget.hidden = true
135
+ }
136
+ }
137
+ }
@@ -1,3 +1,3 @@
1
1
  module Nanoui
2
- VERSION = "0.4.0"
2
+ VERSION = "0.6.0".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Omerovic
@@ -37,6 +37,34 @@ dependencies:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '3.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rubocop
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.60'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.60'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rubocop-rspec
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.0'
40
68
  description: Quality components with semantic HTML, accessibility-first, native CSS
41
69
  nesting, and BEM naming. Zero runtime dependencies.
42
70
  email:
@@ -62,31 +90,48 @@ files:
62
90
  - lib/generators/nanoui/templates/css/base/10_globals.css
63
91
  - lib/generators/nanoui/templates/css/components/accordion.css
64
92
  - lib/generators/nanoui/templates/css/components/alert.css
93
+ - lib/generators/nanoui/templates/css/components/avatar.css
65
94
  - lib/generators/nanoui/templates/css/components/badge.css
95
+ - lib/generators/nanoui/templates/css/components/breadcrumb.css
66
96
  - lib/generators/nanoui/templates/css/components/button.css
67
97
  - lib/generators/nanoui/templates/css/components/card.css
68
98
  - lib/generators/nanoui/templates/css/components/checkbox.css
99
+ - lib/generators/nanoui/templates/css/components/checklist.css
100
+ - lib/generators/nanoui/templates/css/components/code.css
101
+ - lib/generators/nanoui/templates/css/components/copy.css
69
102
  - lib/generators/nanoui/templates/css/components/dialog.css
70
103
  - lib/generators/nanoui/templates/css/components/dropdown.css
104
+ - lib/generators/nanoui/templates/css/components/empty.css
71
105
  - lib/generators/nanoui/templates/css/components/input.css
72
106
  - lib/generators/nanoui/templates/css/components/label.css
107
+ - lib/generators/nanoui/templates/css/components/navbar.css
73
108
  - lib/generators/nanoui/templates/css/components/progress.css
74
109
  - lib/generators/nanoui/templates/css/components/radio.css
75
110
  - lib/generators/nanoui/templates/css/components/select.css
111
+ - lib/generators/nanoui/templates/css/components/sidebar.css
112
+ - lib/generators/nanoui/templates/css/components/skeleton.css
113
+ - lib/generators/nanoui/templates/css/components/stat.css
76
114
  - lib/generators/nanoui/templates/css/components/switch.css
77
115
  - lib/generators/nanoui/templates/css/components/table.css
78
116
  - lib/generators/nanoui/templates/css/components/tabs.css
117
+ - lib/generators/nanoui/templates/css/components/timeline.css
79
118
  - lib/generators/nanoui/templates/css/components/toast.css
80
119
  - lib/generators/nanoui/templates/css/components/tooltip.css
120
+ - lib/generators/nanoui/templates/css/components/upload.css
81
121
  - lib/generators/nanoui/templates/css/fonts/inter-variable.ttf
82
122
  - lib/generators/nanoui/templates/css/layout/container.css
83
123
  - lib/generators/nanoui/templates/js/controllers/accordion_controller.js
124
+ - lib/generators/nanoui/templates/js/controllers/copy_controller.js
125
+ - lib/generators/nanoui/templates/js/controllers/data_table_controller.js
84
126
  - lib/generators/nanoui/templates/js/controllers/dialog_controller.js
85
127
  - lib/generators/nanoui/templates/js/controllers/dropdown_controller.js
128
+ - lib/generators/nanoui/templates/js/controllers/navbar_controller.js
129
+ - lib/generators/nanoui/templates/js/controllers/sidebar_controller.js
86
130
  - lib/generators/nanoui/templates/js/controllers/switch_controller.js
87
131
  - lib/generators/nanoui/templates/js/controllers/tabs_controller.js
88
132
  - lib/generators/nanoui/templates/js/controllers/toast_controller.js
89
133
  - lib/generators/nanoui/templates/js/controllers/tooltip_controller.js
134
+ - lib/generators/nanoui/templates/js/controllers/upload_controller.js
90
135
  - lib/nanoui.rb
91
136
  - lib/nanoui/version.rb
92
137
  homepage: https://github.com/chille1987/nanoui
@@ -109,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
154
  - !ruby/object:Gem::Version
110
155
  version: '0'
111
156
  requirements: []
112
- rubygems_version: 3.6.9
157
+ rubygems_version: 4.0.3
113
158
  specification_version: 4
114
159
  summary: Vanilla CSS + Stimulus component library for Rails
115
160
  test_files: []