x4js 2.0.13 → 2.0.14

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 (258) hide show
  1. package/.vscode/launch.json +14 -0
  2. package/README.md +5 -0
  3. package/{lib/src/demo → demo}/main.scss +3 -1
  4. package/{lib/src/demo/main.tsx → demo/main.ts} +37 -36
  5. package/demo/package.json +26 -0
  6. package/demo/scss.d.ts +4 -0
  7. package/demo/svg.d.ts +1 -0
  8. package/demo/tsconfig.json +14 -0
  9. package/lib/README.txt +5 -0
  10. package/lib/cjs/x4.css +1 -1
  11. package/lib/cjs/x4.js +2 -1
  12. package/lib/esm/x4.css +1 -1
  13. package/lib/esm/x4.mjs +2 -1
  14. package/lib/src/components/boxes/boxes.module.scss +17 -0
  15. package/lib/src/components/boxes/boxes.ts +162 -13
  16. package/lib/src/components/breadcrumb/breadcrumb.scss +56 -28
  17. package/lib/src/components/breadcrumb/breadcrumb.ts +93 -84
  18. package/lib/src/components/btngroup/btngroup.module.scss +12 -0
  19. package/lib/src/components/btngroup/btngroup.ts +41 -8
  20. package/lib/src/components/button/button.module.scss +23 -5
  21. package/lib/src/components/button/button.ts +72 -4
  22. package/lib/src/components/canvas/canvas.module.scss +25 -0
  23. package/lib/src/components/canvas/canvas.ts +189 -0
  24. package/lib/src/components/canvas/canvas_ex.ts +269 -0
  25. package/lib/src/components/checkbox/checkbox.ts +18 -4
  26. package/lib/src/components/combobox/combobox.module.scss +24 -15
  27. package/lib/src/components/combobox/combobox.ts +107 -24
  28. package/lib/src/components/components.ts +7 -0
  29. package/lib/src/components/dialog/dialog.module.scss +37 -3
  30. package/lib/src/components/dialog/dialog.ts +149 -31
  31. package/lib/src/components/filedrop/cloud-arrow-up.svg +1 -0
  32. package/lib/src/components/filedrop/filedrop.module.scss +70 -0
  33. package/lib/src/components/filedrop/filedrop.ts +131 -0
  34. package/lib/src/components/form/form.module.scss +4 -0
  35. package/lib/src/components/form/form.ts +137 -6
  36. package/lib/src/components/gridview/arrow-down-light.svg +1 -0
  37. package/lib/src/components/gridview/arrow-up-light.svg +1 -0
  38. package/lib/src/components/gridview/gridview.module.scss +324 -0
  39. package/lib/src/components/gridview/gridview.ts +1175 -0
  40. package/lib/src/components/icon/icon.module.scss +1 -1
  41. package/lib/src/components/icon/icon.ts +4 -1
  42. package/lib/src/components/image/image.module.scss +8 -1
  43. package/lib/src/components/image/image.ts +105 -6
  44. package/lib/src/components/input/input.module.scss +8 -3
  45. package/lib/src/components/input/input.ts +137 -14
  46. package/lib/src/components/keyboard/arrow-up.svg +1 -0
  47. package/lib/src/components/keyboard/delete-left.svg +1 -0
  48. package/lib/src/components/keyboard/eye-slash.svg +1 -0
  49. package/lib/src/components/keyboard/keyboard.module.scss +134 -0
  50. package/lib/src/components/keyboard/keyboard.ts +525 -0
  51. package/lib/src/components/label/label.module.scss +22 -4
  52. package/lib/src/components/label/label.ts +33 -0
  53. package/lib/src/components/link/link.ts +81 -78
  54. package/lib/src/components/listbox/listbox.module.scss +61 -3
  55. package/lib/src/components/listbox/listbox.ts +164 -56
  56. package/lib/src/components/menu/menu.module.scss +10 -1
  57. package/lib/src/components/menu/menu.ts +4 -1
  58. package/lib/src/components/messages/messages.module.scss +44 -0
  59. package/lib/src/components/messages/messages.ts +164 -18
  60. package/lib/src/components/messages/pen-field.svg +1 -0
  61. package/lib/src/components/normalize.scss +5 -0
  62. package/lib/src/components/notification/notification.module.scss +4 -2
  63. package/lib/src/components/notification/notification.ts +2 -4
  64. package/lib/src/components/panel/panel.module.scss +12 -0
  65. package/lib/src/components/popup/popup.module.scss +4 -2
  66. package/lib/src/components/popup/popup.ts +136 -92
  67. package/lib/src/components/propgrid/folder-closed.svg +1 -0
  68. package/lib/src/components/propgrid/folder-open.svg +1 -0
  69. package/lib/src/components/propgrid/progrid.module.scss +108 -0
  70. package/lib/src/components/propgrid/propgrid.ts +271 -0
  71. package/lib/src/components/propgrid/updown.svg +4 -0
  72. package/lib/src/components/radio/radio.module.scss +147 -0
  73. package/lib/src/components/radio/radio.svg +4 -0
  74. package/lib/src/components/radio/radio.ts +142 -0
  75. package/lib/src/components/select/select.module.scss +9 -0
  76. package/lib/src/components/select/select.ts +134 -0
  77. package/lib/src/components/shared.scss +47 -0
  78. package/lib/src/components/sizers/sizer.ts +9 -2
  79. package/lib/src/components/slider/slider.module.scss +77 -30
  80. package/lib/src/components/slider/slider.ts +72 -22
  81. package/lib/src/components/tabs/tabs.module.scss +1 -2
  82. package/lib/src/components/tabs/tabs.ts +43 -12
  83. package/lib/src/components/textarea/textarea.module.scss +6 -2
  84. package/lib/src/components/textarea/textarea.ts +73 -8
  85. package/lib/src/components/textedit/textedit.module.scss +3 -1
  86. package/lib/src/components/textedit/textedit.ts +31 -4
  87. package/lib/src/components/themes.scss +7 -0
  88. package/lib/src/components/tickline/tickline.module.scss +26 -0
  89. package/lib/src/components/tickline/tickline.ts +82 -0
  90. package/lib/src/components/tooltips/comments-question.svg +1 -0
  91. package/lib/src/components/tooltips/tooltips.scss +30 -9
  92. package/lib/src/components/tooltips/tooltips.ts +10 -5
  93. package/lib/src/components/treeview/treeview.module.scss +129 -60
  94. package/lib/src/components/treeview/treeview.ts +47 -12
  95. package/lib/src/components/viewport/viewport.module.scss +7 -0
  96. package/lib/src/core/component.ts +102 -32
  97. package/lib/src/core/core_application.ts +222 -2
  98. package/lib/src/core/core_colors.ts +2 -2
  99. package/lib/src/{components/grid/datastore.ts → core/core_data.ts} +261 -250
  100. package/lib/src/core/core_dragdrop.ts +3 -3
  101. package/lib/src/core/core_element.ts +13 -1
  102. package/lib/src/core/core_events.ts +28 -0
  103. package/lib/src/core/core_i18n.ts +18 -2
  104. package/lib/src/core/core_react.ts +79 -0
  105. package/lib/src/core/core_router.ts +23 -7
  106. package/lib/src/core/core_styles.ts +5 -5
  107. package/lib/src/core/core_svg.ts +173 -12
  108. package/lib/src/core/core_tools.ts +305 -87
  109. package/lib/src/x4tsx.d.ts +25 -0
  110. package/lib/styles/x4.css +1 -1
  111. package/lib/types/x4js.d.ts +767 -92
  112. package/package.json +4 -4
  113. package/scripts/build.mjs +378 -0
  114. package/scripts/prepack.mjs +346 -0
  115. package/src/components/base.scss +25 -0
  116. package/src/components/boxes/boxes.module.scss +54 -0
  117. package/src/components/boxes/boxes.ts +278 -0
  118. package/src/components/breadcrumb/breadcrumb.scss +56 -0
  119. package/src/components/breadcrumb/breadcrumb.ts +93 -0
  120. package/src/components/breadcrumb/chevron-right.svg +1 -0
  121. package/src/components/btngroup/btngroup.module.scss +41 -0
  122. package/src/components/btngroup/btngroup.ts +153 -0
  123. package/src/components/button/button.module.scss +173 -0
  124. package/src/components/button/button.ts +185 -0
  125. package/src/components/calendar/calendar-check-sharp-light.svg +1 -0
  126. package/src/components/calendar/calendar.module.scss +163 -0
  127. package/src/components/calendar/calendar.ts +327 -0
  128. package/src/components/calendar/chevron-left-sharp-light.svg +1 -0
  129. package/src/components/calendar/chevron-right-sharp-light.svg +1 -0
  130. package/src/components/canvas/canvas.module.scss +25 -0
  131. package/src/components/canvas/canvas.ts +189 -0
  132. package/src/components/canvas/canvas_ex.ts +269 -0
  133. package/src/components/checkbox/check.svg +4 -0
  134. package/src/components/checkbox/checkbox.module.scss +142 -0
  135. package/src/components/checkbox/checkbox.ts +140 -0
  136. package/src/components/colorinput/colorinput.module.scss +65 -0
  137. package/src/components/colorinput/colorinput.ts +91 -0
  138. package/src/components/colorinput/crosshairs-simple-sharp-light.svg +1 -0
  139. package/src/components/colorpicker/colorpicker.module.scss +133 -0
  140. package/src/components/colorpicker/colorpicker.ts +482 -0
  141. package/src/components/combobox/combobox.module.scss +133 -0
  142. package/src/components/combobox/combobox.ts +275 -0
  143. package/src/components/combobox/updown.svg +4 -0
  144. package/src/components/components.ts +41 -0
  145. package/src/components/dialog/dialog.module.scss +105 -0
  146. package/src/components/dialog/dialog.ts +212 -0
  147. package/src/components/dialog/xmark-sharp-light.svg +1 -0
  148. package/src/components/filedrop/cloud-arrow-up.svg +1 -0
  149. package/src/components/filedrop/filedrop.module.scss +70 -0
  150. package/src/components/filedrop/filedrop.ts +131 -0
  151. package/src/components/form/form.module.scss +38 -0
  152. package/src/components/form/form.ts +172 -0
  153. package/src/components/gridview/arrow-down-light.svg +1 -0
  154. package/src/components/gridview/arrow-up-light.svg +1 -0
  155. package/src/components/gridview/gridview.module.scss +324 -0
  156. package/src/components/gridview/gridview.ts +1175 -0
  157. package/src/components/header/header.module.scss +40 -0
  158. package/src/components/header/header.ts +130 -0
  159. package/src/components/icon/icon.module.scss +30 -0
  160. package/src/components/icon/icon.ts +139 -0
  161. package/src/components/image/image.module.scss +28 -0
  162. package/src/components/image/image.ts +168 -0
  163. package/src/components/input/input.module.scss +74 -0
  164. package/src/components/input/input.ts +398 -0
  165. package/src/components/keyboard/arrow-up.svg +1 -0
  166. package/src/components/keyboard/delete-left.svg +1 -0
  167. package/src/components/keyboard/eye-slash.svg +1 -0
  168. package/src/components/keyboard/keyboard.module.scss +134 -0
  169. package/src/components/keyboard/keyboard.ts +525 -0
  170. package/src/components/label/label.module.scss +76 -0
  171. package/src/components/label/label.ts +97 -0
  172. package/src/components/link/link.ts +81 -0
  173. package/src/components/listbox/listbox.module.scss +161 -0
  174. package/src/components/listbox/listbox.ts +539 -0
  175. package/src/components/menu/caret-right-solid.svg +1 -0
  176. package/src/components/menu/menu.module.scss +117 -0
  177. package/src/components/menu/menu.ts +174 -0
  178. package/src/components/messages/circle-exclamation.svg +1 -0
  179. package/src/components/messages/messages.module.scss +92 -0
  180. package/src/components/messages/messages.ts +215 -0
  181. package/src/components/messages/pen-field.svg +1 -0
  182. package/src/components/normalize.scss +391 -0
  183. package/src/components/notification/circle-check-solid.svg +1 -0
  184. package/src/components/notification/circle-exclamation-solid.svg +1 -0
  185. package/src/components/notification/circle-notch-light.svg +1 -0
  186. package/src/components/notification/notification.module.scss +84 -0
  187. package/src/components/notification/notification.ts +107 -0
  188. package/src/components/notification/xmark-sharp-light.svg +1 -0
  189. package/src/components/panel/panel.module.scss +60 -0
  190. package/src/components/panel/panel.ts +58 -0
  191. package/src/components/popup/popup.module.scss +45 -0
  192. package/src/components/popup/popup.ts +440 -0
  193. package/src/components/progress/progress.module.scss +57 -0
  194. package/src/components/progress/progress.ts +44 -0
  195. package/src/components/propgrid/folder-closed.svg +1 -0
  196. package/src/components/propgrid/folder-open.svg +1 -0
  197. package/src/components/propgrid/progrid.module.scss +108 -0
  198. package/src/components/propgrid/propgrid.ts +271 -0
  199. package/src/components/propgrid/updown.svg +4 -0
  200. package/src/components/radio/radio.module.scss +147 -0
  201. package/src/components/radio/radio.svg +4 -0
  202. package/src/components/radio/radio.ts +142 -0
  203. package/src/components/rating/rating.module.scss +23 -0
  204. package/src/components/rating/rating.ts +131 -0
  205. package/src/components/rating/star-sharp-light.svg +1 -0
  206. package/src/components/rating/star-sharp-solid.svg +1 -0
  207. package/src/components/select/select.module.scss +9 -0
  208. package/src/components/select/select.ts +134 -0
  209. package/src/components/shared.scss +137 -0
  210. package/src/components/sizers/sizer.module.scss +90 -0
  211. package/src/components/sizers/sizer.ts +131 -0
  212. package/src/components/slider/slider.module.scss +118 -0
  213. package/src/components/slider/slider.ts +198 -0
  214. package/src/components/switch/switch.module.scss +127 -0
  215. package/src/components/switch/switch.ts +62 -0
  216. package/src/components/tabs/tabs.module.scss +45 -0
  217. package/src/components/tabs/tabs.ts +199 -0
  218. package/src/components/textarea/textarea.module.scss +63 -0
  219. package/src/components/textarea/textarea.ts +125 -0
  220. package/src/components/textedit/textedit.module.scss +116 -0
  221. package/src/components/textedit/textedit.ts +110 -0
  222. package/src/components/themes.scss +88 -0
  223. package/src/components/tickline/tickline.module.scss +26 -0
  224. package/src/components/tickline/tickline.ts +82 -0
  225. package/src/components/tooltips/circle-info-sharp-light.svg +1 -0
  226. package/src/components/tooltips/comments-question.svg +1 -0
  227. package/src/components/tooltips/tooltips.scss +72 -0
  228. package/src/components/tooltips/tooltips.ts +109 -0
  229. package/src/components/treeview/chevron-down-light.svg +1 -0
  230. package/src/components/treeview/treeview.module.scss +185 -0
  231. package/src/components/treeview/treeview.ts +445 -0
  232. package/src/components/viewport/viewport.module.scss +32 -0
  233. package/src/components/viewport/viewport.ts +41 -0
  234. package/src/core/component.ts +1072 -0
  235. package/src/core/core_application.ts +264 -0
  236. package/src/core/core_colors.ts +250 -0
  237. package/src/core/core_data.ts +1309 -0
  238. package/src/core/core_dom.ts +471 -0
  239. package/src/core/core_dragdrop.ts +201 -0
  240. package/src/core/core_element.ts +110 -0
  241. package/src/core/core_events.ts +177 -0
  242. package/src/core/core_i18n.ts +393 -0
  243. package/src/core/core_react.ts +79 -0
  244. package/src/core/core_router.ts +237 -0
  245. package/src/core/core_styles.ts +214 -0
  246. package/src/core/core_svg.ts +711 -0
  247. package/src/core/core_tools.ts +906 -0
  248. package/src/types/scss.d.ts +4 -0
  249. package/src/types/svg.d.ts +1 -0
  250. package/src/types/x4react.d.ts +9 -0
  251. package/src/x4.scss +19 -0
  252. package/src/x4tsx.d.ts +25 -0
  253. package/tsconfig.json +14 -0
  254. package/lib/src/components/grid/gridview.ts +0 -1108
  255. package/lib/src/components/grid/memdb.ts +0 -325
  256. /package/{lib/src/demo → demo}/assets/house-light.svg +0 -0
  257. /package/{lib/src/demo → demo}/assets/radio.svg +0 -0
  258. /package/{lib/src/demo → demo}/index.html +0 -0
@@ -18,6 +18,9 @@
18
18
 
19
19
  .x4hbox {
20
20
  @extend .hbox;
21
+ &.align-start {
22
+ align-items: start;
23
+ }
21
24
  }
22
25
 
23
26
  .x4vbox {
@@ -25,6 +28,8 @@
25
28
  }
26
29
 
27
30
  .x4stackbox {
31
+ display: flex;
32
+
28
33
  &>* {
29
34
  @extend .fit;
30
35
  position: relative !important;
@@ -35,3 +40,15 @@
35
40
  }
36
41
  }
37
42
 
43
+ .x4gridbox {
44
+ display: grid;
45
+ }
46
+
47
+ .x4masonrybox {
48
+ display: grid;
49
+ grid-gap: 10px;
50
+ grid-template-columns: repeat(auto-fill, minmax(250px,1fr));
51
+ grid-auto-rows: 10px;
52
+
53
+ overflow: hidden;
54
+ }
@@ -14,12 +14,13 @@
14
14
  * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
15
  **/
16
16
 
17
- import { class_ns } from '@core/core_tools.js';
18
- import { Component, ComponentEvents, ComponentProps } from "../../core/component"
17
+ import { class_ns, isArray, isNumber, isString } from '@core/core_tools.js';
18
+ import { Component, ComponentContent, ComponentEvents, ComponentProps } from "../../core/component"
19
19
 
20
20
  import "./boxes.module.scss";
21
21
 
22
22
  export interface BoxProps extends ComponentProps {
23
+ tag?: string;
23
24
  }
24
25
 
25
26
  /**
@@ -55,9 +56,11 @@ export class VBox<P extends BoxProps=BoxProps,E extends ComponentEvents=Componen
55
56
  * stack of widgets where only one widget is visible at a time
56
57
  */
57
58
 
59
+ type ContentBuilder = ( ) => Component;
60
+
58
61
  interface StackItem {
59
62
  name: string;
60
- content: Component;
63
+ content: Component | ContentBuilder;
61
64
  }
62
65
 
63
66
  interface StackedLayoutProps extends Omit<ComponentProps,"content"> {
@@ -65,19 +68,19 @@ interface StackedLayoutProps extends Omit<ComponentProps,"content"> {
65
68
  items: StackItem[];
66
69
  }
67
70
 
68
- interface _StackItem extends StackItem {
71
+ interface StackItemEx extends StackItem {
69
72
  page: Component;
70
73
  }
71
74
 
72
75
  @class_ns( "x4" )
73
76
  export class StackBox extends Box<StackedLayoutProps> {
74
- private _items: _StackItem[];
77
+ private _items: StackItemEx[];
75
78
 
76
79
  constructor( props: StackedLayoutProps ) {
77
80
  super( props );
78
81
 
79
82
  this._items = props.items?.map( itm => {
80
- return { ...itm, page: null };
83
+ return { ...itm, page: null as any};
81
84
  });
82
85
 
83
86
  if( props.default ) {
@@ -88,8 +91,16 @@ export class StackBox extends Box<StackedLayoutProps> {
88
91
  }
89
92
  }
90
93
 
94
+ addItem( item: StackItem ) {
95
+ this._items.push( {
96
+ name: item.name,
97
+ content: item.content,
98
+ page: null
99
+ });
100
+ }
101
+
91
102
  select( name: string ) {
92
- let sel = this.query( `.selected` );
103
+ let sel = this.query( `:scope > .selected` );
93
104
  if( sel ) {
94
105
  sel.setClass( "selected", false );
95
106
  }
@@ -103,27 +114,165 @@ export class StackBox extends Box<StackedLayoutProps> {
103
114
 
104
115
  sel = pg.page;
105
116
  if( sel ) {
117
+ (sel as any).activate?.( );
106
118
  sel.setClass( "selected", true );
107
119
  }
108
120
  }
121
+
122
+ return pg?.page;
109
123
  }
110
124
 
111
125
  /**
112
126
  *
113
127
  */
114
128
 
115
- private _createPage( page: _StackItem ) {
129
+ private _createPage( page: StackItemEx ) {
116
130
 
117
131
  let content: Component;
118
- //if( page.content instanceof ComponentBuilder ) {
119
- // content = page.content.create( );
120
- //}
121
- //else {
132
+ if( page.content instanceof Function ) {
133
+ content = page.content( );
134
+ page.content = content; // keep it
135
+ }
136
+ else {
122
137
  content = page.content;
123
- //}
138
+ }
124
139
 
125
140
  content?.setData( "stackname", page.name );
126
141
  return content;
127
142
  }
143
+
144
+ /**
145
+ *
146
+ */
147
+
148
+ getPage( name: string ) {
149
+ const pg = this._items.find( x => x.name==name );
150
+ return pg ? pg.content : null;
151
+ }
152
+ }
153
+
154
+ // :: GRIDBOX ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
155
+
156
+
157
+ export interface GridboxProps extends BoxProps {
158
+ rows?: number | string | string[];
159
+ columns?: number | string | string[];
160
+ }
161
+
162
+ @class_ns("x4")
163
+ export class GridBox<P extends GridboxProps=GridboxProps,E extends ComponentEvents=ComponentEvents> extends Box<P,E> {
164
+
165
+ constructor( props: P ) {
166
+ super( props );
167
+
168
+ if( props.rows!==undefined ) {
169
+ this.setRows( props.rows );
170
+ }
171
+
172
+ if( props.columns!==undefined ) {
173
+ this.setCols( props.columns );
174
+ }
175
+ }
176
+
177
+ setRows( r: number | string | string[] ) {
178
+ if( isArray(r) ) {
179
+ r = r.join( " " );
180
+ }
181
+ else if( isNumber(r) ) {
182
+ r = `repeat( ${r}, 1fr )`;
183
+ }
184
+
185
+ this.setStyleValue( "gridTemplateRows", r );
186
+ }
187
+
188
+ setCols( r: number | string | string[] ) {
189
+ if( isArray(r) ) {
190
+ r = r.join( " " );
191
+ }
192
+ else if( isNumber(r) ) {
193
+ r = `repeat( ${r}, 1fr )`;
194
+ }
195
+
196
+ this.setStyleValue( "gridTemplateColumns", r );
197
+ }
198
+
199
+ setRowCount( n: number ) {
200
+ this.setStyleValue( "gridTemplateRows", `repeat(${n})` );
201
+ }
202
+
203
+ setColCount( n: number ) {
204
+ this.setStyleValue( "gridTemplateColumns", `repeat(${n})` );
205
+ }
206
+
207
+ /**
208
+ * @param t "a a a" "b c c" "b c c"
209
+ * user item.setAttribute( "grid-area", "a" );
210
+ */
211
+
212
+ setTemplate( t: string[] ) {
213
+ this.setAttribute( "grid-template-area", t.map( x => '"' + x + '"' ).join(" ") );
214
+ }
215
+ }
216
+
217
+
218
+ // :: MASONRY ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
219
+
220
+ // from a nice article of Andy Barefoot
221
+ // https://medium.com/@andybarefoot/a-masonry-style-layout-using-css-grid-8c663d355ebb
222
+
223
+ interface MasonryProps extends Omit<BoxProps,"content"> {
224
+ items: Component[];
225
+ }
226
+
227
+ @class_ns("x4")
228
+ export class MasonryBox extends Box<MasonryProps> {
229
+
230
+ constructor(props: MasonryProps ) {
231
+ super(props);
232
+
233
+ this.addDOMEvent( 'resized', () => {
234
+ this.resizeAllItems( );
235
+ });
236
+
237
+ if( props.items ) {
238
+ this.setItems( props.items );
239
+ }
240
+ }
241
+
242
+ resizeItem(item: Component) {
243
+ const style = this.getComputedStyle();
244
+
245
+ const rowHeight = parseInt(style['gridAutoRows']);
246
+ const rowGap = parseInt(style['rowGap']);
247
+
248
+ let content = item.query('.content');
249
+ if( !content ) {
250
+ content = item;
251
+ }
252
+
253
+ if (content && (rowHeight + rowGap)) {
254
+ const rc = content.getBoundingRect();
255
+ const rowSpan = Math.ceil( (rc.height + rowGap) / (rowHeight + rowGap) );
256
+ item.setStyleValue('gridRowEnd', "span " + rowSpan);
257
+ }
258
+ }
259
+
260
+ resizeAllItems( ) {
261
+ const els = this.queryAll( ".item" );
262
+ els.forEach( itm => {;
263
+ this.resizeItem( itm );
264
+ } );
265
+ }
266
+
267
+ setItems( items: Component[] ) {
268
+ const els = items.map( x => {
269
+ return new Box( {
270
+ cls: 'item',
271
+ content: x
272
+ } );
273
+ });
274
+
275
+ this.setContent( els );
276
+ }
128
277
  }
129
278
 
@@ -1,28 +1,56 @@
1
-
2
- :root {
3
- --link-color: var( --accent-background );
4
- }
5
-
6
- .x4breadcrumbs {
7
- border-bottom: 1px solid var( --border );
8
- padding: 8px 0;
9
- font-size: 120%;
10
- margin-bottom: 2em;
11
-
12
- &> .x4button {
13
- border: none;
14
- background-color: transparent;
15
- color: var( --link-color );
16
- border-radius: 16px;
17
- padding: 6px 8px;
18
- min-width: 60px;
19
-
20
- &:hover {
21
- border-bottom-color: var( --link-color );
22
- }
23
-
24
- &:last-child {
25
- font-weight: bold;
26
- }
27
- }
28
- }
1
+
2
+ :root {
3
+ --breadcrumbs-background: var( --background-primary );
4
+ --breadcrumbs-icon-color: var( --text-ternary );
5
+ --breadcrumbs-link-color: var( --text-ternary );
6
+ --breadcrumbs-active-color: var( --accent-background );
7
+ }
8
+
9
+ .x4breadcrumbs {
10
+ background-color: var( --breadcrumbs-background );
11
+ border-bottom: 1px solid var( --border );
12
+ padding: 8px 0;
13
+ margin-bottom: 2em;
14
+
15
+ &> .x4button {
16
+ border: none;
17
+ background-color: transparent;
18
+ color: var( --breadcrumbs-link-color );
19
+ padding: 6px 8px;
20
+ padding-right: 0;
21
+ min-width: 60px;
22
+
23
+ #icon {
24
+ fill: var( --breadcrumbs-icon-color );
25
+ }
26
+
27
+ &:not(:last-child):after {
28
+ content: ">"
29
+ }
30
+
31
+ &:hover:not(:last-child) {
32
+ background-color: transparent;
33
+ color: var( --accent-background );
34
+ fill: var( --accent-background );
35
+ border-bottom-color: var( --breadcrumbs-link-color );
36
+ #text {
37
+ text-decoration: underline;
38
+ }
39
+ }
40
+
41
+ &:last-child {
42
+ font-weight: bold;
43
+ color: var( --breadcrumbs-active-color );
44
+
45
+ #icon {
46
+ fill: var( --breadcrumbs-active-color );
47
+ }
48
+
49
+ cursor: auto;
50
+ &:hover {
51
+ background-color: transparent;
52
+ color: var( --breadcrumbs-link-color );
53
+ }
54
+ }
55
+ }
56
+ }
@@ -1,84 +1,93 @@
1
- /**
2
- * ___ ___ __
3
- * \ \/ / / _
4
- * \ / /_| |_
5
- * / \____ _|
6
- * /__/\__\ |_|
7
- *
8
- * @file breadcrumb.ts
9
- * @author Etienne Cochard
10
- *
11
- * @copyright (c) 2024 R-libre ingenierie
12
- *
13
- * Use of this source code is governed by an MIT-style license
14
- * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
- **/
16
-
17
- import { class_ns } from '@core/core_tools.js';
18
- import { BoxProps, Button, HBox, Icon, Link } from '../components';
19
- import { Component, ComponentEvents, EvClick } from '@core/component.js';
20
- import { EventCallback } from '@core/core_events.js';
21
-
22
- import "./breadcrumb.scss"
23
-
24
- import icon_sep from "./chevron-right.svg"
25
-
26
- /**
27
- * Breadcrumb events
28
- */
29
-
30
- interface BreadcrumbEvents extends ComponentEvents {
31
- click: EvClick; // context = item name
32
- }
33
-
34
- /**
35
- *
36
- */
37
-
38
- interface BreadcrumbElement {
39
- icon?: string;
40
- name: string;
41
- label: string;
42
- }
43
-
44
- /**
45
- *
46
- */
47
-
48
- interface BreadcrumbsProps extends BoxProps{
49
- items: BreadcrumbElement[];
50
- click?: EventCallback<EvClick>;
51
- }
52
-
53
- /**
54
- *
55
- */
56
-
57
- @class_ns( "x4" )
58
- export class Breadcrumbs extends HBox<BreadcrumbsProps,BreadcrumbEvents> {
59
-
60
- constructor( props: BreadcrumbsProps ) {
61
- super( props );
62
-
63
- this.mapPropEvents( props, "click" );
64
-
65
- const items: Component[] = [];
66
-
67
- props.items?.map( (x: BreadcrumbElement, idx ) => {
68
- items.push( new Button( {
69
- label: x.label,
70
- icon: x.icon,
71
- click: ( ) => {
72
- this.fire( "click", { context: x.name } );
73
- }
74
- }) );
75
-
76
- if( idx!=props.items.length-1 ) {
77
- items.push( new Icon( { iconId: icon_sep } ) );
78
- }
79
- });
80
-
81
- this.setContent( items );
82
- }
83
- }
84
-
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file breadcrumb.ts
9
+ * @author Etienne Cochard
10
+ *
11
+ * @copyright (c) 2024 R-libre ingenierie
12
+ *
13
+ * Use of this source code is governed by an MIT-style license
14
+ * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
+ **/
16
+
17
+ import { class_ns } from '@core/core_tools.js';
18
+ import { parseRoute, Router } from '@core/core_router.js';
19
+
20
+ import { BoxProps, Button, HBox, Icon } from '../components';
21
+ import { Component, ComponentEvents, EvClick } from '@core/component.js';
22
+ import { EventCallback } from '@core/core_events.js';
23
+
24
+ import "./breadcrumb.scss"
25
+
26
+ import icon_sep from "./chevron-right.svg"
27
+
28
+ /**
29
+ * Breadcrumb events
30
+ */
31
+
32
+ interface BreadcrumbEvents extends ComponentEvents {
33
+ click: EvClick; // context = item name
34
+ }
35
+
36
+ /**
37
+ *
38
+ */
39
+
40
+ interface BreadcrumbElement {
41
+ name?: string;
42
+ icon?: string;
43
+ label: string;
44
+ click?: ( name: string ) => void;
45
+ }
46
+
47
+ /**
48
+ *
49
+ */
50
+
51
+ interface BreadcrumbsProps extends BoxProps{
52
+ items: BreadcrumbElement[];
53
+ click?: EventCallback<EvClick>;
54
+ }
55
+
56
+ /**
57
+ *
58
+ */
59
+
60
+ @class_ns( "x4" )
61
+ export class Breadcrumbs extends HBox<BreadcrumbsProps,BreadcrumbEvents> {
62
+
63
+ constructor( props: BreadcrumbsProps ) {
64
+ super( props );
65
+
66
+ this.mapPropEvents( props, "click" );
67
+
68
+ if( props.items ) {
69
+ this.setItems( props.items );
70
+ }
71
+ }
72
+
73
+ setItems( elements: BreadcrumbElement[ ] ) {
74
+
75
+ const items = elements.map( itm => {
76
+ return new Button( {
77
+ label: itm.label,
78
+ icon: itm.icon,
79
+ click: ( ) => {
80
+ if( itm.click ) {
81
+ itm.click( itm.name );
82
+ }
83
+ else {
84
+ this.fire( "click", { context: itm.name } );
85
+ }
86
+ }
87
+ })
88
+ });
89
+
90
+ this.setContent( items );
91
+ }
92
+ }
93
+
@@ -14,11 +14,17 @@
14
14
  * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
15
  **/
16
16
 
17
+ :root {
18
+ --btngroup-background: white;
19
+ }
20
+
17
21
  .x4btngroup {
18
22
  align-content: start;
19
23
  margin: 5px;
20
24
  gap: 4px;
21
25
 
26
+ background: var( --btngroup-background );
27
+
22
28
  &.align-right {
23
29
  justify-content: end;
24
30
  }
@@ -26,4 +32,10 @@
26
32
  &.align-center {
27
33
  justify-content: center;
28
34
  }
35
+
36
+ .x4button:disabled {
37
+ .fa-primary {
38
+ fill: var( --border );
39
+ }
40
+ }
29
41
  }
@@ -14,7 +14,7 @@
14
14
  * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
15
  **/
16
16
 
17
- import { Component, ComponentEvent, ComponentEvents, ComponentProps, Flex } from '../../core/component';
17
+ import { Component, ComponentEvents, ComponentProps, Flex, Space } from '../../core/component';
18
18
  import { EventCallback } from '../../core/core_events';
19
19
  import { class_ns, isString } from '../../core/core_tools';
20
20
  import { _tr } from '../../core/core_i18n'
@@ -25,6 +25,7 @@ import { Label } from '../label/label.js';
25
25
  import { EvBtnClick } from '../dialog/dialog.js';
26
26
 
27
27
  import "./btngroup.module.scss"
28
+ import { Input } from '../components.js';
28
29
 
29
30
  /**
30
31
  * accept "ok" or "ok.<classname>"
@@ -36,9 +37,10 @@ type predefined = `ok${ "" | `.${string}`}`
36
37
  | `no${ "" | `.${string}`}`
37
38
  | `retry${ "" | `.${string}`}`
38
39
  | `abort${ "" | `.${string}`}`
39
- | "-"; // - = flex
40
+ | "-" | ">>" // - = Flex
41
+ | "~"; // space
40
42
 
41
- export type BtnGroupItem = predefined | Button | Label;
43
+ export type BtnGroupItem = predefined | Button | Label | Input;
42
44
 
43
45
  interface BtnGroupEvents extends ComponentEvents {
44
46
  btnclick: EvBtnClick;
@@ -86,18 +88,31 @@ export class BtnGroup extends Box<BtnGroupProps,BtnGroupEvents> {
86
88
 
87
89
  const childs: Component[] = [];
88
90
 
91
+ const hasOption = ( options: string[], value: string ) => {
92
+ const idx = options.indexOf( value );
93
+ if( idx>=0 ) {
94
+ options.splice( idx, 1 );
95
+ return true;
96
+ }
97
+ }
98
+
99
+
89
100
  btns?.forEach( (b: string | Component) => {
90
101
 
91
- if( b==="-" ) {
102
+ if( b==="-" || b===">>" ) {
92
103
  b = new Flex( );
93
104
  }
105
+ else if( b=='~' ) {
106
+ b = new Space( "1em" );
107
+ }
94
108
  else if( isString(b) ) {
95
109
  let title: string;
96
110
 
97
111
  const nm = (b as predefined);
98
112
 
99
- let [txt,cls] = nm.split( "." );
100
-
113
+ let [txt,...def] = nm.split( "." );
114
+
115
+ let cls = "";
101
116
  switch( txt as predefined ) {
102
117
  case "ok": title = _tr.global.ok; break;
103
118
  case "cancel": title = _tr.global.cancel; break;
@@ -107,9 +122,23 @@ export class BtnGroup extends Box<BtnGroupProps,BtnGroupEvents> {
107
122
  case "retry": title = _tr.global.retry; break;
108
123
  }
109
124
 
110
- b = new Button( { cls, label: title, click: ( ) => {
111
- this.fire( "btnclick", {button:nm as string} )
125
+ b = new Button( { cls, id: txt, label: title, click: ( ) => {
126
+ this.fire( "btnclick", {button:txt as string} )
112
127
  } } );
128
+
129
+ if( hasOption( def, "default" ) ) {
130
+ b.addClass( 'default' );
131
+ }
132
+
133
+ if( hasOption( def, "autofocus" ) ) {
134
+ b.setAttribute( 'autofocus', true );
135
+ }
136
+
137
+ if( hasOption( def, "disabled" ) ) {
138
+ b.enable( false );
139
+ }
140
+
141
+ b.addClass( def.join(" ") );
113
142
  }
114
143
 
115
144
  childs.push( b );
@@ -117,4 +146,8 @@ export class BtnGroup extends Box<BtnGroupProps,BtnGroupEvents> {
117
146
 
118
147
  super.setContent( childs );
119
148
  }
149
+
150
+ getButton( id: string ) {
151
+ return this.query<Button>( '#'+id );
152
+ }
120
153
  }