feather-ui-kit 0.1.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/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # feather-ui-kit
2
+
3
+ An ultra-lightweight React UI component library that leans on browser primitives.
4
+ Several components ship **zero JavaScript** (Accordion, Tabs, Tooltip, Menu). Each
5
+ component is its own subpath export, so you only ship the bytes you import.
6
+
7
+ ```bash
8
+ npm i feather-ui-kit
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ Import the base palette once (and the component styles), then import components per-subpath:
14
+
15
+ ```jsx
16
+ import "feather-ui-kit/themes/light.css"; // the --fk-* token contract
17
+ import "feather-ui-kit/styles.css"; // component styles
18
+ // optional: import "feather-ui-kit/themes/dark.css";
19
+
20
+ import Button from "feather-ui-kit/button";
21
+ import Dialog, { DialogBody, DialogFoot } from "feather-ui-kit/dialog";
22
+
23
+ export default function App() {
24
+ return <Button variant="primary">Deploy</Button>;
25
+ }
26
+ ```
27
+
28
+ Or pull several from the barrel:
29
+
30
+ ```jsx
31
+ import { Button, Card, CardBody, Badge, Tabs } from "feather-ui-kit";
32
+ ```
33
+
34
+ ## Components
35
+
36
+ `Typography` (Overline / Heading / Title / Lead / Text / Muted / Metric) ·
37
+ `Button` · `Input` · `Select` · `Checkbox` · `Radio` · `Switch` · `Slider` ·
38
+ `Badge` · `Avatar` (+ `AvatarGroup`) · `Progress` · `Card` (+ Head/Title/Desc/Body/Foot) ·
39
+ `Table` · `Tabs` · `Accordion` · `Tooltip` · `Menu` · `Dialog` · `ToastProvider`/`useToast`.
40
+
41
+ ## Theming
42
+
43
+ Everything reads from `--fk-*` custom properties. Override them on `:root`
44
+ (or any container) to retheme all components at once:
45
+
46
+ ```css
47
+ :root {
48
+ --fk-accent: #4F46E5;
49
+ --fk-radius: 12px;
50
+ }
51
+ ```
52
+
53
+ The full token contract lives in `themes/variables.css`. Build a theme visually
54
+ with the [theme customizer](https://babanomania.github.io/feather-kit/#/customizer).
55
+
56
+ ## Build
57
+
58
+ ```bash
59
+ npm run build # esbuild → dist/ (ESM + CJS, one entry per component) + size report
60
+ ```
61
+
62
+ Zero runtime dependencies — React is the only peer dependency. MIT licensed.
@@ -0,0 +1 @@
1
+ import{jsx as o,jsxs as s}from"react/jsx-runtime";function r({summary:a,open:e,className:c,children:d,...i}){let n=["feather-accordion",c].filter(Boolean).join(" ");return s("details",{className:n,open:e,...i,children:[o("summary",{children:a}),o("div",{className:"feather-accordion-body",children:d})]})}export{r as default};
@@ -0,0 +1 @@
1
+ var n=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var t=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var m=(a,o)=>{for(var c in o)n(a,c,{get:o[c],enumerable:!0})},u=(a,o,c,i)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of t(o))!f.call(a,e)&&e!==c&&n(a,e,{get:()=>o[e],enumerable:!(i=l(o,e))||i.enumerable});return a};var y=a=>u(n({},"__esModule",{value:!0}),a);var h={};m(h,{default:()=>r});module.exports=y(h);var d=require("react/jsx-runtime");function r({summary:a,open:o,className:c,children:i,...e}){let s=["feather-accordion",c].filter(Boolean).join(" ");return(0,d.jsxs)("details",{className:s,open:o,...e,children:[(0,d.jsx)("summary",{children:a}),(0,d.jsx)("div",{className:"feather-accordion-body",children:i})]})}
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";var n=(...a)=>a.filter(Boolean).join(" ");function f({initials:a,src:t,alt:r,className:o,...s}){return e("span",{className:n("feather-avatar",o),...s,children:t?e("img",{src:t,alt:r||""}):a})}function i({className:a,children:t,...r}){return e("div",{className:n("feather-avatars",a),...r,children:t})}export{i as AvatarGroup,f as default};
package/dist/avatar.js ADDED
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(t,a)=>{for(var r in a)s(t,r,{get:a[r],enumerable:!0})},u=(t,a,r,n)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of v(a))!c.call(t,e)&&e!==r&&s(t,e,{get:()=>a[e],enumerable:!(n=l(a,e))||n.enumerable});return t};var d=t=>u(s({},"__esModule",{value:!0}),t);var m={};p(m,{AvatarGroup:()=>h,default:()=>i});module.exports=d(m);var o=require("react/jsx-runtime"),f=(...t)=>t.filter(Boolean).join(" ");function i({initials:t,src:a,alt:r,className:n,...e}){return(0,o.jsx)("span",{className:f("feather-avatar",n),...e,children:a?(0,o.jsx)("img",{src:a,alt:r||""}):t})}function h({className:t,children:a,...r}){return(0,o.jsx)("div",{className:f("feather-avatars",t),...r,children:a})}
@@ -0,0 +1 @@
1
+ import{jsx as d,jsxs as l}from"react/jsx-runtime";function f({variant:a="soft",dot:e,className:s,children:t,...n}){let o=["feather-badge",`feather-badge-${a}`,s].filter(Boolean).join(" ");return l("span",{className:o,...n,children:[e&&d("span",{className:"feather-badge-dot"}),t]})}export{f as default};
package/dist/badge.js ADDED
@@ -0,0 +1 @@
1
+ var f=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var p=(e,a)=>{for(var t in a)f(e,t,{get:a[t],enumerable:!0})},b=(e,a,t,n)=>{if(a&&typeof a=="object"||typeof a=="function")for(let s of c(a))!g.call(e,s)&&s!==t&&f(e,s,{get:()=>a[s],enumerable:!(n=r(a,s))||n.enumerable});return e};var h=e=>b(f({},"__esModule",{value:!0}),e);var i={};p(i,{default:()=>d});module.exports=h(i);var o=require("react/jsx-runtime");function d({variant:e="soft",dot:a,className:t,children:n,...s}){let l=["feather-badge",`feather-badge-${e}`,t].filter(Boolean).join(" ");return(0,o.jsxs)("span",{className:l,...s,children:[a&&(0,o.jsx)("span",{className:"feather-badge-dot"}),n]})}
@@ -0,0 +1 @@
1
+ import{jsx as u}from"react/jsx-runtime";function r({variant:t="primary",size:o,className:e,...n}){let a=["feather-button",`feather-button-${t}`,o==="sm"&&"feather-button-sm",e].filter(Boolean).join(" ");return u("button",{className:a,...n})}export{r as default};
package/dist/button.js ADDED
@@ -0,0 +1 @@
1
+ var r=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var c=(o,t)=>{for(var n in t)r(o,n,{get:t[n],enumerable:!0})},h=(o,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of s(t))!b.call(o,e)&&e!==n&&r(o,e,{get:()=>t[e],enumerable:!(a=l(t,e))||a.enumerable});return o};var i=o=>h(r({},"__esModule",{value:!0}),o);var m={};c(m,{default:()=>u});module.exports=i(m);var f=require("react/jsx-runtime");function u({variant:o="primary",size:t,className:n,...a}){let e=["feather-button",`feather-button-${o}`,t==="sm"&&"feather-button-sm",n].filter(Boolean).join(" ");return(0,f.jsx)("button",{className:e,...a})}
@@ -0,0 +1 @@
1
+ import{jsx as t}from"react/jsx-runtime";var a=(...e)=>e.filter(Boolean).join(" ");function o({className:e,...r}){return t("div",{className:a("feather-card",e),...r})}function c({className:e,...r}){return t("div",{className:a("feather-card-head",e),...r})}function n({as:e="h3",className:r,...d}){return t(e,{className:a("feather-card-title",r),...d})}function f({className:e,...r}){return t("p",{className:a("feather-card-desc",e),...r})}function s({className:e,...r}){return t("div",{className:a("feather-card-body",e),...r})}function i({className:e,...r}){return t("div",{className:a("feather-card-foot",e),...r})}export{s as CardBody,f as CardDesc,i as CardFoot,c as CardHead,n as CardTitle,o as default};
package/dist/card.js ADDED
@@ -0,0 +1 @@
1
+ var c=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var l=(e,r)=>{for(var t in r)c(e,t,{get:r[t],enumerable:!0})},h=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of i(r))!u.call(e,o)&&o!==t&&c(e,o,{get:()=>r[o],enumerable:!(n=s(r,o))||n.enumerable});return e};var p=e=>h(c({},"__esModule",{value:!0}),e);var y={};l(y,{CardBody:()=>m,CardDesc:()=>N,CardFoot:()=>v,CardHead:()=>x,CardTitle:()=>C,default:()=>f});module.exports=p(y);var a=require("react/jsx-runtime"),d=(...e)=>e.filter(Boolean).join(" ");function f({className:e,...r}){return(0,a.jsx)("div",{className:d("feather-card",e),...r})}function x({className:e,...r}){return(0,a.jsx)("div",{className:d("feather-card-head",e),...r})}function C({as:e="h3",className:r,...t}){return(0,a.jsx)(e,{className:d("feather-card-title",r),...t})}function N({className:e,...r}){return(0,a.jsx)("p",{className:d("feather-card-desc",e),...r})}function m({className:e,...r}){return(0,a.jsx)("div",{className:d("feather-card-body",e),...r})}function v({className:e,...r}){return(0,a.jsx)("div",{className:d("feather-card-foot",e),...r})}
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as c}from"react/jsx-runtime";function s({label:o,className:n,...l}){let t=["feather-check",n].filter(Boolean).join(" ");return c("label",{className:t,children:[e("input",{type:"checkbox",...l}),e("span",{className:"feather-check-box",children:e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3.5",strokeLinecap:"round",strokeLinejoin:"round",children:e("polyline",{points:"20 6 9 17 4 12"})})}),o]})}export{s as default};
@@ -0,0 +1 @@
1
+ var c=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var p=(o,e)=>{for(var l in e)c(o,l,{get:e[l],enumerable:!0})},h=(o,e,l,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!k.call(o,t)&&t!==l&&c(o,t,{get:()=>e[t],enumerable:!(s=a(e,t))||s.enumerable});return o};var f=o=>h(c({},"__esModule",{value:!0}),o);var u={};p(u,{default:()=>r});module.exports=f(u);var n=require("react/jsx-runtime");function r({label:o,className:e,...l}){let s=["feather-check",e].filter(Boolean).join(" ");return(0,n.jsxs)("label",{className:s,children:[(0,n.jsx)("input",{type:"checkbox",...l}),(0,n.jsx)("span",{className:"feather-check-box",children:(0,n.jsx)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,n.jsx)("polyline",{points:"20 6 9 17 4 12"})})}),o]})}
@@ -0,0 +1 @@
1
+ import{useRef as c,useEffect as s}from"react";import{jsx as a}from"react/jsx-runtime";var l=(...o)=>o.filter(Boolean).join(" ");function u({open:o,onClose:t,className:i,children:n,...f}){let r=c(null);return s(()=>{let e=r.current;e&&(o&&!e.open?e.showModal():!o&&e.open&&e.close())},[o]),a("dialog",{ref:r,className:l("feather-dialog",i),onClose:t,onClick:e=>{e.target===r.current&&r.current.close()},...f,children:n})}function g({className:o,...t}){return a("div",{className:l("feather-dialog-body",o),...t})}function h({className:o,...t}){return a("div",{className:l("feather-dialog-foot",o),...t})}export{g as DialogBody,h as DialogFoot,u as default};
package/dist/dialog.js ADDED
@@ -0,0 +1 @@
1
+ var c=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var m=(o,e)=>{for(var l in e)c(o,l,{get:e[l],enumerable:!0})},p=(o,e,l,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of g(e))!h.call(o,t)&&t!==l&&c(o,t,{get:()=>e[t],enumerable:!(a=d(e,t))||a.enumerable});return o};var x=o=>p(c({},"__esModule",{value:!0}),o);var v={};m(v,{DialogBody:()=>D,DialogFoot:()=>N,default:()=>u});module.exports=x(v);var n=require("react"),f=require("react/jsx-runtime"),s=(...o)=>o.filter(Boolean).join(" ");function u({open:o,onClose:e,className:l,children:a,...t}){let i=(0,n.useRef)(null);return(0,n.useEffect)(()=>{let r=i.current;r&&(o&&!r.open?r.showModal():!o&&r.open&&r.close())},[o]),(0,f.jsx)("dialog",{ref:i,className:s("feather-dialog",l),onClose:e,onClick:r=>{r.target===i.current&&i.current.close()},...t,children:a})}function D({className:o,...e}){return(0,f.jsx)("div",{className:s("feather-dialog-body",o),...e})}function N({className:o,...e}){return(0,f.jsx)("div",{className:s("feather-dialog-foot",o),...e})}
@@ -0,0 +1 @@
1
+ import{jsx as c,jsxs as de}from"react/jsx-runtime";var i=(...e)=>e.filter(Boolean).join(" ");function re({className:e,...t}){return c("span",{className:i("feather-overline",e),...t})}function ne({level:e=2,className:t,...a}){let o="h"+Math.min(Math.max(e,1),6),r=e<=1?"feather-h1":e===2?"feather-h2":"feather-h3";return c(o,{className:i(r,t),...a})}function se({as:e="h3",className:t,...a}){return c(e,{className:i("feather-title",t),...a})}function le({as:e="p",className:t,...a}){return c(e,{className:i("feather-lead",t),...a})}function ie({as:e="p",className:t,...a}){return c(e,{className:i("feather-text",t),...a})}function ce({as:e="span",className:t,...a}){return c(e,{className:i("feather-muted",t),...a})}function fe({unit:e,size:t,className:a,children:o,...r}){return de("div",{className:i("feather-metric",t==="sm"&&"feather-metric-sm",a),...r,children:[o,e!=null&&c("span",{className:"feather-metric-unit",children:e})]})}import{jsx as ue}from"react/jsx-runtime";function M({variant:e="primary",size:t,className:a,...o}){let r=["feather-button",`feather-button-${e}`,t==="sm"&&"feather-button-sm",a].filter(Boolean).join(" ");return ue("button",{className:r,...o})}import{useId as pe}from"react";import{jsx as d,jsxs as me}from"react/jsx-runtime";var h=(...e)=>e.filter(Boolean).join(" ");function L({className:e,...t}){return d("div",{className:h("feather-field",e),...t})}function P({className:e,...t}){return d("label",{className:h("feather-label",e),...t})}function A({className:e,...t}){return d("span",{className:h("feather-hint",e),...t})}function D({label:e,hint:t,id:a,className:o,...r}){let n=pe(),s=a||n,l=d("input",{id:s,className:h("feather-input",o),...r});return e==null&&t==null?l:me(L,{children:[e!=null&&d(P,{htmlFor:s,children:e}),l,t!=null&&d(A,{children:t})]})}import{jsx as H}from"react/jsx-runtime";function I({className:e,children:t,...a}){let o=["feather-select",e].filter(Boolean).join(" ");return H("div",{className:o,children:H("select",{...a,children:t})})}import{jsx as v,jsxs as he}from"react/jsx-runtime";function S({label:e,className:t,...a}){let o=["feather-check",t].filter(Boolean).join(" ");return he("label",{className:o,children:[v("input",{type:"checkbox",...a}),v("span",{className:"feather-check-box",children:v("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3.5",strokeLinecap:"round",strokeLinejoin:"round",children:v("polyline",{points:"20 6 9 17 4 12"})})}),e]})}import{jsx as y,jsxs as ve}from"react/jsx-runtime";function $({label:e,className:t,...a}){let o=["feather-check feather-radio",t].filter(Boolean).join(" ");return ve("label",{className:o,children:[y("input",{type:"radio",...a}),y("span",{className:"feather-check-box",children:y("span",{className:"feather-check-dot"})}),e]})}import{jsx as u,jsxs as x}from"react/jsx-runtime";function R({label:e,title:t,description:a,className:o,...r}){let n=(...s)=>s.filter(Boolean).join(" ");return t!=null||a!=null?x("label",{className:n("feather-switch feather-switch-row",o),children:[x("span",{className:"feather-switch-text",children:[u("b",{children:t}),u("span",{children:a})]}),x("span",{style:{display:"inline-flex"},children:[u("input",{type:"checkbox",...r}),u("span",{className:"feather-switch-track"})]})]}):x("label",{className:n("feather-switch",o),children:[u("input",{type:"checkbox",...r}),u("span",{className:"feather-switch-track"}),e]})}import{jsx as B,jsxs as xe}from"react/jsx-runtime";function E({label:e,showValue:t,className:a,...o}){let r=["feather-slider",a].filter(Boolean).join(" "),n=o.value!=null?o.value:o.defaultValue;return xe("label",{className:r,children:[e!=null&&B("span",{children:e}),B("input",{type:"range",...o}),t&&B("span",{className:"feather-slider-value",children:n})]})}import{jsx as Ne,jsxs as be}from"react/jsx-runtime";function G({variant:e="soft",dot:t,className:a,children:o,...r}){let n=["feather-badge",`feather-badge-${e}`,a].filter(Boolean).join(" ");return be("span",{className:n,...r,children:[t&&Ne("span",{className:"feather-badge-dot"}),o]})}import{jsx as C}from"react/jsx-runtime";var O=(...e)=>e.filter(Boolean).join(" ");function W({initials:e,src:t,alt:a,className:o,...r}){return C("span",{className:O("feather-avatar",o),...r,children:t?C("img",{src:t,alt:a||""}):e})}function ge({className:e,children:t,...a}){return C("div",{className:O("feather-avatars",e),...a,children:t})}import{jsx as j}from"react/jsx-runtime";function q({value:e=0,className:t,...a}){let o=["feather-progress",t].filter(Boolean).join(" "),r=Math.max(0,Math.min(100,e));return j("div",{className:o,role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,...a,children:j("i",{style:{width:r+"%"}})})}import{jsx as m}from"react/jsx-runtime";var p=(...e)=>e.filter(Boolean).join(" ");function V({className:e,...t}){return m("div",{className:p("feather-card",e),...t})}function ke({className:e,...t}){return m("div",{className:p("feather-card-head",e),...t})}function ye({as:e="h3",className:t,...a}){return m(e,{className:p("feather-card-title",t),...a})}function Be({className:e,...t}){return m("p",{className:p("feather-card-desc",e),...t})}function Ce({className:e,...t}){return m("div",{className:p("feather-card-body",e),...t})}function Te({className:e,...t}){return m("div",{className:p("feather-card-foot",e),...t})}import{jsx as z}from"react/jsx-runtime";function J({className:e,children:t,...a}){let o=["feather-table",e].filter(Boolean).join(" ");return z("div",{className:"feather-table-wrap",children:z("table",{className:o,...a,children:t})})}import{useId as we,Fragment as Fe}from"react";import{jsx as N,jsxs as K}from"react/jsx-runtime";function Q({items:e=[],defaultIndex:t=0,className:a}){let o=we(),r=["feather-tabs",a].filter(Boolean).join(" ");return K("div",{className:r,children:[e.map((n,s)=>K(Fe,{children:[N("input",{type:"radio",name:o,id:`${o}-${s}`,defaultChecked:s===t}),N("label",{htmlFor:`${o}-${s}`,children:n.label})]},s)),N("div",{className:"feather-tabs-panels",children:e.map((n,s)=>N("div",{className:"feather-tabs-panel",children:n.content},s))})]})}import{jsx as U,jsxs as Me}from"react/jsx-runtime";function X({summary:e,open:t,className:a,children:o,...r}){let n=["feather-accordion",a].filter(Boolean).join(" ");return Me("details",{className:n,open:t,...r,children:[U("summary",{children:e}),U("div",{className:"feather-accordion-body",children:o})]})}import{jsx as Le}from"react/jsx-runtime";function Y({tip:e,className:t,children:a,...o}){let r=["feather-tooltip",t].filter(Boolean).join(" ");return Le("span",{className:r,"data-tip":e,tabIndex:0,...o,children:a})}import{useId as Pe}from"react";import{Fragment as Z,jsx as b,jsxs as _}from"react/jsx-runtime";function ee({label:e="Actions",trigger:t,className:a,children:o,...r}){let n="fkmenu-"+Pe().replace(/[:]/g,""),s="--"+n;return _(Z,{children:[b("button",{className:"feather-menu-trigger",popoverTarget:n,style:{anchorName:s},...r,children:t||_(Z,{children:[e,b("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:b("polyline",{points:"6 9 12 15 18 9"})})]})}),b("div",{id:n,popover:"auto",className:["feather-menu",a].filter(Boolean).join(" "),style:{positionAnchor:s},onClick:l=>{l.target.closest("button,a")&&l.currentTarget.hidePopover?.()},children:o})]})}import{useRef as Ae,useEffect as De}from"react";import{jsx as w}from"react/jsx-runtime";var T=(...e)=>e.filter(Boolean).join(" ");function te({open:e,onClose:t,className:a,children:o,...r}){let n=Ae(null);return De(()=>{let s=n.current;s&&(e&&!s.open?s.showModal():!e&&s.open&&s.close())},[e]),w("dialog",{ref:n,className:T("feather-dialog",a),onClose:t,onClick:s=>{s.target===n.current&&n.current.close()},...r,children:o})}function He({className:e,...t}){return w("div",{className:T("feather-dialog-body",e),...t})}function Ie({className:e,...t}){return w("div",{className:T("feather-dialog-foot",e),...t})}import{createContext as Se,useContext as $e,useState as Re,useCallback as ae,useRef as Ee}from"react";import{createPortal as Ge}from"react-dom";import{jsx as g,jsxs as F}from"react/jsx-runtime";var oe=Se(null),Oe=0;function We({children:e,duration:t=3200}){let[a,o]=Re([]),r=Ee({}),n=ae(l=>{o(f=>f.filter(k=>k.id!==l)),clearTimeout(r.current[l]),delete r.current[l]},[]),s=ae(l=>{let f=++Oe;return o(k=>[...k,{id:f,...l}]),r.current[f]=setTimeout(()=>n(f),l.duration||t),f},[t,n]);return F(oe.Provider,{value:s,children:[e,typeof document<"u"&&Ge(g("div",{className:"feather-toaster",children:a.map(l=>F("div",{className:"feather-toast",role:"status",onClick:()=>n(l.id),children:[g("span",{className:"feather-toast-icon",children:l.icon||"\u2713"}),F("div",{children:[g("div",{className:"feather-toast-title",children:l.title}),l.desc!=null&&g("div",{className:"feather-toast-desc",children:l.desc})]})]},l.id))}),document.body)]})}function je(){let e=$e(oe);if(!e)throw new Error("useToast must be used inside <ToastProvider>");return e}export{X as Accordion,W as Avatar,ge as AvatarGroup,G as Badge,M as Button,V as Card,Ce as CardBody,Be as CardDesc,Te as CardFoot,ke as CardHead,ye as CardTitle,S as Checkbox,te as Dialog,He as DialogBody,Ie as DialogFoot,L as Field,ne as Heading,A as Hint,D as Input,P as Label,le as Lead,ee as Menu,fe as Metric,ce as Muted,re as Overline,q as Progress,$ as Radio,I as Select,E as Slider,R as Switch,J as Table,Q as Tabs,ie as Text,se as Title,We as ToastProvider,Y as Tooltip,je as useToast};
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ var P=Object.defineProperty;var Te=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var Fe=Object.prototype.hasOwnProperty;var Me=(e,t)=>{for(var a in t)P(e,a,{get:t[a],enumerable:!0})},Le=(e,t,a,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of we(t))!Fe.call(e,r)&&r!==a&&P(e,r,{get:()=>t[r],enumerable:!(o=Te(t,r))||o.enumerable});return e};var Pe=e=>Le(P({},"__esModule",{value:!0}),e);var De={};Me(De,{Accordion:()=>X,Avatar:()=>q,AvatarGroup:()=>de,Badge:()=>j,Button:()=>A,Card:()=>J,CardBody:()=>he,CardDesc:()=>me,CardFoot:()=>ve,CardHead:()=>ue,CardTitle:()=>pe,Checkbox:()=>E,Dialog:()=>ee,DialogBody:()=>be,DialogFoot:()=>ge,Field:()=>D,Heading:()=>ae,Hint:()=>I,Input:()=>S,Label:()=>H,Lead:()=>re,Menu:()=>Z,Metric:()=>le,Muted:()=>se,Overline:()=>te,Progress:()=>z,Radio:()=>G,Select:()=>R,Slider:()=>W,Switch:()=>O,Table:()=>Q,Tabs:()=>U,Text:()=>ne,Title:()=>oe,ToastProvider:()=>Be,Tooltip:()=>Y,useToast:()=>Ce});module.exports=Pe(De);var d=require("react/jsx-runtime"),h=(...e)=>e.filter(Boolean).join(" ");function te({className:e,...t}){return(0,d.jsx)("span",{className:h("feather-overline",e),...t})}function ae({level:e=2,className:t,...a}){let o="h"+Math.min(Math.max(e,1),6),r=e<=1?"feather-h1":e===2?"feather-h2":"feather-h3";return(0,d.jsx)(o,{className:h(r,t),...a})}function oe({as:e="h3",className:t,...a}){return(0,d.jsx)(e,{className:h("feather-title",t),...a})}function re({as:e="p",className:t,...a}){return(0,d.jsx)(e,{className:h("feather-lead",t),...a})}function ne({as:e="p",className:t,...a}){return(0,d.jsx)(e,{className:h("feather-text",t),...a})}function se({as:e="span",className:t,...a}){return(0,d.jsx)(e,{className:h("feather-muted",t),...a})}function le({unit:e,size:t,className:a,children:o,...r}){return(0,d.jsxs)("div",{className:h("feather-metric",t==="sm"&&"feather-metric-sm",a),...r,children:[o,e!=null&&(0,d.jsx)("span",{className:"feather-metric-unit",children:e})]})}var ie=require("react/jsx-runtime");function A({variant:e="primary",size:t,className:a,...o}){let r=["feather-button",`feather-button-${e}`,t==="sm"&&"feather-button-sm",a].filter(Boolean).join(" ");return(0,ie.jsx)("button",{className:r,...o})}var ce=require("react"),u=require("react/jsx-runtime"),B=(...e)=>e.filter(Boolean).join(" ");function D({className:e,...t}){return(0,u.jsx)("div",{className:B("feather-field",e),...t})}function H({className:e,...t}){return(0,u.jsx)("label",{className:B("feather-label",e),...t})}function I({className:e,...t}){return(0,u.jsx)("span",{className:B("feather-hint",e),...t})}function S({label:e,hint:t,id:a,className:o,...r}){let n=(0,ce.useId)(),s=a||n,l=(0,u.jsx)("input",{id:s,className:B("feather-input",o),...r});return e==null&&t==null?l:(0,u.jsxs)(D,{children:[e!=null&&(0,u.jsx)(H,{htmlFor:s,children:e}),l,t!=null&&(0,u.jsx)(I,{children:t})]})}var $=require("react/jsx-runtime");function R({className:e,children:t,...a}){let o=["feather-select",e].filter(Boolean).join(" ");return(0,$.jsx)("div",{className:o,children:(0,$.jsx)("select",{...a,children:t})})}var v=require("react/jsx-runtime");function E({label:e,className:t,...a}){let o=["feather-check",t].filter(Boolean).join(" ");return(0,v.jsxs)("label",{className:o,children:[(0,v.jsx)("input",{type:"checkbox",...a}),(0,v.jsx)("span",{className:"feather-check-box",children:(0,v.jsx)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,v.jsx)("polyline",{points:"20 6 9 17 4 12"})})}),e]})}var b=require("react/jsx-runtime");function G({label:e,className:t,...a}){let o=["feather-check feather-radio",t].filter(Boolean).join(" ");return(0,b.jsxs)("label",{className:o,children:[(0,b.jsx)("input",{type:"radio",...a}),(0,b.jsx)("span",{className:"feather-check-box",children:(0,b.jsx)("span",{className:"feather-check-dot"})}),e]})}var i=require("react/jsx-runtime");function O({label:e,title:t,description:a,className:o,...r}){let n=(...s)=>s.filter(Boolean).join(" ");return t!=null||a!=null?(0,i.jsxs)("label",{className:n("feather-switch feather-switch-row",o),children:[(0,i.jsxs)("span",{className:"feather-switch-text",children:[(0,i.jsx)("b",{children:t}),(0,i.jsx)("span",{children:a})]}),(0,i.jsxs)("span",{style:{display:"inline-flex"},children:[(0,i.jsx)("input",{type:"checkbox",...r}),(0,i.jsx)("span",{className:"feather-switch-track"})]})]}):(0,i.jsxs)("label",{className:n("feather-switch",o),children:[(0,i.jsx)("input",{type:"checkbox",...r}),(0,i.jsx)("span",{className:"feather-switch-track"}),e]})}var g=require("react/jsx-runtime");function W({label:e,showValue:t,className:a,...o}){let r=["feather-slider",a].filter(Boolean).join(" "),n=o.value!=null?o.value:o.defaultValue;return(0,g.jsxs)("label",{className:r,children:[e!=null&&(0,g.jsx)("span",{children:e}),(0,g.jsx)("input",{type:"range",...o}),t&&(0,g.jsx)("span",{className:"feather-slider-value",children:n})]})}var C=require("react/jsx-runtime");function j({variant:e="soft",dot:t,className:a,children:o,...r}){let n=["feather-badge",`feather-badge-${e}`,a].filter(Boolean).join(" ");return(0,C.jsxs)("span",{className:n,...r,children:[t&&(0,C.jsx)("span",{className:"feather-badge-dot"}),o]})}var T=require("react/jsx-runtime"),fe=(...e)=>e.filter(Boolean).join(" ");function q({initials:e,src:t,alt:a,className:o,...r}){return(0,T.jsx)("span",{className:fe("feather-avatar",o),...r,children:t?(0,T.jsx)("img",{src:t,alt:a||""}):e})}function de({className:e,children:t,...a}){return(0,T.jsx)("div",{className:fe("feather-avatars",e),...a,children:t})}var V=require("react/jsx-runtime");function z({value:e=0,className:t,...a}){let o=["feather-progress",t].filter(Boolean).join(" "),r=Math.max(0,Math.min(100,e));return(0,V.jsx)("div",{className:o,role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,...a,children:(0,V.jsx)("i",{style:{width:r+"%"}})})}var x=require("react/jsx-runtime"),k=(...e)=>e.filter(Boolean).join(" ");function J({className:e,...t}){return(0,x.jsx)("div",{className:k("feather-card",e),...t})}function ue({className:e,...t}){return(0,x.jsx)("div",{className:k("feather-card-head",e),...t})}function pe({as:e="h3",className:t,...a}){return(0,x.jsx)(e,{className:k("feather-card-title",t),...a})}function me({className:e,...t}){return(0,x.jsx)("p",{className:k("feather-card-desc",e),...t})}function he({className:e,...t}){return(0,x.jsx)("div",{className:k("feather-card-body",e),...t})}function ve({className:e,...t}){return(0,x.jsx)("div",{className:k("feather-card-foot",e),...t})}var K=require("react/jsx-runtime");function Q({className:e,children:t,...a}){let o=["feather-table",e].filter(Boolean).join(" ");return(0,K.jsx)("div",{className:"feather-table-wrap",children:(0,K.jsx)("table",{className:o,...a,children:t})})}var w=require("react"),m=require("react/jsx-runtime");function U({items:e=[],defaultIndex:t=0,className:a}){let o=(0,w.useId)(),r=["feather-tabs",a].filter(Boolean).join(" ");return(0,m.jsxs)("div",{className:r,children:[e.map((n,s)=>(0,m.jsxs)(w.Fragment,{children:[(0,m.jsx)("input",{type:"radio",name:o,id:`${o}-${s}`,defaultChecked:s===t}),(0,m.jsx)("label",{htmlFor:`${o}-${s}`,children:n.label})]},s)),(0,m.jsx)("div",{className:"feather-tabs-panels",children:e.map((n,s)=>(0,m.jsx)("div",{className:"feather-tabs-panel",children:n.content},s))})]})}var y=require("react/jsx-runtime");function X({summary:e,open:t,className:a,children:o,...r}){let n=["feather-accordion",a].filter(Boolean).join(" ");return(0,y.jsxs)("details",{className:n,open:t,...r,children:[(0,y.jsx)("summary",{children:e}),(0,y.jsx)("div",{className:"feather-accordion-body",children:o})]})}var xe=require("react/jsx-runtime");function Y({tip:e,className:t,children:a,...o}){let r=["feather-tooltip",t].filter(Boolean).join(" ");return(0,xe.jsx)("span",{className:r,"data-tip":e,tabIndex:0,...o,children:a})}var Ne=require("react"),c=require("react/jsx-runtime");function Z({label:e="Actions",trigger:t,className:a,children:o,...r}){let n="fkmenu-"+(0,Ne.useId)().replace(/[:]/g,""),s="--"+n;return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)("button",{className:"feather-menu-trigger",popoverTarget:n,style:{anchorName:s},...r,children:t||(0,c.jsxs)(c.Fragment,{children:[e,(0,c.jsx)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,c.jsx)("polyline",{points:"6 9 12 15 18 9"})})]})}),(0,c.jsx)("div",{id:n,popover:"auto",className:["feather-menu",a].filter(Boolean).join(" "),style:{positionAnchor:s},onClick:l=>{l.target.closest("button,a")&&l.currentTarget.hidePopover?.()},children:o})]})}var F=require("react"),M=require("react/jsx-runtime"),_=(...e)=>e.filter(Boolean).join(" ");function ee({open:e,onClose:t,className:a,children:o,...r}){let n=(0,F.useRef)(null);return(0,F.useEffect)(()=>{let s=n.current;s&&(e&&!s.open?s.showModal():!e&&s.open&&s.close())},[e]),(0,M.jsx)("dialog",{ref:n,className:_("feather-dialog",a),onClose:t,onClick:s=>{s.target===n.current&&n.current.close()},...r,children:o})}function be({className:e,...t}){return(0,M.jsx)("div",{className:_("feather-dialog-body",e),...t})}function ge({className:e,...t}){return(0,M.jsx)("div",{className:_("feather-dialog-foot",e),...t})}var f=require("react"),ke=require("react-dom"),p=require("react/jsx-runtime"),ye=(0,f.createContext)(null),Ae=0;function Be({children:e,duration:t=3200}){let[a,o]=(0,f.useState)([]),r=(0,f.useRef)({}),n=(0,f.useCallback)(l=>{o(N=>N.filter(L=>L.id!==l)),clearTimeout(r.current[l]),delete r.current[l]},[]),s=(0,f.useCallback)(l=>{let N=++Ae;return o(L=>[...L,{id:N,...l}]),r.current[N]=setTimeout(()=>n(N),l.duration||t),N},[t,n]);return(0,p.jsxs)(ye.Provider,{value:s,children:[e,typeof document<"u"&&(0,ke.createPortal)((0,p.jsx)("div",{className:"feather-toaster",children:a.map(l=>(0,p.jsxs)("div",{className:"feather-toast",role:"status",onClick:()=>n(l.id),children:[(0,p.jsx)("span",{className:"feather-toast-icon",children:l.icon||"\u2713"}),(0,p.jsxs)("div",{children:[(0,p.jsx)("div",{className:"feather-toast-title",children:l.title}),l.desc!=null&&(0,p.jsx)("div",{className:"feather-toast-desc",children:l.desc})]})]},l.id))}),document.body)]})}function Ce(){let e=(0,f.useContext)(ye);if(!e)throw new Error("useToast must be used inside <ToastProvider>");return e}
@@ -0,0 +1 @@
1
+ import{useId as s}from"react";import{jsx as n,jsxs as h}from"react/jsx-runtime";var l=(...e)=>e.filter(Boolean).join(" ");function c({className:e,...t}){return n("div",{className:l("feather-field",e),...t})}function p({className:e,...t}){return n("label",{className:l("feather-label",e),...t})}function d({className:e,...t}){return n("span",{className:l("feather-hint",e),...t})}function m({label:e,hint:t,id:u,className:a,...i}){let f=s(),r=u||f,o=n("input",{id:r,className:l("feather-input",a),...i});return e==null&&t==null?o:h(c,{children:[e!=null&&n(p,{htmlFor:r,children:e}),o,t!=null&&n(d,{children:t})]})}export{c as Field,d as Hint,p as Label,m as default};
package/dist/input.js ADDED
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var I=(e,t)=>{for(var r in t)a(e,r,{get:t[r],enumerable:!0})},b=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of N(t))!F.call(e,l)&&l!==r&&a(e,l,{get:()=>t[l],enumerable:!(o=x(t,l))||o.enumerable});return e};var H=e=>b(a({},"__esModule",{value:!0}),e);var L={};I(L,{Field:()=>c,Hint:()=>d,Label:()=>p,default:()=>m});module.exports=H(L);var s=require("react"),n=require("react/jsx-runtime"),u=(...e)=>e.filter(Boolean).join(" ");function c({className:e,...t}){return(0,n.jsx)("div",{className:u("feather-field",e),...t})}function p({className:e,...t}){return(0,n.jsx)("label",{className:u("feather-label",e),...t})}function d({className:e,...t}){return(0,n.jsx)("span",{className:u("feather-hint",e),...t})}function m({label:e,hint:t,id:r,className:o,...l}){let h=(0,s.useId)(),i=r||h,f=(0,n.jsx)("input",{id:i,className:u("feather-input",o),...l});return e==null&&t==null?f:(0,n.jsxs)(c,{children:[e!=null&&(0,n.jsx)(p,{htmlFor:i,children:e}),f,t!=null&&(0,n.jsx)(d,{children:t})]})}
@@ -0,0 +1 @@
1
+ import{useId as p}from"react";import{Fragment as r,jsx as o,jsxs as i}from"react/jsx-runtime";function d({label:s="Actions",trigger:a,className:l,children:u,...c}){let e="fkmenu-"+p().replace(/[:]/g,""),t="--"+e;return i(r,{children:[o("button",{className:"feather-menu-trigger",popoverTarget:e,style:{anchorName:t},...c,children:a||i(r,{children:[s,o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:o("polyline",{points:"6 9 12 15 18 9"})})]})}),o("div",{id:e,popover:"auto",className:["feather-menu",l].filter(Boolean).join(" "),style:{positionAnchor:t},onClick:n=>{n.target.closest("button,a")&&n.currentTarget.hidePopover?.()},children:u})]})}export{d as default};
package/dist/menu.js ADDED
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var v=(t,o)=>{for(var r in o)a(t,r,{get:o[r],enumerable:!0})},h=(t,o,r,i)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of f(o))!g.call(t,n)&&n!==r&&a(t,n,{get:()=>o[n],enumerable:!(i=d(o,n))||i.enumerable});return t};var m=t=>h(a({},"__esModule",{value:!0}),t);var k={};v(k,{default:()=>p});module.exports=m(k);var c=require("react"),e=require("react/jsx-runtime");function p({label:t="Actions",trigger:o,className:r,children:i,...n}){let s="fkmenu-"+(0,c.useId)().replace(/[:]/g,""),l="--"+s;return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("button",{className:"feather-menu-trigger",popoverTarget:s,style:{anchorName:l},...n,children:o||(0,e.jsxs)(e.Fragment,{children:[t,(0,e.jsx)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,e.jsx)("polyline",{points:"6 9 12 15 18 9"})})]})}),(0,e.jsx)("div",{id:s,popover:"auto",className:["feather-menu",r].filter(Boolean).join(" "),style:{positionAnchor:l},onClick:u=>{u.target.closest("button,a")&&u.currentTarget.hidePopover?.()},children:i})]})}
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";function t({value:r=0,className:o,...i}){let s=["feather-progress",o].filter(Boolean).join(" "),a=Math.max(0,Math.min(100,r));return e("div",{className:s,role:"progressbar","aria-valuenow":a,"aria-valuemin":0,"aria-valuemax":100,...i,children:e("i",{style:{width:a+"%"}})})}export{t as default};
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var v=(e,a)=>{for(var o in a)s(e,o,{get:a[o],enumerable:!0})},d=(e,a,o,i)=>{if(a&&typeof a=="object"||typeof a=="function")for(let r of c(a))!u.call(e,r)&&r!==o&&s(e,r,{get:()=>a[r],enumerable:!(i=n(a,r))||i.enumerable});return e};var f=e=>d(s({},"__esModule",{value:!0}),e);var h={};v(h,{default:()=>l});module.exports=f(h);var t=require("react/jsx-runtime");function l({value:e=0,className:a,...o}){let i=["feather-progress",a].filter(Boolean).join(" "),r=Math.max(0,Math.min(100,e));return(0,t.jsx)("div",{className:i,role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,...o,children:(0,t.jsx)("i",{style:{width:r+"%"}})})}
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as s}from"react/jsx-runtime";function t({label:a,className:c,...l}){let o=["feather-check feather-radio",c].filter(Boolean).join(" ");return s("label",{className:o,children:[e("input",{type:"radio",...l}),e("span",{className:"feather-check-box",children:e("span",{className:"feather-check-dot"})}),a]})}export{t as default};
package/dist/radio.js ADDED
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var i=(a,e)=>{for(var c in e)s(a,c,{get:e[c],enumerable:!0})},p=(a,e,c,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of f(e))!h.call(a,o)&&o!==c&&s(a,o,{get:()=>e[o],enumerable:!(t=r(e,o))||t.enumerable});return a};var d=a=>p(s({},"__esModule",{value:!0}),a);var b={};i(b,{default:()=>n});module.exports=d(b);var l=require("react/jsx-runtime");function n({label:a,className:e,...c}){let t=["feather-check feather-radio",e].filter(Boolean).join(" ");return(0,l.jsxs)("label",{className:t,children:[(0,l.jsx)("input",{type:"radio",...c}),(0,l.jsx)("span",{className:"feather-check-box",children:(0,l.jsx)("span",{className:"feather-check-dot"})}),a]})}
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";function s({className:l,children:t,...c}){let o=["feather-select",l].filter(Boolean).join(" ");return e("div",{className:o,children:e("select",{...c,children:t})})}export{s as default};
package/dist/select.js ADDED
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var r=(l,e)=>{for(var t in e)s(l,t,{get:e[t],enumerable:!0})},u=(l,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of i(e))!d.call(l,c)&&c!==t&&s(l,c,{get:()=>e[c],enumerable:!(o=f(e,c))||o.enumerable});return l};var v=l=>u(s({},"__esModule",{value:!0}),l);var h={};r(h,{default:()=>a});module.exports=v(h);var n=require("react/jsx-runtime");function a({className:l,children:e,...t}){let o=["feather-select",l].filter(Boolean).join(" ");return(0,n.jsx)("div",{className:o,children:(0,n.jsx)("select",{...t,children:e})})}
@@ -0,0 +1 @@
1
+ import{jsx as l,jsxs as i}from"react/jsx-runtime";function f({label:a,showValue:n,className:t,...e}){let u=["feather-slider",t].filter(Boolean).join(" "),s=e.value!=null?e.value:e.defaultValue;return i("label",{className:u,children:[a!=null&&l("span",{children:a}),l("input",{type:"range",...e}),n&&l("span",{className:"feather-slider-value",children:s})]})}export{f as default};
package/dist/slider.js ADDED
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var r=Object.prototype.hasOwnProperty;var o=(l,e)=>{for(var t in e)s(l,t,{get:e[t],enumerable:!0})},v=(l,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of d(e))!r.call(l,n)&&n!==t&&s(l,n,{get:()=>e[n],enumerable:!(a=c(e,n))||a.enumerable});return l};var h=l=>v(s({},"__esModule",{value:!0}),l);var N={};o(N,{default:()=>f});module.exports=h(N);var u=require("react/jsx-runtime");function f({label:l,showValue:e,className:t,...a}){let n=["feather-slider",t].filter(Boolean).join(" "),i=a.value!=null?a.value:a.defaultValue;return(0,u.jsxs)("label",{className:n,children:[l!=null&&(0,u.jsx)("span",{children:l}),(0,u.jsx)("input",{type:"range",...a}),e&&(0,u.jsx)("span",{className:"feather-slider-value",children:i})]})}
@@ -0,0 +1 @@
1
+ import{jsx as a,jsxs as e}from"react/jsx-runtime";function f({label:h,title:t,description:l,className:s,...n}){let c=(...i)=>i.filter(Boolean).join(" ");return t!=null||l!=null?e("label",{className:c("feather-switch feather-switch-row",s),children:[e("span",{className:"feather-switch-text",children:[a("b",{children:t}),a("span",{children:l})]}),e("span",{style:{display:"inline-flex"},children:[a("input",{type:"checkbox",...n}),a("span",{className:"feather-switch-track"})]})]}):e("label",{className:c("feather-switch",s),children:[a("input",{type:"checkbox",...n}),a("span",{className:"feather-switch-track"}),h]})}export{f as default};
package/dist/switch.js ADDED
@@ -0,0 +1 @@
1
+ var c=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var w=(t,a)=>{for(var s in a)c(t,s,{get:a[s],enumerable:!0})},o=(t,a,s,n)=>{if(a&&typeof a=="object"||typeof a=="function")for(let l of r(a))!b.call(t,l)&&l!==s&&c(t,l,{get:()=>a[l],enumerable:!(n=p(a,l))||n.enumerable});return t};var u=t=>o(c({},"__esModule",{value:!0}),t);var x={};w(x,{default:()=>i});module.exports=u(x);var e=require("react/jsx-runtime");function i({label:t,title:a,description:s,className:n,...l}){let h=(...f)=>f.filter(Boolean).join(" ");return a!=null||s!=null?(0,e.jsxs)("label",{className:h("feather-switch feather-switch-row",n),children:[(0,e.jsxs)("span",{className:"feather-switch-text",children:[(0,e.jsx)("b",{children:a}),(0,e.jsx)("span",{children:s})]}),(0,e.jsxs)("span",{style:{display:"inline-flex"},children:[(0,e.jsx)("input",{type:"checkbox",...l}),(0,e.jsx)("span",{className:"feather-switch-track"})]})]}):(0,e.jsxs)("label",{className:h("feather-switch",n),children:[(0,e.jsx)("input",{type:"checkbox",...l}),(0,e.jsx)("span",{className:"feather-switch-track"}),t]})}
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";function b({className:a,children:l,...t}){let o=["feather-table",a].filter(Boolean).join(" ");return e("div",{className:"feather-table-wrap",children:e("table",{className:o,...t,children:l})})}export{b as default};
package/dist/table.js ADDED
@@ -0,0 +1 @@
1
+ var b=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var i=(a,e)=>{for(var l in e)b(a,l,{get:e[l],enumerable:!0})},d=(a,e,l,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of s(e))!c.call(a,t)&&t!==l&&b(a,t,{get:()=>e[t],enumerable:!(o=r(e,t))||o.enumerable});return a};var h=a=>d(b({},"__esModule",{value:!0}),a);var p={};i(p,{default:()=>n});module.exports=h(p);var f=require("react/jsx-runtime");function n({className:a,children:e,...l}){let o=["feather-table",a].filter(Boolean).join(" ");return(0,f.jsx)("div",{className:"feather-table-wrap",children:(0,f.jsx)("table",{className:o,...l,children:e})})}
@@ -0,0 +1 @@
1
+ import{useId as m,Fragment as c}from"react";import{jsx as a,jsxs as s}from"react/jsx-runtime";function f({items:n=[],defaultIndex:d=0,className:o}){let t=m(),r=["feather-tabs",o].filter(Boolean).join(" ");return s("div",{className:r,children:[n.map((l,e)=>s(c,{children:[a("input",{type:"radio",name:t,id:`${t}-${e}`,defaultChecked:e===d}),a("label",{htmlFor:`${t}-${e}`,children:l.label})]},e)),a("div",{className:"feather-tabs-panels",children:n.map((l,e)=>a("div",{className:"feather-tabs-panel",children:l.content},e))})]})}export{f as default};
package/dist/tabs.js ADDED
@@ -0,0 +1 @@
1
+ var m=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var b=(a,e)=>{for(var n in e)m(a,n,{get:e[n],enumerable:!0})},v=(a,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let l of i(e))!p.call(a,l)&&l!==n&&m(a,l,{get:()=>e[l],enumerable:!(s=f(e,l))||s.enumerable});return a};var h=a=>v(m({},"__esModule",{value:!0}),a);var u={};b(u,{default:()=>c});module.exports=h(u);var o=require("react"),t=require("react/jsx-runtime");function c({items:a=[],defaultIndex:e=0,className:n}){let s=(0,o.useId)(),l=["feather-tabs",n].filter(Boolean).join(" ");return(0,t.jsxs)("div",{className:l,children:[a.map((r,d)=>(0,t.jsxs)(o.Fragment,{children:[(0,t.jsx)("input",{type:"radio",name:s,id:`${s}-${d}`,defaultChecked:d===e}),(0,t.jsx)("label",{htmlFor:`${s}-${d}`,children:r.label})]},d)),(0,t.jsx)("div",{className:"feather-tabs-panels",children:a.map((r,d)=>(0,t.jsx)("div",{className:"feather-tabs-panel",children:r.content},d))})]})}
@@ -0,0 +1 @@
1
+ import{createContext as f,useContext as T,useState as p,useCallback as u,useRef as h}from"react";import{createPortal as x}from"react-dom";import{jsx as o,jsxs as n}from"react/jsx-runtime";var l=f(null),C=0;function b({children:s,duration:c=3200}){let[m,d]=p([]),r=h({}),a=u(e=>{d(t=>t.filter(i=>i.id!==e)),clearTimeout(r.current[e]),delete r.current[e]},[]),v=u(e=>{let t=++C;return d(i=>[...i,{id:t,...e}]),r.current[t]=setTimeout(()=>a(t),e.duration||c),t},[c,a]);return n(l.Provider,{value:v,children:[s,typeof document<"u"&&x(o("div",{className:"feather-toaster",children:m.map(e=>n("div",{className:"feather-toast",role:"status",onClick:()=>a(e.id),children:[o("span",{className:"feather-toast-icon",children:e.icon||"\u2713"}),n("div",{children:[o("div",{className:"feather-toast-title",children:e.title}),e.desc!=null&&o("div",{className:"feather-toast-desc",children:e.desc})]})]},e.id))}),document.body)]})}function k(){let s=T(l);if(!s)throw new Error("useToast must be used inside <ToastProvider>");return s}export{b as ToastProvider,k as useToast};
package/dist/toast.js ADDED
@@ -0,0 +1 @@
1
+ var l=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var x=(t,s)=>{for(var i in s)l(t,i,{get:s[i],enumerable:!0})},C=(t,s,i,c)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of p(s))!h.call(t,r)&&r!==i&&l(t,r,{get:()=>s[r],enumerable:!(c=T(s,r))||c.enumerable});return t};var N=t=>C(l({},"__esModule",{value:!0}),t);var y={};x(y,{ToastProvider:()=>b,useToast:()=>k});module.exports=N(y);var o=require("react"),m=require("react-dom"),a=require("react/jsx-runtime"),v=(0,o.createContext)(null),P=0;function b({children:t,duration:s=3200}){let[i,c]=(0,o.useState)([]),r=(0,o.useRef)({}),d=(0,o.useCallback)(e=>{c(n=>n.filter(u=>u.id!==e)),clearTimeout(r.current[e]),delete r.current[e]},[]),f=(0,o.useCallback)(e=>{let n=++P;return c(u=>[...u,{id:n,...e}]),r.current[n]=setTimeout(()=>d(n),e.duration||s),n},[s,d]);return(0,a.jsxs)(v.Provider,{value:f,children:[t,typeof document<"u"&&(0,m.createPortal)((0,a.jsx)("div",{className:"feather-toaster",children:i.map(e=>(0,a.jsxs)("div",{className:"feather-toast",role:"status",onClick:()=>d(e.id),children:[(0,a.jsx)("span",{className:"feather-toast-icon",children:e.icon||"\u2713"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"feather-toast-title",children:e.title}),e.desc!=null&&(0,a.jsx)("div",{className:"feather-toast-desc",children:e.desc})]})]},e.id))}),document.body)]})}function k(){let t=(0,o.useContext)(v);if(!t)throw new Error("useToast must be used inside <ToastProvider>");return t}
@@ -0,0 +1 @@
1
+ import{jsx as p}from"react/jsx-runtime";function l({tip:t,className:o,children:a,...n}){let e=["feather-tooltip",o].filter(Boolean).join(" ");return p("span",{className:e,"data-tip":t,tabIndex:0,...n,children:a})}export{l as default};
@@ -0,0 +1 @@
1
+ var l=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(o,t)=>{for(var n in t)l(o,n,{get:t[n],enumerable:!0})},r=(o,t,n,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of f(t))!c.call(o,a)&&a!==n&&l(o,a,{get:()=>t[a],enumerable:!(e=s(t,a))||e.enumerable});return o};var u=o=>r(l({},"__esModule",{value:!0}),o);var b={};d(b,{default:()=>p});module.exports=u(b);var i=require("react/jsx-runtime");function p({tip:o,className:t,children:n,...e}){let a=["feather-tooltip",t].filter(Boolean).join(" ");return(0,i.jsx)("span",{className:a,"data-tip":o,tabIndex:0,...e,children:n})}
@@ -0,0 +1 @@
1
+ import{jsx as n,jsxs as o}from"react/jsx-runtime";var r=(...e)=>e.filter(Boolean).join(" ");function i({className:e,...t}){return n("span",{className:r("feather-overline",e),...t})}function f({level:e=2,className:t,...a}){let s="h"+Math.min(Math.max(e,1),6),c=e<=1?"feather-h1":e===2?"feather-h2":"feather-h3";return n(s,{className:r(c,t),...a})}function h({as:e="h3",className:t,...a}){return n(e,{className:r("feather-title",t),...a})}function u({as:e="p",className:t,...a}){return n(e,{className:r("feather-lead",t),...a})}function m({as:e="p",className:t,...a}){return n(e,{className:r("feather-text",t),...a})}function l({as:e="span",className:t,...a}){return n(e,{className:r("feather-muted",t),...a})}function p({unit:e,size:t,className:a,children:s,...c}){return o("div",{className:r("feather-metric",t==="sm"&&"feather-metric-sm",a),...c,children:[s,e!=null&&n("span",{className:"feather-metric-unit",children:e})]})}export{f as Heading,u as Lead,p as Metric,l as Muted,i as Overline,m as Text,h as Title};
@@ -0,0 +1 @@
1
+ var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var u=(e,t)=>{for(var a in t)o(e,a,{get:t[a],enumerable:!0})},m=(e,t,a,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of f(t))!h.call(e,n)&&n!==a&&o(e,n,{get:()=>t[n],enumerable:!(c=i(t,n))||c.enumerable});return e};var l=e=>m(o({},"__esModule",{value:!0}),e);var v={};u(v,{Heading:()=>x,Lead:()=>d,Metric:()=>g,Muted:()=>T,Overline:()=>p,Text:()=>M,Title:()=>N});module.exports=l(v);var r=require("react/jsx-runtime"),s=(...e)=>e.filter(Boolean).join(" ");function p({className:e,...t}){return(0,r.jsx)("span",{className:s("feather-overline",e),...t})}function x({level:e=2,className:t,...a}){let c="h"+Math.min(Math.max(e,1),6),n=e<=1?"feather-h1":e===2?"feather-h2":"feather-h3";return(0,r.jsx)(c,{className:s(n,t),...a})}function N({as:e="h3",className:t,...a}){return(0,r.jsx)(e,{className:s("feather-title",t),...a})}function d({as:e="p",className:t,...a}){return(0,r.jsx)(e,{className:s("feather-lead",t),...a})}function M({as:e="p",className:t,...a}){return(0,r.jsx)(e,{className:s("feather-text",t),...a})}function T({as:e="span",className:t,...a}){return(0,r.jsx)(e,{className:s("feather-muted",t),...a})}function g({unit:e,size:t,className:a,children:c,...n}){return(0,r.jsxs)("div",{className:s("feather-metric",t==="sm"&&"feather-metric-sm",a),...n,children:[c,e!=null&&(0,r.jsx)("span",{className:"feather-metric-unit",children:e})]})}
@@ -0,0 +1,185 @@
1
+ /* feather-kit — component styles. Import once: import "feather-kit/styles.css"
2
+ Every rule reads from the --fk-* token contract (see themes/variables.css),
3
+ so a theme swap restyles all of it. */
4
+
5
+ /* ── typography ── */
6
+ .feather-overline { font-family: var(--fk-font-mono); font-size: 11px; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fk-accent-deep); }
7
+ .feather-h1 { font-family: var(--fk-font); font-size: 30px; font-weight: 720; letter-spacing: -0.025em; line-height: 1.1; color: var(--fk-ink); margin: 0; }
8
+ .feather-h2 { font-family: var(--fk-font); font-size: 22px; font-weight: 680; letter-spacing: -0.02em; line-height: 1.18; color: var(--fk-ink); margin: 0; }
9
+ .feather-h3, .feather-title { font-family: var(--fk-font); font-size: 15px; font-weight: 650; letter-spacing: -0.01em; color: var(--fk-ink); margin: 0; }
10
+ .feather-lead { font-family: var(--fk-font-serif); font-size: 17px; line-height: 1.5; color: var(--fk-ink-soft); margin: 0; }
11
+ .feather-text { font-family: var(--fk-font); font-size: 14px; line-height: 1.55; color: var(--fk-ink-soft); margin: 0; }
12
+ .feather-muted { font-family: var(--fk-font); font-size: 12.5px; color: var(--fk-muted); }
13
+ .feather-metric { font-family: var(--fk-font); font-size: 30px; font-weight: 720; letter-spacing: -0.03em; color: var(--fk-ink); font-variant-numeric: tabular-nums; display: inline-flex; align-items: baseline; gap: 6px; line-height: 1; }
14
+ .feather-metric-sm { font-size: 22px; }
15
+ .feather-metric-unit { font-family: var(--fk-font); font-size: 12px; font-weight: 500; letter-spacing: 0; color: var(--fk-muted); }
16
+
17
+ /* ── button ── */
18
+ .feather-button { font-family: var(--fk-font); font-size: 13.5px; font-weight: 500; height: 36px; padding: 0 15px; border-radius: var(--fk-radius); border: 1px solid transparent; cursor: pointer; white-space: nowrap; display: inline-flex; align-items: center; justify-content: center; gap: 7px; transition: background 130ms, border-color 130ms, transform 90ms; }
19
+ .feather-button:active { transform: translateY(0.5px); }
20
+ .feather-button:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--fk-bg), 0 0 0 4px var(--fk-accent); }
21
+ .feather-button[disabled] { opacity: 0.55; cursor: not-allowed; }
22
+ .feather-button-primary { background: var(--fk-accent); color: var(--fk-on-accent); }
23
+ .feather-button-primary:hover { background: var(--fk-accent-deep); }
24
+ .feather-button-secondary { background: var(--fk-bg-subtle); color: var(--fk-ink); border-color: var(--fk-border); }
25
+ .feather-button-secondary:hover { background: color-mix(in srgb, var(--fk-bg-subtle), var(--fk-ink) 7%); }
26
+ .feather-button-outline { background: var(--fk-bg); color: var(--fk-ink); border-color: var(--fk-border); }
27
+ .feather-button-outline:hover { background: var(--fk-bg-subtle); }
28
+ .feather-button-ghost { background: transparent; color: var(--fk-ink); }
29
+ .feather-button-ghost:hover { background: var(--fk-bg-subtle); }
30
+ .feather-button-destructive { background: var(--fk-danger); color: #fff; }
31
+ .feather-button-destructive:hover { background: color-mix(in srgb, var(--fk-danger), #000 14%); }
32
+ .feather-button-sm { height: 30px; padding: 0 11px; font-size: 12.5px; }
33
+ .feather-button-block { width: 100%; }
34
+ .feather-button svg { width: 15px; height: 15px; }
35
+
36
+ /* ── field / input ── */
37
+ .feather-field { display: flex; flex-direction: column; gap: 6px; width: 100%; }
38
+ .feather-label { font-family: var(--fk-font); font-size: 12.5px; font-weight: 500; color: var(--fk-ink); }
39
+ .feather-input { font-family: var(--fk-font); font-size: 13.5px; height: 36px; padding: 0 12px; width: 100%; border-radius: var(--fk-radius); border: 1px solid var(--fk-border); background: var(--fk-bg); color: var(--fk-ink); transition: border-color 130ms, box-shadow 130ms; }
40
+ .feather-input::placeholder { color: var(--fk-muted); }
41
+ .feather-input:focus { outline: none; border-color: var(--fk-accent); box-shadow: 0 0 0 3px var(--fk-accent-soft); }
42
+ .feather-hint { font-family: var(--fk-font); font-size: 11.5px; color: var(--fk-muted); }
43
+
44
+ /* ── select ── */
45
+ .feather-select { position: relative; display: flex; align-items: center; width: 100%; }
46
+ .feather-select select { appearance: none; -webkit-appearance: none; font-family: var(--fk-font); font-size: 13.5px; height: 36px; padding: 0 34px 0 12px; border-radius: var(--fk-radius); border: 1px solid var(--fk-border); background: var(--fk-bg); color: var(--fk-ink); width: 100%; cursor: pointer; transition: border-color 130ms, box-shadow 130ms; }
47
+ .feather-select select:focus { outline: none; border-color: var(--fk-accent); box-shadow: 0 0 0 3px var(--fk-accent-soft); }
48
+ .feather-select::after { content: ""; position: absolute; right: 14px; width: 7px; height: 7px; border-right: 1.5px solid var(--fk-muted); border-bottom: 1.5px solid var(--fk-muted); transform: rotate(45deg) translateY(-2px); pointer-events: none; }
49
+
50
+ /* ── checkbox / radio ── */
51
+ .feather-check { display: inline-flex; align-items: center; gap: 9px; font-family: var(--fk-font); font-size: 13.5px; color: var(--fk-ink); cursor: pointer; }
52
+ .feather-check input { position: absolute; opacity: 0; width: 1px; height: 1px; }
53
+ .feather-check-box { width: 18px; height: 18px; border-radius: max(3px, calc(var(--fk-radius) - 3px)); border: 1.5px solid var(--fk-border); background: var(--fk-bg); display: inline-flex; align-items: center; justify-content: center; flex: none; transition: background 120ms, border-color 120ms; }
54
+ .feather-check.feather-radio .feather-check-box { border-radius: 50%; }
55
+ .feather-check-box svg { width: 12px; height: 12px; color: var(--fk-on-accent); opacity: 0; transition: opacity 120ms; }
56
+ .feather-check-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--fk-on-accent); opacity: 0; transition: opacity 120ms; }
57
+ .feather-check input:checked + .feather-check-box { background: var(--fk-accent); border-color: var(--fk-accent); }
58
+ .feather-check input:checked + .feather-check-box svg, .feather-check input:checked + .feather-check-box .feather-check-dot { opacity: 1; }
59
+ .feather-check input:focus-visible + .feather-check-box { box-shadow: 0 0 0 3px var(--fk-accent-soft); }
60
+
61
+ /* ── switch ── */
62
+ .feather-switch { display: inline-flex; align-items: center; gap: 9px; font-family: var(--fk-font); font-size: 13.5px; color: var(--fk-ink); cursor: pointer; }
63
+ .feather-switch input { position: absolute; opacity: 0; width: 1px; height: 1px; }
64
+ .feather-switch-track { width: 38px; height: 22px; border-radius: 999px; background: var(--fk-border); position: relative; transition: background 160ms; flex: none; }
65
+ .feather-switch-track::after { content: ""; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,0.25); transition: transform 170ms cubic-bezier(0.16,1,0.3,1); }
66
+ .feather-switch input:checked + .feather-switch-track { background: var(--fk-accent); }
67
+ .feather-switch input:checked + .feather-switch-track::after { transform: translateX(16px); }
68
+ .feather-switch input:focus-visible + .feather-switch-track { box-shadow: 0 0 0 3px var(--fk-accent-soft); }
69
+ .feather-switch-row { display: flex; width: 100%; justify-content: space-between; align-items: center; gap: 12px; }
70
+ .feather-switch-row .feather-switch-text { display: flex; flex-direction: column; text-align: left; }
71
+ .feather-switch-text b { font-size: 13.5px; font-weight: 600; color: var(--fk-ink); }
72
+ .feather-switch-text span { font-size: 12px; color: var(--fk-muted); font-weight: 400; }
73
+
74
+ /* ── slider ── */
75
+ .feather-slider { display: flex; align-items: center; gap: 12px; font-family: var(--fk-font); font-size: 12.5px; color: var(--fk-ink-soft); width: 100%; }
76
+ .feather-slider input[type=range] { accent-color: var(--fk-accent); flex: 1; }
77
+ .feather-slider-value { font-variant-numeric: tabular-nums; color: var(--fk-ink); min-width: 30px; text-align: right; }
78
+
79
+ /* ── badge ── */
80
+ .feather-badge { font-family: var(--fk-font); font-size: 11px; font-weight: 600; padding: 2.5px 9px; border-radius: 999px; display: inline-flex; align-items: center; gap: 5px; line-height: 1.4; }
81
+ .feather-badge-solid { background: var(--fk-ink); color: var(--fk-bg); }
82
+ .feather-badge-soft { background: var(--fk-accent-soft); color: var(--fk-accent-deep); }
83
+ .feather-badge-outline { border: 1px solid var(--fk-border); color: var(--fk-ink-soft); }
84
+ .feather-badge-danger { background: color-mix(in srgb, var(--fk-danger), transparent 88%); color: var(--fk-danger); }
85
+ .feather-badge-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
86
+
87
+ /* ── avatar ── */
88
+ .feather-avatar { width: 34px; height: 34px; border-radius: 50%; font-family: var(--fk-font); font-size: 12px; font-weight: 600; display: inline-flex; align-items: center; justify-content: center; color: var(--fk-on-accent); background: linear-gradient(135deg, var(--fk-accent), color-mix(in srgb, var(--fk-accent), #fff 28%)); flex: none; overflow: hidden; }
89
+ .feather-avatar img { width: 100%; height: 100%; object-fit: cover; }
90
+ .feather-avatars { display: flex; }
91
+ .feather-avatars .feather-avatar { margin-left: -8px; border: 2px solid var(--fk-bg); }
92
+ .feather-avatars .feather-avatar:first-child { margin-left: 0; }
93
+ .feather-avatar-more { background: var(--fk-bg-subtle); color: var(--fk-ink-soft); }
94
+
95
+ /* ── progress ── */
96
+ .feather-progress { height: 8px; border-radius: 999px; background: var(--fk-bg-subtle); overflow: hidden; width: 100%; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--fk-border), transparent 45%); }
97
+ .feather-progress > i { display: block; height: 100%; background: var(--fk-accent); border-radius: 999px; transition: width 240ms cubic-bezier(0.16,1,0.3,1); }
98
+
99
+ /* ── card ── */
100
+ .feather-card { background: var(--fk-bg); border: 1px solid var(--fk-border); border-radius: calc(var(--fk-radius) + 6px); box-shadow: 0 1px 2px rgba(0,0,0,0.04); overflow: hidden; }
101
+ .feather-card-head { padding: 18px 20px; }
102
+ .feather-card-title { font-family: var(--fk-font); font-size: 16px; font-weight: 650; color: var(--fk-ink); letter-spacing: -0.01em; margin: 0; }
103
+ .feather-card-desc { font-family: var(--fk-font); font-size: 13px; color: var(--fk-muted); margin: 4px 0 0; line-height: 1.45; }
104
+ .feather-card-body { padding: 18px 20px; }
105
+ .feather-card-foot { padding: 14px 20px; border-top: 1px solid var(--fk-border); display: flex; gap: 9px; justify-content: flex-end; background: var(--fk-bg-subtle); }
106
+
107
+ /* ── table ── */
108
+ .feather-table-wrap { width: 100%; overflow-x: auto; }
109
+ .feather-table { width: 100%; border-collapse: collapse; font-family: var(--fk-font); font-size: 13px; }
110
+ .feather-table th { text-align: left; font-weight: 600; color: var(--fk-muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; padding: 10px 14px; border-bottom: 1px solid var(--fk-border); white-space: nowrap; }
111
+ .feather-table td { padding: 12px 14px; border-bottom: 1px solid var(--fk-border); color: var(--fk-ink); white-space: nowrap; vertical-align: middle; }
112
+ .feather-table tbody tr:last-child td { border-bottom: 0; }
113
+ .feather-table tbody tr { transition: background 100ms; }
114
+ .feather-table tbody tr:hover { background: color-mix(in srgb, var(--fk-bg), var(--fk-ink) 4%); }
115
+ .feather-table .feather-num { text-align: right; font-variant-numeric: tabular-nums; }
116
+
117
+ /* ── tabs (zero JS — radio group + CSS sibling) ── */
118
+ .feather-tabs { width: 100%; }
119
+ .feather-tabs > input { position: absolute; width: 1px; height: 1px; opacity: 0; }
120
+ .feather-tabs > label { font-family: var(--fk-font); font-size: 13px; font-weight: 500; padding: 7px 13px 9px; cursor: pointer; color: var(--fk-muted); display: inline-block; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color 120ms; }
121
+ .feather-tabs > label:hover { color: var(--fk-ink); }
122
+ .feather-tabs > input:checked + label { color: var(--fk-ink); border-bottom-color: var(--fk-accent); }
123
+ .feather-tabs > input:focus-visible + label { outline: 2px solid var(--fk-accent); outline-offset: 2px; border-radius: 5px; }
124
+ .feather-tabs-panels { border-top: 1px solid var(--fk-border); padding-top: 14px; }
125
+ .feather-tabs-panel { display: none; font-family: var(--fk-font); font-size: 13.5px; color: var(--fk-ink-soft); line-height: 1.55; }
126
+ .feather-tabs > input:nth-of-type(1):checked ~ .feather-tabs-panels > .feather-tabs-panel:nth-of-type(1),
127
+ .feather-tabs > input:nth-of-type(2):checked ~ .feather-tabs-panels > .feather-tabs-panel:nth-of-type(2),
128
+ .feather-tabs > input:nth-of-type(3):checked ~ .feather-tabs-panels > .feather-tabs-panel:nth-of-type(3),
129
+ .feather-tabs > input:nth-of-type(4):checked ~ .feather-tabs-panels > .feather-tabs-panel:nth-of-type(4),
130
+ .feather-tabs > input:nth-of-type(5):checked ~ .feather-tabs-panels > .feather-tabs-panel:nth-of-type(5),
131
+ .feather-tabs > input:nth-of-type(6):checked ~ .feather-tabs-panels > .feather-tabs-panel:nth-of-type(6),
132
+ .feather-tabs > input:nth-of-type(7):checked ~ .feather-tabs-panels > .feather-tabs-panel:nth-of-type(7),
133
+ .feather-tabs > input:nth-of-type(8):checked ~ .feather-tabs-panels > .feather-tabs-panel:nth-of-type(8) { display: block; }
134
+
135
+ /* ── accordion (native <details>) ── */
136
+ .feather-accordion { border-bottom: 1px solid var(--fk-border); }
137
+ .feather-accordion:first-of-type { border-top: 1px solid var(--fk-border); }
138
+ .feather-accordion > summary { font-family: var(--fk-font); font-size: 13.5px; font-weight: 500; padding: 13px 2px; cursor: pointer; list-style: none; display: flex; align-items: center; justify-content: space-between; gap: 10px; color: var(--fk-ink); }
139
+ .feather-accordion > summary::-webkit-details-marker { display: none; }
140
+ .feather-accordion > summary::after { content: "+"; color: var(--fk-muted); font-size: 16px; line-height: 1; }
141
+ .feather-accordion[open] > summary::after { content: "\2212"; color: var(--fk-accent); }
142
+ .feather-accordion-body { font-family: var(--fk-font); font-size: 13px; color: var(--fk-ink-soft); line-height: 1.55; padding: 0 2px 14px; }
143
+
144
+ /* ── tooltip (zero JS — CSS only) ── */
145
+ .feather-tooltip { position: relative; display: inline-flex; }
146
+ .feather-tooltip::after { content: attr(data-tip); position: absolute; bottom: calc(100% + 9px); left: 50%; transform: translateX(-50%) translateY(4px); background: var(--fk-ink); color: var(--fk-bg); font-size: 11.5px; padding: 5px 9px; border-radius: 7px; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity 130ms, transform 130ms; font-family: var(--fk-font); z-index: 20; }
147
+ .feather-tooltip:hover::after, .feather-tooltip:focus-visible::after { opacity: 1; transform: translateX(-50%) translateY(0); }
148
+
149
+ /* ── menu (zero JS — Popover API) ── */
150
+ .feather-menu-trigger { font-family: var(--fk-font); font-size: 13px; font-weight: 500; padding: 0 13px; height: 34px; border-radius: var(--fk-radius); border: 1px solid var(--fk-border); background: var(--fk-bg); color: var(--fk-ink); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px; transition: border-color 120ms, background 120ms; }
151
+ .feather-menu-trigger:hover { background: var(--fk-bg-subtle); }
152
+ .feather-menu-trigger svg { width: 15px; height: 15px; }
153
+ .feather-menu { border: 1px solid var(--fk-border); border-radius: calc(var(--fk-radius) + 2px); background: var(--fk-bg); padding: 5px; min-width: 172px; box-shadow: 0 1px 2px rgba(0,0,0,0.05), 0 16px 32px -16px rgba(0,0,0,0.42); }
154
+ @supports (top: anchor(bottom)) { .feather-menu { margin: 0; inset: auto; top: calc(anchor(bottom) + 6px); left: anchor(left); } }
155
+ .feather-menu button, .feather-menu a { display: flex; align-items: center; justify-content: space-between; gap: 12px; width: 100%; text-align: left; font-family: var(--fk-font); font-size: 13px; padding: 7px 9px; border: 0; background: transparent; border-radius: 6px; color: var(--fk-ink); cursor: pointer; text-decoration: none; }
156
+ .feather-menu button:hover, .feather-menu a:hover { background: var(--fk-bg-subtle); }
157
+ .feather-menu .feather-kbd { font-family: var(--fk-font-mono); font-size: 10.5px; color: var(--fk-muted); }
158
+ .feather-menu .feather-menu-danger { color: var(--fk-danger); }
159
+ .feather-menu .feather-menu-danger:hover { background: color-mix(in srgb, var(--fk-danger), transparent 90%); }
160
+ .feather-menu hr { border: 0; border-top: 1px solid var(--fk-border); margin: 5px 4px; }
161
+ .feather-menu:popover-open { animation: feather-pop 130ms ease; }
162
+ @keyframes feather-pop { from { opacity: 0; transform: translateY(-4px); } }
163
+
164
+ /* ── dialog (native <dialog>) ── */
165
+ .feather-dialog { border: 1px solid var(--fk-border); border-radius: calc(var(--fk-radius) + 6px); padding: 0; width: min(400px, calc(100vw - 36px)); background: var(--fk-bg); color: var(--fk-ink); box-shadow: 0 1px 2px rgba(0,0,0,0.05), 0 40px 90px -34px rgba(0,0,0,0.5); }
166
+ .feather-dialog::backdrop { background: rgba(10,10,12,0.46); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
167
+ .feather-dialog[open] { animation: feather-dlg 190ms cubic-bezier(0.16,1,0.3,1); }
168
+ @keyframes feather-dlg { from { opacity: 0; transform: translateY(10px) scale(0.97); } }
169
+ .feather-dialog-body { padding: 20px 22px; }
170
+ .feather-dialog-body h3 { font-family: var(--fk-font); font-size: 16px; font-weight: 650; margin: 0 0 5px; color: var(--fk-ink); }
171
+ .feather-dialog-body p { font-family: var(--fk-font); font-size: 13px; color: var(--fk-muted); margin: 0; line-height: 1.5; }
172
+ .feather-dialog-foot { padding: 14px 20px; border-top: 1px solid var(--fk-border); display: flex; gap: 9px; justify-content: flex-end; background: var(--fk-bg-subtle); }
173
+
174
+ /* ── toast ── */
175
+ .feather-toaster { position: fixed; right: 18px; bottom: 18px; z-index: 9999; display: flex; flex-direction: column; gap: 10px; pointer-events: none; }
176
+ .feather-toast { pointer-events: auto; display: flex; align-items: flex-start; gap: 11px; background: var(--fk-ink); color: var(--fk-bg); padding: 12px 14px 13px; border-radius: calc(var(--fk-radius) + 4px); box-shadow: 0 12px 34px -10px rgba(0,0,0,0.45); width: 270px; animation: feather-toast-in 260ms cubic-bezier(0.16,1,0.3,1); }
177
+ .feather-toast-icon { flex: none; width: 20px; height: 20px; border-radius: 50%; background: var(--fk-accent); color: var(--fk-on-accent); display: inline-flex; align-items: center; justify-content: center; font-size: 12px; margin-top: 1px; }
178
+ .feather-toast-title { font-family: var(--fk-font); font-size: 13px; font-weight: 600; }
179
+ .feather-toast-desc { font-family: var(--fk-font); font-size: 12px; color: color-mix(in srgb, var(--fk-bg), transparent 34%); margin-top: 2px; }
180
+ @keyframes feather-toast-in { from { opacity: 0; transform: translateY(12px) scale(0.98); } }
181
+
182
+ @media (prefers-reduced-motion: reduce) {
183
+ .feather-button, .feather-switch-track::after, .feather-progress > i, .feather-menu:popover-open,
184
+ .feather-dialog[open], .feather-toast { animation: none !important; transition: none !important; }
185
+ }
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "feather-ui-kit",
3
+ "version": "0.1.0",
4
+ "description": "An ultra-lightweight React UI component library built on browser primitives. Several components ship zero JavaScript. Import only what you use.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "babanomania",
8
+ "homepage": "https://github.com/babanomania/feather-kit",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/babanomania/feather-kit.git",
12
+ "directory": "packages/feather-kit"
13
+ },
14
+ "keywords": ["react", "ui", "components", "css", "lightweight", "zero-dependency", "design-system"],
15
+ "sideEffects": ["*.css"],
16
+ "exports": {
17
+ ".": { "import": "./dist/index.esm.js", "require": "./dist/index.js" },
18
+ "./typography": { "import": "./dist/typography.esm.js", "require": "./dist/typography.js" },
19
+ "./button": { "import": "./dist/button.esm.js", "require": "./dist/button.js" },
20
+ "./input": { "import": "./dist/input.esm.js", "require": "./dist/input.js" },
21
+ "./select": { "import": "./dist/select.esm.js", "require": "./dist/select.js" },
22
+ "./checkbox": { "import": "./dist/checkbox.esm.js", "require": "./dist/checkbox.js" },
23
+ "./radio": { "import": "./dist/radio.esm.js", "require": "./dist/radio.js" },
24
+ "./switch": { "import": "./dist/switch.esm.js", "require": "./dist/switch.js" },
25
+ "./slider": { "import": "./dist/slider.esm.js", "require": "./dist/slider.js" },
26
+ "./badge": { "import": "./dist/badge.esm.js", "require": "./dist/badge.js" },
27
+ "./avatar": { "import": "./dist/avatar.esm.js", "require": "./dist/avatar.js" },
28
+ "./progress": { "import": "./dist/progress.esm.js", "require": "./dist/progress.js" },
29
+ "./card": { "import": "./dist/card.esm.js", "require": "./dist/card.js" },
30
+ "./table": { "import": "./dist/table.esm.js", "require": "./dist/table.js" },
31
+ "./tabs": { "import": "./dist/tabs.esm.js", "require": "./dist/tabs.js" },
32
+ "./accordion": { "import": "./dist/accordion.esm.js", "require": "./dist/accordion.js" },
33
+ "./tooltip": { "import": "./dist/tooltip.esm.js", "require": "./dist/tooltip.js" },
34
+ "./menu": { "import": "./dist/menu.esm.js", "require": "./dist/menu.js" },
35
+ "./dialog": { "import": "./dist/dialog.esm.js", "require": "./dist/dialog.js" },
36
+ "./toast": { "import": "./dist/toast.esm.js", "require": "./dist/toast.js" },
37
+ "./styles.css": "./feather-kit.css",
38
+ "./themes/*": "./themes/*"
39
+ },
40
+ "main": "./dist/index.js",
41
+ "module": "./dist/index.esm.js",
42
+ "files": [
43
+ "dist",
44
+ "themes",
45
+ "feather-kit.css",
46
+ "README.md"
47
+ ],
48
+ "scripts": {
49
+ "build": "node build.js",
50
+ "prepublishOnly": "node build.js"
51
+ },
52
+ "peerDependencies": {
53
+ "react": ">=18"
54
+ },
55
+ "devDependencies": {
56
+ "esbuild": "^0.23.0",
57
+ "react": "^19.0.0"
58
+ }
59
+ }
@@ -0,0 +1,32 @@
1
+ /* feather-kit — dark palette override.
2
+ Opt-in with <html data-theme="dark">, or let it follow the OS via the
3
+ prefers-color-scheme block below (unless the user forced light). */
4
+ [data-theme="dark"] {
5
+ --fk-accent: #38BDF8;
6
+ --fk-accent-deep: #0EA5E9;
7
+ --fk-accent-soft: rgba(56, 189, 248, 0.16);
8
+ --fk-ink: #E7ECF3;
9
+ --fk-ink-soft: #9AA6B6;
10
+ --fk-muted: #6B7686;
11
+ --fk-bg: #16181D;
12
+ --fk-bg-subtle: #0E0F13;
13
+ --fk-border: #2A2E37;
14
+ --fk-danger: #FB7185;
15
+ --fk-on-accent: #06243A;
16
+ }
17
+
18
+ @media (prefers-color-scheme: dark) {
19
+ :root:not([data-theme="light"]) {
20
+ --fk-accent: #38BDF8;
21
+ --fk-accent-deep: #0EA5E9;
22
+ --fk-accent-soft: rgba(56, 189, 248, 0.16);
23
+ --fk-ink: #E7ECF3;
24
+ --fk-ink-soft: #9AA6B6;
25
+ --fk-muted: #6B7686;
26
+ --fk-bg: #16181D;
27
+ --fk-bg-subtle: #0E0F13;
28
+ --fk-border: #2A2E37;
29
+ --fk-danger: #FB7185;
30
+ --fk-on-accent: #06243A;
31
+ }
32
+ }
@@ -0,0 +1,3 @@
1
+ /* feather-kit — base palette. Always import this (it pulls in the token
2
+ contract). Pair with dark.css if you want a dark-mode override. */
3
+ @import url("./variables.css");
@@ -0,0 +1,24 @@
1
+ /* feather-kit — the --fk-* design-token contract.
2
+ These are the Feather (default, light) values. Override any of them on
3
+ :root, or scope them to a container, to retheme every component at once. */
4
+ :root {
5
+ --fk-accent: #109488;
6
+ --fk-accent-deep: #0C746B;
7
+ --fk-accent-soft: rgba(16, 148, 136, 0.12);
8
+ --fk-ink: #1A1917;
9
+ --fk-ink-soft: #57544E;
10
+ --fk-muted: #8C8980;
11
+ --fk-bg: #FBFAF7;
12
+ --fk-bg-subtle: #F2F0EA;
13
+ --fk-border: #D8D3C8;
14
+ --fk-radius: 8px;
15
+ --fk-danger: #C5365E;
16
+
17
+ /* contrast colour painted over --fk-accent (button text, check marks).
18
+ Set to a dark value in themes whose accent is light. */
19
+ --fk-on-accent: #FFFFFF;
20
+
21
+ --fk-font: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
22
+ --fk-font-serif: Georgia, "Iowan Old Style", "Times New Roman", serif;
23
+ --fk-font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
24
+ }