native-document 1.0.166 → 1.0.169

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 (139) hide show
  1. package/.vitepress/config.js +166 -0
  2. package/CHANGELOG.md +187 -0
  3. package/components.js +4 -1
  4. package/dist/native-document.components.min.js +593 -300
  5. package/dist/native-document.dev.js +99 -75
  6. package/dist/native-document.dev.js.map +1 -1
  7. package/dist/native-document.min.js +1 -1
  8. package/docs/advanced-components.md +213 -608
  9. package/docs/anchor.md +173 -312
  10. package/docs/cache.md +95 -803
  11. package/docs/cli.md +179 -0
  12. package/docs/components/accordion.md +172 -0
  13. package/docs/components/alert.md +99 -0
  14. package/docs/components/avatar.md +160 -0
  15. package/docs/components/badge.md +102 -0
  16. package/docs/components/breadcrumb.md +89 -0
  17. package/docs/components/button.md +183 -0
  18. package/docs/components/card.md +69 -0
  19. package/docs/components/context-menu.md +118 -0
  20. package/docs/components/data-table.md +345 -0
  21. package/docs/components/dropdown.md +214 -0
  22. package/docs/components/form/autocomplete-field.md +81 -0
  23. package/docs/components/form/checkbox-field.md +41 -0
  24. package/docs/components/form/checkbox-group-field.md +54 -0
  25. package/docs/components/form/color-field.md +64 -0
  26. package/docs/components/form/date-field.md +92 -0
  27. package/docs/components/form/field-collection.md +63 -0
  28. package/docs/components/form/file-field.md +203 -0
  29. package/docs/components/form/form-control.md +87 -0
  30. package/docs/components/form/image-field.md +90 -0
  31. package/docs/components/form/index.md +115 -0
  32. package/docs/components/form/number-field.md +65 -0
  33. package/docs/components/form/radio-field.md +51 -0
  34. package/docs/components/form/select-field.md +123 -0
  35. package/docs/components/form/slider.md +136 -0
  36. package/docs/components/form/string-field.md +134 -0
  37. package/docs/components/form/textarea-field.md +65 -0
  38. package/docs/components/form-fields.md +372 -0
  39. package/docs/components/getting-started.md +264 -0
  40. package/docs/components/icons.md +321 -0
  41. package/docs/components/index.md +337 -0
  42. package/docs/components/layout.md +279 -0
  43. package/docs/components/list.md +73 -0
  44. package/docs/components/menu.md +215 -0
  45. package/docs/components/modal.md +156 -0
  46. package/docs/components/pagination.md +95 -0
  47. package/docs/components/popover.md +131 -0
  48. package/docs/components/progress.md +111 -0
  49. package/docs/components/shortcut-manager.md +221 -0
  50. package/docs/components/simple-table.md +107 -0
  51. package/docs/components/skeleton.md +155 -0
  52. package/docs/components/spinner.md +100 -0
  53. package/docs/components/splitter.md +133 -0
  54. package/docs/components/stepper.md +163 -0
  55. package/docs/components/switch.md +113 -0
  56. package/docs/components/tabs.md +153 -0
  57. package/docs/components/toast.md +119 -0
  58. package/docs/components/tooltip.md +151 -0
  59. package/docs/components/traits.md +261 -0
  60. package/docs/conditional-rendering.md +170 -588
  61. package/docs/contributing.md +300 -25
  62. package/docs/core-concepts.md +205 -374
  63. package/docs/elements.md +251 -367
  64. package/docs/extending-native-document-element.md +192 -207
  65. package/docs/filters.md +153 -1122
  66. package/docs/getting-started.md +193 -267
  67. package/docs/i18n.md +241 -0
  68. package/docs/index.md +76 -0
  69. package/docs/lifecycle-events.md +143 -75
  70. package/docs/list-rendering.md +227 -852
  71. package/docs/memory-management.md +134 -47
  72. package/docs/native-document-element.md +337 -186
  73. package/docs/native-fetch.md +99 -630
  74. package/docs/observable-resource.md +364 -0
  75. package/docs/observables.md +592 -526
  76. package/docs/routing.md +244 -653
  77. package/docs/state-management.md +134 -241
  78. package/docs/svg-elements.md +231 -0
  79. package/docs/theming.md +409 -0
  80. package/docs/tutorials/.gitkeep +0 -0
  81. package/docs/validation.md +95 -97
  82. package/docs/vitepress-conventions.md +219 -0
  83. package/package.json +34 -13
  84. package/readme.md +269 -89
  85. package/src/components/card/Card.js +93 -39
  86. package/src/components/card/index.js +1 -1
  87. package/src/components/form/field/types/FileField.js +3 -3
  88. package/src/components/icon/Icon.js +107 -0
  89. package/src/components/icon/icon-getters.js +142 -0
  90. package/src/components/icon/icons.js +171 -0
  91. package/src/components/icon/index.js +17 -0
  92. package/src/components/icon/types/Icon.d.ts +191 -0
  93. package/src/components/index.d.ts +6 -1
  94. package/src/components/list/HasListItem.js +171 -0
  95. package/src/components/list/List.js +41 -107
  96. package/src/components/list/ListDivider.js +39 -0
  97. package/src/components/list/ListGroup.js +76 -59
  98. package/src/components/list/ListItem.js +117 -69
  99. package/src/components/list/index.js +3 -1
  100. package/src/components/list/types/List.d.ts +45 -32
  101. package/src/components/list/types/ListDivider.ts +16 -0
  102. package/src/components/list/types/ListGroup.d.ts +51 -29
  103. package/src/components/list/types/ListItem.d.ts +40 -30
  104. package/src/components/spacer/Spacer.js +1 -1
  105. package/src/core/data/ObservableResource.js +5 -0
  106. package/src/core/data/observable-helpers/observable.prototypes.js +2 -0
  107. package/src/core/elements/content-formatter.js +16 -2
  108. package/src/core/elements/form.js +1 -1
  109. package/src/core/elements/img.js +1 -1
  110. package/src/core/elements/medias.js +2 -2
  111. package/src/core/elements/meta-data.js +1 -1
  112. package/src/core/wrappers/AttributesWrapper.js +37 -22
  113. package/src/core/wrappers/ElementCreator.js +9 -16
  114. package/src/core/wrappers/HtmlElementWrapper.js +26 -7
  115. package/src/core/wrappers/NDElement.js +12 -1
  116. package/src/core/wrappers/prototypes/attributes-extensions.js +24 -24
  117. package/src/core/wrappers/prototypes/nd-element-extensions.js +1 -8
  118. package/src/ui/components/card/CardRender.js +133 -0
  119. package/src/ui/components/card/card.css +169 -0
  120. package/src/ui/components/contextmenu/ContextmenuRender.js +1 -1
  121. package/src/ui/components/icon/material/MaterialIconRender.js +71 -0
  122. package/src/ui/components/icon/material/material.css +15 -0
  123. package/src/ui/components/icon/material/material.map.js +170 -0
  124. package/src/ui/components/icon/phosphor/PhosphorIconRender.js +71 -0
  125. package/src/ui/components/icon/phosphor/phosphor.css +17 -0
  126. package/src/ui/components/icon/phosphor/phosphor.map.js +165 -0
  127. package/src/ui/components/icon/tabler/TablerIconRender.js +59 -0
  128. package/src/ui/components/icon/tabler/tabler.css +14 -0
  129. package/src/ui/components/icon/tabler/tabler.map.js +165 -0
  130. package/src/ui/components/list/ListRender.js +18 -0
  131. package/src/ui/components/list/divider/ListDividerRender.js +10 -0
  132. package/src/ui/components/list/divider/list-divider.css +12 -0
  133. package/src/ui/components/list/group/ListGroupRender.js +61 -0
  134. package/src/ui/components/list/group/list-group.css +62 -0
  135. package/src/ui/components/list/item/ListItemRender.js +238 -0
  136. package/src/ui/components/list/item/list-item.css +191 -0
  137. package/src/ui/components/list/list.css +24 -0
  138. package/src/ui/components/spacer/SpacerRender.js +10 -0
  139. package/src/ui/index.js +13 -0
@@ -1,12 +1,12 @@
1
-
2
1
  import BaseComponent from '../BaseComponent';
3
2
  import HasEventEmitter from '../../core/utils/HasEventEmitter';
4
3
  import HasItems from '../$traits/has-items/HasItems';
4
+ import { $ } from '../../core/data/Observable';
5
+ import HasListItem from './HasListItem';
5
6
 
6
7
  /**
7
8
  * Flexible list container supporting single/multi selection, checkbox or click-to-select modes, dividers, and inset styling.
8
9
  *
9
- *
10
10
  * @example
11
11
  * const list = new List()
12
12
  * .selectable(true)
@@ -20,27 +20,26 @@ import HasItems from '../$traits/has-items/HasItems';
20
20
  * });
21
21
  *
22
22
  * @constructor
23
- * @param {GlobalAttributes} [config]
23
+ * @param {GlobalAttributes} [props]
24
24
  */
25
- export default function List(config = {}) {
26
- if(!(this instanceof List)) {
27
- return new List(config);
25
+ export default function List(props = {}) {
26
+ if (!(this instanceof List)) {
27
+ return new List(props);
28
28
  }
29
29
 
30
30
  this.$description = {
31
- selectable: false,
32
- multiSelect: false,
33
- selectedValues: null,
34
- inset: false,
35
- divider: false,
36
- data: null,
37
- render: null,
38
- selectByCheckbox: false,
39
- selectByClick: false,
40
- loopOnKeyboard: true,
41
- ...config,
31
+ selectable: $(false),
32
+ multiSelect: $(false),
33
+ selectedValues: $.array(),
34
+ inset: $(0),
35
+ divider: false,
36
+ items: $.array(),
37
+ render: null,
38
+ selectByCheckbox: $(false),
39
+ selectByClick: $(false),
40
+ loopOnKeyboard: $(false),
41
+ props,
42
42
  };
43
-
44
43
  }
45
44
 
46
45
  List.defaultTemplate = null;
@@ -48,71 +47,30 @@ List.defaultTemplate = null;
48
47
  /**
49
48
  * Registers the render template for List.
50
49
  * @param {(description: {
51
- * selectable: boolean,
52
- * multiSelect: boolean,
53
- * selectedValues: Observable<*[]>|null,
54
- * inset: boolean,
55
- * divider: boolean,
56
- * data: *|null,
57
- * render: ((desc: *, instance: List) => NdChild)|null,
58
- * selectByCheckbox: boolean,
59
- * selectByClick: boolean,
60
- * loopOnKeyboard: boolean,
61
- * props: GlobalAttributes,
50
+ * selectable: ObservableItem<boolean>,
51
+ * multiSelect: ObservableItem<boolean>,
52
+ * selectedValues: ObservableArray<*>,
53
+ * inset: ObservableItem<number>,
54
+ * divider: boolean,
55
+ * data: *|null,
56
+ * render: ((desc: *, instance: List) => NdChild)|null,
57
+ * selectByCheckbox: ObservableItem<boolean>,
58
+ * selectByClick: ObservableItem<boolean>,
59
+ * loopOnKeyboard: ObservableItem<boolean>,
60
+ * items: ObservableArray<*>,
61
+ * props: GlobalAttributes,
62
62
  * }, instance: List) => NdChild} template
63
63
  */
64
64
  List.use = function(template) {
65
- List.defaultTemplate = template.list;
65
+ List.defaultTemplate = template;
66
66
  };
67
67
 
68
68
  BaseComponent.extends(List);
69
- BaseComponent.use(List, HasItems, HasEventEmitter);
70
-
71
- List.defaultTemplate = null;
72
-
73
- List.use = function(template) {
74
- List.defaultTemplate = template.list;
75
- };
76
-
77
- /**
78
- * @param {*} [selectable]
79
- * @returns {this}
80
- */
81
- List.prototype.selectable = function(selectable = true) {
82
- this.$description.selectable = selectable;
83
- return this;
84
- };
85
-
86
- /**
87
- * @returns {this}
88
- */
89
- List.prototype.selectByClick = function() {
90
- this.$description.selectByClick = true;
91
- this.$description.selectByCheckbox = false;
92
- return this;
93
- };
94
-
95
- /**
96
- * @returns {this}
97
- */
98
- List.prototype.selectByCheckbox = function() {
99
- this.$description.selectByClick = false;
100
- this.$description.selectByCheckbox = true;
101
- return this;
102
- };
69
+ BaseComponent.use(List, HasItems, HasEventEmitter, HasListItem);
103
70
 
104
- /**
105
- * @param {*} [multi]
106
- * @returns {this}
107
- */
108
- List.prototype.multiSelect = function(multi = true) {
109
- this.$description.multiSelect = multi;
110
- this.$description.selectable = true;
111
- return this;
112
- };
113
71
 
114
72
  /**
115
- * @param {Observable<*[]>} observable
73
+ * @param {ObservableArray<*>|Observable<*[]>} observable
116
74
  * @returns {this}
117
75
  */
118
76
  List.prototype.selectedValuesModel = function(observable) {
@@ -121,41 +79,17 @@ List.prototype.selectedValuesModel = function(observable) {
121
79
  };
122
80
 
123
81
  /**
124
- * @param {number} [inset]
82
+ * Inset padding in px applied to all items.
83
+ * @param {number} [inset=0]
125
84
  * @returns {this}
126
85
  */
127
- List.prototype.inset = function(inset = true) {
128
- this.$description.inset = inset;
86
+ List.prototype.inset = function(inset = 0) {
87
+ this.$description.inset.set(inset);
129
88
  return this;
130
89
  };
131
90
 
132
91
  /**
133
- * @returns {this}
134
- */
135
- List.prototype.next = function() {
136
- // TODO:
137
- return this;
138
- };
139
-
140
- /**
141
- * @returns {this}
142
- */
143
- List.prototype.preview = function() {
144
- // TODO:
145
- return this;
146
- };
147
-
148
- /**
149
- * @param {*} loopOnKeyboard
150
- * @returns {this}
151
- */
152
- List.prototype.loopOnKeyboard = function(loopOnKeyboard) {
153
- this.$description.loopOnKeyboard = loopOnKeyboard;
154
- return this;
155
- };
156
-
157
- /**
158
- * @param {*} [divider]
92
+ * @param {boolean} [divider=true]
159
93
  * @returns {this}
160
94
  */
161
95
  List.prototype.withDivider = function(divider = true) {
@@ -168,12 +102,12 @@ List.prototype.withDivider = function(divider = true) {
168
102
  * @returns {this}
169
103
  */
170
104
  List.prototype.data = function(data) {
171
- this.$description.data = data;
105
+ this.$description.items = data;
172
106
  return this;
173
107
  };
174
108
 
175
109
  /**
176
- * @param {(item: ListItem, event: MouseEvent) => void} handler
110
+ * @param {(item: *, event: MouseEvent) => void} handler
177
111
  * @returns {this}
178
112
  */
179
113
  List.prototype.onItemClick = function(handler) {
@@ -182,10 +116,10 @@ List.prototype.onItemClick = function(handler) {
182
116
  };
183
117
 
184
118
  /**
185
- * @param {(item: ListItem) => void} handler
119
+ * @param {(item: *) => void} handler
186
120
  * @returns {this}
187
121
  */
188
122
  List.prototype.onItemSelect = function(handler) {
189
123
  this.on('itemSelect', handler);
190
124
  return this;
191
- };
125
+ };
@@ -0,0 +1,39 @@
1
+ import BaseComponent from '../BaseComponent';
2
+
3
+ /**
4
+ * Visual separator between items in a List.
5
+ *
6
+ * @example
7
+ * List()
8
+ * .item('Dashboard')
9
+ * .divider()
10
+ * .item('Settings')
11
+ *
12
+ * ListDivider.use((description, instance) => {
13
+ * return Li({ class: 'list-divider', role: 'separator' });
14
+ * });
15
+ *
16
+ * @constructor
17
+ * @param {GlobalAttributes} [props={}]
18
+ */
19
+ export default function ListDivider(props = {}) {
20
+ if (!(this instanceof ListDivider)) {
21
+ return new ListDivider(props);
22
+ }
23
+
24
+ BaseComponent.call(this, props);
25
+
26
+ this.$description = { props };
27
+ }
28
+
29
+ BaseComponent.extends(ListDivider);
30
+
31
+ ListDivider.defaultTemplate = null;
32
+
33
+ /**
34
+ * Registers the render template for ListDivider.
35
+ * @param {(description: { props: GlobalAttributes }, instance: ListDivider) => NdChild} template
36
+ */
37
+ ListDivider.use = function(template) {
38
+ ListDivider.defaultTemplate = template;
39
+ };
@@ -1,54 +1,79 @@
1
1
  import BaseComponent from '../BaseComponent';
2
+ import HasEventEmitter from '../../core/utils/HasEventEmitter';
2
3
  import HasItems from '../$traits/has-items/HasItems';
4
+ import HasListItem from './HasListItem';
5
+ import { $ } from '../../core/data/Observable';
3
6
 
4
7
  /**
5
- * Groups ListItem instances under a header/footer inside a List.
6
- *
8
+ * A collapsible group of ListItems inside a List. Can hold items, dividers, and nested groups.
7
9
  *
8
10
  * @example
9
- * const group = new ListGroup(Span('Favourites'))
10
- * .inset(true)
11
- * .renderHeader((desc, instance) => H3(desc.header));
11
+ * ListGroup('Workspace')
12
+ * .icon(FolderIcon())
13
+ * .collapsable()
14
+ * .item('Dashboard', DashboardIcon())
15
+ * .item('Analytics', ChartIcon());
16
+ *
17
+ * // From data
18
+ * ListGroup('Reports')
19
+ * .from(reports, (report) =>
20
+ * ListItem().label(report.name).value(report.id)
21
+ * );
22
+ *
23
+ * ListGroup.use((description, instance) => {
24
+ * return Div({ class: 'list-group' });
25
+ * });
12
26
  *
13
27
  * @constructor
14
- * @param {NdChild} [label]
15
- * @param {GlobalAttributes} [config={}]
28
+ * @param {NdChild} label
29
+ * @param {GlobalAttributes} [props={}]
16
30
  */
17
- export default function ListGroup(label, config = {}) {
18
- if(!(this instanceof ListGroup)) {
19
- return new ListGroup(label, config);
31
+ export default function ListGroup(label, props = {}) {
32
+ if (!(this instanceof ListGroup)) {
33
+ return new ListGroup(label, props);
20
34
  }
21
35
 
36
+ BaseComponent.call(this, props);
37
+
22
38
  this.$description = {
23
- header: label || null,
24
- footer: null,
25
- items: [],
26
- inset: false,
27
- data: null,
28
- renderHeader: null,
29
- renderFooter: null,
30
- render: null,
31
- ...config,
39
+ selectable: $(false),
40
+ multiSelect: $(false),
41
+ selectedValues: $.array(),
42
+ label: label,
43
+ icon: null,
44
+ items: $.array(),
45
+ render: null,
46
+ collapsable: false,
47
+ collapsed: null,
48
+ visibility: $(true),
49
+ selectByCheckbox: $(false),
50
+ selectByClick: $(false),
51
+ loopOnKeyboard: $(false),
52
+ props,
32
53
  };
33
54
  }
34
55
 
35
56
  BaseComponent.extends(ListGroup);
36
- BaseComponent.use(ListGroup, HasItems);
57
+ BaseComponent.use(ListGroup, HasItems, HasEventEmitter, HasListItem);
58
+
59
+ HasListItem.components.ListGroup = ListGroup;
37
60
 
38
61
  ListGroup.defaultTemplate = null;
62
+ ListGroup.prototype.__$ListInstance = true;
39
63
 
40
64
  /**
41
65
  * Registers the render template for ListGroup.
42
66
  * @param {(description: {
43
- * header: NdChild|null,
44
- * footer: NdChild|null,
45
- * items: *[],
46
- * inset: boolean,
47
- * data: *|null,
48
- * renderHeader: ((desc: *, instance: ListGroup) => NdChild)|null,
49
- * renderFooter: ((desc: *, instance: ListGroup) => NdChild)|null,
50
- * render: ((desc: *, instance: ListGroup) => NdChild)|null,
51
- * props: GlobalAttributes,
67
+ * label: NdChild,
68
+ * icon: NdChild|null,
69
+ * items: ObservableArray<ListItem|ListGroup|ListDivider>,
70
+ * itemBuilder: (item: *) => ListItem|ListGroup|ListDivider,
71
+ * data: *|null,
72
+ * render: ((desc: *, instance: ListGroup) => NdChild)|null,
73
+ * collapsable: boolean,
74
+ * collapsed: ObservableItem<boolean>|null,
75
+ * visibility: ObservableItem<boolean>,
76
+ * props: GlobalAttributes,
52
77
  * }, instance: ListGroup) => NdChild} template
53
78
  */
54
79
  ListGroup.use = function(template) {
@@ -56,37 +81,47 @@ ListGroup.use = function(template) {
56
81
  };
57
82
 
58
83
  /**
59
- * @param {NdChild} header
84
+ * @param {NdChild} icon
60
85
  * @returns {this}
61
86
  */
62
- ListGroup.prototype.header = function(header) {
63
- this.$description.header = header;
87
+ ListGroup.prototype.icon = function(icon) {
88
+ this.$description.icon = icon;
64
89
  return this;
65
90
  };
66
91
 
67
92
  /**
68
- * @param {NdChild} title
93
+ * @param {boolean} [mode=true]
94
+ * @param {NdChild} [openedIcon]
95
+ * @param {NdChild} [closedIcon]
69
96
  * @returns {this}
70
97
  */
71
- ListGroup.prototype.title = function(title) {
72
- return this.header(title);
98
+ ListGroup.prototype.collapsable = function(mode = true, openedIcon, closedIcon) {
99
+ this.$description.collapsable = mode;
100
+ this.$description.collapsed = this.$description.collapsed || $(false);
101
+ this.$description.collapsableOpenedIcon = openedIcon || null;
102
+ this.$description.collapsableClosedIcon = closedIcon || null;
103
+ return this;
73
104
  };
74
105
 
75
106
  /**
76
- * @param {NdChild} footer
107
+ * @param {boolean} [mode=true]
77
108
  * @returns {this}
78
109
  */
79
- ListGroup.prototype.footer = function(footer) {
80
- this.$description.footer = footer;
110
+ ListGroup.prototype.collapsed = function(mode = true) {
111
+ if (!this.$description.collapsed) {
112
+ this.$description.collapsed = $(mode);
113
+ } else {
114
+ this.$description.collapsed.set(mode);
115
+ }
81
116
  return this;
82
117
  };
83
118
 
84
119
  /**
85
- * @param {number} [inset]
120
+ * @param {boolean|Observable<boolean>} mode
86
121
  * @returns {this}
87
122
  */
88
- ListGroup.prototype.inset = function(inset = true) {
89
- this.$description.inset = inset;
123
+ ListGroup.prototype.visibility = function(mode) {
124
+ this.$description.visibility = BaseComponent.obs(mode);
90
125
  return this;
91
126
  };
92
127
 
@@ -98,21 +133,3 @@ ListGroup.prototype.data = function(data) {
98
133
  this.$description.data = data;
99
134
  return this;
100
135
  };
101
-
102
- /**
103
- * @param {(desc: *, instance: *) => NdChild} renderFn
104
- * @returns {this}
105
- */
106
- ListGroup.prototype.renderHeader = function(renderFn) {
107
- this.$description.renderHeader = renderFn;
108
- return this;
109
- };
110
-
111
- /**
112
- * @param {(desc: *, instance: *) => NdChild} renderFn
113
- * @returns {this}
114
- */
115
- ListGroup.prototype.renderFooter = function(renderFn) {
116
- this.$description.renderFooter = renderFn;
117
- return this;
118
- };