@sikt/sds-tabs 2.0.1 → 3.0.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.
- package/dist/cjs/index.css +5 -1
- package/dist/cjs/index.css.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/index.css +5 -1
- package/dist/index.css.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/cjs/index.css
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
.sds-tabs{--tab-list-border-bottom:var(--sds-border-
|
|
1
|
+
.sds-tabs{--tab-list-border-bottom:var(--sds-space-border-weight-regular)}.sds-tabs__tab-list{border-bottom:var(--tab-list-border-bottom) solid var(--sds-color-layout-divider-subtle);display:flex;margin-bottom:var(--sds-space-gap-small)}.sds-tabs__tab{align-items:center;border:0;border-bottom:var(--sds-space-border-weight-bold) solid #0000;color:var(--sds-color-text-primary);display:flex;font-size:var(--sds-typography-body-fontsize-large);gap:var(--sds-space-gap-small);line-height:var(--sds-typography-body-lineheight-large);margin-bottom:calc(var(--tab-list-border-bottom)*-1);padding:var(--sds-space-padding-medium) var(--sds-space-padding-small)}.sds-tabs__tab-icon{font-size:var(--sds-base-size-m)}.sds-tabs__tab[aria-selected=true]{border-color:var(--sds-color-interaction-primary-strong-default)}.sds-tabs__tab:focus-visible,.sds-tabs__tab:hover{background-color:var(
|
|
2
|
+
--sds-color-interaction-primary-transparent-highlight
|
|
3
|
+
);border-color:var(--sds-color-interaction-primary-strong-highlight)}.sds-tabs__tab:active{background-color:var(
|
|
4
|
+
--sds-color-interaction-primary-transparent-pressed
|
|
5
|
+
);border-color:var(--sds-color-interaction-primary-strong-pressed)}.sds-tabs__tab:focus-visible{outline:var(--sds-focus-outline)}.sds-tabs__tab-panel:focus-visible{outline:var(--sds-focus-outline)}.sds-tab-link{display:inline-flex;text-decoration:none}.sds-tab-link--selected{border-color:var(--sds-color-interaction-primary-strong-default)}.sds-tab-link:focus-visible{outline-offset:0}
|
|
2
6
|
/*# sourceMappingURL=index.css.map */
|
package/dist/cjs/index.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["tabs.pcss","tab-link.pcss"],"names":[],"mappings":"AAAA,UACE,
|
|
1
|
+
{"version":3,"sources":["tabs.pcss","tab-link.pcss"],"names":[],"mappings":"AAAA,UACE,+DAsDF,CApDE,oBACE,wFACwC,CACxC,YAAa,CACb,wCACF,CAEA,eACE,kBAAmB,CACnB,QAAc,CACd,6DAAoE,CACpE,mCAAoC,CACpC,YAAa,CAEb,mDAAoD,CADpD,8BAA+B,CAE/B,uDAAwD,CAExD,oDAAuD,CADvD,sEA6BF,CA1BE,oBACE,gCACF,CAEA,mCACE,gEACF,CAEA,kDAEE;;OAEC,CACD,kEACF,CAEA,sBACE;;OAEC,CACD,gEACF,CAEA,6BACE,gCACF,CAIA,mCACE,gCACF,CCrDJ,cACE,mBAAoB,CACpB,oBASF,CAPE,wBACE,gEACF,CAEA,4BACE,gBACF","file":"index.css","sourcesContent":[".sds-tabs {\n --tab-list-border-bottom: var(--sds-space-border-weight-regular);\n\n &__tab-list {\n border-bottom: var(--tab-list-border-bottom) solid\n var(--sds-color-layout-divider-subtle);\n display: flex;\n margin-bottom: var(--sds-space-gap-small);\n }\n\n &__tab {\n align-items: center;\n border: 0 none;\n border-bottom: var(--sds-space-border-weight-bold) solid transparent;\n color: var(--sds-color-text-primary);\n display: flex;\n gap: var(--sds-space-gap-small);\n font-size: var(--sds-typography-body-fontsize-large);\n line-height: var(--sds-typography-body-lineheight-large);\n padding: var(--sds-space-padding-medium) var(--sds-space-padding-small);\n margin-bottom: calc(var(--tab-list-border-bottom) * -1);\n\n &-icon {\n font-size: var(--sds-base-size-m);\n }\n\n &[aria-selected=\"true\"] {\n border-color: var(--sds-color-interaction-primary-strong-default);\n }\n\n &:hover,\n &:focus-visible {\n background-color: var(\n --sds-color-interaction-primary-transparent-highlight\n );\n border-color: var(--sds-color-interaction-primary-strong-highlight);\n }\n\n &:active {\n background-color: var(\n --sds-color-interaction-primary-transparent-pressed\n );\n border-color: var(--sds-color-interaction-primary-strong-pressed);\n }\n\n &:focus-visible {\n outline: var(--sds-focus-outline);\n }\n }\n\n &__tab-panel {\n &:focus-visible {\n outline: var(--sds-focus-outline);\n }\n }\n}\n",".sds-tab-link {\n display: inline-flex;\n text-decoration: none;\n\n &--selected {\n border-color: var(--sds-color-interaction-primary-strong-default);\n }\n\n &:focus-visible {\n outline-offset: 0;\n }\n}\n"]}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),s=require("react"),t=require("clsx");const a=s.createContext(null),n=s.forwardRef((({children:a,className:n,icon:l,badge:i,href:d,isSelected:r,...c},o)=>e.jsxs("a",{className:t("sds-tabs__tab","sds-tab-link",r&&"sds-tab-link--selected",n),href:d,ref:o,...c,children:[l&&e.jsx("div",{className:"sds-tabs__tab-icon",children:l}),a,i&&e.jsx("div",{className:"sds-tabs__tab-badge",children:r?s.isValidElement(i)&&s.cloneElement(i,{visibility:"high"}):i})]})));n.displayName="TabLink",exports.Tab=({children:n,className:l,icon:i,badge:d,...r})=>{const{index:c}=r,{id:o,count:b,isSelectOnFocus:x,selectedIndex:u,setSelectedIndex:h,setPreviousIndex:m}=s.useContext(a),f=c===u,p=e=>{x&&(m(u),h(e))};return e.jsxs("button",{className:t("sds-tabs__tab",l),role:"tab","aria-selected":f,"aria-controls":`panel-${o}-${c}`,id:`tab-${o}-${c}`,tabIndex:f?0:-1,onClick:()=>{m(u),h(c)},onKeyDown:e=>{const s=b-1,t=e.currentTarget,a=t.parentElement?.firstChild,n=t.parentElement?.lastChild;if("ArrowLeft"===e.key){const e=t.previousSibling;c>0?e.focus():n.focus(),p(u>0?u-1:s)}else if("ArrowRight"===e.key){const e=t.nextSibling;c<s?e.focus():a.focus(),p(u<s?u+1:0)}else"Home"===e.key?(a.focus(),p(0)):"End"===e.key?(n.focus(),p(s)):"Enter"!==e.key&&"Space"!==e.code||h(c)},...r,children:[i&&e.jsx("span",{className:"sds-tabs__tab-icon",children:i}),n,d&&e.jsx("span",{className:"sds-tabs__tab-badge",children:f?s.isValidElement(d)&&s.cloneElement(d,{visibility:"
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),s=require("react"),t=require("clsx");const a=s.createContext(null),n=s.forwardRef((({children:a,className:n,icon:l,badge:i,href:d,isSelected:r,...c},o)=>e.jsxs("a",{className:t("sds-tabs__tab","sds-tab-link",r&&"sds-tab-link--selected",n),href:d,ref:o,...c,children:[l&&e.jsx("div",{className:"sds-tabs__tab-icon",children:l}),a,i&&e.jsx("div",{className:"sds-tabs__tab-badge",children:r?s.isValidElement(i)&&s.cloneElement(i,{visibility:"high"}):i})]})));n.displayName="TabLink",exports.Tab=({children:n,className:l,icon:i,badge:d,...r})=>{const{index:c}=r,{id:o,count:b,isSelectOnFocus:x,selectedIndex:u,setSelectedIndex:h,setPreviousIndex:m}=s.useContext(a),f=c===u,p=e=>{x&&(m(u),h(e))};return e.jsxs("button",{className:t("sds-tabs__tab",l),role:"tab","aria-selected":f,"aria-controls":`panel-${o}-${c}`,id:`tab-${o}-${c}`,tabIndex:f?0:-1,onClick:()=>{m(u),h(c)},onKeyDown:e=>{const s=b-1,t=e.currentTarget,a=t.parentElement?.firstChild,n=t.parentElement?.lastChild;if("ArrowLeft"===e.key){const e=t.previousSibling;c>0?e.focus():n.focus(),p(u>0?u-1:s)}else if("ArrowRight"===e.key){const e=t.nextSibling;c<s?e.focus():a.focus(),p(u<s?u+1:0)}else"Home"===e.key?(a.focus(),p(0)):"End"===e.key?(n.focus(),p(s)):"Enter"!==e.key&&"Space"!==e.code||h(c)},...r,children:[i&&e.jsx("span",{className:"sds-tabs__tab-icon",children:i}),n,d&&e.jsx("span",{className:"sds-tabs__tab-badge",children:f?s.isValidElement(d)&&s.cloneElement(d,{visibility:"strong"}):d})]})},exports.TabLink=n,exports.TabList=({children:a,"aria-label":n,className:l,...i})=>{const d=s.Children.toArray(a);return e.jsx("div",{className:t("sds-tabs__tab-list",l),role:"tablist","aria-label":n,...i,children:s.Children.map(d,((t,a)=>{if(s.isValidElement(t))return e.jsx(e.Fragment,{children:s.cloneElement(t,{index:a})})}))})},exports.TabPanel=({children:n,className:l,...i})=>{const{index:d}=i,{id:r,selectedIndex:c}=s.useContext(a),o=d===c;return e.jsx("div",{className:t("sds-tabs__tab-panel",l),id:`panel-${r}-${d}`,role:"tabpanel",tabIndex:o?void 0:-1,"aria-labelledby":`tab-${r}-${d}`,hidden:!o,...i,children:n})},exports.Tabs=({defaultIndex:n=0,onChange:l,isSelectOnFocus:i=!1,children:d,className:r,...c})=>{const[o,b]=s.useState(n),[x,u]=s.useState(n),h=s.useId();s.useEffect((()=>{l&&x!==o&&l(o)}),[l,o]);const m=s.Children.toArray(d),f=m.length-1;return e.jsx(a.Provider,{value:{id:h,count:f,isSelectOnFocus:i,selectedIndex:o,setSelectedIndex:b,setPreviousIndex:u},children:e.jsx("div",{className:t("sds-tabs",r),...c,children:s.Children.map(m,((t,a)=>s.isValidElement(t)&&a>0?e.jsx(e.Fragment,{children:s.cloneElement(t,{index:a-1})}):t))})})};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../Tabs.tsx","../../TabLink.tsx","../../Tab.tsx","../../TabList.tsx","../../TabPanel.tsx"],"sourcesContent":["import React, {\n Children,\n ReactNode,\n cloneElement,\n useId,\n useState,\n isValidElement,\n createContext,\n ReactElement,\n useEffect,\n HTMLAttributes,\n} from \"react\";\nimport clsx from \"clsx\";\nimport \"./tabs.pcss\";\nimport { TabPanelProps } from \"./TabPanel\";\n\nexport type TabsContextType = {\n id: string;\n count: number;\n isSelectOnFocus: boolean;\n selectedIndex: number;\n setSelectedIndex: (index: number) => void;\n setPreviousIndex: (index: number) => void;\n};\n\nexport const TabsContext = createContext<TabsContextType | null>(null);\n\nexport interface TabsProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultIndex?: number;\n isSelectOnFocus?: boolean;\n onChange?: (index: number) => void;\n children: ReactNode;\n className?: string;\n}\n\nexport const Tabs = ({\n defaultIndex = 0,\n onChange,\n isSelectOnFocus = false,\n children,\n className,\n ...rest\n}: TabsProps) => {\n const [selectedIndex, setSelectedIndex] = useState(defaultIndex);\n const [previousIndex, setPreviousIndex] = useState(defaultIndex);\n const id = useId();\n\n useEffect(() => {\n if (onChange && previousIndex !== selectedIndex) {\n onChange(selectedIndex);\n }\n }, [onChange, selectedIndex]);\n\n const arrayChildren = Children.toArray(children);\n const count = arrayChildren.length - 1;\n\n return (\n <TabsContext.Provider\n value={{\n id,\n count,\n isSelectOnFocus,\n selectedIndex,\n setSelectedIndex,\n setPreviousIndex,\n }}\n >\n <div className={clsx(\"sds-tabs\", className)} {...rest}>\n {Children.map(arrayChildren, (child, index) => {\n if (isValidElement(child) && index > 0) {\n return (\n <>\n {cloneElement(\n child as ReactElement<TabPanelProps & { index: number }>,\n {\n index: index - 1,\n }\n )}\n </>\n );\n } else {\n return child;\n }\n })}\n </div>\n </TabsContext.Provider>\n );\n};\n","import React, {\n AnchorHTMLAttributes,\n cloneElement,\n forwardRef,\n isValidElement,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport clsx from \"clsx\";\nimport \"./tab-link.pcss\";\n\nexport interface TabLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n children: ReactNode;\n className?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n isSelected?: boolean;\n}\n\nexport const TabLink = forwardRef<HTMLAnchorElement, TabLinkProps>(\n (\n {\n children,\n className,\n icon,\n badge,\n href,\n isSelected,\n ...rest\n }: TabLinkProps,\n ref\n ) => {\n return (\n <a\n className={clsx(\n \"sds-tabs__tab\",\n \"sds-tab-link\",\n isSelected && \"sds-tab-link--selected\",\n className\n )}\n href={href}\n ref={ref}\n {...rest}\n >\n {icon && <div className=\"sds-tabs__tab-icon\">{icon}</div>}\n {children}\n {badge && (\n <div className=\"sds-tabs__tab-badge\">\n {isSelected\n ? isValidElement(badge) &&\n cloneElement(badge as ReactElement, { visibility: \"high\" })\n : badge}\n </div>\n )}\n </a>\n );\n }\n);\n\nTabLink.displayName = \"TabLink\";\n","import React, {\n cloneElement,\n isValidElement,\n HTMLAttributes,\n KeyboardEvent,\n ReactElement,\n ReactNode,\n useContext,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { TabsContext, TabsContextType } from \"./Tabs\";\n\nexport interface TabProps extends HTMLAttributes<HTMLButtonElement> {\n children: ReactNode;\n className?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n}\n\nexport const Tab = ({\n children,\n className,\n icon,\n badge,\n ...rest\n}: TabProps) => {\n const { index } = rest as { index: number };\n const {\n id,\n count,\n isSelectOnFocus,\n selectedIndex,\n setSelectedIndex,\n setPreviousIndex,\n } = useContext(TabsContext) as TabsContextType;\n const isSelected = index === selectedIndex;\n const handleSelect = (index: number) => {\n if (isSelectOnFocus) {\n setPreviousIndex(selectedIndex);\n setSelectedIndex(index);\n }\n };\n const handleKeyPress = (event: KeyboardEvent<HTMLButtonElement>) => {\n const firstIndex = 0;\n const lastIndex = count - 1;\n const currentTarget = event.currentTarget;\n const firstChild = currentTarget.parentElement?.firstChild as HTMLElement;\n const lastChild = currentTarget.parentElement?.lastChild as HTMLElement;\n\n if (event.key === \"ArrowLeft\") {\n const previousSibling = currentTarget.previousSibling as HTMLElement;\n if (index > firstIndex) {\n previousSibling.focus();\n } else {\n lastChild.focus();\n }\n\n handleSelect(selectedIndex > firstIndex ? selectedIndex - 1 : lastIndex);\n } else if (event.key === \"ArrowRight\") {\n const nextSibling = currentTarget.nextSibling as HTMLElement;\n if (index < lastIndex) {\n nextSibling.focus();\n } else {\n firstChild.focus();\n }\n\n handleSelect(selectedIndex < lastIndex ? selectedIndex + 1 : firstIndex);\n } else if (event.key === \"Home\") {\n firstChild.focus();\n handleSelect(firstIndex);\n } else if (event.key === \"End\") {\n lastChild.focus();\n handleSelect(lastIndex);\n } else if (event.key === \"Enter\" || event.code === \"Space\") {\n setSelectedIndex(index);\n }\n };\n\n return (\n <button\n className={clsx(\"sds-tabs__tab\", className)}\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={`panel-${id}-${index}`}\n id={`tab-${id}-${index}`}\n tabIndex={isSelected ? 0 : -1}\n onClick={() => {\n setPreviousIndex(selectedIndex);\n setSelectedIndex(index);\n }}\n onKeyDown={handleKeyPress}\n {...rest}\n >\n {icon && <span className=\"sds-tabs__tab-icon\">{icon}</span>}\n {children}\n {badge && (\n <span className=\"sds-tabs__tab-badge\">\n {isSelected\n ? isValidElement(badge) &&\n cloneElement(badge as ReactElement, { visibility: \"high\" })\n : badge}\n </span>\n )}\n </button>\n );\n};\n","import React, {\n Children,\n ReactNode,\n ReactElement,\n cloneElement,\n isValidElement,\n HTMLAttributes,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { TabProps } from \"./Tab\";\n\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n \"aria-label\": string;\n className?: string;\n}\n\nexport const TabList = ({\n children,\n \"aria-label\": ariaLabel,\n className,\n ...rest\n}: TabListProps) => {\n const arrayChildren = Children.toArray(children);\n\n return (\n <div\n className={clsx(\"sds-tabs__tab-list\", className)}\n role=\"tablist\"\n aria-label={ariaLabel}\n {...rest}\n >\n {Children.map(arrayChildren, (child, index) => {\n if (isValidElement(child)) {\n return (\n <>\n {cloneElement(\n child as ReactElement<TabProps & { index: number }>,\n {\n index,\n }\n )}\n </>\n );\n }\n })}\n </div>\n );\n};\n","import React, { ReactNode, useContext } from \"react\";\nimport clsx from \"clsx\";\nimport { TabsContext, TabsContextType } from \"./Tabs\";\n\nexport interface TabPanelProps {\n children: ReactNode;\n className?: string;\n}\n\nexport const TabPanel = ({ children, className, ...rest }: TabPanelProps) => {\n const { index } = rest as { index: number };\n const { id, selectedIndex } = useContext(TabsContext) as TabsContextType;\n const isSelected = index === selectedIndex;\n return (\n <div\n className={clsx(\"sds-tabs__tab-panel\", className)}\n id={`panel-${id}-${index}`}\n role=\"tabpanel\"\n tabIndex={isSelected ? 0 : -1}\n aria-labelledby={`tab-${id}-${index}`}\n hidden={!isSelected}\n {...rest}\n >\n {children}\n </div>\n );\n};\n"],"names":["TabsContext","createContext","TabLink","forwardRef","children","className","icon","badge","href","isSelected","rest","ref","_jsxs","clsx","_jsx","isValidElement","cloneElement","visibility","displayName","index","id","count","isSelectOnFocus","selectedIndex","setSelectedIndex","setPreviousIndex","useContext","handleSelect","role","tabIndex","onClick","onKeyDown","event","lastIndex","currentTarget","firstChild","parentElement","lastChild","key","previousSibling","focus","nextSibling","code","jsx","ariaLabel","arrayChildren","Children","toArray","map","child","_Fragment","Fragment","hidden","defaultIndex","onChange","useState","previousIndex","useId","useEffect","length","Provider","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../Tabs.tsx","../../TabLink.tsx","../../Tab.tsx","../../TabList.tsx","../../TabPanel.tsx"],"sourcesContent":["import React, {\n Children,\n ReactNode,\n cloneElement,\n useId,\n useState,\n isValidElement,\n createContext,\n ReactElement,\n useEffect,\n HTMLAttributes,\n} from \"react\";\nimport clsx from \"clsx\";\nimport \"./tabs.pcss\";\nimport { TabPanelProps } from \"./TabPanel\";\n\nexport type TabsContextType = {\n id: string;\n count: number;\n isSelectOnFocus: boolean;\n selectedIndex: number;\n setSelectedIndex: (index: number) => void;\n setPreviousIndex: (index: number) => void;\n};\n\nexport const TabsContext = createContext<TabsContextType | null>(null);\n\nexport interface TabsProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultIndex?: number;\n isSelectOnFocus?: boolean;\n onChange?: (index: number) => void;\n children: ReactNode;\n className?: string;\n}\n\nexport const Tabs = ({\n defaultIndex = 0,\n onChange,\n isSelectOnFocus = false,\n children,\n className,\n ...rest\n}: TabsProps) => {\n const [selectedIndex, setSelectedIndex] = useState(defaultIndex);\n const [previousIndex, setPreviousIndex] = useState(defaultIndex);\n const id = useId();\n\n useEffect(() => {\n if (onChange && previousIndex !== selectedIndex) {\n onChange(selectedIndex);\n }\n }, [onChange, selectedIndex]);\n\n const arrayChildren = Children.toArray(children);\n const count = arrayChildren.length - 1;\n\n return (\n <TabsContext.Provider\n value={{\n id,\n count,\n isSelectOnFocus,\n selectedIndex,\n setSelectedIndex,\n setPreviousIndex,\n }}\n >\n <div className={clsx(\"sds-tabs\", className)} {...rest}>\n {Children.map(arrayChildren, (child, index) => {\n if (isValidElement(child) && index > 0) {\n return (\n <>\n {cloneElement(\n child as ReactElement<TabPanelProps & { index: number }>,\n {\n index: index - 1,\n }\n )}\n </>\n );\n } else {\n return child;\n }\n })}\n </div>\n </TabsContext.Provider>\n );\n};\n","import React, {\n AnchorHTMLAttributes,\n cloneElement,\n forwardRef,\n isValidElement,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport clsx from \"clsx\";\nimport \"./tab-link.pcss\";\n\nexport interface TabLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n children: ReactNode;\n className?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n isSelected?: boolean;\n}\n\nexport const TabLink = forwardRef<HTMLAnchorElement, TabLinkProps>(\n (\n {\n children,\n className,\n icon,\n badge,\n href,\n isSelected,\n ...rest\n }: TabLinkProps,\n ref\n ) => {\n return (\n <a\n className={clsx(\n \"sds-tabs__tab\",\n \"sds-tab-link\",\n isSelected && \"sds-tab-link--selected\",\n className\n )}\n href={href}\n ref={ref}\n {...rest}\n >\n {icon && <div className=\"sds-tabs__tab-icon\">{icon}</div>}\n {children}\n {badge && (\n <div className=\"sds-tabs__tab-badge\">\n {isSelected\n ? isValidElement(badge) &&\n cloneElement(badge as ReactElement, { visibility: \"high\" })\n : badge}\n </div>\n )}\n </a>\n );\n }\n);\n\nTabLink.displayName = \"TabLink\";\n","import React, {\n cloneElement,\n isValidElement,\n HTMLAttributes,\n KeyboardEvent,\n ReactElement,\n ReactNode,\n useContext,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { TabsContext, TabsContextType } from \"./Tabs\";\n\nexport interface TabProps extends HTMLAttributes<HTMLButtonElement> {\n children: ReactNode;\n className?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n}\n\nexport const Tab = ({\n children,\n className,\n icon,\n badge,\n ...rest\n}: TabProps) => {\n const { index } = rest as { index: number };\n const {\n id,\n count,\n isSelectOnFocus,\n selectedIndex,\n setSelectedIndex,\n setPreviousIndex,\n } = useContext(TabsContext) as TabsContextType;\n const isSelected = index === selectedIndex;\n const handleSelect = (index: number) => {\n if (isSelectOnFocus) {\n setPreviousIndex(selectedIndex);\n setSelectedIndex(index);\n }\n };\n const handleKeyPress = (event: KeyboardEvent<HTMLButtonElement>) => {\n const firstIndex = 0;\n const lastIndex = count - 1;\n const currentTarget = event.currentTarget;\n const firstChild = currentTarget.parentElement?.firstChild as HTMLElement;\n const lastChild = currentTarget.parentElement?.lastChild as HTMLElement;\n\n if (event.key === \"ArrowLeft\") {\n const previousSibling = currentTarget.previousSibling as HTMLElement;\n if (index > firstIndex) {\n previousSibling.focus();\n } else {\n lastChild.focus();\n }\n\n handleSelect(selectedIndex > firstIndex ? selectedIndex - 1 : lastIndex);\n } else if (event.key === \"ArrowRight\") {\n const nextSibling = currentTarget.nextSibling as HTMLElement;\n if (index < lastIndex) {\n nextSibling.focus();\n } else {\n firstChild.focus();\n }\n\n handleSelect(selectedIndex < lastIndex ? selectedIndex + 1 : firstIndex);\n } else if (event.key === \"Home\") {\n firstChild.focus();\n handleSelect(firstIndex);\n } else if (event.key === \"End\") {\n lastChild.focus();\n handleSelect(lastIndex);\n } else if (event.key === \"Enter\" || event.code === \"Space\") {\n setSelectedIndex(index);\n }\n };\n\n return (\n <button\n className={clsx(\"sds-tabs__tab\", className)}\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={`panel-${id}-${index}`}\n id={`tab-${id}-${index}`}\n tabIndex={isSelected ? 0 : -1}\n onClick={() => {\n setPreviousIndex(selectedIndex);\n setSelectedIndex(index);\n }}\n onKeyDown={handleKeyPress}\n {...rest}\n >\n {icon && <span className=\"sds-tabs__tab-icon\">{icon}</span>}\n {children}\n {badge && (\n <span className=\"sds-tabs__tab-badge\">\n {isSelected\n ? isValidElement(badge) &&\n cloneElement(badge as ReactElement, { visibility: \"strong\" })\n : badge}\n </span>\n )}\n </button>\n );\n};\n","import React, {\n Children,\n ReactNode,\n ReactElement,\n cloneElement,\n isValidElement,\n HTMLAttributes,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { TabProps } from \"./Tab\";\n\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n \"aria-label\": string;\n className?: string;\n}\n\nexport const TabList = ({\n children,\n \"aria-label\": ariaLabel,\n className,\n ...rest\n}: TabListProps) => {\n const arrayChildren = Children.toArray(children);\n\n return (\n <div\n className={clsx(\"sds-tabs__tab-list\", className)}\n role=\"tablist\"\n aria-label={ariaLabel}\n {...rest}\n >\n {Children.map(arrayChildren, (child, index) => {\n if (isValidElement(child)) {\n return (\n <>\n {cloneElement(\n child as ReactElement<TabProps & { index: number }>,\n {\n index,\n }\n )}\n </>\n );\n }\n })}\n </div>\n );\n};\n","import React, { ReactNode, useContext } from \"react\";\nimport clsx from \"clsx\";\nimport { TabsContext, TabsContextType } from \"./Tabs\";\n\nexport interface TabPanelProps {\n children: ReactNode;\n className?: string;\n}\n\nexport const TabPanel = ({ children, className, ...rest }: TabPanelProps) => {\n const { index } = rest as { index: number };\n const { id, selectedIndex } = useContext(TabsContext) as TabsContextType;\n const isSelected = index === selectedIndex;\n return (\n <div\n className={clsx(\"sds-tabs__tab-panel\", className)}\n id={`panel-${id}-${index}`}\n role=\"tabpanel\"\n tabIndex={isSelected ? undefined : -1}\n aria-labelledby={`tab-${id}-${index}`}\n hidden={!isSelected}\n {...rest}\n >\n {children}\n </div>\n );\n};\n"],"names":["TabsContext","createContext","TabLink","forwardRef","children","className","icon","badge","href","isSelected","rest","ref","_jsxs","clsx","_jsx","isValidElement","cloneElement","visibility","displayName","index","id","count","isSelectOnFocus","selectedIndex","setSelectedIndex","setPreviousIndex","useContext","handleSelect","role","tabIndex","onClick","onKeyDown","event","lastIndex","currentTarget","firstChild","parentElement","lastChild","key","previousSibling","focus","nextSibling","code","jsx","ariaLabel","arrayChildren","Children","toArray","map","child","_Fragment","Fragment","undefined","hidden","defaultIndex","onChange","useState","previousIndex","useId","useEffect","length","Provider","value"],"mappings":"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"}
|
package/dist/index.css
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
.sds-tabs{--tab-list-border-bottom:var(--sds-border-
|
|
1
|
+
.sds-tabs{--tab-list-border-bottom:var(--sds-space-border-weight-regular)}.sds-tabs__tab-list{border-bottom:var(--tab-list-border-bottom) solid var(--sds-color-layout-divider-subtle);display:flex;margin-bottom:var(--sds-space-gap-small)}.sds-tabs__tab{align-items:center;border:0;border-bottom:var(--sds-space-border-weight-bold) solid #0000;color:var(--sds-color-text-primary);display:flex;font-size:var(--sds-typography-body-fontsize-large);gap:var(--sds-space-gap-small);line-height:var(--sds-typography-body-lineheight-large);margin-bottom:calc(var(--tab-list-border-bottom)*-1);padding:var(--sds-space-padding-medium) var(--sds-space-padding-small)}.sds-tabs__tab-icon{font-size:var(--sds-base-size-m)}.sds-tabs__tab[aria-selected=true]{border-color:var(--sds-color-interaction-primary-strong-default)}.sds-tabs__tab:focus-visible,.sds-tabs__tab:hover{background-color:var(
|
|
2
|
+
--sds-color-interaction-primary-transparent-highlight
|
|
3
|
+
);border-color:var(--sds-color-interaction-primary-strong-highlight)}.sds-tabs__tab:active{background-color:var(
|
|
4
|
+
--sds-color-interaction-primary-transparent-pressed
|
|
5
|
+
);border-color:var(--sds-color-interaction-primary-strong-pressed)}.sds-tabs__tab:focus-visible{outline:var(--sds-focus-outline)}.sds-tabs__tab-panel:focus-visible{outline:var(--sds-focus-outline)}.sds-tab-link{display:inline-flex;text-decoration:none}.sds-tab-link--selected{border-color:var(--sds-color-interaction-primary-strong-default)}.sds-tab-link:focus-visible{outline-offset:0}
|
|
2
6
|
/*# sourceMappingURL=index.css.map */
|
package/dist/index.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["tabs.pcss","tab-link.pcss"],"names":[],"mappings":"AAAA,UACE,
|
|
1
|
+
{"version":3,"sources":["tabs.pcss","tab-link.pcss"],"names":[],"mappings":"AAAA,UACE,+DAsDF,CApDE,oBACE,wFACwC,CACxC,YAAa,CACb,wCACF,CAEA,eACE,kBAAmB,CACnB,QAAc,CACd,6DAAoE,CACpE,mCAAoC,CACpC,YAAa,CAEb,mDAAoD,CADpD,8BAA+B,CAE/B,uDAAwD,CAExD,oDAAuD,CADvD,sEA6BF,CA1BE,oBACE,gCACF,CAEA,mCACE,gEACF,CAEA,kDAEE;;OAEC,CACD,kEACF,CAEA,sBACE;;OAEC,CACD,gEACF,CAEA,6BACE,gCACF,CAIA,mCACE,gCACF,CCrDJ,cACE,mBAAoB,CACpB,oBASF,CAPE,wBACE,gEACF,CAEA,4BACE,gBACF","file":"index.css","sourcesContent":[".sds-tabs {\n --tab-list-border-bottom: var(--sds-space-border-weight-regular);\n\n &__tab-list {\n border-bottom: var(--tab-list-border-bottom) solid\n var(--sds-color-layout-divider-subtle);\n display: flex;\n margin-bottom: var(--sds-space-gap-small);\n }\n\n &__tab {\n align-items: center;\n border: 0 none;\n border-bottom: var(--sds-space-border-weight-bold) solid transparent;\n color: var(--sds-color-text-primary);\n display: flex;\n gap: var(--sds-space-gap-small);\n font-size: var(--sds-typography-body-fontsize-large);\n line-height: var(--sds-typography-body-lineheight-large);\n padding: var(--sds-space-padding-medium) var(--sds-space-padding-small);\n margin-bottom: calc(var(--tab-list-border-bottom) * -1);\n\n &-icon {\n font-size: var(--sds-base-size-m);\n }\n\n &[aria-selected=\"true\"] {\n border-color: var(--sds-color-interaction-primary-strong-default);\n }\n\n &:hover,\n &:focus-visible {\n background-color: var(\n --sds-color-interaction-primary-transparent-highlight\n );\n border-color: var(--sds-color-interaction-primary-strong-highlight);\n }\n\n &:active {\n background-color: var(\n --sds-color-interaction-primary-transparent-pressed\n );\n border-color: var(--sds-color-interaction-primary-strong-pressed);\n }\n\n &:focus-visible {\n outline: var(--sds-focus-outline);\n }\n }\n\n &__tab-panel {\n &:focus-visible {\n outline: var(--sds-focus-outline);\n }\n }\n}\n",".sds-tab-link {\n display: inline-flex;\n text-decoration: none;\n\n &--selected {\n border-color: var(--sds-color-interaction-primary-strong-default);\n }\n\n &:focus-visible {\n outline-offset: 0;\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,Fragment as s,jsxs as a}from"react/jsx-runtime";import{createContext as t,useState as n,useId as i,useEffect as l,Children as
|
|
1
|
+
import{jsx as e,Fragment as s,jsxs as a}from"react/jsx-runtime";import{createContext as t,useState as n,useId as i,useEffect as l,Children as d,isValidElement as c,cloneElement as r,useContext as o,forwardRef as b}from"react";import h from"clsx";const m=t(null),u=({defaultIndex:a=0,onChange:t,isSelectOnFocus:o=!1,children:b,className:u,...f})=>{const[x,p]=n(a),[_,N]=n(a),v=i();l((()=>{t&&_!==x&&t(x)}),[t,x]);const g=d.toArray(b),y=g.length-1;return e(m.Provider,{value:{id:v,count:y,isSelectOnFocus:o,selectedIndex:x,setSelectedIndex:p,setPreviousIndex:N},children:e("div",{className:h("sds-tabs",u),...f,children:d.map(g,((a,t)=>c(a)&&t>0?e(s,{children:r(a,{index:t-1})}):a))})})},f=({children:a,"aria-label":t,className:n,...i})=>{const l=d.toArray(a);return e("div",{className:h("sds-tabs__tab-list",n),role:"tablist","aria-label":t,...i,children:d.map(l,((a,t)=>{if(c(a))return e(s,{children:r(a,{index:t})})}))})},x=({children:s,className:t,icon:n,badge:i,...l})=>{const{index:d}=l,{id:b,count:u,isSelectOnFocus:f,selectedIndex:x,setSelectedIndex:p,setPreviousIndex:_}=o(m),N=d===x,v=e=>{f&&(_(x),p(e))};return a("button",{className:h("sds-tabs__tab",t),role:"tab","aria-selected":N,"aria-controls":`panel-${b}-${d}`,id:`tab-${b}-${d}`,tabIndex:N?0:-1,onClick:()=>{_(x),p(d)},onKeyDown:e=>{const s=u-1,a=e.currentTarget,t=a.parentElement?.firstChild,n=a.parentElement?.lastChild;if("ArrowLeft"===e.key){const e=a.previousSibling;d>0?e.focus():n.focus(),v(x>0?x-1:s)}else if("ArrowRight"===e.key){const e=a.nextSibling;d<s?e.focus():t.focus(),v(x<s?x+1:0)}else"Home"===e.key?(t.focus(),v(0)):"End"===e.key?(n.focus(),v(s)):"Enter"!==e.key&&"Space"!==e.code||p(d)},...l,children:[n&&e("span",{className:"sds-tabs__tab-icon",children:n}),s,i&&e("span",{className:"sds-tabs__tab-badge",children:N?c(i)&&r(i,{visibility:"strong"}):i})]})},p=({children:s,className:a,...t})=>{const{index:n}=t,{id:i,selectedIndex:l}=o(m),d=n===l;return e("div",{className:h("sds-tabs__tab-panel",a),id:`panel-${i}-${n}`,role:"tabpanel",tabIndex:d?void 0:-1,"aria-labelledby":`tab-${i}-${n}`,hidden:!d,...t,children:s})},_=b((({children:s,className:t,icon:n,badge:i,href:l,isSelected:d,...o},b)=>a("a",{className:h("sds-tabs__tab","sds-tab-link",d&&"sds-tab-link--selected",t),href:l,ref:b,...o,children:[n&&e("div",{className:"sds-tabs__tab-icon",children:n}),s,i&&e("div",{className:"sds-tabs__tab-badge",children:d?c(i)&&r(i,{visibility:"high"}):i})]})));_.displayName="TabLink";export{x as Tab,_ as TabLink,f as TabList,p as TabPanel,u as Tabs};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../Tabs.tsx","../TabList.tsx","../Tab.tsx","../TabPanel.tsx","../TabLink.tsx"],"sourcesContent":["import React, {\n Children,\n ReactNode,\n cloneElement,\n useId,\n useState,\n isValidElement,\n createContext,\n ReactElement,\n useEffect,\n HTMLAttributes,\n} from \"react\";\nimport clsx from \"clsx\";\nimport \"./tabs.pcss\";\nimport { TabPanelProps } from \"./TabPanel\";\n\nexport type TabsContextType = {\n id: string;\n count: number;\n isSelectOnFocus: boolean;\n selectedIndex: number;\n setSelectedIndex: (index: number) => void;\n setPreviousIndex: (index: number) => void;\n};\n\nexport const TabsContext = createContext<TabsContextType | null>(null);\n\nexport interface TabsProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultIndex?: number;\n isSelectOnFocus?: boolean;\n onChange?: (index: number) => void;\n children: ReactNode;\n className?: string;\n}\n\nexport const Tabs = ({\n defaultIndex = 0,\n onChange,\n isSelectOnFocus = false,\n children,\n className,\n ...rest\n}: TabsProps) => {\n const [selectedIndex, setSelectedIndex] = useState(defaultIndex);\n const [previousIndex, setPreviousIndex] = useState(defaultIndex);\n const id = useId();\n\n useEffect(() => {\n if (onChange && previousIndex !== selectedIndex) {\n onChange(selectedIndex);\n }\n }, [onChange, selectedIndex]);\n\n const arrayChildren = Children.toArray(children);\n const count = arrayChildren.length - 1;\n\n return (\n <TabsContext.Provider\n value={{\n id,\n count,\n isSelectOnFocus,\n selectedIndex,\n setSelectedIndex,\n setPreviousIndex,\n }}\n >\n <div className={clsx(\"sds-tabs\", className)} {...rest}>\n {Children.map(arrayChildren, (child, index) => {\n if (isValidElement(child) && index > 0) {\n return (\n <>\n {cloneElement(\n child as ReactElement<TabPanelProps & { index: number }>,\n {\n index: index - 1,\n }\n )}\n </>\n );\n } else {\n return child;\n }\n })}\n </div>\n </TabsContext.Provider>\n );\n};\n","import React, {\n Children,\n ReactNode,\n ReactElement,\n cloneElement,\n isValidElement,\n HTMLAttributes,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { TabProps } from \"./Tab\";\n\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n \"aria-label\": string;\n className?: string;\n}\n\nexport const TabList = ({\n children,\n \"aria-label\": ariaLabel,\n className,\n ...rest\n}: TabListProps) => {\n const arrayChildren = Children.toArray(children);\n\n return (\n <div\n className={clsx(\"sds-tabs__tab-list\", className)}\n role=\"tablist\"\n aria-label={ariaLabel}\n {...rest}\n >\n {Children.map(arrayChildren, (child, index) => {\n if (isValidElement(child)) {\n return (\n <>\n {cloneElement(\n child as ReactElement<TabProps & { index: number }>,\n {\n index,\n }\n )}\n </>\n );\n }\n })}\n </div>\n );\n};\n","import React, {\n cloneElement,\n isValidElement,\n HTMLAttributes,\n KeyboardEvent,\n ReactElement,\n ReactNode,\n useContext,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { TabsContext, TabsContextType } from \"./Tabs\";\n\nexport interface TabProps extends HTMLAttributes<HTMLButtonElement> {\n children: ReactNode;\n className?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n}\n\nexport const Tab = ({\n children,\n className,\n icon,\n badge,\n ...rest\n}: TabProps) => {\n const { index } = rest as { index: number };\n const {\n id,\n count,\n isSelectOnFocus,\n selectedIndex,\n setSelectedIndex,\n setPreviousIndex,\n } = useContext(TabsContext) as TabsContextType;\n const isSelected = index === selectedIndex;\n const handleSelect = (index: number) => {\n if (isSelectOnFocus) {\n setPreviousIndex(selectedIndex);\n setSelectedIndex(index);\n }\n };\n const handleKeyPress = (event: KeyboardEvent<HTMLButtonElement>) => {\n const firstIndex = 0;\n const lastIndex = count - 1;\n const currentTarget = event.currentTarget;\n const firstChild = currentTarget.parentElement?.firstChild as HTMLElement;\n const lastChild = currentTarget.parentElement?.lastChild as HTMLElement;\n\n if (event.key === \"ArrowLeft\") {\n const previousSibling = currentTarget.previousSibling as HTMLElement;\n if (index > firstIndex) {\n previousSibling.focus();\n } else {\n lastChild.focus();\n }\n\n handleSelect(selectedIndex > firstIndex ? selectedIndex - 1 : lastIndex);\n } else if (event.key === \"ArrowRight\") {\n const nextSibling = currentTarget.nextSibling as HTMLElement;\n if (index < lastIndex) {\n nextSibling.focus();\n } else {\n firstChild.focus();\n }\n\n handleSelect(selectedIndex < lastIndex ? selectedIndex + 1 : firstIndex);\n } else if (event.key === \"Home\") {\n firstChild.focus();\n handleSelect(firstIndex);\n } else if (event.key === \"End\") {\n lastChild.focus();\n handleSelect(lastIndex);\n } else if (event.key === \"Enter\" || event.code === \"Space\") {\n setSelectedIndex(index);\n }\n };\n\n return (\n <button\n className={clsx(\"sds-tabs__tab\", className)}\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={`panel-${id}-${index}`}\n id={`tab-${id}-${index}`}\n tabIndex={isSelected ? 0 : -1}\n onClick={() => {\n setPreviousIndex(selectedIndex);\n setSelectedIndex(index);\n }}\n onKeyDown={handleKeyPress}\n {...rest}\n >\n {icon && <span className=\"sds-tabs__tab-icon\">{icon}</span>}\n {children}\n {badge && (\n <span className=\"sds-tabs__tab-badge\">\n {isSelected\n ? isValidElement(badge) &&\n cloneElement(badge as ReactElement, { visibility: \"high\" })\n : badge}\n </span>\n )}\n </button>\n );\n};\n","import React, { ReactNode, useContext } from \"react\";\nimport clsx from \"clsx\";\nimport { TabsContext, TabsContextType } from \"./Tabs\";\n\nexport interface TabPanelProps {\n children: ReactNode;\n className?: string;\n}\n\nexport const TabPanel = ({ children, className, ...rest }: TabPanelProps) => {\n const { index } = rest as { index: number };\n const { id, selectedIndex } = useContext(TabsContext) as TabsContextType;\n const isSelected = index === selectedIndex;\n return (\n <div\n className={clsx(\"sds-tabs__tab-panel\", className)}\n id={`panel-${id}-${index}`}\n role=\"tabpanel\"\n tabIndex={isSelected ? 0 : -1}\n aria-labelledby={`tab-${id}-${index}`}\n hidden={!isSelected}\n {...rest}\n >\n {children}\n </div>\n );\n};\n","import React, {\n AnchorHTMLAttributes,\n cloneElement,\n forwardRef,\n isValidElement,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport clsx from \"clsx\";\nimport \"./tab-link.pcss\";\n\nexport interface TabLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n children: ReactNode;\n className?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n isSelected?: boolean;\n}\n\nexport const TabLink = forwardRef<HTMLAnchorElement, TabLinkProps>(\n (\n {\n children,\n className,\n icon,\n badge,\n href,\n isSelected,\n ...rest\n }: TabLinkProps,\n ref\n ) => {\n return (\n <a\n className={clsx(\n \"sds-tabs__tab\",\n \"sds-tab-link\",\n isSelected && \"sds-tab-link--selected\",\n className\n )}\n href={href}\n ref={ref}\n {...rest}\n >\n {icon && <div className=\"sds-tabs__tab-icon\">{icon}</div>}\n {children}\n {badge && (\n <div className=\"sds-tabs__tab-badge\">\n {isSelected\n ? isValidElement(badge) &&\n cloneElement(badge as ReactElement, { visibility: \"high\" })\n : badge}\n </div>\n )}\n </a>\n );\n }\n);\n\nTabLink.displayName = \"TabLink\";\n"],"names":["TabsContext","createContext","Tabs","defaultIndex","onChange","isSelectOnFocus","children","className","rest","selectedIndex","setSelectedIndex","useState","previousIndex","setPreviousIndex","id","useId","useEffect","arrayChildren","Children","toArray","count","length","_jsx","Provider","value","clsx","map","child","index","isValidElement","_Fragment","cloneElement","TabList","ariaLabel","role","Tab","icon","badge","useContext","isSelected","handleSelect","_jsxs","tabIndex","onClick","onKeyDown","event","lastIndex","currentTarget","firstChild","parentElement","lastChild","key","previousSibling","focus","nextSibling","code","visibility","TabPanel","hidden","TabLink","forwardRef","href","ref","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../Tabs.tsx","../TabList.tsx","../Tab.tsx","../TabPanel.tsx","../TabLink.tsx"],"sourcesContent":["import React, {\n Children,\n ReactNode,\n cloneElement,\n useId,\n useState,\n isValidElement,\n createContext,\n ReactElement,\n useEffect,\n HTMLAttributes,\n} from \"react\";\nimport clsx from \"clsx\";\nimport \"./tabs.pcss\";\nimport { TabPanelProps } from \"./TabPanel\";\n\nexport type TabsContextType = {\n id: string;\n count: number;\n isSelectOnFocus: boolean;\n selectedIndex: number;\n setSelectedIndex: (index: number) => void;\n setPreviousIndex: (index: number) => void;\n};\n\nexport const TabsContext = createContext<TabsContextType | null>(null);\n\nexport interface TabsProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultIndex?: number;\n isSelectOnFocus?: boolean;\n onChange?: (index: number) => void;\n children: ReactNode;\n className?: string;\n}\n\nexport const Tabs = ({\n defaultIndex = 0,\n onChange,\n isSelectOnFocus = false,\n children,\n className,\n ...rest\n}: TabsProps) => {\n const [selectedIndex, setSelectedIndex] = useState(defaultIndex);\n const [previousIndex, setPreviousIndex] = useState(defaultIndex);\n const id = useId();\n\n useEffect(() => {\n if (onChange && previousIndex !== selectedIndex) {\n onChange(selectedIndex);\n }\n }, [onChange, selectedIndex]);\n\n const arrayChildren = Children.toArray(children);\n const count = arrayChildren.length - 1;\n\n return (\n <TabsContext.Provider\n value={{\n id,\n count,\n isSelectOnFocus,\n selectedIndex,\n setSelectedIndex,\n setPreviousIndex,\n }}\n >\n <div className={clsx(\"sds-tabs\", className)} {...rest}>\n {Children.map(arrayChildren, (child, index) => {\n if (isValidElement(child) && index > 0) {\n return (\n <>\n {cloneElement(\n child as ReactElement<TabPanelProps & { index: number }>,\n {\n index: index - 1,\n }\n )}\n </>\n );\n } else {\n return child;\n }\n })}\n </div>\n </TabsContext.Provider>\n );\n};\n","import React, {\n Children,\n ReactNode,\n ReactElement,\n cloneElement,\n isValidElement,\n HTMLAttributes,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { TabProps } from \"./Tab\";\n\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n \"aria-label\": string;\n className?: string;\n}\n\nexport const TabList = ({\n children,\n \"aria-label\": ariaLabel,\n className,\n ...rest\n}: TabListProps) => {\n const arrayChildren = Children.toArray(children);\n\n return (\n <div\n className={clsx(\"sds-tabs__tab-list\", className)}\n role=\"tablist\"\n aria-label={ariaLabel}\n {...rest}\n >\n {Children.map(arrayChildren, (child, index) => {\n if (isValidElement(child)) {\n return (\n <>\n {cloneElement(\n child as ReactElement<TabProps & { index: number }>,\n {\n index,\n }\n )}\n </>\n );\n }\n })}\n </div>\n );\n};\n","import React, {\n cloneElement,\n isValidElement,\n HTMLAttributes,\n KeyboardEvent,\n ReactElement,\n ReactNode,\n useContext,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { TabsContext, TabsContextType } from \"./Tabs\";\n\nexport interface TabProps extends HTMLAttributes<HTMLButtonElement> {\n children: ReactNode;\n className?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n}\n\nexport const Tab = ({\n children,\n className,\n icon,\n badge,\n ...rest\n}: TabProps) => {\n const { index } = rest as { index: number };\n const {\n id,\n count,\n isSelectOnFocus,\n selectedIndex,\n setSelectedIndex,\n setPreviousIndex,\n } = useContext(TabsContext) as TabsContextType;\n const isSelected = index === selectedIndex;\n const handleSelect = (index: number) => {\n if (isSelectOnFocus) {\n setPreviousIndex(selectedIndex);\n setSelectedIndex(index);\n }\n };\n const handleKeyPress = (event: KeyboardEvent<HTMLButtonElement>) => {\n const firstIndex = 0;\n const lastIndex = count - 1;\n const currentTarget = event.currentTarget;\n const firstChild = currentTarget.parentElement?.firstChild as HTMLElement;\n const lastChild = currentTarget.parentElement?.lastChild as HTMLElement;\n\n if (event.key === \"ArrowLeft\") {\n const previousSibling = currentTarget.previousSibling as HTMLElement;\n if (index > firstIndex) {\n previousSibling.focus();\n } else {\n lastChild.focus();\n }\n\n handleSelect(selectedIndex > firstIndex ? selectedIndex - 1 : lastIndex);\n } else if (event.key === \"ArrowRight\") {\n const nextSibling = currentTarget.nextSibling as HTMLElement;\n if (index < lastIndex) {\n nextSibling.focus();\n } else {\n firstChild.focus();\n }\n\n handleSelect(selectedIndex < lastIndex ? selectedIndex + 1 : firstIndex);\n } else if (event.key === \"Home\") {\n firstChild.focus();\n handleSelect(firstIndex);\n } else if (event.key === \"End\") {\n lastChild.focus();\n handleSelect(lastIndex);\n } else if (event.key === \"Enter\" || event.code === \"Space\") {\n setSelectedIndex(index);\n }\n };\n\n return (\n <button\n className={clsx(\"sds-tabs__tab\", className)}\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={`panel-${id}-${index}`}\n id={`tab-${id}-${index}`}\n tabIndex={isSelected ? 0 : -1}\n onClick={() => {\n setPreviousIndex(selectedIndex);\n setSelectedIndex(index);\n }}\n onKeyDown={handleKeyPress}\n {...rest}\n >\n {icon && <span className=\"sds-tabs__tab-icon\">{icon}</span>}\n {children}\n {badge && (\n <span className=\"sds-tabs__tab-badge\">\n {isSelected\n ? isValidElement(badge) &&\n cloneElement(badge as ReactElement, { visibility: \"strong\" })\n : badge}\n </span>\n )}\n </button>\n );\n};\n","import React, { ReactNode, useContext } from \"react\";\nimport clsx from \"clsx\";\nimport { TabsContext, TabsContextType } from \"./Tabs\";\n\nexport interface TabPanelProps {\n children: ReactNode;\n className?: string;\n}\n\nexport const TabPanel = ({ children, className, ...rest }: TabPanelProps) => {\n const { index } = rest as { index: number };\n const { id, selectedIndex } = useContext(TabsContext) as TabsContextType;\n const isSelected = index === selectedIndex;\n return (\n <div\n className={clsx(\"sds-tabs__tab-panel\", className)}\n id={`panel-${id}-${index}`}\n role=\"tabpanel\"\n tabIndex={isSelected ? undefined : -1}\n aria-labelledby={`tab-${id}-${index}`}\n hidden={!isSelected}\n {...rest}\n >\n {children}\n </div>\n );\n};\n","import React, {\n AnchorHTMLAttributes,\n cloneElement,\n forwardRef,\n isValidElement,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport clsx from \"clsx\";\nimport \"./tab-link.pcss\";\n\nexport interface TabLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n children: ReactNode;\n className?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n isSelected?: boolean;\n}\n\nexport const TabLink = forwardRef<HTMLAnchorElement, TabLinkProps>(\n (\n {\n children,\n className,\n icon,\n badge,\n href,\n isSelected,\n ...rest\n }: TabLinkProps,\n ref\n ) => {\n return (\n <a\n className={clsx(\n \"sds-tabs__tab\",\n \"sds-tab-link\",\n isSelected && \"sds-tab-link--selected\",\n className\n )}\n href={href}\n ref={ref}\n {...rest}\n >\n {icon && <div className=\"sds-tabs__tab-icon\">{icon}</div>}\n {children}\n {badge && (\n <div className=\"sds-tabs__tab-badge\">\n {isSelected\n ? isValidElement(badge) &&\n cloneElement(badge as ReactElement, { visibility: \"high\" })\n : badge}\n </div>\n )}\n </a>\n );\n }\n);\n\nTabLink.displayName = \"TabLink\";\n"],"names":["TabsContext","createContext","Tabs","defaultIndex","onChange","isSelectOnFocus","children","className","rest","selectedIndex","setSelectedIndex","useState","previousIndex","setPreviousIndex","id","useId","useEffect","arrayChildren","Children","toArray","count","length","_jsx","Provider","value","clsx","map","child","index","isValidElement","_Fragment","cloneElement","TabList","ariaLabel","role","Tab","icon","badge","useContext","isSelected","handleSelect","_jsxs","tabIndex","onClick","onKeyDown","event","lastIndex","currentTarget","firstChild","parentElement","lastChild","key","previousSibling","focus","nextSibling","code","visibility","TabPanel","undefined","hidden","TabLink","forwardRef","href","ref","displayName"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sikt/sds-tabs",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"build": "rollup -c ../../rollup.config.mjs"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@sikt/sds-core": "^
|
|
16
|
+
"@sikt/sds-core": "^3.0.0",
|
|
17
|
+
"@sikt/sds-tokens": "^1.0.0"
|
|
17
18
|
},
|
|
18
19
|
"peerDependencies": {
|
|
19
20
|
"@types/react": "^18.0.0",
|