@chayns-ui/layout 0.1.0 → 0.3.2

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.
package/README.md CHANGED
@@ -9,16 +9,21 @@ pnpm add @chayns-ui/layout @chayns-ui/core @chayns-ui/tokens react
9
9
  ```
10
10
 
11
11
  Load the resolved token stylesheet, Core stylesheet required by the host
12
- application, and the AppLayout stylesheet:
12
+ application, and the Layout stylesheet:
13
13
 
14
14
  ```tsx
15
15
  import '@chayns-ui/tokens/baseline.css';
16
16
  import '@chayns-ui/tokens/patch.css';
17
17
  import '@chayns-ui/core/styles.css';
18
- import '@chayns-ui/layout/app-layout.css';
18
+ import '@chayns-ui/layout/styles.css';
19
19
 
20
20
  import { AppLayout } from '@chayns-ui/layout';
21
21
  ```
22
22
 
23
23
  `AppLayout` renders the application shell with a 64px header, recursive
24
- navigation, controlled or uncontrolled sidebar collapse, and consumer content.
24
+ navigation, controlled or uncontrolled sidebar collapse, optional
25
+ `headerContent` beside the logo, and consumer content.
26
+
27
+ Alternatively, the component stylesheet is available as
28
+ `@chayns-ui/layout/app-layout.css` or
29
+ `@chayns-ui/layout/tabs.css`.
@@ -10,152 +10,21 @@
10
10
  color: var(--on-accent);
11
11
  }
12
12
 
13
- .chayns-tabs {
14
- display: flex;
15
- flex-direction: column;
16
- container-type: inline-size;
17
- inline-size: 100%;
18
- block-size: 100%;
19
- min-inline-size: 0;
20
- }
21
-
22
- .chayns-tabs__list {
23
- display: flex;
24
- gap: var(--sp-1);
25
- align-items: stretch;
26
- min-inline-size: 0;
27
- overflow-x: auto;
28
- background: transparent;
29
- }
30
-
31
- .chayns-tabs__bar {
13
+ .chayns-app-layout__header {
32
14
  display: flex;
33
- align-items: stretch;
34
- block-size: var(--ctrl-h);
35
- min-inline-size: 0;
36
- }
37
-
38
- .chayns-tabs__item {
39
- display: inline-flex;
40
- flex: 0 0 auto;
41
- align-items: stretch;
42
- border-radius: var(--k12) var(--k12) 0 0;
43
- overflow: hidden;
44
- }
45
-
46
- .chayns-tabs__tab {
47
- display: inline-flex;
48
- flex: 0 0 auto;
49
- align-items: center;
50
- justify-content: center;
51
- gap: var(--sp-2);
52
- block-size: var(--ctrl-h);
53
- min-block-size: var(--ctrl-h);
54
- min-inline-size: var(--ctrl-h);
55
- padding-block: 0;
56
- padding-inline: var(--sp-3) var(--sp-2);
57
- border: 0;
58
- border-radius: 0;
59
- color: var(--on-accent);
60
- font: inherit;
61
- cursor: pointer;
62
- background: transparent;
63
- }
64
-
65
- .chayns-tabs__item:has(.chayns-tabs__tab--active) {
66
- background: var(--surface);
67
- }
68
-
69
- .chayns-tabs__item:not(:has(.chayns-tabs__tab--active)) {
70
- background: color-mix(in srgb, var(--surface) 10%, transparent);
71
- }
72
-
73
- .chayns-tabs__remove,
74
- .chayns-tabs__add {
75
- display: inline-flex;
76
- align-items: center;
77
- justify-content: center;
78
- inline-size: var(--ctrl-h);
79
- block-size: var(--ctrl-h);
80
- min-block-size: var(--ctrl-h);
81
- padding: 0 var(--sp-2);
82
- border: 0;
83
- color: var(--on-accent);
84
- font: inherit;
85
- cursor: pointer;
86
- background: transparent;
87
- }
88
-
89
- .chayns-tabs__remove {
90
- inline-size: var(--icon);
91
- padding: 0;
92
- border-radius: 0;
93
- }
94
-
95
- .chayns-tabs__add {
96
- flex: 0 0 auto;
97
- border-radius: 0;
98
- color: var(--on-accent);
99
- }
100
-
101
- .chayns-tabs__item:has(:focus-visible) {
102
- outline: none;
103
- box-shadow: inset 0 0 0 var(--focus-ring-size)
104
- rgb(var(--focus-ring-rgb), var(--focus-ring-alpha-strong));
105
- }
106
-
107
- .chayns-tabs__tab:focus-visible,
108
- .chayns-tabs__remove:focus-visible,
109
- .chayns-tabs__add:focus-visible {
110
- outline: none;
111
- }
112
-
113
- .chayns-tabs__icon {
114
- display: inline-flex;
115
- flex: none;
15
+ grid-area: header;
116
16
  align-items: center;
117
- justify-content: center;
118
- inline-size: var(--icon);
119
- block-size: var(--icon);
120
- }
121
-
122
- .chayns-tabs__remove .chayns-tabs__icon {
123
- inline-size: var(--fs-meta);
124
- block-size: var(--fs-meta);
125
- font-size: var(--fs-meta);
126
- }
127
-
128
- .chayns-tabs__item:has(.chayns-tabs__tab--active) .chayns-tabs__tab,
129
- .chayns-tabs__item:has(.chayns-tabs__tab--active) .chayns-tabs__remove {
130
- color: var(--accent);
131
- }
132
-
133
- .chayns-tabs__panel {
134
- flex: 1 1 auto;
135
17
  min-inline-size: 0;
136
- min-block-size: 0;
137
- padding: var(--sp-4);
138
- overflow: auto;
139
- background: var(--surface);
140
- }
141
-
142
- @container (max-width: 20rem) {
143
- .chayns-tabs__label {
144
- position: absolute;
145
- inline-size: 1px;
146
- block-size: 1px;
147
- overflow: hidden;
148
- clip-path: inset(50%);
149
- white-space: nowrap;
150
- }
18
+ padding-inline: var(--sp-4);
151
19
  }
152
20
 
153
- .chayns-app-layout__header {
21
+ .chayns-app-layout__header-content {
154
22
  display: flex;
155
- grid-area: header;
23
+ flex: 1 1 auto;
156
24
  align-items: center;
25
+ justify-content: flex-end;
157
26
  min-inline-size: 0;
158
- padding-inline: var(--sp-4);
27
+ margin-inline-start: var(--sp-4);
159
28
  }
160
29
 
161
30
  .chayns-app-layout__logo {
@@ -170,7 +39,7 @@
170
39
  flex-direction: column;
171
40
  min-inline-size: 0;
172
41
  min-block-size: 0;
173
- padding: var(--sp-2);
42
+ padding: 0 var(--sp-2) var(--sp-2);
174
43
  }
175
44
 
176
45
  .chayns-app-layout__navigation {
@@ -1 +1 @@
1
- {"version":3,"file":"AppLayout.d.ts","sourceRoot":"","sources":["../../../src/components/app-layout/AppLayout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,eAAO,MAAM,SAAS,wHAmFrB,CAAC"}
1
+ {"version":3,"file":"AppLayout.d.ts","sourceRoot":"","sources":["../../../src/components/app-layout/AppLayout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,eAAO,MAAM,SAAS,wHAqFrB,CAAC"}
@@ -3,7 +3,7 @@ import NavigationItems from "./navigation-items/NavigationItems.js";
3
3
  import { forwardRef, useId, useState } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/app-layout/AppLayout.tsx
6
- var AppLayout = forwardRef(({ activeItemId, children, className, collapseLabel, collapsed, defaultCollapsed = false, expandLabel, items, logo, navigationLabel, onClick, onCollapsedChange, ...rootProps }, ref) => {
6
+ var AppLayout = forwardRef(({ activeItemId, children, className, collapseLabel, collapsed, defaultCollapsed = false, expandLabel, headerContent, items, logo, navigationLabel, onClick, onCollapsedChange, ...rootProps }, ref) => {
7
7
  const baseId = useId();
8
8
  const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);
9
9
  const [expandedIds, setExpandedIds] = useState(() => /* @__PURE__ */ new Set());
@@ -31,13 +31,16 @@ var AppLayout = forwardRef(({ activeItemId, children, className, collapseLabel,
31
31
  className: rootClassName,
32
32
  ref,
33
33
  children: [
34
- /* @__PURE__ */ jsx("header", {
34
+ /* @__PURE__ */ jsxs("header", {
35
35
  className: "chayns-app-layout__header",
36
- children: /* @__PURE__ */ jsx("img", {
36
+ children: [/* @__PURE__ */ jsx("img", {
37
37
  alt: "",
38
38
  className: "chayns-app-layout__logo",
39
39
  src: logo
40
- })
40
+ }), /* @__PURE__ */ jsx("div", {
41
+ className: "chayns-app-layout__header-content",
42
+ children: headerContent
43
+ })]
41
44
  }),
42
45
  /* @__PURE__ */ jsxs("aside", {
43
46
  className: "chayns-app-layout__sidebar",
@@ -1 +1 @@
1
- {"version":3,"file":"AppLayout.js","names":[],"sources":["../../../src/components/app-layout/AppLayout.tsx"],"sourcesContent":["import { forwardRef, useId, useState } from 'react';\n\nimport type { AppLayoutProps } from './AppLayout.types.js';\nimport AppLayoutIcon from './app-layout-icon/AppLayoutIcon.js';\nimport NavigationItems from './navigation-items/NavigationItems.js';\n\nexport const AppLayout = forwardRef<HTMLDivElement, AppLayoutProps>(\n (\n {\n activeItemId,\n children,\n className,\n collapseLabel,\n collapsed,\n defaultCollapsed = false,\n expandLabel,\n items,\n logo,\n navigationLabel,\n onClick,\n onCollapsedChange,\n ...rootProps\n },\n ref,\n ) => {\n const baseId = useId();\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const [expandedIds, setExpandedIds] = useState<ReadonlySet<string>>(() => new Set());\n const isCollapsed = collapsed ?? internalCollapsed;\n const rootClassName = [\n 'chayns-app-layout',\n isCollapsed ? 'chayns-app-layout--collapsed' : undefined,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleCollapsedChange = () => {\n const nextCollapsed = !isCollapsed;\n if (collapsed === undefined) {\n setInternalCollapsed(nextCollapsed);\n }\n onCollapsedChange?.(nextCollapsed);\n };\n\n const handleToggle = (id: string) => {\n setExpandedIds((current) => {\n const next = new Set(current);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n return (\n <div {...rootProps} className={rootClassName} ref={ref}>\n <header className=\"chayns-app-layout__header\">\n <img alt=\"\" className=\"chayns-app-layout__logo\" src={logo} />\n </header>\n <aside className=\"chayns-app-layout__sidebar\">\n <nav aria-label={navigationLabel} className=\"chayns-app-layout__navigation\">\n <NavigationItems\n activeItemId={activeItemId}\n collapsed={isCollapsed}\n expandedIds={expandedIds}\n items={items}\n onClick={onClick}\n onToggle={handleToggle}\n parentId={baseId}\n />\n </nav>\n <div className=\"chayns-app-layout__footer\">\n <button\n aria-label={isCollapsed ? expandLabel : collapseLabel}\n className=\"chayns-app-layout__collapse\"\n onClick={handleCollapsedChange}\n type=\"button\"\n >\n <AppLayoutIcon icon=\"fa-sidebar\" />\n </button>\n </div>\n </aside>\n <main className=\"chayns-app-layout__content\">{children}</main>\n </div>\n );\n },\n);\n\nAppLayout.displayName = 'AppLayout';\n"],"mappings":";;;;;AAMA,IAAa,YAAY,YAErB,EACE,cACA,UACA,WACA,eACA,WACA,mBAAmB,OACnB,aACA,OACA,MACA,iBACA,SACA,mBACA,GAAG,aAEL,QACG;CACH,MAAM,SAAS,MAAM;CACrB,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,gBAAgB;CAC3E,MAAM,CAAC,aAAa,kBAAkB,+BAAoC,IAAI,IAAI,CAAC;CACnF,MAAM,cAAc,aAAa;CACjC,MAAM,gBAAgB;EACpB;EACA,cAAc,iCAAiC,KAAA;EAC/C;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,MAAM,8BAA8B;EAClC,MAAM,gBAAgB,CAAC;EACvB,IAAI,cAAc,KAAA,GAChB,qBAAqB,aAAa;EAEpC,oBAAoB,aAAa;CACnC;CAEA,MAAM,gBAAgB,OAAe;EACnC,gBAAgB,YAAY;GAC1B,MAAM,OAAO,IAAI,IAAI,OAAO;GAC5B,IAAI,KAAK,IAAI,EAAE,GACb,KAAK,OAAO,EAAE;QAEd,KAAK,IAAI,EAAE;GAEb,OAAO;EACT,CAAC;CACH;CAEA,OACE,qBAAC,OAAD;EAAK,GAAI;EAAW,WAAW;EAAoB;EAAnD,UAAA;GACE,oBAAC,UAAD;IAAQ,WAAU;IAChB,UAAA,oBAAC,OAAD;KAAK,KAAI;KAAG,WAAU;KAA0B,KAAK;IAAO,CAAA;GACtD,CAAA;GACR,qBAAC,SAAD;IAAO,WAAU;IAAjB,UAAA,CACE,oBAAC,OAAD;KAAK,cAAY;KAAiB,WAAU;KAC1C,UAAA,oBAAC,iBAAD;MACgB;MACd,WAAW;MACE;MACN;MACE;MACT,UAAU;MACV,UAAU;KACX,CAAA;IACE,CAAA,GACL,oBAAC,OAAD;KAAK,WAAU;KACb,UAAA,oBAAC,UAAD;MACE,cAAY,cAAc,cAAc;MACxC,WAAU;MACV,SAAS;MACT,MAAK;MAEL,UAAA,oBAAC,eAAD,EAAe,MAAK,aAAc,CAAA;KAC5B,CAAA;IACL,CAAA,CACA;;GACP,oBAAC,QAAD;IAAM,WAAU;IAA8B;GAAe,CAAA;EAC1D;;AAET,CACF;AAEA,UAAU,cAAc"}
1
+ {"version":3,"file":"AppLayout.js","names":[],"sources":["../../../src/components/app-layout/AppLayout.tsx"],"sourcesContent":["import { forwardRef, useId, useState } from 'react';\n\nimport type { AppLayoutProps } from './AppLayout.types.js';\nimport AppLayoutIcon from './app-layout-icon/AppLayoutIcon.js';\nimport NavigationItems from './navigation-items/NavigationItems.js';\n\nexport const AppLayout = forwardRef<HTMLDivElement, AppLayoutProps>(\n (\n {\n activeItemId,\n children,\n className,\n collapseLabel,\n collapsed,\n defaultCollapsed = false,\n expandLabel,\n headerContent,\n items,\n logo,\n navigationLabel,\n onClick,\n onCollapsedChange,\n ...rootProps\n },\n ref,\n ) => {\n const baseId = useId();\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const [expandedIds, setExpandedIds] = useState<ReadonlySet<string>>(() => new Set());\n const isCollapsed = collapsed ?? internalCollapsed;\n const rootClassName = [\n 'chayns-app-layout',\n isCollapsed ? 'chayns-app-layout--collapsed' : undefined,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleCollapsedChange = () => {\n const nextCollapsed = !isCollapsed;\n if (collapsed === undefined) {\n setInternalCollapsed(nextCollapsed);\n }\n onCollapsedChange?.(nextCollapsed);\n };\n\n const handleToggle = (id: string) => {\n setExpandedIds((current) => {\n const next = new Set(current);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n return (\n <div {...rootProps} className={rootClassName} ref={ref}>\n <header className=\"chayns-app-layout__header\">\n <img alt=\"\" className=\"chayns-app-layout__logo\" src={logo} />\n <div className=\"chayns-app-layout__header-content\">{headerContent}</div>\n </header>\n <aside className=\"chayns-app-layout__sidebar\">\n <nav aria-label={navigationLabel} className=\"chayns-app-layout__navigation\">\n <NavigationItems\n activeItemId={activeItemId}\n collapsed={isCollapsed}\n expandedIds={expandedIds}\n items={items}\n onClick={onClick}\n onToggle={handleToggle}\n parentId={baseId}\n />\n </nav>\n <div className=\"chayns-app-layout__footer\">\n <button\n aria-label={isCollapsed ? expandLabel : collapseLabel}\n className=\"chayns-app-layout__collapse\"\n onClick={handleCollapsedChange}\n type=\"button\"\n >\n <AppLayoutIcon icon=\"fa-sidebar\" />\n </button>\n </div>\n </aside>\n <main className=\"chayns-app-layout__content\">{children}</main>\n </div>\n );\n },\n);\n\nAppLayout.displayName = 'AppLayout';\n"],"mappings":";;;;;AAMA,IAAa,YAAY,YAErB,EACE,cACA,UACA,WACA,eACA,WACA,mBAAmB,OACnB,aACA,eACA,OACA,MACA,iBACA,SACA,mBACA,GAAG,aAEL,QACG;CACH,MAAM,SAAS,MAAM;CACrB,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,gBAAgB;CAC3E,MAAM,CAAC,aAAa,kBAAkB,+BAAoC,IAAI,IAAI,CAAC;CACnF,MAAM,cAAc,aAAa;CACjC,MAAM,gBAAgB;EACpB;EACA,cAAc,iCAAiC,KAAA;EAC/C;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,MAAM,8BAA8B;EAClC,MAAM,gBAAgB,CAAC;EACvB,IAAI,cAAc,KAAA,GAChB,qBAAqB,aAAa;EAEpC,oBAAoB,aAAa;CACnC;CAEA,MAAM,gBAAgB,OAAe;EACnC,gBAAgB,YAAY;GAC1B,MAAM,OAAO,IAAI,IAAI,OAAO;GAC5B,IAAI,KAAK,IAAI,EAAE,GACb,KAAK,OAAO,EAAE;QAEd,KAAK,IAAI,EAAE;GAEb,OAAO;EACT,CAAC;CACH;CAEA,OACE,qBAAC,OAAD;EAAK,GAAI;EAAW,WAAW;EAAoB;EAAnD,UAAA;GACE,qBAAC,UAAD;IAAQ,WAAU;IAAlB,UAAA,CACE,oBAAC,OAAD;KAAK,KAAI;KAAG,WAAU;KAA0B,KAAK;IAAO,CAAA,GAC5D,oBAAC,OAAD;KAAK,WAAU;KAAqC,UAAA;IAAmB,CAAA,CACjE;;GACR,qBAAC,SAAD;IAAO,WAAU;IAAjB,UAAA,CACE,oBAAC,OAAD;KAAK,cAAY;KAAiB,WAAU;KAC1C,UAAA,oBAAC,iBAAD;MACgB;MACd,WAAW;MACE;MACN;MACE;MACT,UAAU;MACV,UAAU;KACX,CAAA;IACE,CAAA,GACL,oBAAC,OAAD;KAAK,WAAU;KACb,UAAA,oBAAC,UAAD;MACE,cAAY,cAAc,cAAc;MACxC,WAAU;MACV,SAAS;MACT,MAAK;MAEL,UAAA,oBAAC,eAAD,EAAe,MAAK,aAAc,CAAA;KAC5B,CAAA;IACL,CAAA,CACA;;GACP,oBAAC,QAAD;IAAM,WAAU;IAA8B;GAAe,CAAA;EAC1D;;AAET,CACF;AAEA,UAAU,cAAc"}
@@ -47,6 +47,11 @@ export interface AppLayoutProps extends Omit<ComponentPropsWithRef<'div'>, 'chil
47
47
  * name.
48
48
  */
49
49
  logo: string;
50
+ /**
51
+ * @description Optional consumer-provided content rendered in the remaining
52
+ * header area to the right of the logo.
53
+ */
54
+ headerContent?: ReactNode;
50
55
  /**
51
56
  * @description Top-level navigation items, recursively composable via each
52
57
  * item's own `children`. An empty array renders an empty navigation list.
@@ -1 +1 @@
1
- {"version":3,"file":"AppLayout.types.d.ts","sourceRoot":"","sources":["../../../src/components/app-layout/AppLayout.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,MAAM,EAAE,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,EAAE,aAAa,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChG;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,KAAK,EAAE,aAAa,EAAE,CAAC;IAEvB;;;;OAIG;IACH,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9B;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD"}
1
+ {"version":3,"file":"AppLayout.types.d.ts","sourceRoot":"","sources":["../../../src/components/app-layout/AppLayout.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,MAAM,EAAE,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,EAAE,aAAa,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChG;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B;;;OAGG;IACH,KAAK,EAAE,aAAa,EAAE,CAAC;IAEvB;;;;OAIG;IACH,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9B;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD"}
@@ -0,0 +1,2 @@
1
+ @import url('./app-layout.css');
2
+ @import url('./tabs.css');
package/dist/tabs.css ADDED
@@ -0,0 +1,142 @@
1
+ @layer chayns.components {
2
+ .chayns-tabs {
3
+ display: flex;
4
+ flex-direction: column;
5
+ container-type: inline-size;
6
+ inline-size: 100%;
7
+ block-size: 100%;
8
+ min-inline-size: 0;
9
+ }
10
+
11
+ .chayns-tabs__list {
12
+ display: flex;
13
+ gap: var(--sp-1);
14
+ align-items: stretch;
15
+ min-inline-size: 0;
16
+ overflow-x: auto;
17
+ background: transparent;
18
+ }
19
+
20
+ .chayns-tabs__bar {
21
+ display: flex;
22
+ align-items: stretch;
23
+ block-size: var(--ctrl-h);
24
+ min-inline-size: 0;
25
+ }
26
+
27
+ .chayns-tabs__item {
28
+ display: inline-flex;
29
+ flex: 0 0 auto;
30
+ align-items: stretch;
31
+ border-radius: var(--k12) var(--k12) 0 0;
32
+ overflow: hidden;
33
+ }
34
+
35
+ .chayns-tabs__tab {
36
+ display: inline-flex;
37
+ flex: 0 0 auto;
38
+ align-items: center;
39
+ justify-content: center;
40
+ gap: var(--sp-2);
41
+ block-size: var(--ctrl-h);
42
+ min-block-size: var(--ctrl-h);
43
+ min-inline-size: var(--ctrl-h);
44
+ padding-block: 0;
45
+ padding-inline: var(--sp-3) var(--sp-2);
46
+ border: 0;
47
+ border-radius: 0;
48
+ color: var(--on-accent);
49
+ font: inherit;
50
+ cursor: pointer;
51
+ background: transparent;
52
+ }
53
+
54
+ .chayns-tabs__item:has(.chayns-tabs__tab--active) {
55
+ background: var(--surface);
56
+ }
57
+
58
+ .chayns-tabs__item:not(:has(.chayns-tabs__tab--active)) {
59
+ background: color-mix(in srgb, var(--surface) 10%, transparent);
60
+ }
61
+
62
+ .chayns-tabs__remove,
63
+ .chayns-tabs__add {
64
+ display: inline-flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ inline-size: var(--ctrl-h);
68
+ block-size: var(--ctrl-h);
69
+ min-block-size: var(--ctrl-h);
70
+ padding: 0 var(--sp-2);
71
+ border: 0;
72
+ color: var(--on-accent);
73
+ font: inherit;
74
+ cursor: pointer;
75
+ background: transparent;
76
+ }
77
+
78
+ .chayns-tabs__remove {
79
+ inline-size: var(--icon);
80
+ padding: 0;
81
+ border-radius: 0;
82
+ }
83
+
84
+ .chayns-tabs__add {
85
+ flex: 0 0 auto;
86
+ border-radius: 0;
87
+ color: var(--on-accent);
88
+ }
89
+
90
+ .chayns-tabs__item:has(:focus-visible) {
91
+ outline: none;
92
+ box-shadow: inset 0 0 0 var(--focus-ring-size)
93
+ rgb(var(--focus-ring-rgb), var(--focus-ring-alpha-strong));
94
+ }
95
+
96
+ .chayns-tabs__tab:focus-visible,
97
+ .chayns-tabs__remove:focus-visible,
98
+ .chayns-tabs__add:focus-visible {
99
+ outline: none;
100
+ }
101
+
102
+ .chayns-tabs__icon {
103
+ display: inline-flex;
104
+ flex: none;
105
+ align-items: center;
106
+ justify-content: center;
107
+ inline-size: var(--icon);
108
+ block-size: var(--icon);
109
+ }
110
+
111
+ .chayns-tabs__remove .chayns-tabs__icon {
112
+ inline-size: var(--fs-meta);
113
+ block-size: var(--fs-meta);
114
+ font-size: var(--fs-meta);
115
+ }
116
+
117
+ .chayns-tabs__item:has(.chayns-tabs__tab--active) .chayns-tabs__tab,
118
+ .chayns-tabs__item:has(.chayns-tabs__tab--active) .chayns-tabs__remove {
119
+ color: var(--accent);
120
+ }
121
+
122
+ .chayns-tabs__panel {
123
+ flex: 1 1 auto;
124
+ min-inline-size: 0;
125
+ min-block-size: 0;
126
+ padding: var(--sp-4);
127
+ overflow: auto;
128
+ background: var(--surface);
129
+ color: var(--text);
130
+ }
131
+
132
+ @container (max-width: 20rem) {
133
+ .chayns-tabs__label {
134
+ position: absolute;
135
+ inline-size: 1px;
136
+ block-size: 1px;
137
+ overflow: hidden;
138
+ clip-path: inset(50%);
139
+ white-space: nowrap;
140
+ }
141
+ }
142
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-ui/layout",
3
- "version": "0.1.0",
3
+ "version": "0.3.2",
4
4
  "description": "Accessible application layout components for chayns UI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -23,21 +23,26 @@
23
23
  "import": "./dist/index.js"
24
24
  },
25
25
  "./app-layout.css": "./dist/app-layout.css",
26
+ "./tabs.css": "./dist/tabs.css",
27
+ "./styles.css": "./dist/styles.css",
26
28
  "./package.json": "./package.json"
27
29
  },
28
30
  "peerDependencies": {
29
- "@chayns-ui/core": ">=0.2.1",
31
+ "@chayns-ui/core": ">=0.3.1",
30
32
  "react": ">=18 <20"
31
33
  },
34
+ "devDependencies": {
35
+ "@chayns-ui/core": "0.3.1"
36
+ },
32
37
  "engines": {
33
38
  "node": ">=18"
34
39
  },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
35
43
  "scripts": {
36
44
  "build": "vite build && node ../../tooling/copy-layout-css.mjs && tsc -b tsconfig.build.json --force",
37
45
  "clean": "node ../../tooling/clean-package.mjs layout",
38
46
  "typecheck": "tsc -p tsconfig.json --noEmit"
39
- },
40
- "publishConfig": {
41
- "access": "public"
42
47
  }
43
- }
48
+ }