@litejs/ui 25.1.0 → 25.10.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.
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ //-
3
+ //- Usage
4
+ //- lj-extract-lang [FILE..]
5
+ //-
6
+ //- Options
7
+ //- --pretty, -p Pretty print json output
8
+ //-
9
+ //- Examples
10
+ //- lj-extract-translations translations.json
11
+ //-
12
+
13
+ var fs = require("fs")
14
+ , path = require("path")
15
+ , opts = require("@litejs/cli/opts.js").opts({
16
+ pretty: false,
17
+ version: false
18
+ })
19
+ , extractLang = require("../extract-lang.js").extractLang
20
+ , package = require("../package.json")
21
+
22
+
23
+ if (opts._unknown[0]) {
24
+ console.error("\nError: Unknown option: " + opts._unknown)
25
+ usage(true)
26
+ process.exit(1)
27
+ } else if (opts._[0]) {
28
+ readJson(opts._[0])
29
+ } else {
30
+ usage()
31
+ }
32
+
33
+ function usage(err) {
34
+ if (!err && opts.version) console.log("%s v%s", package.name, package.version)
35
+ var helpFile = module.filename
36
+ console.log(fs.readFileSync(helpFile, "utf8").match(/^\/\/-.*/gm).join("\n").replace(/^.../gm, ""))
37
+ }
38
+
39
+ function readJson(file) {
40
+ var lang
41
+ , all = require(path.resolve(file))
42
+ , i = 0
43
+ , locales = Object.keys(all.locales)
44
+
45
+ console.log("Extract translations: " + locales)
46
+
47
+ for (; lang = locales[i++]; ) {
48
+ writeJson(lang + ".json", extractLang(all, lang))
49
+ }
50
+ }
51
+
52
+ function writeJson(file, data) {
53
+ fs.writeFileSync(path.resolve(file), JSON.stringify(data, null, opts.pretty ? 2 : null) + "\n", "utf8")
54
+ }
55
+
56
+
package/css/anim.css CHANGED
@@ -1,20 +1,13 @@
1
1
 
2
- /**
3
- * 1. Trigger GPU acceleration.
4
- * Remove first flicker on iphone.
5
- */
6
2
 
7
3
  .anim,
8
4
  .anim:after,
9
5
  .anim:before {
10
- -webkit-transition: all .2s cubic-bezier(0, 0, .2, 1) 0s;
11
- -moz-transition: all .2s cubic-bezier(0, 0, .2, 1) 0s;
12
- -o-transition: all .2s cubic-bezier(0, 0, .2, 1) 0s;
13
- transition: all .2s cubic-bezier(0, 0, .2, 1) 0s;
6
+ transition: all .2s;
14
7
 
15
- -webkit-transform: translate3d(0, 0, 0); /* 1 */
16
- transform: translate3d(0, 0, 0);
17
- -webkit-perspective: 1000;
18
- perspective: 1000;
8
+ /* Trigger GPU acceleration. Remove first flicker on iphone. */
9
+ transform: translate3d(0, 0, 0);
10
+
11
+ perspective: 1000;
19
12
  }
20
13
 
package/css/base.css CHANGED
@@ -1,40 +1,21 @@
1
1
 
2
- /**
3
- * 1. Do not adjusts the text size automatically.
4
- * IE Phone note - If the viewport is set using <meta> element,
5
- * the value of the CSS text-size-adjust property is ignored.
6
- * Webkit bug - If -webkit-text-size-adjust is explicitely set to none,
7
- * Webkit-based desktop browsers, like Chrome or Safari,
8
- * instead of ignoring the property, will prevent the user to zoom in or out the Web page.
9
- * See Bug 56543, Bug 163359, and Bug 84186.
10
- * 2. IE for Windows Phone 8.1 supports "-webkit-text-size-adjust" as an alias for "-ms-text-size-adjust".
11
- * 3. Firefox<29, iOS<4, Android<4 need vendor prefixes.
12
- * 4. Disable double-tap gestures to remove 350 millisecond delay before single taps.
13
- * 5. Improve scroll performance by stop the paint on scroll.
14
- * Fix position: fixed in most Android 2.2–2.3 browsers
15
- * http://benfrain.com/easy-css-fix-fixed-positioning-android-2-2-2-3/
16
- */
2
+
17
3
 
18
4
  *, *:before, *:after {
19
5
  color: inherit;
20
- -webkit-box-sizing: inherit; /* 3 */
21
- -moz-box-sizing: inherit;
22
- box-sizing: inherit;
23
- -webkit-backface-visibility: inherit;
24
- backface-visibility: inherit;
6
+ box-sizing: inherit;
7
+ backface-visibility: inherit;
25
8
  }
26
9
 
27
10
  html {
28
- -webkit-text-size-adjust: 100%; /* 1 */
29
- -ms-text-size-adjust: 100%; /* 2 */
30
- -webkit-font-smoothing: antialiased;
31
- -webkit-box-sizing: border-box; /* 3 */
32
- -moz-box-sizing: border-box;
33
- box-sizing: border-box;
34
- touch-action: manipulation; /* 4 */
35
- -webkit-backface-visibility: hidden; /* 5 */
36
- backface-visibility: hidden;
37
- text-rendering: optimizeLegibility;
11
+ /* 62.5% sets 1em = 10px (16px × 0.625) */
12
+ font-size: 62.5%;
13
+
14
+ /* Use IE4 superior box model */
15
+ box-sizing: border-box;
16
+
17
+ /* Improve scroll performance by stop the paint on scroll */
18
+ backface-visibility: hidden;
38
19
  }
39
20
 
40
21
  html,
@@ -64,16 +45,10 @@ label,
64
45
  pointer-events: none;
65
46
  }
66
47
 
67
- button {
68
- /* Fix extra padding issue in IE6/7 */
69
- width: auto;
70
- overflow: visible;
71
- }
72
-
73
48
  b,
74
49
  strong,
75
50
  th {
76
- /* Firefox default {font-weight:bolder} does not render well with some fonts (Helvetica Neue on macs). */
51
+ /* Firefox's default 'bolder' looks bad with some fonts (Helvetica Neue on macs). */
77
52
  font-weight: bold;
78
53
  }
79
54
 
@@ -89,142 +64,31 @@ video {
89
64
  vertical-align: top;
90
65
  }
91
66
 
92
- /**
93
- * 1. tables still need cellspacing="0" in the markup
94
- * 2. Restores the normal text size
95
- * @see http://code.stephenmorley.org/html-and-css/fixing-browsers-broken-monospace-font-handling/
96
- */
97
67
 
98
68
  table {
69
+ /* tables still need cellspacing="0" in the markup */
99
70
  border-collapse: collapse;
100
- border-spacing: 0; /* 1 */
71
+ border-spacing: 0;
101
72
  }
102
73
 
103
74
  code,
104
75
  kbd,
105
76
  pre,
106
77
  samp {
107
- font-family: monospace, monospace; /* 2 */
78
+ /* Fix monospace bug in browsers that may ignore first one */
79
+ font-family: monospace, monospace;
108
80
  font-size: 1em;
109
81
  }
110
82
 
111
83
  textarea {
112
- resize: vertical;
84
+ resize: both;
113
85
  }
114
86
 
115
87
  button,
116
- [draggable=true],
117
88
  .btn,
118
- .no-select {
119
- -webkit-user-select: none;
120
- -khtml-user-select: none;
121
- -moz-user-select: none;
122
- -ms-user-select: none;
123
- -o-user-select: none;
124
- user-select: none;
125
- }
126
-
89
+ .no-select,
127
90
  [draggable=true] {
128
- -webkit-user-drag: element;
129
- -khtml-user-drag: element;
130
- user-drag: element;
131
- }
132
-
133
-
134
- /**
135
- * Global Classes
136
- * --------------
137
- */
138
-
139
- .max-height {
140
- height: auto !important;
141
- height: 100%;
142
- min-height: 100%;
143
- }
144
-
145
- .sm .sm-hide,
146
- .md .md-hide,
147
- .lg .lg-hide,
148
- .hide-empty:empty,
149
- .hide {
150
- display: none !important;
151
- visibility: hidden;
152
- }
153
- .transparent {
154
- opacity: 0 !important;
155
- filter: alpha(opacity=0) !important;
156
- }
157
- .abs {
158
- position: absolute;
159
- }
160
- .absr {
161
- position: absolute;
162
- top: 0px;
163
- right: 0px;
164
- }
165
- .fix {
166
- position: absolute;
167
- position: fixed;
168
- }
169
- .rel {
170
- position: relative;
171
- height: 100%;
172
- }
173
- .max {
174
- top: 0px;
175
- left: 0px;
176
- width: 100%;
177
- height: 100%;
178
- overflow: hidden;
179
- }
180
-
181
-
182
- /* establishes a new block formatting context */
183
- .block {
184
- overflow: hidden;
185
- }
186
-
187
- .btn,
188
- .no-wrap,
189
- .ellipsis {
190
- text-overflow: ellipsis;
191
- white-space: nowrap;
192
- }
193
-
194
- .sm .sm-left,
195
- .md .md-left,
196
- .lg .lg-left,
197
- .left {
198
- float: left;
199
- }
200
-
201
- .sm .sm-right,
202
- .md .md-right,
203
- .lg .lg-right,
204
- .right {
205
- float: right !important;
206
- }
207
-
208
- .sm .sm-t-left,
209
- .md .md-t-left,
210
- .lg .md-t-left,
211
- .lg .lg-t-left,
212
- .t-left {
213
- text-align: left;
214
- }
215
- .sm .sm-t-center,
216
- .md .md-t-center,
217
- .lg .md-t-center,
218
- .lg .lg-t-center,
219
- .t-center {
220
- text-align: center;
221
- }
222
- .sm .sm-t-right,
223
- .md .md-t-right,
224
- .lg .md-t-right,
225
- .lg .lg-t-right,
226
- .t-right {
227
- text-align: right;
91
+ user-select: none;
228
92
  }
229
93
 
230
94
 
package/css/global.css ADDED
@@ -0,0 +1,99 @@
1
+
2
+
3
+ /**
4
+ * Global Classes
5
+ * --------------
6
+ */
7
+
8
+ .max-height {
9
+ height: auto !important;
10
+ height: 100%;
11
+ min-height: 100%;
12
+ }
13
+
14
+ .sm .sm-hide,
15
+ .md .md-hide,
16
+ .lg .lg-hide,
17
+ .hide-empty:empty,
18
+ .hide {
19
+ display: none !important;
20
+ visibility: hidden;
21
+ }
22
+ .transparent {
23
+ opacity: 0 !important;
24
+ filter: alpha(opacity=0) !important;
25
+ }
26
+ .abs {
27
+ position: absolute;
28
+ }
29
+ .absr {
30
+ position: absolute;
31
+ top: 0px;
32
+ right: 0px;
33
+ }
34
+ .fix {
35
+ position: absolute;
36
+ position: fixed;
37
+ }
38
+ .rel {
39
+ position: relative;
40
+ height: 100%;
41
+ }
42
+ .max {
43
+ top: 0px;
44
+ left: 0px;
45
+ width: 100%;
46
+ height: 100%;
47
+ overflow: hidden;
48
+ }
49
+
50
+
51
+ /* establishes a new block formatting context */
52
+ .block {
53
+ overflow: hidden;
54
+ }
55
+
56
+ .btn,
57
+ .no-wrap,
58
+ .ellipsis {
59
+ text-overflow: ellipsis;
60
+ white-space: nowrap;
61
+ }
62
+
63
+ .sm .sm-left,
64
+ .md .md-left,
65
+ .lg .lg-left,
66
+ .left {
67
+ float: left;
68
+ }
69
+
70
+ .sm .sm-right,
71
+ .md .md-right,
72
+ .lg .lg-right,
73
+ .right {
74
+ float: right !important;
75
+ }
76
+
77
+ .sm .sm-t-left,
78
+ .md .md-t-left,
79
+ .lg .md-t-left,
80
+ .lg .lg-t-left,
81
+ .t-left {
82
+ text-align: left;
83
+ }
84
+ .sm .sm-t-center,
85
+ .md .md-t-center,
86
+ .lg .md-t-center,
87
+ .lg .lg-t-center,
88
+ .t-center {
89
+ text-align: center;
90
+ }
91
+ .sm .sm-t-right,
92
+ .md .md-t-right,
93
+ .lg .md-t-right,
94
+ .lg .lg-t-right,
95
+ .t-right {
96
+ text-align: right;
97
+ }
98
+
99
+
package/el/Slider.ui ADDED
@@ -0,0 +1,229 @@
1
+
2
+ %css
3
+ .Slider,
4
+ .Toggle {
5
+ background: none;
6
+ height: 32px;
7
+ position: relative;
8
+ touch-action: none;
9
+ width: 200px;
10
+ color: #000;
11
+ font-size: 14px;
12
+ line-height: 32px;
13
+ }
14
+ .Slider-fill,
15
+ .Slider:before,
16
+ .Toggle:before {
17
+ background: rgba(0, 0, 0, .5);
18
+ border-radius: 2px;
19
+ height: 4px;
20
+ position: absolute;
21
+ top: 14px;
22
+ transition: inherit;
23
+ }
24
+ .Slider:before,
25
+ .Toggle:before {
26
+ background: #ccc;
27
+ content: "";
28
+ display: block;
29
+ width: 100%;
30
+ }
31
+ .Slider-knob,
32
+ .Toggle-knob {
33
+ border-radius: 50%;
34
+ box-shadow: 0 0 0 0 rgb(0, 0, 0, .2), 0 1px 4px rgba(0, 0, 0, .2);
35
+ height: 20px;
36
+ position: relative; /* for IE6 overflow:visible bug */
37
+ transition: inherit;
38
+ width: 20px;
39
+ }
40
+ .Slider-knob {
41
+ float: right;
42
+ margin: -8px -10px 0 0;
43
+ outline: none;
44
+ background: #f5f5f5;
45
+ }
46
+ :hover > * > .Slider-knob,
47
+ :focus > * > .Slider-knob {
48
+ box-shadow: 0 0 0 8px rgb(0, 0, 0, .2), 0 1px 4px rgba(0, 0, 0, .3);
49
+ }
50
+ .Slider-knob.is-active {
51
+ box-shadow: 0 0 0 12px rgb(0, 0, 0, .2), 0 1px 5px 5px rgba(0, 0, 0, .3);
52
+ }
53
+ /* value bubble */
54
+ .Slider-knob:before,
55
+ .Slider-knob:after {
56
+ background: inherit;
57
+ border-radius: 16px;
58
+ content: "";
59
+ height: 32px;
60
+ left: -6px;
61
+ min-width: 32px;
62
+ opacity: 0;
63
+ pointer-events: none;
64
+ position: absolute;
65
+ top: 0px;
66
+ transform: rotate(45deg);
67
+ transition: inherit;
68
+ }
69
+ .Slider-knob:after {
70
+ content: attr(data-val);
71
+ left: 10px;
72
+ padding: 0 4px;
73
+ transform: translate(-50%, 0);
74
+ }
75
+ :focus > * > .Slider-knob:before,
76
+ :hover > * > .Slider-knob:before,
77
+ .Slider-knob.is-active:before {
78
+ border-radius: 50% 50% 0 50%;
79
+ box-shadow: 3px 3px 3px 1px rgba(0, 0, 0, .3);
80
+ opacity: 1;
81
+ top: -43px;
82
+ }
83
+ :focus > * > .Slider-knob:after,
84
+ :hover > * > .Slider-knob:after,
85
+ .Slider-knob.is-active:after {
86
+ box-shadow: -4px -3px 3px -2px rgba(0, 0, 0, .15), 4px -3px 3px -2px rgba(0, 0, 0, .15);
87
+ opacity: 1;
88
+ top: -43px;
89
+ }
90
+ input:checked + .Toggle-knob {
91
+ background-color: #00a651;
92
+ left: 16px;
93
+ }
94
+ .Slider.color .Slider-fill {
95
+ background: red;
96
+ }
97
+ .Slider.color .Slider-fill+.Slider-fill {
98
+ background: green;
99
+ }
100
+ .Slider.color .Slider-fill+.Slider-fill+.Slider-fill {
101
+ background: blue;
102
+ }
103
+ .Slider.no-first > .Slider-fill:last-child {
104
+ background: #ccc;
105
+ }
106
+
107
+ %js
108
+ var elOn = El.on
109
+ , elOff = El.off
110
+ , elCls = El.cls
111
+ , elGet = El.get
112
+ El.$b.SliderInit = function(el, range) {
113
+ range = (range || elGet(el, "range") || "").split(/[^+\-\d.]/) // min:max:step:margin
114
+ var knobLen, offset, px, drag, min, max, minPx, maxPx, value
115
+ //, vert = El.hasClass(el, "is-vertical")
116
+ , vert = false
117
+ , attr = vert ? "offsetHeight" : "offsetWidth"
118
+ , fill = el.firstChild
119
+ , knob = fill.lastChild
120
+ , emit = El.rate(El.emit.bind(el, el, "change"), 500)
121
+ elOn(window, "blur", stop)
122
+ setTimeout(el.val = set, 10, value||0)
123
+ function load() {
124
+ min = +(range[0] || 0)
125
+ max = +(range[1] || 100)
126
+ knobLen = knob[attr]>>1
127
+ minPx = 0
128
+ maxPx = el[attr] - knobLen - knobLen
129
+ px = maxPx / (max - min)
130
+ }
131
+ elOn(el, "pointerdown", function(e) {
132
+ drag = true
133
+ load()
134
+ var tmp = el.getBoundingClientRect()
135
+ offset = (vert ? tmp.top + maxPx + El.scrollTop() + knobLen : tmp.left + El.scrollLeft()) + knobLen
136
+ tmp = offset - e.clientX + (value-min||0)*px
137
+ if (tmp < knobLen && tmp > -knobLen) offset -= tmp
138
+ if (el.childNodes.length > 1) {
139
+ var next
140
+ , x = maxPx
141
+ , diff = vert ? offset - e.pageY : e.pageX - offset
142
+ for (tmp = fill = el.firstChild; tmp; tmp = tmp.nextSibling) {
143
+ next = diff - tmp[attr] + knobLen
144
+ if (next < 0 ? -next <= x : next < x) {
145
+ fill = tmp
146
+ knob = tmp.firstChild
147
+ x = next < 0 ? -next : next
148
+ }
149
+ }
150
+ if (fill.previousSibling) {
151
+ maxPx = fill.previousSibling[attr] - knobLen
152
+ if (range[3]) maxPx -= px * range[3]
153
+ }
154
+ if (fill.nextSibling) {
155
+ minPx = fill.nextSibling[attr] - knobLen
156
+ if (range[3]) minPx += px * range[3]
157
+ }
158
+ }
159
+ move(e)
160
+ listen(elOn)
161
+ })
162
+ function move(e) {
163
+ var diff = vert ? offset - e.pageY : e.pageX - offset
164
+ diff = (diff > maxPx ? maxPx : (diff < minPx ? minPx : diff))
165
+ set((diff / px) + min, e, diff)
166
+ return El.stop(e)
167
+ }
168
+ function stop(e) {
169
+ if (drag) {
170
+ drag = false
171
+ listen(elOff)
172
+ set(value)
173
+ }
174
+ }
175
+ function listen(onOff) {
176
+ elCls(el, "anim", !drag)
177
+ elCls(knob, "is-active", drag)
178
+ onOff(document, "pointerup", stop)
179
+ onOff(document, "pointermove", move)
180
+ }
181
+ function set(val, e, pos) {
182
+ load()
183
+ val = El.step(val < min ? min : val > max ? max : val || 0, +(range[2] || 1))
184
+ if (value !== void 0 && (!drag || pos !== void 0)) {
185
+ El.css(fill, vert ? "height" : "width", ((pos || (val-min)*px)+knobLen) + "px", 0)
186
+ }
187
+ if (value !== val) {
188
+ el.value = value = val
189
+ if (drag && e) emit(e)
190
+ var format = elGet(el, "format")
191
+ El.set(knob, "data-val", format ? $d._(format, {val:val}) : val)
192
+ }
193
+ }
194
+ }
195
+
196
+ %el Slider
197
+ button.Slider.anim.reset ;SliderInit!
198
+ .Slider-fill
199
+ .Slider-knob[tabindex=0]
200
+
201
+ %el Slider2
202
+ button.Slider.anim.reset ;SliderInit!
203
+ .Slider-fill
204
+ .Slider-knob[tabindex=0]
205
+ .Slider-fill
206
+ .Slider-knob[tabindex=0]
207
+
208
+ %el Slider3
209
+ button.Slider.reset ;SliderInit!
210
+ .Slider-fill
211
+ .Slider-knob[tabindex=0]
212
+ .Slider-fill
213
+ .Slider-knob[tabindex=0]
214
+ .Slider-fill
215
+ .Slider-knob[tabindex=0]
216
+
217
+ %el Toggle
218
+ button.Toggle.reset ;SliderInit! "0:1"
219
+ ;css: "width","36px"
220
+ .Slider-fill.anim
221
+ .Slider-knob.anim[tabindex=0]
222
+
223
+ %el Togglea
224
+ label.Toggle.reset[tabindex=0]
225
+ input[type=checkbox].hide
226
+ ;readonly! row && !row.write
227
+ ;checked! model && (row && row.opts ? row.opts === model.get(row.path) : !!model.get(row.path))
228
+ .Toggle-knob.anim
229
+
@@ -0,0 +1,33 @@
1
+
2
+ !function(exports) {
3
+ exports.extractLang = extractLang
4
+
5
+ function extractLang(translations, lang) {
6
+ var missing = []
7
+ , out = extract(translations, "")
8
+ if (missing[0]) {
9
+ console.error("WARNING! Missing '%s' translations: %s [%s]", lang, missing.length, missing+"")
10
+ }
11
+ return out
12
+
13
+ function extract(map, path) {
14
+ var key
15
+ , out = {}
16
+ , translations = map.translations
17
+ if (!translations) return map[lang]
18
+ for (key in translations) {
19
+ out[key] = extract(translations[key], path + key + ".")
20
+ if (
21
+ out[key] === key ||
22
+ out[key] === void 0 && missing.push(path + key) ||
23
+ isObject(out[key]) && Object.keys(out[key]).length < 1
24
+ ) delete out[key]
25
+ }
26
+ return out
27
+ }
28
+ function isObject(obj) {
29
+ return obj && obj.constructor === Object
30
+ }
31
+ }
32
+ }(this) // jshint ignore:line
33
+