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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) 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/TsSearchHeader/TsSearchHeader.css +98 -0
  5. package/esm/layouts/TsSearchHeader/TsSearchHeader.d.ts +5 -0
  6. package/esm/layouts/TsSearchHeader/TsSearchHeader.js +25 -0
  7. package/esm/layouts/TsSearchHeader/TsSearchHeader.js.map +1 -0
  8. package/esm/layouts/TsSearchHeader/TsSearchHeader.types.d.ts +14 -0
  9. package/esm/layouts/TsSearchHeader/TsSearchHeader.types.js +2 -0
  10. package/esm/layouts/TsSearchHeader/TsSearchHeader.types.js.map +1 -0
  11. package/esm/layouts/TsSearchHeader/__stories__/TsSearchHeader.stories.mdx +39 -0
  12. package/lib/index.d.ts +1 -0
  13. package/lib/index.js +1 -0
  14. package/lib/index.js.map +1 -1
  15. package/lib/layouts/TsSearchHeader/TsSearchHeader.css +98 -0
  16. package/lib/layouts/TsSearchHeader/TsSearchHeader.d.ts +5 -0
  17. package/lib/layouts/TsSearchHeader/TsSearchHeader.js +30 -0
  18. package/lib/layouts/TsSearchHeader/TsSearchHeader.js.map +1 -0
  19. package/lib/layouts/TsSearchHeader/TsSearchHeader.types.d.ts +14 -0
  20. package/lib/layouts/TsSearchHeader/TsSearchHeader.types.js +3 -0
  21. package/lib/layouts/TsSearchHeader/TsSearchHeader.types.js.map +1 -0
  22. package/lib/layouts/TsSearchHeader/__stories__/TsSearchHeader.stories.mdx +39 -0
  23. package/package.json +1 -1
  24. package/src/index.ts +1 -0
  25. package/src/layouts/TsSearchHeader/TsSearchHeader.css +98 -0
  26. package/src/layouts/TsSearchHeader/TsSearchHeader.tsx +58 -0
  27. package/src/layouts/TsSearchHeader/TsSearchHeader.types.ts +11 -0
  28. 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"}
@@ -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"}
@@ -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.0",
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';
@@ -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} />