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 +62 -0
- package/dist/accordion.esm.js +1 -0
- package/dist/accordion.js +1 -0
- package/dist/avatar.esm.js +1 -0
- package/dist/avatar.js +1 -0
- package/dist/badge.esm.js +1 -0
- package/dist/badge.js +1 -0
- package/dist/button.esm.js +1 -0
- package/dist/button.js +1 -0
- package/dist/card.esm.js +1 -0
- package/dist/card.js +1 -0
- package/dist/checkbox.esm.js +1 -0
- package/dist/checkbox.js +1 -0
- package/dist/dialog.esm.js +1 -0
- package/dist/dialog.js +1 -0
- package/dist/index.esm.js +1 -0
- package/dist/index.js +1 -0
- package/dist/input.esm.js +1 -0
- package/dist/input.js +1 -0
- package/dist/menu.esm.js +1 -0
- package/dist/menu.js +1 -0
- package/dist/progress.esm.js +1 -0
- package/dist/progress.js +1 -0
- package/dist/radio.esm.js +1 -0
- package/dist/radio.js +1 -0
- package/dist/select.esm.js +1 -0
- package/dist/select.js +1 -0
- package/dist/slider.esm.js +1 -0
- package/dist/slider.js +1 -0
- package/dist/switch.esm.js +1 -0
- package/dist/switch.js +1 -0
- package/dist/table.esm.js +1 -0
- package/dist/table.js +1 -0
- package/dist/tabs.esm.js +1 -0
- package/dist/tabs.js +1 -0
- package/dist/toast.esm.js +1 -0
- package/dist/toast.js +1 -0
- package/dist/tooltip.esm.js +1 -0
- package/dist/tooltip.js +1 -0
- package/dist/typography.esm.js +1 -0
- package/dist/typography.js +1 -0
- package/feather-kit.css +185 -0
- package/package.json +59 -0
- package/themes/dark.css +32 -0
- package/themes/light.css +3 -0
- package/themes/variables.css +24 -0
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})}
|
package/dist/card.esm.js
ADDED
|
@@ -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};
|
package/dist/checkbox.js
ADDED
|
@@ -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})]})}
|
package/dist/menu.esm.js
ADDED
|
@@ -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};
|
package/dist/progress.js
ADDED
|
@@ -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})})}
|
package/dist/tabs.esm.js
ADDED
|
@@ -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};
|
package/dist/tooltip.js
ADDED
|
@@ -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})]})}
|
package/feather-kit.css
ADDED
|
@@ -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
|
+
}
|
package/themes/dark.css
ADDED
|
@@ -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
|
+
}
|
package/themes/light.css
ADDED
|
@@ -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
|
+
}
|