@public-ui/sample-react 3.0.0-rc.5 → 3.0.0-rc.7

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 (214) hide show
  1. package/dist/1006.js +2 -0
  2. package/dist/1573.js +2 -0
  3. package/dist/1752.js +2 -0
  4. package/dist/1932.js +2 -0
  5. package/dist/2069.js +2 -0
  6. package/dist/2212.js +2 -0
  7. package/dist/2231.js +2 -0
  8. package/dist/2321.js +2 -0
  9. package/dist/{7997.js → 2596.js} +2 -2
  10. package/dist/2827.js +2 -0
  11. package/dist/2894.js +2 -0
  12. package/dist/{9929.js → 3099.js} +2 -2
  13. package/dist/3151.js +2 -0
  14. package/dist/3203.js +2 -0
  15. package/dist/3540.js +2 -0
  16. package/dist/373.js +2 -0
  17. package/dist/3918.js +2 -0
  18. package/dist/3920.js +2 -0
  19. package/dist/4030.js +2 -0
  20. package/dist/4048.js +2 -0
  21. package/dist/4201.js +2 -0
  22. package/dist/{3872.js → 4587.js} +2 -2
  23. package/dist/4641.js +2 -0
  24. package/dist/4876.js +2 -0
  25. package/dist/5249.js +2 -0
  26. package/dist/5301.js +2 -0
  27. package/dist/5690.js +2 -0
  28. package/dist/5746.js +2 -0
  29. package/dist/5750.js +2 -0
  30. package/dist/5794.js +2 -0
  31. package/dist/6047.js +2 -0
  32. package/dist/6066.js +2 -0
  33. package/dist/6304.js +2 -0
  34. package/dist/6781.js +2 -0
  35. package/dist/6790.js +2 -0
  36. package/dist/6984.js +2 -0
  37. package/dist/7013.js +2 -0
  38. package/dist/7178.js +2 -0
  39. package/dist/{7958.js → 7347.js} +2 -2
  40. package/dist/740.js +2 -0
  41. package/dist/7444.js +2 -0
  42. package/dist/7533.js +2 -0
  43. package/dist/7535.js +2 -0
  44. package/dist/775.js +2 -0
  45. package/dist/8137.js +2 -0
  46. package/dist/8180.js +2 -0
  47. package/dist/8192.js +2 -0
  48. package/dist/8246.js +2 -0
  49. package/dist/833.js +2 -0
  50. package/dist/8378.js +2 -0
  51. package/dist/8570.js +2 -0
  52. package/dist/8605.js +2 -0
  53. package/dist/8625.js +2 -0
  54. package/dist/8826.js +2 -0
  55. package/dist/{6420.js → 8840.js} +2 -2
  56. package/dist/907.js +2 -0
  57. package/dist/9108.js +2 -0
  58. package/dist/9162.js +1 -1
  59. package/dist/9255.js +2 -0
  60. package/dist/9322.js +2 -0
  61. package/dist/9581.js +2 -0
  62. package/dist/9719.js +2 -0
  63. package/dist/9731.js +2 -0
  64. package/dist/9930.js +2 -0
  65. package/dist/9938.js +2 -0
  66. package/dist/9938.js.LICENSE.txt +3 -0
  67. package/dist/main.css +3 -3
  68. package/dist/main.js +1 -1
  69. package/dist/main.js.LICENSE.txt +2 -2
  70. package/package.json +21 -19
  71. package/src/components/button/short-key.tsx +104 -3
  72. package/src/components/handout/basic.tsx +2 -4
  73. package/src/components/icon/basic.tsx +2 -1
  74. package/src/components/input-date/partials/cases.tsx +1 -1
  75. package/src/components/input-radio/partials/variants.tsx +8 -6
  76. package/src/components/link/short-key.tsx +1 -1
  77. package/src/components/popover-button/basic.tsx +55 -0
  78. package/src/components/popover-button/routes.ts +8 -0
  79. package/src/components/progress/basic.tsx +12 -5
  80. package/src/components/select/partials/cases.tsx +6 -3
  81. package/src/components/single-select/partials/cases.tsx +3 -0
  82. package/src/components/table/sort-data.tsx +2 -2
  83. package/src/components/table/stateful-with-selection.tsx +4 -1
  84. package/src/components/table/stateless-with-selection.tsx +4 -1
  85. package/src/components/table/stateless-with-single-selection.tsx +2 -0
  86. package/src/components/tree/basic.tsx +1 -0
  87. package/src/react.main.tsx +10 -2
  88. package/src/scenarios/change-tabindex.tsx +1 -1
  89. package/src/scenarios/horizontal-scrollbar-advanced/layout.scss +4 -4
  90. package/src/shares/longOptions.ts +15 -0
  91. package/src/shares/routes.ts +3 -1
  92. package/src/style.scss +3 -3
  93. package/webpack.config.js +22 -0
  94. package/dist/1068.js +0 -2
  95. package/dist/1219.js +0 -2
  96. package/dist/136.js +0 -2
  97. package/dist/1416.js +0 -2
  98. package/dist/1676.js +0 -2
  99. package/dist/1718.js +0 -2
  100. package/dist/1744.js +0 -2
  101. package/dist/1791.js +0 -2
  102. package/dist/2078.js +0 -2
  103. package/dist/2115.js +0 -2
  104. package/dist/2195.js +0 -2
  105. package/dist/3021.js +0 -2
  106. package/dist/3027.js +0 -2
  107. package/dist/3186.js +0 -2
  108. package/dist/364.js +0 -2
  109. package/dist/3758.js +0 -2
  110. package/dist/3836.js +0 -2
  111. package/dist/3879.js +0 -2
  112. package/dist/3926.js +0 -2
  113. package/dist/3949.js +0 -2
  114. package/dist/4211.js +0 -2
  115. package/dist/4350.js +0 -2
  116. package/dist/4390.js +0 -2
  117. package/dist/4566.js +0 -2
  118. package/dist/4662.js +0 -2
  119. package/dist/4928.js +0 -2
  120. package/dist/5000.js +0 -2
  121. package/dist/5138.js +0 -2
  122. package/dist/5151.js +0 -2
  123. package/dist/5171.js +0 -2
  124. package/dist/5718.js +0 -2
  125. package/dist/5781.js +0 -2
  126. package/dist/5876.js +0 -2
  127. package/dist/597.js +0 -2
  128. package/dist/6451.js +0 -2
  129. package/dist/6480.js +0 -2
  130. package/dist/6577.js +0 -2
  131. package/dist/6983.js +0 -2
  132. package/dist/7084.js +0 -2
  133. package/dist/7225.js +0 -2
  134. package/dist/7267.js +0 -2
  135. package/dist/8069.js +0 -2
  136. package/dist/8177.js +0 -2
  137. package/dist/8212.js +0 -2
  138. package/dist/8243.js +0 -2
  139. package/dist/8283.js +0 -2
  140. package/dist/8478.js +0 -2
  141. package/dist/851.js +0 -2
  142. package/dist/8573.js +0 -2
  143. package/dist/8728.js +0 -2
  144. package/dist/8808.js +0 -2
  145. package/dist/8999.js +0 -2
  146. package/dist/9068.js +0 -2
  147. package/dist/9130.js +0 -2
  148. package/dist/9219.js +0 -2
  149. package/dist/9423.js +0 -2
  150. package/dist/9430.js +0 -2
  151. package/dist/993.js +0 -2
  152. /package/dist/{1068.js.LICENSE.txt → 1006.js.LICENSE.txt} +0 -0
  153. /package/dist/{1219.js.LICENSE.txt → 1573.js.LICENSE.txt} +0 -0
  154. /package/dist/{136.js.LICENSE.txt → 1752.js.LICENSE.txt} +0 -0
  155. /package/dist/{1416.js.LICENSE.txt → 1932.js.LICENSE.txt} +0 -0
  156. /package/dist/{1676.js.LICENSE.txt → 2069.js.LICENSE.txt} +0 -0
  157. /package/dist/{1718.js.LICENSE.txt → 2212.js.LICENSE.txt} +0 -0
  158. /package/dist/{1744.js.LICENSE.txt → 2231.js.LICENSE.txt} +0 -0
  159. /package/dist/{1791.js.LICENSE.txt → 2321.js.LICENSE.txt} +0 -0
  160. /package/dist/{2078.js.LICENSE.txt → 2596.js.LICENSE.txt} +0 -0
  161. /package/dist/{2115.js.LICENSE.txt → 2827.js.LICENSE.txt} +0 -0
  162. /package/dist/{2195.js.LICENSE.txt → 2894.js.LICENSE.txt} +0 -0
  163. /package/dist/{3021.js.LICENSE.txt → 3099.js.LICENSE.txt} +0 -0
  164. /package/dist/{3027.js.LICENSE.txt → 3151.js.LICENSE.txt} +0 -0
  165. /package/dist/{3186.js.LICENSE.txt → 3203.js.LICENSE.txt} +0 -0
  166. /package/dist/{364.js.LICENSE.txt → 3540.js.LICENSE.txt} +0 -0
  167. /package/dist/{3758.js.LICENSE.txt → 373.js.LICENSE.txt} +0 -0
  168. /package/dist/{3836.js.LICENSE.txt → 3918.js.LICENSE.txt} +0 -0
  169. /package/dist/{3872.js.LICENSE.txt → 3920.js.LICENSE.txt} +0 -0
  170. /package/dist/{3879.js.LICENSE.txt → 4030.js.LICENSE.txt} +0 -0
  171. /package/dist/{3926.js.LICENSE.txt → 4048.js.LICENSE.txt} +0 -0
  172. /package/dist/{3949.js.LICENSE.txt → 4201.js.LICENSE.txt} +0 -0
  173. /package/dist/{4211.js.LICENSE.txt → 4587.js.LICENSE.txt} +0 -0
  174. /package/dist/{4350.js.LICENSE.txt → 4641.js.LICENSE.txt} +0 -0
  175. /package/dist/{4390.js.LICENSE.txt → 4876.js.LICENSE.txt} +0 -0
  176. /package/dist/{4566.js.LICENSE.txt → 5249.js.LICENSE.txt} +0 -0
  177. /package/dist/{4662.js.LICENSE.txt → 5301.js.LICENSE.txt} +0 -0
  178. /package/dist/{4928.js.LICENSE.txt → 5690.js.LICENSE.txt} +0 -0
  179. /package/dist/{5000.js.LICENSE.txt → 5746.js.LICENSE.txt} +0 -0
  180. /package/dist/{5138.js.LICENSE.txt → 5750.js.LICENSE.txt} +0 -0
  181. /package/dist/{5151.js.LICENSE.txt → 5794.js.LICENSE.txt} +0 -0
  182. /package/dist/{5171.js.LICENSE.txt → 6047.js.LICENSE.txt} +0 -0
  183. /package/dist/{5718.js.LICENSE.txt → 6066.js.LICENSE.txt} +0 -0
  184. /package/dist/{5781.js.LICENSE.txt → 6304.js.LICENSE.txt} +0 -0
  185. /package/dist/{5876.js.LICENSE.txt → 6781.js.LICENSE.txt} +0 -0
  186. /package/dist/{597.js.LICENSE.txt → 6790.js.LICENSE.txt} +0 -0
  187. /package/dist/{6420.js.LICENSE.txt → 6984.js.LICENSE.txt} +0 -0
  188. /package/dist/{6451.js.LICENSE.txt → 7013.js.LICENSE.txt} +0 -0
  189. /package/dist/{6480.js.LICENSE.txt → 7178.js.LICENSE.txt} +0 -0
  190. /package/dist/{6577.js.LICENSE.txt → 7347.js.LICENSE.txt} +0 -0
  191. /package/dist/{6983.js.LICENSE.txt → 740.js.LICENSE.txt} +0 -0
  192. /package/dist/{7084.js.LICENSE.txt → 7444.js.LICENSE.txt} +0 -0
  193. /package/dist/{7225.js.LICENSE.txt → 7533.js.LICENSE.txt} +0 -0
  194. /package/dist/{7267.js.LICENSE.txt → 7535.js.LICENSE.txt} +0 -0
  195. /package/dist/{7958.js.LICENSE.txt → 775.js.LICENSE.txt} +0 -0
  196. /package/dist/{7997.js.LICENSE.txt → 8137.js.LICENSE.txt} +0 -0
  197. /package/dist/{8069.js.LICENSE.txt → 8180.js.LICENSE.txt} +0 -0
  198. /package/dist/{8177.js.LICENSE.txt → 8192.js.LICENSE.txt} +0 -0
  199. /package/dist/{8212.js.LICENSE.txt → 8246.js.LICENSE.txt} +0 -0
  200. /package/dist/{8243.js.LICENSE.txt → 833.js.LICENSE.txt} +0 -0
  201. /package/dist/{8283.js.LICENSE.txt → 8378.js.LICENSE.txt} +0 -0
  202. /package/dist/{8478.js.LICENSE.txt → 8570.js.LICENSE.txt} +0 -0
  203. /package/dist/{851.js.LICENSE.txt → 8605.js.LICENSE.txt} +0 -0
  204. /package/dist/{8573.js.LICENSE.txt → 8625.js.LICENSE.txt} +0 -0
  205. /package/dist/{8728.js.LICENSE.txt → 8826.js.LICENSE.txt} +0 -0
  206. /package/dist/{8808.js.LICENSE.txt → 8840.js.LICENSE.txt} +0 -0
  207. /package/dist/{8999.js.LICENSE.txt → 907.js.LICENSE.txt} +0 -0
  208. /package/dist/{9068.js.LICENSE.txt → 9108.js.LICENSE.txt} +0 -0
  209. /package/dist/{9130.js.LICENSE.txt → 9255.js.LICENSE.txt} +0 -0
  210. /package/dist/{9219.js.LICENSE.txt → 9322.js.LICENSE.txt} +0 -0
  211. /package/dist/{9423.js.LICENSE.txt → 9581.js.LICENSE.txt} +0 -0
  212. /package/dist/{9430.js.LICENSE.txt → 9719.js.LICENSE.txt} +0 -0
  213. /package/dist/{9929.js.LICENSE.txt → 9731.js.LICENSE.txt} +0 -0
  214. /package/dist/{993.js.LICENSE.txt → 9930.js.LICENSE.txt} +0 -0
@@ -33,7 +33,7 @@
33
33
  */
34
34
 
35
35
  /**
36
- * @remix-run/router v1.21.1
36
+ * @remix-run/router v1.23.0
37
37
  *
38
38
  * Copyright (c) Remix Software Inc.
39
39
  *
@@ -44,7 +44,7 @@
44
44
  */
45
45
 
46
46
  /**
47
- * React Router v6.28.2
47
+ * React Router v6.30.0
48
48
  *
49
49
  * Copyright (c) Remix Software Inc.
50
50
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@public-ui/sample-react",
3
- "version": "3.0.0-rc.5",
3
+ "version": "3.0.0-rc.7",
4
4
  "description": "This app contains samples for the KoliBri/Public UI",
5
5
  "license": "EUPL-1.2",
6
6
  "repository": {
@@ -13,20 +13,20 @@
13
13
  "@leanup/stack-webpack": "1.3.54",
14
14
  "@playwright/test": "1.49.1",
15
15
  "@stencil/core": "4.22.3",
16
- "@types/node": "ts5.7",
16
+ "@types/node": "22.14.1",
17
17
  "@types/react": "18.3.4",
18
18
  "@types/react-dom": "18.3.5",
19
- "@typescript-eslint/eslint-plugin": "8.18.2",
20
- "@typescript-eslint/parser": "8.18.2",
19
+ "@typescript-eslint/eslint-plugin": "8.27.0",
20
+ "@typescript-eslint/parser": "8.27.0",
21
21
  "@unocss/preset-uno": "0.58.9",
22
22
  "@unocss/webpack": "0.58.9",
23
- "adopted-style-sheets": "1.1.7",
23
+ "adopted-style-sheets": "1.1.8",
24
24
  "ajv": "8.17.1",
25
25
  "chromedriver": "130.0.4",
26
26
  "cpy-cli": "5.0.0",
27
27
  "cross-env": "7.0.3",
28
28
  "css-loader": "7.1.2",
29
- "esbuild-loader": "4.2.2",
29
+ "esbuild-loader": "4.3.0",
30
30
  "eslint": "^8",
31
31
  "eslint-plugin-html": "8.1.2",
32
32
  "eslint-plugin-json": "^3",
@@ -34,32 +34,34 @@
34
34
  "eslint-plugin-react": "7.37.4",
35
35
  "file-loader": "6.2.0",
36
36
  "formik": "2.4.6",
37
- "knip": "5.40.0",
37
+ "knip": "5.46.0",
38
38
  "less-loader": "12.2.0",
39
39
  "mini-css-extract-plugin": "2.9.2",
40
40
  "nightwatch-axe-verbose": "2.3.1",
41
- "npm-run-all": "4.1.5",
41
+ "npm-run-all2": "7.0.2",
42
42
  "postcss-loader": "8.1.1",
43
- "prettier": "3.4.2",
43
+ "prettier": "3.5.3",
44
44
  "react": "18.3.1",
45
45
  "react-dom": "18.3.1",
46
46
  "react-number-format": "5.4.3",
47
- "react-router": "6.28.2",
48
- "react-router-dom": "6.28.2",
47
+ "react-router": "6.30.0",
48
+ "react-router-dom": "6.30.0",
49
49
  "rimraf": "6.0.1",
50
- "sass-loader": "16.0.4",
50
+ "sass-loader": "16.0.5",
51
51
  "string-replace-loader": "3.1.0",
52
52
  "tslib": "2.8.1",
53
- "typescript": "5.7.3",
54
- "webpack": "5.97.1",
53
+ "typescript": "5.8.2",
54
+ "webpack": "5.98.0",
55
55
  "webpack-cli": "5.1.4",
56
56
  "webpack-dev-server": "5.2.0",
57
57
  "world_countries_lists": "2.9.0",
58
- "yup": "1.5.0",
59
- "@public-ui-/theme-ecl": "2.1.3",
60
- "@public-ui/components": "3.0.0-rc.5",
61
- "@public-ui/react": "3.0.0-rc.5",
62
- "@public-ui/theme-default": "3.0.0-rc.5"
58
+ "yup": "1.6.1",
59
+ "@public-ui/components": "3.0.0-rc.7",
60
+ "@public-ui/react": "3.0.0-rc.7",
61
+ "@public-ui/theme-default": "3.0.0-rc.7"
62
+ },
63
+ "optionalDependencies": {
64
+ "@public-ui-/theme-ecl": "2.1.3"
63
65
  },
64
66
  "files": [
65
67
  ".eslintignore",
@@ -1,8 +1,61 @@
1
- import { KolButton } from '@public-ui/react';
2
- import React from 'react';
1
+ import { createReactRenderElement, KolButton, KolHeading, KolTableStateful } from '@public-ui/react';
3
2
  import type { FC } from 'react';
3
+ import { useRef } from 'react';
4
+ import React from 'react';
4
5
  import { SampleDescription } from '../SampleDescription';
5
6
  import { useToasterService } from '../../hooks/useToasterService';
7
+ import { getRoot } from '../../shares/react-roots';
8
+ import type { KoliBriTableHeaders } from '@public-ui/components';
9
+ import { ToasterService } from '@public-ui/components';
10
+
11
+ const RowActions: FC<{ label: string }> = ({ label }) => {
12
+ const toaster = ToasterService.getInstance(document);
13
+ const editButtonRef = useRef<HTMLKolButtonElement | null>(null);
14
+ const deleteButtonRef = useRef<HTMLKolButtonElement | null>(null);
15
+
16
+ const handleEditClick = () => {
17
+ toaster.enqueue({
18
+ label: 'Edit clicked',
19
+ description: `The button "edit" has been clicked for ${label}`,
20
+ type: 'info',
21
+ });
22
+ };
23
+
24
+ const handleDeleteClick = () => {
25
+ toaster.enqueue({
26
+ label: 'Delete clicked',
27
+ description: `The button "delete" has been clicked for ${label}`,
28
+ type: 'warning',
29
+ });
30
+ };
31
+
32
+ const handleKeyUp = (event: React.KeyboardEvent<HTMLDivElement>) => {
33
+ switch (event.code) {
34
+ case 'KeyE':
35
+ void editButtonRef.current?.kolFocus();
36
+ handleEditClick();
37
+ return;
38
+ case 'KeyD':
39
+ void deleteButtonRef.current?.kolFocus();
40
+ handleDeleteClick();
41
+ return;
42
+ }
43
+ };
44
+
45
+ return (
46
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
47
+ <div
48
+ style={{
49
+ display: 'flex',
50
+ gap: 'calc(10rem / var(--kolibri-root-font-size, 16))',
51
+ }}
52
+ onKeyUp={handleKeyUp}
53
+ >
54
+ <KolButton ref={editButtonRef} _label={'Edit'} _shortKey={'e'} _on={{ onClick: handleEditClick }} />
55
+ <KolButton ref={deleteButtonRef} _label={'Delete'} _shortKey={'d'} _variant={'danger'} _on={{ onClick: handleDeleteClick }} />
56
+ </div>
57
+ );
58
+ };
6
59
 
7
60
  export const ButtonShortKey: FC = () => {
8
61
  const { dummyClickEventHandler } = useToasterService();
@@ -11,11 +64,50 @@ export const ButtonShortKey: FC = () => {
11
64
  onClick: dummyClickEventHandler,
12
65
  };
13
66
 
67
+ type Data = {
68
+ label: string;
69
+ };
70
+ const DATA: Data[] = [
71
+ {
72
+ label: 'Row 1',
73
+ },
74
+ {
75
+ label: 'Row 2',
76
+ },
77
+ ];
78
+
79
+ const HEADERS: KoliBriTableHeaders = {
80
+ horizontal: [
81
+ [
82
+ {
83
+ label: 'Label',
84
+ key: 'label',
85
+ textAlign: 'left',
86
+ },
87
+ {
88
+ label: 'Actions',
89
+ key: 'actions',
90
+ textAlign: 'left',
91
+
92
+ render: (el, cell) => {
93
+ getRoot(createReactRenderElement(el)).render(<RowActions label={(cell.data as Data).label} />);
94
+ },
95
+ },
96
+ ],
97
+ ],
98
+ };
99
+
14
100
  return (
15
101
  <>
16
102
  <SampleDescription>
17
103
  <p>
18
- This sample shows KolButton with short key without functionality. The short key is purely visual. Its functionality needs to be developed separately.{' '}
104
+ The first sample shows KolButton with short key without functionality. The short key is purely visual. Its functionality needs to be developed
105
+ separately.
106
+ </p>
107
+ <p>
108
+ The second sample showcases a table where each row contains two KolButtons, each with its own shortcut key. To trigger an action, move the focus to
109
+ any of the &quot;Actions&quot; cells and press &quot;e&quot; or &quot;d.&quot; Doing so will activate the corresponding action and display a Toast
110
+ notification for demonstration purposes.
19
111
  </p>
20
112
  </SampleDescription>
21
113
 
@@ -34,6 +126,15 @@ export const ButtonShortKey: FC = () => {
34
126
  _on={dummyEventHandler}
35
127
  />
36
128
  </div>
129
+
130
+ <KolHeading _level={2} _label="Interactive sample" className="mt" />
131
+
132
+ <KolTableStateful
133
+ _label={`Move focus within one of the "Actions" cells and press "e" or "d" to trigger an action.`}
134
+ _data={DATA}
135
+ _headers={HEADERS}
136
+ _minWidth="400px"
137
+ />
37
138
  </>
38
139
  );
39
140
  };
@@ -248,10 +248,8 @@ export const HandoutBasic: FC = () => {
248
248
  <p>
249
249
  I am <KolAbbr>e.g.</KolAbbr> an abbreviation without label.
250
250
  </p>
251
- <div className="grid grid-cols-2 items-center">
252
- <KolProgress _variant="bar" _max={100} _value={33} _label="Progress" />
253
- <KolProgress _variant="cycle" _max={100} _value={66} _label="Progress" />
254
- </div>
251
+ <KolProgress _variant="bar" _max={100} _value={33} _label="Progress" />
252
+ <KolProgress _variant="cycle" _max={100} _value={66} _label="Progress" />
255
253
  </div>
256
254
  </KolCard>
257
255
  <KolCard className="col-span-6 sm:col-span-6 md:col-span-6 xl:col-span-3" _label="Button, LinkButton and Tab" _level={2}>
@@ -12,8 +12,9 @@ export const IconBasic: FC = () => (
12
12
  </SampleDescription>
13
13
 
14
14
  <div className="grid gap-4">
15
- <KolIcon _label="" _icons="codicon codicon-home" />
15
+ <KolIcon className="block w-[1em] h-[1em]" _label="" _icons="codicon codicon-home" />
16
16
  <KolIcon
17
+ className="block w-[1em] h-[1em]"
17
18
  style={{
18
19
  color: 'red',
19
20
  }}
@@ -8,7 +8,7 @@ export const InputDateCases = forwardRef<HTMLKolInputDateElement, Components.Kol
8
8
  return (
9
9
  <div className="grid gap-4">
10
10
  <div className="black-background">
11
- <KolInputDate {...props} _type="date" _label="Date input (Black background test)" _required />{' '}
11
+ <KolInputDate {...props} _type="date" _label="Date input (Black background test)" _required />
12
12
  </div>
13
13
  <KolInputDate {...props} _type="datetime-local" _label="Local-Datetime (Standard)" _required />
14
14
  <KolInputDate
@@ -4,17 +4,19 @@ import { InputRadioCases } from './cases';
4
4
 
5
5
  import type { Components } from '@public-ui/components';
6
6
  import { SampleColumns } from '../../SampleColumns';
7
+ import { KolHeading } from '@public-ui/react';
8
+
7
9
  export const InputRadioVariants = forwardRef<HTMLKolInputRadioElement, Components.KolInputRadio>(function InputRadioVariant(props, ref) {
8
10
  return (
9
11
  <SampleColumns>
10
- <fieldset>
11
- <legend>Radio</legend>
12
+ <div className="border border-solid border-dark-100 p-3">
13
+ <KolHeading _level={2} _label="Radio" className="block mb-2" />
12
14
  <InputRadioCases {...props} />
13
- </fieldset>
14
- <fieldset>
15
- <legend>Radio (hideLabel)</legend>
15
+ </div>
16
+ <div className="border border-solid border-dark-100 p-3">
17
+ <KolHeading _level={2} _label="Radio (hideLabel)" className="block mb-2" />
16
18
  <InputRadioCases ref={ref} {...props} _hideLabel />
17
- </fieldset>
19
+ </div>
18
20
  </SampleColumns>
19
21
  );
20
22
  });
@@ -8,7 +8,7 @@ export const LinkShortKey: FC = () => (
8
8
  <>
9
9
  <SampleDescription>
10
10
  <p>
11
- This sample shows KolButton with short key without functionality. The short key is purely visual. Its functionality needs to be developed separately.{' '}
11
+ This sample shows KolButton with short key without functionality. The short key is purely visual. Its functionality needs to be developed separately.
12
12
  </p>
13
13
  </SampleDescription>
14
14
 
@@ -0,0 +1,55 @@
1
+ import type { FC } from 'react';
2
+ import { useContext } from 'react';
3
+ import React from 'react';
4
+ import { SampleDescription } from '../SampleDescription';
5
+ import { KolButton, KolPopoverButton, KolBadge } from '@public-ui/react';
6
+ import { useToasterService } from '../../hooks/useToasterService';
7
+ import { HideMenusContext } from '../../shares/HideMenusContext';
8
+
9
+ export const PopoverButtonBasic: FC = () => {
10
+ const hideMenus = useContext(HideMenusContext);
11
+ const { dummyClickEventHandler } = useToasterService();
12
+
13
+ const dummyEventHandler = {
14
+ onClick: dummyClickEventHandler,
15
+ };
16
+
17
+ return (
18
+ <>
19
+ <SampleDescription>
20
+ <p>
21
+ The PopoverButton component combines a button with a popover that appears when clicked. The popover can be positioned in different directions (top,
22
+ right, bottom, left) using the <code>_popoverAlign</code> prop.
23
+ </p>
24
+ </SampleDescription>
25
+ {!hideMenus && <KolBadge className="block mb-3" _label="Component is a DRAFT - Don't use in production yet." _color="#db5461" />}
26
+
27
+ <div className="flex flex-wrap gap-4">
28
+ <KolPopoverButton _label={'Open popover'} _variant="primary" _icons={{ right: 'codicon codicon-chevron-down' }}>
29
+ <KolButton _label="Button within popover" _variant="primary" _on={dummyEventHandler} />
30
+ <br />
31
+ <br />
32
+ <KolButton _label="Second Button within popover" _on={dummyEventHandler} />
33
+ </KolPopoverButton>
34
+
35
+ <KolPopoverButton _label="Open popover" _popoverAlign="right" _icons={{ right: 'codicon codicon-chevron-right' }}>
36
+ <p className="w-sm">
37
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur aut dolore dolores itaque praesentium reprehenderit sed voluptatum!
38
+ Exercitationem ipsa magni maiores modi, placeat quas quos reprehenderit rerum sit veniam vitae.
39
+ </p>
40
+ </KolPopoverButton>
41
+
42
+ <KolPopoverButton _label="icon-only with tooltip" _icons="codicon codicon-info" _tooltipAlign="right" _hideLabel>
43
+ This is an explanation shown on click.
44
+ </KolPopoverButton>
45
+
46
+ <KolPopoverButton _label="">
47
+ <span slot="expert">
48
+ <u>Expert slot content</u>
49
+ </span>
50
+ This sample illustrates a button with expert slot.
51
+ </KolPopoverButton>
52
+ </div>
53
+ </>
54
+ );
55
+ };
@@ -0,0 +1,8 @@
1
+ import { Routes } from '../../shares/types';
2
+ import { PopoverButtonBasic } from './basic';
3
+
4
+ export const POPOVER_BUTTON_ROUTES: Routes = {
5
+ 'popover-button': {
6
+ basic: PopoverButtonBasic,
7
+ },
8
+ };
@@ -11,11 +11,18 @@ export const ProgressBasic: FC = () => (
11
11
  <p>KolProgress renders a progress indicator. The sample shows the variants &quot;bar&quot; and &quot;cycle&quot; with and without labels.</p>
12
12
  </SampleDescription>
13
13
 
14
- <div className="grid gap-4">
15
- <KolProgress _variant="bar" _max={100} _value={0} _label="With label"></KolProgress>
16
- <KolProgress _variant="bar" _max={100} _value={33}></KolProgress>
17
- <KolProgress _variant="bar" _max={100} _value={100}></KolProgress>
18
- <KolProgress _variant="cycle" _max={100} _value={33}></KolProgress>
14
+ <div className="grid gap-4 grid-cols-1 sm:grid-cols-2">
15
+ <fieldset title="Percentages" className="flex flex-col gap-4">
16
+ <KolProgress _variant="bar" _max={7} _value={0}></KolProgress>
17
+ <KolProgress _variant="bar" _max={7} _value={2}></KolProgress>
18
+ <KolProgress _variant="bar" _max={7} _value={7}></KolProgress>
19
+ <KolProgress _variant="cycle" _max={7} _value={6}></KolProgress>
20
+ </fieldset>
21
+ <fieldset title="Custom units" className="flex flex-col gap-4">
22
+ <KolProgress _label="Distance" _variant="bar" _max={65434} _value={7236} _unit="m"></KolProgress>
23
+ <KolProgress _label="12 Tasks to do" _variant="bar" _max={12} _value={5} _unit="tasks completed"></KolProgress>
24
+ <KolProgress _label="Max 150 kg" _variant="cycle" _max={150} _value={42} _unit="kg"></KolProgress>
25
+ </fieldset>
19
26
  </div>
20
27
  </>
21
28
  );
@@ -9,9 +9,8 @@ import { COUNTRY_OPTIONS } from '../../../shares/country';
9
9
 
10
10
  const SALUTATION_OPTIONS: SelectOption<string>[] = [
11
11
  {
12
- label: 'No choice',
12
+ label: 'No salutation',
13
13
  value: '',
14
- disabled: true,
15
14
  },
16
15
  {
17
16
  label: 'Mrs.',
@@ -27,6 +26,10 @@ const SALUTATION_OPTIONS: SelectOption<string>[] = [
27
26
  },
28
27
  ];
29
28
 
29
+ const SALUTATION_OPTIONS_DISABLED = SALUTATION_OPTIONS.map((option, index) =>
30
+ index === 0 ? { label: 'Select salutation', value: '', disabled: true } : option,
31
+ );
32
+
30
33
  type GroupedOptionsType = Record<string, Optgroup<StencilUnknown>>;
31
34
 
32
35
  const groupedOptions: GroupedOptionsType = COUNTRY_OPTIONS.reduce((acc, option) => {
@@ -59,7 +62,7 @@ export const SelectCases = forwardRef<HTMLKolSelectElement, Components.KolSelect
59
62
  }}
60
63
  />
61
64
  <KolSelect {...props} _options={SALUTATION_OPTIONS} _label="Disabled" _disabled />
62
- <KolSelect {...props} _options={SALUTATION_OPTIONS} _label="Salutation with error" _msg={{ _type: 'error', _description: ERROR_MSG }} _touched />
65
+ <KolSelect {...props} _options={SALUTATION_OPTIONS_DISABLED} _label="Salutation with error" _msg={{ _type: 'error', _description: ERROR_MSG }} _touched />
63
66
  <KolSelect {...props} _options={COUNTRY_OPTIONS} _label="Multiple choice" _multiple />
64
67
  <KolSelect
65
68
  {...props}
@@ -7,6 +7,7 @@ import { ERROR_MSG, HINT_MSG } from '../../../shares/constants';
7
7
  import type { Option, StencilUnknown } from '@public-ui/components';
8
8
  import { COUNTRY_OPTIONS } from '../../../shares/country';
9
9
  import type { Components } from '@public-ui/components';
10
+ import { LONG_OPTIONS } from '../../../shares/longOptions';
10
11
 
11
12
  export const SingleSelectCases = (props: Components.KolSingleSelect) => {
12
13
  return (
@@ -37,6 +38,8 @@ export const SingleSelectCases = (props: Components.KolSingleSelect) => {
37
38
  />
38
39
  <KolSingleSelect {...props} _label="With access key" _options={COUNTRY_OPTIONS as Option<StencilUnknown>[]} _value={'de'} _accessKey="c" />
39
40
  <KolSingleSelect {...props} _label="With short key" _options={COUNTRY_OPTIONS as Option<StencilUnknown>[]} _value={'de'} _shortKey="s" />
41
+ <KolSingleSelect {...props} _label="With long labels" _options={LONG_OPTIONS as Option<StencilUnknown>[]} _placeholder="Placeholder" />
42
+ <KolSingleSelect {...props} _label="With hidden clear button" _options={COUNTRY_OPTIONS as Option<StencilUnknown>[]} _value={'de'} _hideClearButton />
40
43
  </div>
41
44
  );
42
45
  };
@@ -59,11 +59,11 @@ export const TableSortData: FC = () => (
59
59
 
60
60
  <section className="w-full grid gap-4">
61
61
  <section className="grid gap-4">
62
- <KolHeading _level={2} _label="Vertical" />
62
+ <KolHeading _level={2} _label="Vertical headers" />
63
63
  <KolTableStateful _label="Sort a date column" _minWidth="auto" _data={DATA.slice(0, 10)} _headers={HEADERS_VERTICAL} className="block" />
64
64
  </section>
65
65
  <section className="grid gap-4">
66
- <KolHeading _level={2} _label="Horizontal" />
66
+ <KolHeading _level={2} _label="Horizontal headers" />
67
67
  <KolTableStateful _label="Sort a date column" _minWidth="auto" _data={DATA} _headers={HEADERS_HORIZONTAL} className="block" />
68
68
  </section>
69
69
  </section>
@@ -10,6 +10,8 @@ import { useToasterService } from '../../hooks/useToasterService';
10
10
  const DATA = [
11
11
  { id: '1001', name: 'Foo Bar', internalIdentifier: `AAA1001` },
12
12
  { id: '1002', name: 'Foo Baz', internalIdentifier: `AAA1002` },
13
+ { id: '1003', name: 'This row is always unchecked', internalIdentifier: `AAA1003` },
14
+ { id: '1004', name: 'This row is always checked', internalIdentifier: `AAA1004` },
13
15
  ];
14
16
  type Data = (typeof DATA)[0];
15
17
 
@@ -28,7 +30,8 @@ export const TableStatefulWithSelection: FC = () => {
28
30
 
29
31
  const selection: KoliBriTableSelection = {
30
32
  label: (row) => `Selection for ${(row as Data).name}`,
31
- selectedKeys: selectedValue ? selectedValue.map((element) => element.internalIdentifier) : [],
33
+ selectedKeys: selectedValue ? selectedValue.map((element) => element.internalIdentifier) : ['AAA1004'],
34
+ disabledKeys: ['AAA1003', 'AAA1004'],
32
35
  keyPropertyName: 'internalIdentifier',
33
36
  };
34
37
 
@@ -10,6 +10,8 @@ import { useToasterService } from '../../hooks/useToasterService';
10
10
  const DATA = [
11
11
  { id: '1001', name: 'Foo Bar', internalIdentifier: `AAA1001` },
12
12
  { id: '1002', name: 'Foo Baz', internalIdentifier: `AAA1002` },
13
+ { id: '1003', name: 'This row is always unchecked', internalIdentifier: `AAA1003` },
14
+ { id: '1004', name: 'This row is always checked', internalIdentifier: `AAA1004` },
13
15
  ];
14
16
  type Data = (typeof DATA)[0];
15
17
 
@@ -24,12 +26,13 @@ function KolButtonWrapper({ label }: { label: string }) {
24
26
  }
25
27
 
26
28
  export const TableStatelessWithSelection: FC = () => {
27
- const [selectedKeys, setSelectedKeys] = useState(['AAA1002']);
29
+ const [selectedKeys, setSelectedKeys] = useState(['AAA1002', 'AAA1004']);
28
30
 
29
31
  const selection: KoliBriTableSelection = {
30
32
  label: (row) => `Selection for ${(row as Data).name}`,
31
33
  selectedKeys,
32
34
  keyPropertyName: 'internalIdentifier',
35
+ disabledKeys: ['AAA1003', 'AAA1004'],
33
36
  };
34
37
 
35
38
  const kolTableStatelessRef = useRef<HTMLKolTableStatelessElement>(null);
@@ -10,6 +10,7 @@ import { useToasterService } from '../../hooks/useToasterService';
10
10
  const DATA = [
11
11
  { id: '1001', name: 'Foo Bar', internalIdentifier: `AAA1001` },
12
12
  { id: '1002', name: 'Foo Baz', internalIdentifier: `AAA1002` },
13
+ { id: '1003', name: 'Foo Disabled', internalIdentifier: `AAA1003` },
13
14
  ];
14
15
  type Data = (typeof DATA)[0];
15
16
 
@@ -30,6 +31,7 @@ export const TableStatelessWithSingleSelection: FC = () => {
30
31
  label: (row) => `Selection for ${(row as Data).name}`,
31
32
  multiple: false,
32
33
  selectedKeys,
34
+ disabledKeys: ['AAA1003'],
33
35
  keyPropertyName: 'internalIdentifier',
34
36
  };
35
37
 
@@ -34,6 +34,7 @@ export const TreeBasic: FC = () => {
34
34
  <KolTree _label="Sitemap" class="block w-fit">
35
35
  <KolTreeItem _label={homeLabel} {...getItemProps('home')}></KolTreeItem>
36
36
  <KolTreeItem _label="2 About (open initially)" {...getItemProps('about')} _open>
37
+ <KolTreeItem _label="2.0 Legal" {...getItemProps('legal')}></KolTreeItem>
37
38
  <KolTreeItem _label="2.1 Team" {...getItemProps('team')}>
38
39
  <KolTreeItem _label="2.1.1. Values" {...getItemProps('values')}></KolTreeItem>
39
40
  <KolTreeItem _label="2.1.2. Members" {...getItemProps('members')}>
@@ -6,7 +6,6 @@ import { setTagNameTransformer } from '@public-ui/react';
6
6
  import { bootstrap, KoliBriDevHelper } from '@public-ui/components';
7
7
  import { defineCustomElements } from '@public-ui/components/dist/loader';
8
8
  import { DEFAULT } from '@public-ui/theme-default';
9
- import { ECL_EC, ECL_EU } from '@public-ui-/theme-ecl';
10
9
 
11
10
  import { App } from './App';
12
11
 
@@ -35,8 +34,17 @@ const getThemes = async () => {
35
34
  return [theme];
36
35
  }
37
36
 
37
+ const optionalThemes: Theme[] = [];
38
+ const { ECL_EC, ECL_EU } = await import('@public-ui-/theme-ecl');
39
+
40
+ if (ECL_EC && ECL_EU) {
41
+ optionalThemes.push(ECL_EC, ECL_EU);
42
+ } else {
43
+ console.warn('Theme package @public-ui-/theme-ecl not available. Continuing without it.');
44
+ }
45
+
38
46
  /* List of regular sample app themes */
39
- return [DEFAULT, ECL_EC, ECL_EU] as Theme[];
47
+ return [DEFAULT, ...optionalThemes] as Theme[];
40
48
  };
41
49
 
42
50
  void (async () => {
@@ -228,7 +228,7 @@ export const ChangeTabindex: FC = () => {
228
228
  </KolSplitButton>
229
229
  <KolSplitButton _label="InputText 3, Tabindex 2" tabIndex={2}>
230
230
  Dropdown-Inhalt
231
- </KolSplitButton>{' '}
231
+ </KolSplitButton>
232
232
  <KolSplitButton _label="InputText 4, Tabindex 1" tabIndex={1}>
233
233
  Dropdown-Inhalt
234
234
  </KolSplitButton>
@@ -1,4 +1,4 @@
1
- @import '../../@shared/mixins';
1
+ @use '../../@shared/mixins' as *;
2
2
 
3
3
  .mainlayout {
4
4
  min-height: calc(100vh - rem(32));
@@ -9,11 +9,11 @@
9
9
  grid-template-rows: 1fr;
10
10
  grid-template-areas: 'nav content';
11
11
 
12
- & > .nav-area {
12
+ &>.nav-area {
13
13
  grid-area: nav;
14
14
  }
15
15
 
16
- & > .content {
16
+ &>.content {
17
17
  grid-area: content;
18
18
  }
19
- }
19
+ }
@@ -0,0 +1,15 @@
1
+ export const LONG_OPTIONS = [
2
+ { value: '1', label: 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam' },
3
+ { value: '2', label: 'Lorem ipsum dolor' },
4
+ {
5
+ value: '3',
6
+ label:
7
+ 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
8
+ },
9
+ { value: '4', label: 'Lorem ipsum dolor' },
10
+ { value: '5', label: 'Lorem ipsum dolor' },
11
+ { value: '6', label: 'Lorem ipsum dolor' },
12
+ { value: '7', label: 'Lorem ipsum dolor' },
13
+ { value: '8', label: 'Lorem ipsum dolor' },
14
+ { value: '2', label: 'Lorem ipsum dolor' },
15
+ ];
@@ -30,8 +30,10 @@ import { LINK_ROUTES } from '../components/link/routes';
30
30
  import { MODAL_ROUTES } from '../components/modal/routes';
31
31
  import { NAV_ROUTES } from '../components/nav/routes';
32
32
  import { PAGINATION_ROUTES } from '../components/pagination/routes';
33
+ import { POPOVER_BUTTON_ROUTES } from '../components/popover-button/routes';
33
34
  import { PROGRESS_ROUTES } from '../components/progress/routes';
34
35
  import { QUOTE_ROUTES } from '../components/quote/routes';
36
+ import { SCENARIO_ROUTES } from '../scenarios/routes';
35
37
  import { SELECT_ROUTES } from '../components/select/routes';
36
38
  import { SKIP_NAV_ROUTES } from '../components/skip-nav/routes';
37
39
  import { SPIN_ROUTES } from '../components/spin/routes';
@@ -42,7 +44,6 @@ import { TEXTAREA_ROUTES } from '../components/textarea/routes';
42
44
  import { TOAST_ROUTES } from '../components/toast/routes';
43
45
  import { TOOLBAR_ROUTES } from '../components/toolbar/routes';
44
46
  import { VERSION_ROUTES } from '../components/version/routes';
45
- import { SCENARIO_ROUTES } from '../scenarios/routes';
46
47
  import { Routes } from './types';
47
48
  import { TREE_ROUTES } from '../components/tree/routes';
48
49
  import { COMBOBOX_ROUTES } from '../components/combobox/routes';
@@ -82,6 +83,7 @@ export const ROUTES: Routes = {
82
83
  ...MODAL_ROUTES,
83
84
  ...NAV_ROUTES,
84
85
  ...PAGINATION_ROUTES,
86
+ ...POPOVER_BUTTON_ROUTES,
85
87
  ...PROGRESS_ROUTES,
86
88
  ...QUOTE_ROUTES,
87
89
  ...SELECT_ROUTES,