@dktunited-techoff/techoff-suite-ui 1.10.13 → 1.11.1

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 (38) hide show
  1. package/esm/index.d.ts +1 -0
  2. package/esm/index.js +1 -0
  3. package/esm/index.js.map +1 -1
  4. package/esm/layouts/TsHeader/TsHeader.css +1 -1
  5. package/esm/layouts/TsHeader/TsHeader.d.ts +1 -1
  6. package/esm/layouts/TsHeader/TsHeader.js +2 -1
  7. package/esm/layouts/TsHeader/TsHeader.js.map +1 -1
  8. package/esm/layouts/TsSearchHeader/TsSearchHeader.css +98 -0
  9. package/esm/layouts/TsSearchHeader/TsSearchHeader.d.ts +5 -0
  10. package/esm/layouts/TsSearchHeader/TsSearchHeader.js +25 -0
  11. package/esm/layouts/TsSearchHeader/TsSearchHeader.js.map +1 -0
  12. package/esm/layouts/TsSearchHeader/TsSearchHeader.types.d.ts +14 -0
  13. package/esm/layouts/TsSearchHeader/TsSearchHeader.types.js +2 -0
  14. package/esm/layouts/TsSearchHeader/TsSearchHeader.types.js.map +1 -0
  15. package/esm/layouts/TsSearchHeader/__stories__/TsSearchHeader.stories.mdx +39 -0
  16. package/lib/index.d.ts +1 -0
  17. package/lib/index.js +1 -0
  18. package/lib/index.js.map +1 -1
  19. package/lib/layouts/TsHeader/TsHeader.css +1 -1
  20. package/lib/layouts/TsHeader/TsHeader.d.ts +1 -1
  21. package/lib/layouts/TsHeader/TsHeader.js +2 -1
  22. package/lib/layouts/TsHeader/TsHeader.js.map +1 -1
  23. package/lib/layouts/TsSearchHeader/TsSearchHeader.css +98 -0
  24. package/lib/layouts/TsSearchHeader/TsSearchHeader.d.ts +5 -0
  25. package/lib/layouts/TsSearchHeader/TsSearchHeader.js +30 -0
  26. package/lib/layouts/TsSearchHeader/TsSearchHeader.js.map +1 -0
  27. package/lib/layouts/TsSearchHeader/TsSearchHeader.types.d.ts +14 -0
  28. package/lib/layouts/TsSearchHeader/TsSearchHeader.types.js +3 -0
  29. package/lib/layouts/TsSearchHeader/TsSearchHeader.types.js.map +1 -0
  30. package/lib/layouts/TsSearchHeader/__stories__/TsSearchHeader.stories.mdx +39 -0
  31. package/package.json +1 -1
  32. package/src/index.ts +1 -0
  33. package/src/layouts/TsHeader/TsHeader.css +1 -1
  34. package/src/layouts/TsHeader/TsHeader.tsx +2 -2
  35. package/src/layouts/TsSearchHeader/TsSearchHeader.css +98 -0
  36. package/src/layouts/TsSearchHeader/TsSearchHeader.tsx +58 -0
  37. package/src/layouts/TsSearchHeader/TsSearchHeader.types.ts +11 -0
  38. package/src/layouts/TsSearchHeader/__stories__/TsSearchHeader.stories.mdx +39 -0
package/esm/index.d.ts CHANGED
@@ -12,3 +12,4 @@ export * from './components/TsTooltip/TsTooltip';
12
12
  export * from './layouts/TsHeader/TsHeader';
13
13
  export * from './layouts/TsHeader/TsHeaderProfile';
14
14
  export * from './layouts/TsNavigation/TsNavigation';
15
+ export * from './layouts/TsSearchHeader/TsSearchHeader';
package/esm/index.js CHANGED
@@ -12,4 +12,5 @@ export * from './components/TsTooltip/TsTooltip';
12
12
  export * from './layouts/TsHeader/TsHeader';
13
13
  export * from './layouts/TsHeader/TsHeaderProfile';
14
14
  export * from './layouts/TsNavigation/TsNavigation';
15
+ export * from './layouts/TsSearchHeader/TsSearchHeader';
15
16
  //# sourceMappingURL=index.js.map
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,4DAA4D,CAAC;AAC3E,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oDAAoD,CAAC;AACnE,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,4DAA4D,CAAC;AAC3E,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oDAAoD,CAAC;AACnE,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC"}
@@ -29,7 +29,7 @@ header {
29
29
  .ts-header-search-bar {
30
30
  display: flex;
31
31
  align-items: center;
32
- width: 400px;
32
+ width: 450px;
33
33
  height: 100%;
34
34
  }
35
35
  .ts-header-actions {
@@ -1,4 +1,4 @@
1
1
  import * as React from 'react';
2
2
  import { TsHeaderProps } from './TsHeader.types';
3
3
  import './TsHeader.css';
4
- export declare const TsHeader: ({ actions, appName }: TsHeaderProps) => React.JSX.Element;
4
+ export declare const TsHeader: ({ actions, appName, search }: TsHeaderProps) => React.JSX.Element;
@@ -1,12 +1,13 @@
1
1
  import * as React from 'react';
2
2
  import { icons } from '../../components/TsIcon/icons';
3
3
  import './TsHeader.css';
4
- export const TsHeader = ({ actions, appName }) => {
4
+ export const TsHeader = ({ actions, appName, search }) => {
5
5
  // #########
6
6
  // Rendering
7
7
  return (React.createElement("header", null,
8
8
  React.createElement("div", { className: "ts-header-aside" },
9
9
  React.createElement("div", { className: "ts-header-techoff", dangerouslySetInnerHTML: { __html: icons[`header-${appName}`] } })),
10
+ search && React.createElement("div", { className: "header-search-bar" }, search),
10
11
  React.createElement("div", { className: "ts-header-aside ts-header-right-side" },
11
12
  React.createElement("div", { className: "ts-header-actions" }, actions))));
12
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TsHeader.js","sourceRoot":"","sources":["../../../src/layouts/TsHeader/TsHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAEtD,OAAO,gBAAgB,CAAC;AAExB,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAiB,EAAE,EAAE;IAC9D,YAAY;IACZ,YAAY;IACZ,OAAO,CACL;QACE,6BAAK,SAAS,EAAC,iBAAiB;YAC9B,6BAAK,SAAS,EAAC,mBAAmB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,EAAE,GAAI,CAClG;QAEN,6BAAK,SAAS,EAAC,sCAAsC;YACnD,6BAAK,SAAS,EAAC,mBAAmB,IAAE,OAAO,CAAO,CAC9C,CACC,CACV,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"TsHeader.js","sourceRoot":"","sources":["../../../src/layouts/TsHeader/TsHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAEtD,OAAO,gBAAgB,CAAC;AAExB,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAiB,EAAE,EAAE;IACtE,YAAY;IACZ,YAAY;IACZ,OAAO,CACL;QACE,6BAAK,SAAS,EAAC,iBAAiB;YAC9B,6BAAK,SAAS,EAAC,mBAAmB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,EAAE,GAAI,CAClG;QACL,MAAM,IAAI,6BAAK,SAAS,EAAC,mBAAmB,IAAE,MAAM,CAAO;QAC5D,6BAAK,SAAS,EAAC,sCAAsC;YACnD,6BAAK,SAAS,EAAC,mBAAmB,IAAE,OAAO,CAAO,CAC9C,CACC,CACV,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,98 @@
1
+ .ts-search-header {
2
+ position: relative;
3
+ width: 450px;
4
+ height: 32px;
5
+ }
6
+
7
+ .ts-search-header-input-container {
8
+ display: flex;
9
+ width: 100%;
10
+ height: 100%;
11
+ border-radius: 9999px;
12
+ border: none;
13
+ box-shadow: 0px 12px 9px 0px #10101012;
14
+ background: white;
15
+ }
16
+
17
+ .ts-search-header-input-container-icon {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ width: 48px;
22
+ height: 32px;
23
+ color: #687787;
24
+ }
25
+
26
+ .ts-search-header-bar-input {
27
+ display: flex;
28
+ flex: 1;
29
+ align-items: center;
30
+ justify-content: center;
31
+ height: 32px;
32
+ color: #8c96a2;
33
+ overflow: hidden;
34
+ text-overflow: ellipsis;
35
+ white-space: nowrap;
36
+ }
37
+
38
+ .ts-search-header-bar-input input {
39
+ width: 100%;
40
+ height: 100%;
41
+ border: none;
42
+ }
43
+
44
+ .ts-search-header-bar-input input::placeholder {
45
+ text-align: center;
46
+ }
47
+
48
+ .ts-search-header-dropdown {
49
+ position: absolute;
50
+ top: 100%;
51
+ width: 450px;
52
+ max-height: 250px;
53
+ padding: 12px;
54
+ box-shadow: 0px 8px 9px 0px #1010101a;
55
+ background: white;
56
+ transform: translateY(10px);
57
+ overflow: auto;
58
+ }
59
+
60
+ .ts-search-header-loader {
61
+ display: flex;
62
+ justify-content: center;
63
+ }
64
+
65
+ .ts-search-header-message {
66
+ text-align: center;
67
+ font-style: italic;
68
+ color: #4e5d6b;
69
+ }
70
+
71
+ .ts-search-header-items {
72
+ width: 100%;
73
+ height: 100%;
74
+ }
75
+
76
+ .ts-search-header-item {
77
+ width: 100%;
78
+ height: 32px;
79
+ padding: 0 12px;
80
+ border: none;
81
+ background: white;
82
+ text-align: left;
83
+ cursor: pointer;
84
+ }
85
+
86
+ .ts-search-header-item:hover {
87
+ background: #ebecf7;
88
+ }
89
+
90
+ /* ######### */
91
+ /* GLOBALS */
92
+ * {
93
+ font-size: 14px;
94
+ outline: none;
95
+ box-sizing: border-box;
96
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans',
97
+ 'Helvetica Neue', sans-serif;
98
+ }
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ import { TsSearchHeaderProps, TsSearchHeaderItemProps } from './TsSearchHeader.types';
3
+ import './TsSearchHeader.css';
4
+ export declare const TsSearchHeaderItem: ({ id, label, onClick }: TsSearchHeaderItemProps) => React.JSX.Element;
5
+ export declare const TsSearchHeader: ({ placeholder, noItemMessage, isLoading, value, items, onChange, }: TsSearchHeaderProps) => React.JSX.Element;
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+ import { TsIcon } from '../../components/TsIcon/TsIcon';
3
+ import { TsLoader } from '../../components/TsLoader/TsLoader';
4
+ import './TsSearchHeader.css';
5
+ export const TsSearchHeaderItem = ({ id, label, onClick }) => {
6
+ // Rendering
7
+ return (React.createElement("button", { className: "ts-search-header-item", id: id, onClick: onClick },
8
+ React.createElement("div", { className: "ts-search-header-item-label" }, label)));
9
+ };
10
+ export const TsSearchHeader = ({ placeholder, noItemMessage, isLoading, value, items, onChange, }) => {
11
+ // Rendering
12
+ return (React.createElement("div", { className: "ts-search-header" },
13
+ React.createElement("div", { className: "ts-search-header-input-container" },
14
+ React.createElement("div", { className: "ts-search-header-input-container-icon" },
15
+ React.createElement(TsIcon, { name: "search", size: "16" })),
16
+ React.createElement("div", { className: "ts-search-header-bar-input" },
17
+ React.createElement("input", { id: "search", name: "search", placeholder: placeholder, value: value, onChange: e => onChange(e.target.value) })),
18
+ React.createElement("div", { className: "ts-search-header-input-container-icon" })),
19
+ value && (React.createElement("div", { className: "ts-search-header-dropdown" },
20
+ isLoading && (React.createElement("div", { className: "ts-search-header-loader" },
21
+ React.createElement(TsLoader, { size: "sm" }))),
22
+ !isLoading && (!items || items.length === 0) && (React.createElement("div", { className: "ts-search-header-message" }, noItemMessage ?? 'No item found.')),
23
+ !isLoading && items && items.length > 0 && React.createElement("div", { className: "ts-search-header-items" }, items)))));
24
+ };
25
+ //# sourceMappingURL=TsSearchHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TsSearchHeader.js","sourceRoot":"","sources":["../../../src/layouts/TsSearchHeader/TsSearchHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,sBAAsB,CAAC;AAE9B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAA2B,EAAE,EAAE;IACpF,YAAY;IACZ,OAAO,CACL,gCAAQ,SAAS,EAAC,uBAAuB,EAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO;QAChE,6BAAK,SAAS,EAAC,6BAA6B,IAAE,KAAK,CAAO,CACnD,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC7B,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,EACL,KAAK,EACL,QAAQ,GACY,EAAE,EAAE;IACxB,YAAY;IACZ,OAAO,CACL,6BAAK,SAAS,EAAC,kBAAkB;QAC/B,6BAAK,SAAS,EAAC,kCAAkC;YAC/C,6BAAK,SAAS,EAAC,uCAAuC;gBACpD,oBAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,GAAG,CAC9B;YACN,6BAAK,SAAS,EAAC,4BAA4B;gBACzC,+BACE,EAAE,EAAC,QAAQ,EACX,IAAI,EAAC,QAAQ,EACb,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GACvC,CACE;YACN,6BAAK,SAAS,EAAC,uCAAuC,GAAG,CACrD;QAEL,KAAK,IAAI,CACR,6BAAK,SAAS,EAAC,2BAA2B;YACvC,SAAS,IAAI,CACZ,6BAAK,SAAS,EAAC,yBAAyB;gBACtC,oBAAC,QAAQ,IAAC,IAAI,EAAC,IAAI,GAAG,CAClB,CACP;YACA,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAC/C,6BAAK,SAAS,EAAC,0BAA0B,IAAE,aAAa,IAAI,gBAAgB,CAAO,CACpF;YACA,CAAC,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,6BAAK,SAAS,EAAC,wBAAwB,IAAE,KAAK,CAAO,CAC7F,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { ReactElement } from 'react';
2
+ export type TsSearchHeaderItemProps = {
3
+ id: string;
4
+ label: string;
5
+ onClick?: () => void;
6
+ };
7
+ export type TsSearchHeaderProps = {
8
+ placeholder?: string;
9
+ noItemMessage?: string;
10
+ value: string;
11
+ isLoading?: boolean;
12
+ items?: ReactElement[];
13
+ onChange: (val: string) => void;
14
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TsSearchHeader.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TsSearchHeader.types.js","sourceRoot":"","sources":["../../../src/layouts/TsSearchHeader/TsSearchHeader.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { ArgsTable, Canvas, Meta, Story } from '@storybook/blocks';
3
+ import { TsSearchHeader, TsSearchHeaderItem } from '../TsSearchHeader';
4
+
5
+ <Meta title="Layouts/Search header" />
6
+
7
+ # Search header
8
+
9
+ Search allows users to specify a word or phrase to find relevant content without using navigation. Search can be used as the primary means of discovering content or as a filter to help the user find content.
10
+
11
+ ## Overview
12
+
13
+ <Canvas>
14
+ <Story
15
+ name="Overview"
16
+ args={{
17
+ placeholder: "Search a product by name, by conception code",
18
+ noItemMessage: "",
19
+ value: "",
20
+ isLoading: false,
21
+ items: [
22
+ <TsSearchHeaderItem id="1" label="Item 1" />,
23
+ <TsSearchHeaderItem id="2" label="Item 2" />,
24
+ <TsSearchHeaderItem id="3" label="Item 3" />,
25
+ <TsSearchHeaderItem id="4" label="Item 4" />,
26
+ ],
27
+ onChange: () => undefined,
28
+ }}
29
+
30
+ >
31
+
32
+ {args => <div style={{display: 'flex', width: '100%', height: '300px', justifyContent: 'center'}}><TsSearchHeader {...args} /></div>}
33
+
34
+ </Story>
35
+ </Canvas>
36
+
37
+ ## Props
38
+
39
+ <ArgsTable story="Overview" of={TsSearchHeader} />
package/lib/index.d.ts CHANGED
@@ -12,3 +12,4 @@ export * from './components/TsTooltip/TsTooltip';
12
12
  export * from './layouts/TsHeader/TsHeader';
13
13
  export * from './layouts/TsHeader/TsHeaderProfile';
14
14
  export * from './layouts/TsNavigation/TsNavigation';
15
+ export * from './layouts/TsSearchHeader/TsSearchHeader';
package/lib/index.js CHANGED
@@ -28,4 +28,5 @@ __exportStar(require("./components/TsTooltip/TsTooltip"), exports);
28
28
  __exportStar(require("./layouts/TsHeader/TsHeader"), exports);
29
29
  __exportStar(require("./layouts/TsHeader/TsHeaderProfile"), exports);
30
30
  __exportStar(require("./layouts/TsNavigation/TsNavigation"), exports);
31
+ __exportStar(require("./layouts/TsSearchHeader/TsSearchHeader"), exports);
31
32
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C;AAC/C,qEAAmD;AACnD,iFAA+D;AAC/D,6FAA2E;AAC3E,6DAA2C;AAC3C,qFAAmE;AACnE,uEAAqD;AACrD,iEAA+C;AAC/C,qEAAmD;AACnD,6DAA2C;AAC3C,mEAAiD;AACjD,8DAA4C;AAC5C,qEAAmD;AACnD,sEAAoD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C;AAC/C,qEAAmD;AACnD,iFAA+D;AAC/D,6FAA2E;AAC3E,6DAA2C;AAC3C,qFAAmE;AACnE,uEAAqD;AACrD,iEAA+C;AAC/C,qEAAmD;AACnD,6DAA2C;AAC3C,mEAAiD;AACjD,8DAA4C;AAC5C,qEAAmD;AACnD,sEAAoD;AACpD,0EAAwD"}
@@ -29,7 +29,7 @@ header {
29
29
  .ts-header-search-bar {
30
30
  display: flex;
31
31
  align-items: center;
32
- width: 400px;
32
+ width: 450px;
33
33
  height: 100%;
34
34
  }
35
35
  .ts-header-actions {
@@ -1,4 +1,4 @@
1
1
  import * as React from 'react';
2
2
  import { TsHeaderProps } from './TsHeader.types';
3
3
  import './TsHeader.css';
4
- export declare const TsHeader: ({ actions, appName }: TsHeaderProps) => React.JSX.Element;
4
+ export declare const TsHeader: ({ actions, appName, search }: TsHeaderProps) => React.JSX.Element;
@@ -4,12 +4,13 @@ exports.TsHeader = void 0;
4
4
  const React = require("react");
5
5
  const icons_1 = require("../../components/TsIcon/icons");
6
6
  require("./TsHeader.css");
7
- const TsHeader = ({ actions, appName }) => {
7
+ const TsHeader = ({ actions, appName, search }) => {
8
8
  // #########
9
9
  // Rendering
10
10
  return (React.createElement("header", null,
11
11
  React.createElement("div", { className: "ts-header-aside" },
12
12
  React.createElement("div", { className: "ts-header-techoff", dangerouslySetInnerHTML: { __html: icons_1.icons[`header-${appName}`] } })),
13
+ search && React.createElement("div", { className: "header-search-bar" }, search),
13
14
  React.createElement("div", { className: "ts-header-aside ts-header-right-side" },
14
15
  React.createElement("div", { className: "ts-header-actions" }, actions))));
15
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TsHeader.js","sourceRoot":"","sources":["../../../src/layouts/TsHeader/TsHeader.tsx"],"names":[],"mappings":";;;AAAA,+BAA+B;AAC/B,yDAAsD;AAEtD,0BAAwB;AAEjB,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAiB,EAAE,EAAE;IAC9D,YAAY;IACZ,YAAY;IACZ,OAAO,CACL;QACE,6BAAK,SAAS,EAAC,iBAAiB;YAC9B,6BAAK,SAAS,EAAC,mBAAmB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,aAAK,CAAC,UAAU,OAAO,EAAE,CAAC,EAAE,GAAI,CAClG;QAEN,6BAAK,SAAS,EAAC,sCAAsC;YACnD,6BAAK,SAAS,EAAC,mBAAmB,IAAE,OAAO,CAAO,CAC9C,CACC,CACV,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,QAAQ,YAcnB"}
1
+ {"version":3,"file":"TsHeader.js","sourceRoot":"","sources":["../../../src/layouts/TsHeader/TsHeader.tsx"],"names":[],"mappings":";;;AAAA,+BAA+B;AAC/B,yDAAsD;AAEtD,0BAAwB;AAEjB,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAiB,EAAE,EAAE;IACtE,YAAY;IACZ,YAAY;IACZ,OAAO,CACL;QACE,6BAAK,SAAS,EAAC,iBAAiB;YAC9B,6BAAK,SAAS,EAAC,mBAAmB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,aAAK,CAAC,UAAU,OAAO,EAAE,CAAC,EAAE,GAAI,CAClG;QACL,MAAM,IAAI,6BAAK,SAAS,EAAC,mBAAmB,IAAE,MAAM,CAAO;QAC5D,6BAAK,SAAS,EAAC,sCAAsC;YACnD,6BAAK,SAAS,EAAC,mBAAmB,IAAE,OAAO,CAAO,CAC9C,CACC,CACV,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,QAAQ,YAcnB"}
@@ -0,0 +1,98 @@
1
+ .ts-search-header {
2
+ position: relative;
3
+ width: 450px;
4
+ height: 32px;
5
+ }
6
+
7
+ .ts-search-header-input-container {
8
+ display: flex;
9
+ width: 100%;
10
+ height: 100%;
11
+ border-radius: 9999px;
12
+ border: none;
13
+ box-shadow: 0px 12px 9px 0px #10101012;
14
+ background: white;
15
+ }
16
+
17
+ .ts-search-header-input-container-icon {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ width: 48px;
22
+ height: 32px;
23
+ color: #687787;
24
+ }
25
+
26
+ .ts-search-header-bar-input {
27
+ display: flex;
28
+ flex: 1;
29
+ align-items: center;
30
+ justify-content: center;
31
+ height: 32px;
32
+ color: #8c96a2;
33
+ overflow: hidden;
34
+ text-overflow: ellipsis;
35
+ white-space: nowrap;
36
+ }
37
+
38
+ .ts-search-header-bar-input input {
39
+ width: 100%;
40
+ height: 100%;
41
+ border: none;
42
+ }
43
+
44
+ .ts-search-header-bar-input input::placeholder {
45
+ text-align: center;
46
+ }
47
+
48
+ .ts-search-header-dropdown {
49
+ position: absolute;
50
+ top: 100%;
51
+ width: 450px;
52
+ max-height: 250px;
53
+ padding: 12px;
54
+ box-shadow: 0px 8px 9px 0px #1010101a;
55
+ background: white;
56
+ transform: translateY(10px);
57
+ overflow: auto;
58
+ }
59
+
60
+ .ts-search-header-loader {
61
+ display: flex;
62
+ justify-content: center;
63
+ }
64
+
65
+ .ts-search-header-message {
66
+ text-align: center;
67
+ font-style: italic;
68
+ color: #4e5d6b;
69
+ }
70
+
71
+ .ts-search-header-items {
72
+ width: 100%;
73
+ height: 100%;
74
+ }
75
+
76
+ .ts-search-header-item {
77
+ width: 100%;
78
+ height: 32px;
79
+ padding: 0 12px;
80
+ border: none;
81
+ background: white;
82
+ text-align: left;
83
+ cursor: pointer;
84
+ }
85
+
86
+ .ts-search-header-item:hover {
87
+ background: #ebecf7;
88
+ }
89
+
90
+ /* ######### */
91
+ /* GLOBALS */
92
+ * {
93
+ font-size: 14px;
94
+ outline: none;
95
+ box-sizing: border-box;
96
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans',
97
+ 'Helvetica Neue', sans-serif;
98
+ }
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ import { TsSearchHeaderProps, TsSearchHeaderItemProps } from './TsSearchHeader.types';
3
+ import './TsSearchHeader.css';
4
+ export declare const TsSearchHeaderItem: ({ id, label, onClick }: TsSearchHeaderItemProps) => React.JSX.Element;
5
+ export declare const TsSearchHeader: ({ placeholder, noItemMessage, isLoading, value, items, onChange, }: TsSearchHeaderProps) => React.JSX.Element;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TsSearchHeader = exports.TsSearchHeaderItem = void 0;
4
+ const React = require("react");
5
+ const TsIcon_1 = require("../../components/TsIcon/TsIcon");
6
+ const TsLoader_1 = require("../../components/TsLoader/TsLoader");
7
+ require("./TsSearchHeader.css");
8
+ const TsSearchHeaderItem = ({ id, label, onClick }) => {
9
+ // Rendering
10
+ return (React.createElement("button", { className: "ts-search-header-item", id: id, onClick: onClick },
11
+ React.createElement("div", { className: "ts-search-header-item-label" }, label)));
12
+ };
13
+ exports.TsSearchHeaderItem = TsSearchHeaderItem;
14
+ const TsSearchHeader = ({ placeholder, noItemMessage, isLoading, value, items, onChange, }) => {
15
+ // Rendering
16
+ return (React.createElement("div", { className: "ts-search-header" },
17
+ React.createElement("div", { className: "ts-search-header-input-container" },
18
+ React.createElement("div", { className: "ts-search-header-input-container-icon" },
19
+ React.createElement(TsIcon_1.TsIcon, { name: "search", size: "16" })),
20
+ React.createElement("div", { className: "ts-search-header-bar-input" },
21
+ React.createElement("input", { id: "search", name: "search", placeholder: placeholder, value: value, onChange: e => onChange(e.target.value) })),
22
+ React.createElement("div", { className: "ts-search-header-input-container-icon" })),
23
+ value && (React.createElement("div", { className: "ts-search-header-dropdown" },
24
+ isLoading && (React.createElement("div", { className: "ts-search-header-loader" },
25
+ React.createElement(TsLoader_1.TsLoader, { size: "sm" }))),
26
+ !isLoading && (!items || items.length === 0) && (React.createElement("div", { className: "ts-search-header-message" }, noItemMessage ?? 'No item found.')),
27
+ !isLoading && items && items.length > 0 && React.createElement("div", { className: "ts-search-header-items" }, items)))));
28
+ };
29
+ exports.TsSearchHeader = TsSearchHeader;
30
+ //# sourceMappingURL=TsSearchHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TsSearchHeader.js","sourceRoot":"","sources":["../../../src/layouts/TsSearchHeader/TsSearchHeader.tsx"],"names":[],"mappings":";;;AAAA,+BAA+B;AAE/B,2DAAwD;AACxD,iEAA8D;AAC9D,gCAA8B;AAEvB,MAAM,kBAAkB,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAA2B,EAAE,EAAE;IACpF,YAAY;IACZ,OAAO,CACL,gCAAQ,SAAS,EAAC,uBAAuB,EAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO;QAChE,6BAAK,SAAS,EAAC,6BAA6B,IAAE,KAAK,CAAO,CACnD,CACV,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,kBAAkB,sBAO7B;AAEK,MAAM,cAAc,GAAG,CAAC,EAC7B,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,EACL,KAAK,EACL,QAAQ,GACY,EAAE,EAAE;IACxB,YAAY;IACZ,OAAO,CACL,6BAAK,SAAS,EAAC,kBAAkB;QAC/B,6BAAK,SAAS,EAAC,kCAAkC;YAC/C,6BAAK,SAAS,EAAC,uCAAuC;gBACpD,oBAAC,eAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,GAAG,CAC9B;YACN,6BAAK,SAAS,EAAC,4BAA4B;gBACzC,+BACE,EAAE,EAAC,QAAQ,EACX,IAAI,EAAC,QAAQ,EACb,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GACvC,CACE;YACN,6BAAK,SAAS,EAAC,uCAAuC,GAAG,CACrD;QAEL,KAAK,IAAI,CACR,6BAAK,SAAS,EAAC,2BAA2B;YACvC,SAAS,IAAI,CACZ,6BAAK,SAAS,EAAC,yBAAyB;gBACtC,oBAAC,mBAAQ,IAAC,IAAI,EAAC,IAAI,GAAG,CAClB,CACP;YACA,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAC/C,6BAAK,SAAS,EAAC,0BAA0B,IAAE,aAAa,IAAI,gBAAgB,CAAO,CACpF;YACA,CAAC,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,6BAAK,SAAS,EAAC,wBAAwB,IAAE,KAAK,CAAO,CAC7F,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AA1CW,QAAA,cAAc,kBA0CzB"}
@@ -0,0 +1,14 @@
1
+ import { ReactElement } from 'react';
2
+ export type TsSearchHeaderItemProps = {
3
+ id: string;
4
+ label: string;
5
+ onClick?: () => void;
6
+ };
7
+ export type TsSearchHeaderProps = {
8
+ placeholder?: string;
9
+ noItemMessage?: string;
10
+ value: string;
11
+ isLoading?: boolean;
12
+ items?: ReactElement[];
13
+ onChange: (val: string) => void;
14
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=TsSearchHeader.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TsSearchHeader.types.js","sourceRoot":"","sources":["../../../src/layouts/TsSearchHeader/TsSearchHeader.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { ArgsTable, Canvas, Meta, Story } from '@storybook/blocks';
3
+ import { TsSearchHeader, TsSearchHeaderItem } from '../TsSearchHeader';
4
+
5
+ <Meta title="Layouts/Search header" />
6
+
7
+ # Search header
8
+
9
+ Search allows users to specify a word or phrase to find relevant content without using navigation. Search can be used as the primary means of discovering content or as a filter to help the user find content.
10
+
11
+ ## Overview
12
+
13
+ <Canvas>
14
+ <Story
15
+ name="Overview"
16
+ args={{
17
+ placeholder: "Search a product by name, by conception code",
18
+ noItemMessage: "",
19
+ value: "",
20
+ isLoading: false,
21
+ items: [
22
+ <TsSearchHeaderItem id="1" label="Item 1" />,
23
+ <TsSearchHeaderItem id="2" label="Item 2" />,
24
+ <TsSearchHeaderItem id="3" label="Item 3" />,
25
+ <TsSearchHeaderItem id="4" label="Item 4" />,
26
+ ],
27
+ onChange: () => undefined,
28
+ }}
29
+
30
+ >
31
+
32
+ {args => <div style={{display: 'flex', width: '100%', height: '300px', justifyContent: 'center'}}><TsSearchHeader {...args} /></div>}
33
+
34
+ </Story>
35
+ </Canvas>
36
+
37
+ ## Props
38
+
39
+ <ArgsTable story="Overview" of={TsSearchHeader} />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dktunited-techoff/techoff-suite-ui",
3
- "version": "1.10.13",
3
+ "version": "1.11.1",
4
4
  "main": "lib/index.js",
5
5
  "types": "./lib",
6
6
  "module": "esm/index.js",
package/src/index.ts CHANGED
@@ -12,3 +12,4 @@ export * from './components/TsTooltip/TsTooltip';
12
12
  export * from './layouts/TsHeader/TsHeader';
13
13
  export * from './layouts/TsHeader/TsHeaderProfile';
14
14
  export * from './layouts/TsNavigation/TsNavigation';
15
+ export * from './layouts/TsSearchHeader/TsSearchHeader';
@@ -29,7 +29,7 @@ header {
29
29
  .ts-header-search-bar {
30
30
  display: flex;
31
31
  align-items: center;
32
- width: 400px;
32
+ width: 450px;
33
33
  height: 100%;
34
34
  }
35
35
  .ts-header-actions {
@@ -3,7 +3,7 @@ import { icons } from '../../components/TsIcon/icons';
3
3
  import { TsHeaderProps } from './TsHeader.types';
4
4
  import './TsHeader.css';
5
5
 
6
- export const TsHeader = ({ actions, appName }: TsHeaderProps) => {
6
+ export const TsHeader = ({ actions, appName, search }: TsHeaderProps) => {
7
7
  // #########
8
8
  // Rendering
9
9
  return (
@@ -11,7 +11,7 @@ export const TsHeader = ({ actions, appName }: TsHeaderProps) => {
11
11
  <div className="ts-header-aside">
12
12
  <div className="ts-header-techoff" dangerouslySetInnerHTML={{ __html: icons[`header-${appName}`] }} />
13
13
  </div>
14
- {/* {search && <div className="header-search-bar">{search}</div>} */}
14
+ {search && <div className="header-search-bar">{search}</div>}
15
15
  <div className="ts-header-aside ts-header-right-side">
16
16
  <div className="ts-header-actions">{actions}</div>
17
17
  </div>
@@ -0,0 +1,98 @@
1
+ .ts-search-header {
2
+ position: relative;
3
+ width: 450px;
4
+ height: 32px;
5
+ }
6
+
7
+ .ts-search-header-input-container {
8
+ display: flex;
9
+ width: 100%;
10
+ height: 100%;
11
+ border-radius: 9999px;
12
+ border: none;
13
+ box-shadow: 0px 12px 9px 0px #10101012;
14
+ background: white;
15
+ }
16
+
17
+ .ts-search-header-input-container-icon {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ width: 48px;
22
+ height: 32px;
23
+ color: #687787;
24
+ }
25
+
26
+ .ts-search-header-bar-input {
27
+ display: flex;
28
+ flex: 1;
29
+ align-items: center;
30
+ justify-content: center;
31
+ height: 32px;
32
+ color: #8c96a2;
33
+ overflow: hidden;
34
+ text-overflow: ellipsis;
35
+ white-space: nowrap;
36
+ }
37
+
38
+ .ts-search-header-bar-input input {
39
+ width: 100%;
40
+ height: 100%;
41
+ border: none;
42
+ }
43
+
44
+ .ts-search-header-bar-input input::placeholder {
45
+ text-align: center;
46
+ }
47
+
48
+ .ts-search-header-dropdown {
49
+ position: absolute;
50
+ top: 100%;
51
+ width: 450px;
52
+ max-height: 250px;
53
+ padding: 12px;
54
+ box-shadow: 0px 8px 9px 0px #1010101a;
55
+ background: white;
56
+ transform: translateY(10px);
57
+ overflow: auto;
58
+ }
59
+
60
+ .ts-search-header-loader {
61
+ display: flex;
62
+ justify-content: center;
63
+ }
64
+
65
+ .ts-search-header-message {
66
+ text-align: center;
67
+ font-style: italic;
68
+ color: #4e5d6b;
69
+ }
70
+
71
+ .ts-search-header-items {
72
+ width: 100%;
73
+ height: 100%;
74
+ }
75
+
76
+ .ts-search-header-item {
77
+ width: 100%;
78
+ height: 32px;
79
+ padding: 0 12px;
80
+ border: none;
81
+ background: white;
82
+ text-align: left;
83
+ cursor: pointer;
84
+ }
85
+
86
+ .ts-search-header-item:hover {
87
+ background: #ebecf7;
88
+ }
89
+
90
+ /* ######### */
91
+ /* GLOBALS */
92
+ * {
93
+ font-size: 14px;
94
+ outline: none;
95
+ box-sizing: border-box;
96
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans',
97
+ 'Helvetica Neue', sans-serif;
98
+ }
@@ -0,0 +1,58 @@
1
+ import * as React from 'react';
2
+ import { TsSearchHeaderProps, TsSearchHeaderItemProps } from './TsSearchHeader.types';
3
+ import { TsIcon } from '../../components/TsIcon/TsIcon';
4
+ import { TsLoader } from '../../components/TsLoader/TsLoader';
5
+ import './TsSearchHeader.css';
6
+
7
+ export const TsSearchHeaderItem = ({ id, label, onClick }: TsSearchHeaderItemProps) => {
8
+ // Rendering
9
+ return (
10
+ <button className="ts-search-header-item" id={id} onClick={onClick}>
11
+ <div className="ts-search-header-item-label">{label}</div>
12
+ </button>
13
+ );
14
+ };
15
+
16
+ export const TsSearchHeader = ({
17
+ placeholder,
18
+ noItemMessage,
19
+ isLoading,
20
+ value,
21
+ items,
22
+ onChange,
23
+ }: TsSearchHeaderProps) => {
24
+ // Rendering
25
+ return (
26
+ <div className="ts-search-header">
27
+ <div className="ts-search-header-input-container">
28
+ <div className="ts-search-header-input-container-icon">
29
+ <TsIcon name="search" size="16" />
30
+ </div>
31
+ <div className="ts-search-header-bar-input">
32
+ <input
33
+ id="search"
34
+ name="search"
35
+ placeholder={placeholder}
36
+ value={value}
37
+ onChange={e => onChange(e.target.value)}
38
+ />
39
+ </div>
40
+ <div className="ts-search-header-input-container-icon" />
41
+ </div>
42
+
43
+ {value && (
44
+ <div className="ts-search-header-dropdown">
45
+ {isLoading && (
46
+ <div className="ts-search-header-loader">
47
+ <TsLoader size="sm" />
48
+ </div>
49
+ )}
50
+ {!isLoading && (!items || items.length === 0) && (
51
+ <div className="ts-search-header-message">{noItemMessage ?? 'No item found.'}</div>
52
+ )}
53
+ {!isLoading && items && items.length > 0 && <div className="ts-search-header-items">{items}</div>}
54
+ </div>
55
+ )}
56
+ </div>
57
+ );
58
+ };
@@ -0,0 +1,11 @@
1
+ import { ReactElement } from 'react';
2
+
3
+ export type TsSearchHeaderItemProps = { id: string; label: string; onClick?: () => void };
4
+ export type TsSearchHeaderProps = {
5
+ placeholder?: string;
6
+ noItemMessage?: string;
7
+ value: string;
8
+ isLoading?: boolean;
9
+ items?: ReactElement[];
10
+ onChange: (val: string) => void;
11
+ };
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { ArgsTable, Canvas, Meta, Story } from '@storybook/blocks';
3
+ import { TsSearchHeader, TsSearchHeaderItem } from '../TsSearchHeader';
4
+
5
+ <Meta title="Layouts/Search header" />
6
+
7
+ # Search header
8
+
9
+ Search allows users to specify a word or phrase to find relevant content without using navigation. Search can be used as the primary means of discovering content or as a filter to help the user find content.
10
+
11
+ ## Overview
12
+
13
+ <Canvas>
14
+ <Story
15
+ name="Overview"
16
+ args={{
17
+ placeholder: "Search a product by name, by conception code",
18
+ noItemMessage: "",
19
+ value: "",
20
+ isLoading: false,
21
+ items: [
22
+ <TsSearchHeaderItem id="1" label="Item 1" />,
23
+ <TsSearchHeaderItem id="2" label="Item 2" />,
24
+ <TsSearchHeaderItem id="3" label="Item 3" />,
25
+ <TsSearchHeaderItem id="4" label="Item 4" />,
26
+ ],
27
+ onChange: () => undefined,
28
+ }}
29
+
30
+ >
31
+
32
+ {args => <div style={{display: 'flex', width: '100%', height: '300px', justifyContent: 'center'}}><TsSearchHeader {...args} /></div>}
33
+
34
+ </Story>
35
+ </Canvas>
36
+
37
+ ## Props
38
+
39
+ <ArgsTable story="Overview" of={TsSearchHeader} />