tintora 0.11.0 → 0.13.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.
@@ -0,0 +1,20 @@
1
+ import type { ButtonHTMLAttributes, HTMLAttributes } from 'react';
2
+ import './Card.css';
3
+ type CardElement = 'article' | 'div' | 'section' | 'li';
4
+ export interface CardProps extends HTMLAttributes<HTMLElement> {
5
+ /** `surface` is the light card; `row` is the translucent list row. @default 'surface' */
6
+ variant?: 'surface' | 'row';
7
+ /** The element to render. @default 'article' */
8
+ as?: CardElement;
9
+ }
10
+ export declare function Card({ as: Element, variant, className, ...props }: CardProps): import("react").JSX.Element;
11
+ export interface SelectableCardProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
12
+ /** Rendered as `aria-pressed`. @default false */
13
+ selected?: boolean;
14
+ }
15
+ /**
16
+ * A card that toggles on click. It is a single button, so keep other
17
+ * buttons out of it.
18
+ */
19
+ export declare function SelectableCard({ selected, className, ...props }: SelectableCardProps): import("react").JSX.Element;
20
+ export {};
@@ -0,0 +1,25 @@
1
+ import { type ButtonHTMLAttributes } from 'react';
2
+ import './Select.css';
3
+ import { SelectOption } from './SelectOption';
4
+ interface SelectBaseProps<T extends string> extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value' | 'defaultValue' | 'onChange' | 'children' | 'type' | 'role'> {
5
+ options: readonly SelectOption<T>[];
6
+ /** The trigger shows only the value, so it needs a name. */
7
+ 'aria-label': string;
8
+ /** Shown when nothing is selected. */
9
+ placeholder?: string;
10
+ /** Adds a hidden input so the value submits with a <form>. */
11
+ name?: string;
12
+ }
13
+ interface ControlledProps<T extends string> {
14
+ value: T | null;
15
+ onValueChange: (value: T) => void;
16
+ defaultValue?: never;
17
+ }
18
+ interface UncontrolledProps<T extends string> {
19
+ value?: never;
20
+ onValueChange?: (value: T) => void;
21
+ defaultValue: T | null;
22
+ }
23
+ export type SelectProps<T extends string = string> = SelectBaseProps<T> & (ControlledProps<T> | UncontrolledProps<T>);
24
+ export declare function Select<T extends string>({ defaultValue, options, disabled, value, placeholder, onValueChange, name, className, onClick, onKeyDown, onKeyUp, 'aria-label': ariaLabel, ...props }: SelectProps<T>): import("react").JSX.Element;
25
+ export {};
@@ -0,0 +1,12 @@
1
+ interface SelectContextValue {
2
+ /** The selected value, or null when nothing is selected. */
3
+ value: string | null;
4
+ /** The option the keyboard or pointer is on (aria-activedescendant). */
5
+ activeValue: string | null;
6
+ select: (value: string) => void;
7
+ activate: (value: string) => void;
8
+ optionId: (value: string) => string;
9
+ }
10
+ export declare const SelectContext: import("react").Context<SelectContextValue | null>;
11
+ export declare const useSelectContext: () => SelectContextValue;
12
+ export {};
@@ -0,0 +1,6 @@
1
+ export interface SelectOption<T extends string = string> {
2
+ value: T;
3
+ label: string;
4
+ disabled?: boolean;
5
+ }
6
+ export declare function SelectOption({ label, value, disabled }: SelectOption): import("react").JSX.Element;
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("react"),t=require("react/jsx-runtime");function n(e){var t,r,i=``;if(typeof e==`string`||typeof e==`number`)i+=e;else if(typeof e==`object`){if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(r=n(e[t]))&&(i&&(i+=` `),i+=r)}else for(r in e)e[r]&&(i&&(i+=` `),i+=r)}return i}function r(){for(var e,t,r=0,i=``,a=arguments.length;r<a;r++)(e=arguments[r])&&(t=n(e))&&(i&&(i+=` `),i+=t);return i}function i(e){if(!e.length)return``;let t=e.trim().split(/\s+/).map(e=>e.match(/\p{L}\p{M}*/u)?.[0]).filter(e=>!!e);return`${t[0]??``}${t.length>1?t.at(-1)??``:``}`.toLocaleUpperCase()}function a({name:n,src:a,size:o=`medium`,className:s,...c}){let[l,u]=(0,e.useState)(),d=!!a&&a!==l;return(0,t.jsx)(`span`,{role:`img`,"aria-label":n,...c,className:r(`tintora-avatar`,`tintora-avatar--${o}`,s),children:d?(0,t.jsx)(`img`,{src:a,alt:``,onError:()=>u(a)}):i(n)})}function o({children:e,className:n,variant:i,size:a=`medium`,leadingIcon:o,trailingIcon:s,type:c=`button`,...l}){return(0,t.jsxs)(`button`,{type:c,className:r(`tintora-button`,`tintora-button--${i}`,`tintora-button--${a}`,{"tintora-button--leading-icon":!!o,"tintora-button--trailing-icon":!!s},n),...l,children:[o&&(0,t.jsx)(`span`,{className:`tintora-button__icon`,"aria-hidden":`true`,children:o}),e,s&&(0,t.jsx)(`span`,{className:`tintora-button__icon`,"aria-hidden":`true`,children:s})]})}function s({children:e,selected:n,className:i,"aria-pressed":a,...o}){return(0,t.jsx)(`button`,{...o,type:`button`,className:r(`tintora-chip`,i),"aria-pressed":n??a,children:e})}function c({variant:e=`unread`,label:n,className:i,...a}){return(0,t.jsx)(`span`,{...a,className:r(`tintora-dot`,`tintora-dot--${e}`,i),role:n?`img`:void 0,"aria-label":n,"aria-hidden":!n||void 0})}var l={round:`secondary`,field:`secondary`,nav:`ghost`};function u({icon:e,variant:n=`round`,size:i,selected:a,className:s,...c}){let u=n===`round`?i??`large`:void 0;return(0,t.jsx)(o,{...c,variant:l[n],"aria-current":a?`page`:void 0,className:r(`tintora-icon-button`,`tintora-icon-button--${n}`,u&&`tintora-icon-button--${u}`,s),...u&&{size:u},children:(0,t.jsx)(`span`,{className:`tintora-icon-button__icon`,"aria-hidden":`true`,children:e})})}function d({className:e,disabled:n,...i}){return(0,t.jsxs)(`label`,{className:r(`tintora-search-input`,n&&`tintora-search-input--disabled`,e),children:[(0,t.jsxs)(`svg`,{className:`tintora-search-input__icon`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,"aria-hidden":`true`,children:[(0,t.jsx)(`circle`,{cx:`11`,cy:`11`,r:`7`}),(0,t.jsx)(`path`,{d:`M20 20l-3.5-3.5`})]}),(0,t.jsx)(`input`,{...i,type:`search`,disabled:n,className:`tintora-search-input__input`})]})}function f({children:e,className:n,variant:i=`neutral`,size:a=`medium`,...o}){return(0,t.jsx)(`span`,{...o,className:r(`tintora-tag`,`tintora-tag--${i}`,`tintora-tag--${a}`,n),children:e})}function p({label:n,hint:i,error:a,id:o,className:s,disabled:c,"aria-describedby":l,"aria-invalid":u,...d}){let f=(0,e.useId)(),p=o??f,m=`${p}-message`,h=a??i;return(0,t.jsxs)(`div`,{className:r(`tintora-textfield`,c&&`tintora-textfield--disabled`,s),children:[(0,t.jsx)(`label`,{htmlFor:p,className:`tintora-textfield__label`,children:n}),(0,t.jsx)(`input`,{...d,id:p,disabled:c,className:`tintora-textfield__input`,"aria-invalid":a?!0:u,"aria-describedby":r(h&&m,l)||void 0}),h&&(0,t.jsx)(`span`,{id:m,className:r(`tintora-textfield__hint`,a&&`tintora-textfield__hint--error`),children:h})]})}var m=(0,e.createContext)(null);function h(){let t=(0,e.useContext)(m);if(!t)throw Error(`ToggleItem must be rendered inside a Toggle`);return t}function g({children:n,value:i,defaultValue:a,onValueChange:o,disabled:s=!1,className:c,...l}){let[u,d]=(0,e.useState)(a),f=i!==void 0,p=f?i:u,h=n.findIndex(e=>e.props.value===p),g=(0,e.useRef)(null),[_,v]=(0,e.useState)({x:0,width:0});(0,e.useLayoutEffect)(()=>{let e=g.current;if(!e)return;let t=()=>{let t=e.children.item(h);if(!t)return;let n={x:t.offsetLeft,width:t.offsetWidth};v(e=>e.x===n.x&&e.width===n.width?e:n)};t();let n=new ResizeObserver(t);return n.observe(e),()=>{n.disconnect()}},[h]);let y={"--tintora-toggle-thumb-x":`${_.x}px`,"--tintora-toggle-thumb-width":`${_.width}px`};return(0,t.jsx)(m.Provider,{value:{value:p,select:e=>{e!==p&&(f||d(e),o?.(e))},disabled:s},children:(0,t.jsxs)(`div`,{...l,role:`group`,ref:g,className:r(`tintora-toggle`,s&&`tintora-toggle--disabled`,c),children:[n,(0,t.jsx)(`span`,{"aria-hidden":`true`,className:`tintora-toggle__thumb`,style:y})]})})}function _({value:e,children:n,className:i,disabled:a,onClick:o,...s}){let c=h(),l=t=>{o?.(t),t.defaultPrevented||c.select(e)};return(0,t.jsx)(`button`,{...s,type:`button`,className:r(`tintora-toggle__item`,i),"aria-pressed":c.value===e,disabled:a||c.disabled,onClick:l,children:n})}exports.Avatar=a,exports.Button=o,exports.Chip=s,exports.Dot=c,exports.IconButton=u,exports.SearchInput=d,exports.Tag=f,exports.TextField=p,exports.Toggle=g,exports.ToggleItem=_;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("react"),t=require("react/jsx-runtime");function n(e){var t,r,i=``;if(typeof e==`string`||typeof e==`number`)i+=e;else if(typeof e==`object`){if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(r=n(e[t]))&&(i&&(i+=` `),i+=r)}else for(r in e)e[r]&&(i&&(i+=` `),i+=r)}return i}function r(){for(var e,t,r=0,i=``,a=arguments.length;r<a;r++)(e=arguments[r])&&(t=n(e))&&(i&&(i+=` `),i+=t);return i}function i(e){if(!e.length)return``;let t=e.trim().split(/\s+/).map(e=>e.match(/\p{L}\p{M}*/u)?.[0]).filter(e=>!!e);return`${t[0]??``}${t.length>1?t.at(-1)??``:``}`.toLocaleUpperCase()}function a({name:n,src:a,size:o=`medium`,className:s,...c}){let[l,u]=(0,e.useState)(),d=!!a&&a!==l;return(0,t.jsx)(`span`,{role:`img`,"aria-label":n,...c,className:r(`tintora-avatar`,`tintora-avatar--${o}`,s),children:d?(0,t.jsx)(`img`,{src:a,alt:``,onError:()=>u(a)}):i(n)})}function o({children:e,className:n,variant:i,size:a=`medium`,leadingIcon:o,trailingIcon:s,type:c=`button`,...l}){return(0,t.jsxs)(`button`,{type:c,className:r(`tintora-button`,`tintora-button--${i}`,`tintora-button--${a}`,{"tintora-button--leading-icon":!!o,"tintora-button--trailing-icon":!!s},n),...l,children:[o&&(0,t.jsx)(`span`,{className:`tintora-button__icon`,"aria-hidden":`true`,children:o}),e,s&&(0,t.jsx)(`span`,{className:`tintora-button__icon`,"aria-hidden":`true`,children:s})]})}function s({as:e=`article`,variant:n=`surface`,className:i,...a}){return(0,t.jsx)(e,{...a,className:r(`tintora-card`,`tintora-card--${n}`,i)})}function c({selected:e=!1,className:n,...i}){return(0,t.jsx)(`button`,{...i,type:`button`,"aria-pressed":e,className:r(`tintora-card`,`tintora-card--surface`,`tintora-card--selectable`,e&&`tintora-card--selected`,n)})}function l({children:e,selected:n,className:i,"aria-pressed":a,...o}){return(0,t.jsx)(`button`,{...o,type:`button`,className:r(`tintora-chip`,i),"aria-pressed":n??a,children:e})}function u({variant:e=`unread`,label:n,className:i,...a}){return(0,t.jsx)(`span`,{...a,className:r(`tintora-dot`,`tintora-dot--${e}`,i),role:n?`img`:void 0,"aria-label":n,"aria-hidden":!n||void 0})}var d={round:`secondary`,field:`secondary`,nav:`ghost`};function f({icon:e,variant:n=`round`,size:i,selected:a,className:s,...c}){let l=n===`round`?i??`large`:void 0;return(0,t.jsx)(o,{...c,variant:d[n],"aria-current":a?`page`:void 0,className:r(`tintora-icon-button`,`tintora-icon-button--${n}`,l&&`tintora-icon-button--${l}`,s),...l&&{size:l},children:(0,t.jsx)(`span`,{className:`tintora-icon-button__icon`,"aria-hidden":`true`,children:e})})}function p({className:e,disabled:n,...i}){return(0,t.jsxs)(`label`,{className:r(`tintora-search-input`,n&&`tintora-search-input--disabled`,e),children:[(0,t.jsxs)(`svg`,{className:`tintora-search-input__icon`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,"aria-hidden":`true`,children:[(0,t.jsx)(`circle`,{cx:`11`,cy:`11`,r:`7`}),(0,t.jsx)(`path`,{d:`M20 20l-3.5-3.5`})]}),(0,t.jsx)(`input`,{...i,type:`search`,disabled:n,className:`tintora-search-input__input`})]})}var m=(0,e.createContext)(null),h=()=>{let t=(0,e.useContext)(m);if(!t)throw Error(`SelectOption must be rendered inside a Select`);return t};function g({label:e,value:n,disabled:i}){let{select:a,activate:o,optionId:s,value:c,activeValue:l}=h();return(0,t.jsx)(`div`,{id:s(n),role:`option`,"aria-selected":c===n,"aria-disabled":i||void 0,className:r(`tintora-select__option`,l===n&&`tintora-select__option--active`),onClick:()=>a(n),onMouseMove:()=>!i&&o(n),children:e})}var _=4;function v({defaultValue:n,options:i,disabled:a,value:o,placeholder:s,onValueChange:c,name:l,className:u,onClick:d,onKeyDown:f,onKeyUp:p,"aria-label":h,...v}){let y=(0,e.useId)(),b=(0,e.useRef)(null),x=(0,e.useRef)(null),S=(0,e.useRef)(null),[C,w]=(0,e.useState)(n??null),[T,E]=(0,e.useState)(!1),[D,O]=(0,e.useState)(-1),[k,A]=(0,e.useState)({}),j=o!==void 0,M=j?o:C,N=i.findIndex(e=>e.value===M),P=e=>i[e]?.disabled!==!0,F=()=>i.findIndex((e,t)=>P(t)),I=(e,t)=>{for(let n=e+t;n>=0&&n<i.length;n+=t)if(P(n))return n;return e},L=()=>{let e=I(i.length,-1);return e===i.length?-1:e},R=e=>i.findIndex(t=>t.value===e),z=()=>{O(N>=0&&P(N)?N:F()),E(!0)},B=()=>E(!1),V=e=>{let t=R(e);t<0||!P(t)||(B(),e!==M&&(j||w(e),c?.(e)))},H=e=>{if(f?.(e),e.defaultPrevented)return;let{key:t}=e;if(t===`Tab`)return B();if(!T){[`Enter`,` `,`ArrowDown`,`ArrowUp`].includes(t)&&(e.preventDefault(),z());return}let n={ArrowDown:()=>D<0?F():I(D,1),ArrowUp:()=>D<0?F():I(D,-1),Home:F,End:L};t in n?(e.preventDefault(),O(n[t]())):t===`Enter`||t===` `?(e.preventDefault(),D>=0?V(i[D].value):B()):t===`Escape`&&(e.preventDefault(),B())},U=e=>{p?.(e),e.key===` `&&e.preventDefault()},W=()=>{let e=S.current,t=x.current;if(!e||!t)return;let n=t.getBoundingClientRect(),r=e.offsetHeight,i=n.bottom+_+r<=window.innerHeight,a=n.top-_-r>=0;A({top:i||!a?n.bottom+_:n.top-_-r,left:n.left,minWidth:n.width})},G=e=>{d?.(e),!e.defaultPrevented&&(T?B():z())};(0,e.useLayoutEffect)(()=>{T&&(S.current?.showPopover(),W())},[T]),(0,e.useEffect)(()=>{if(!T)return;let e=e=>{b.current?.contains(e.target)||B()},t=e=>{S.current?.contains(e.target)||W()};return document.addEventListener(`pointerdown`,e),window.addEventListener(`scroll`,t,!0),window.addEventListener(`resize`,W),()=>{document.removeEventListener(`pointerdown`,e),window.removeEventListener(`scroll`,t,!0),window.removeEventListener(`resize`,W)}},[T]),(0,e.useEffect)(()=>{T&&D>=0&&S.current?.children.item(D)?.scrollIntoView?.({block:`nearest`})},[T,D]);let K=e=>`${y}-option-${R(e)}`,q=T?i[D]?.value??null:null,J=i[N]?.label;return(0,t.jsx)(m.Provider,{value:{value:M,activeValue:q,select:V,optionId:K,activate:e=>O(R(e))},children:(0,t.jsxs)(`div`,{ref:b,className:`tintora-select`,children:[(0,t.jsxs)(`button`,{...v,ref:x,type:`button`,role:`combobox`,"aria-label":h,"aria-haspopup":`listbox`,"aria-expanded":T,"aria-controls":T?y:void 0,"aria-activedescendant":q===null?void 0:K(q),disabled:a,className:r(`tintora-select__trigger`,u),onClick:G,onKeyDown:H,onKeyUp:U,children:[(0,t.jsx)(`span`,{className:r(`tintora-select__value`,J===void 0&&`tintora-select__value--placeholder`),children:J??s}),(0,t.jsx)(`svg`,{className:`tintora-select__chevron`,width:`10`,height:`10`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`3`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:(0,t.jsx)(`path`,{d:`M6 9l6 6 6-6`})})]}),T&&(0,t.jsx)(`div`,{ref:S,id:y,role:`listbox`,"aria-label":h,popover:`manual`,className:`tintora-select__menu`,style:k,onMouseDown:e=>e.preventDefault(),children:i.map(e=>(0,t.jsx)(g,{...e},e.value))}),l&&(0,t.jsx)(`input`,{type:`hidden`,name:l,value:M??``,disabled:a})]})})}function y({children:e,className:n,variant:i=`neutral`,size:a=`medium`,...o}){return(0,t.jsx)(`span`,{...o,className:r(`tintora-tag`,`tintora-tag--${i}`,`tintora-tag--${a}`,n),children:e})}function b({label:n,hint:i,error:a,id:o,className:s,disabled:c,"aria-describedby":l,"aria-invalid":u,...d}){let f=(0,e.useId)(),p=o??f,m=`${p}-message`,h=a??i;return(0,t.jsxs)(`div`,{className:r(`tintora-textfield`,c&&`tintora-textfield--disabled`,s),children:[(0,t.jsx)(`label`,{htmlFor:p,className:`tintora-textfield__label`,children:n}),(0,t.jsx)(`input`,{...d,id:p,disabled:c,className:`tintora-textfield__input`,"aria-invalid":a?!0:u,"aria-describedby":r(h&&m,l)||void 0}),h&&(0,t.jsx)(`span`,{id:m,className:r(`tintora-textfield__hint`,a&&`tintora-textfield__hint--error`),children:h})]})}var x=(0,e.createContext)(null);function S(){let t=(0,e.useContext)(x);if(!t)throw Error(`ToggleItem must be rendered inside a Toggle`);return t}function C({children:n,value:i,defaultValue:a,onValueChange:o,disabled:s=!1,className:c,...l}){let[u,d]=(0,e.useState)(a),f=i!==void 0,p=f?i:u,m=n.findIndex(e=>e.props.value===p),h=(0,e.useRef)(null),[g,_]=(0,e.useState)({x:0,width:0});(0,e.useLayoutEffect)(()=>{let e=h.current;if(!e)return;let t=()=>{let t=e.children.item(m);if(!t)return;let n={x:t.offsetLeft,width:t.offsetWidth};_(e=>e.x===n.x&&e.width===n.width?e:n)};t();let n=new ResizeObserver(t);return n.observe(e),()=>{n.disconnect()}},[m]);let v={"--tintora-toggle-thumb-x":`${g.x}px`,"--tintora-toggle-thumb-width":`${g.width}px`};return(0,t.jsx)(x.Provider,{value:{value:p,select:e=>{e!==p&&(f||d(e),o?.(e))},disabled:s},children:(0,t.jsxs)(`div`,{...l,role:`group`,ref:h,className:r(`tintora-toggle`,s&&`tintora-toggle--disabled`,c),children:[n,(0,t.jsx)(`span`,{"aria-hidden":`true`,className:`tintora-toggle__thumb`,style:v})]})})}function w({value:e,children:n,className:i,disabled:a,onClick:o,...s}){let c=S(),l=t=>{o?.(t),t.defaultPrevented||c.select(e)};return(0,t.jsx)(`button`,{...s,type:`button`,className:r(`tintora-toggle__item`,i),"aria-pressed":c.value===e,disabled:a||c.disabled,onClick:l,children:n})}exports.Avatar=a,exports.Button=o,exports.Card=s,exports.Chip=l,exports.Dot=u,exports.IconButton=f,exports.SearchInput=p,exports.Select=v,exports.SelectableCard=c,exports.Tag=y,exports.TextField=b,exports.Toggle=C,exports.ToggleItem=w;
package/dist/index.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  import './tokens.css';
2
2
  export { Avatar } from './Avatar/Avatar';
3
3
  export { Button } from './Button/Button';
4
+ export { Card, SelectableCard, type CardProps, type SelectableCardProps, } from './Card/Card';
4
5
  export { Chip } from './Chip/Chip';
5
6
  export { Dot } from './Dot/Dot';
6
7
  export { IconButton } from './IconButton/IconButton';
7
8
  export { SearchInput } from './SearchInput/SearchInput';
9
+ export { Select } from './Select/Select';
8
10
  export { Tag } from './Tag/Tag';
9
11
  export { TextField } from './TextField/TextField';
10
12
  export { Toggle, type ToggleProps } from './Toggle/Toggle';
package/dist/index.js CHANGED
@@ -1,62 +1,62 @@
1
- import { createContext as e, useContext as t, useId as n, useLayoutEffect as r, useRef as i, useState as a } from "react";
2
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
1
+ import { createContext as e, useContext as t, useEffect as n, useId as r, useLayoutEffect as i, useRef as a, useState as o } from "react";
2
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
3
3
  //#region node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
4
- function c(e) {
4
+ function l(e) {
5
5
  var t, n, r = "";
6
6
  if (typeof e == "string" || typeof e == "number") r += e;
7
7
  else if (typeof e == "object") {
8
8
  if (Array.isArray(e)) {
9
9
  var i = e.length;
10
- for (t = 0; t < i; t++) e[t] && (n = c(e[t])) && (r && (r += " "), r += n);
10
+ for (t = 0; t < i; t++) e[t] && (n = l(e[t])) && (r && (r += " "), r += n);
11
11
  } else for (n in e) e[n] && (r && (r += " "), r += n);
12
12
  }
13
13
  return r;
14
14
  }
15
- function l() {
16
- for (var e, t, n = 0, r = "", i = arguments.length; n < i; n++) (e = arguments[n]) && (t = c(e)) && (r && (r += " "), r += t);
15
+ function u() {
16
+ for (var e, t, n = 0, r = "", i = arguments.length; n < i; n++) (e = arguments[n]) && (t = l(e)) && (r && (r += " "), r += t);
17
17
  return r;
18
18
  }
19
19
  //#endregion
20
20
  //#region src/Avatar/utils.ts
21
- function u(e) {
21
+ function d(e) {
22
22
  if (!e.length) return "";
23
23
  let t = e.trim().split(/\s+/).map((e) => e.match(/\p{L}\p{M}*/u)?.[0]).filter((e) => !!e);
24
24
  return `${t[0] ?? ""}${t.length > 1 ? t.at(-1) ?? "" : ""}`.toLocaleUpperCase();
25
25
  }
26
26
  //#endregion
27
27
  //#region src/Avatar/Avatar.tsx
28
- function d({ name: e, src: t, size: n = "medium", className: r, ...i }) {
29
- let [s, c] = a(), d = !!t && t !== s;
30
- return /* @__PURE__ */ o("span", {
28
+ function f({ name: e, src: t, size: n = "medium", className: r, ...i }) {
29
+ let [a, c] = o(), l = !!t && t !== a;
30
+ return /* @__PURE__ */ s("span", {
31
31
  role: "img",
32
32
  "aria-label": e,
33
33
  ...i,
34
- className: l("tintora-avatar", `tintora-avatar--${n}`, r),
35
- children: d ? /* @__PURE__ */ o("img", {
34
+ className: u("tintora-avatar", `tintora-avatar--${n}`, r),
35
+ children: l ? /* @__PURE__ */ s("img", {
36
36
  src: t,
37
37
  alt: "",
38
38
  onError: () => c(t)
39
- }) : u(e)
39
+ }) : d(e)
40
40
  });
41
41
  }
42
42
  //#endregion
43
43
  //#region src/Button/Button.tsx
44
- function f({ children: e, className: t, variant: n, size: r = "medium", leadingIcon: i, trailingIcon: a, type: c = "button", ...u }) {
45
- return /* @__PURE__ */ s("button", {
46
- type: c,
47
- className: l("tintora-button", `tintora-button--${n}`, `tintora-button--${r}`, {
44
+ function p({ children: e, className: t, variant: n, size: r = "medium", leadingIcon: i, trailingIcon: a, type: o = "button", ...l }) {
45
+ return /* @__PURE__ */ c("button", {
46
+ type: o,
47
+ className: u("tintora-button", `tintora-button--${n}`, `tintora-button--${r}`, {
48
48
  "tintora-button--leading-icon": !!i,
49
49
  "tintora-button--trailing-icon": !!a
50
50
  }, t),
51
- ...u,
51
+ ...l,
52
52
  children: [
53
- i && /* @__PURE__ */ o("span", {
53
+ i && /* @__PURE__ */ s("span", {
54
54
  className: "tintora-button__icon",
55
55
  "aria-hidden": "true",
56
56
  children: i
57
57
  }),
58
58
  e,
59
- a && /* @__PURE__ */ o("span", {
59
+ a && /* @__PURE__ */ s("span", {
60
60
  className: "tintora-button__icon",
61
61
  "aria-hidden": "true",
62
62
  children: a
@@ -65,22 +65,38 @@ function f({ children: e, className: t, variant: n, size: r = "medium", leadingI
65
65
  });
66
66
  }
67
67
  //#endregion
68
+ //#region src/Card/Card.tsx
69
+ function m({ as: e = "article", variant: t = "surface", className: n, ...r }) {
70
+ return /* @__PURE__ */ s(e, {
71
+ ...r,
72
+ className: u("tintora-card", `tintora-card--${t}`, n)
73
+ });
74
+ }
75
+ function h({ selected: e = !1, className: t, ...n }) {
76
+ return /* @__PURE__ */ s("button", {
77
+ ...n,
78
+ type: "button",
79
+ "aria-pressed": e,
80
+ className: u("tintora-card", "tintora-card--surface", "tintora-card--selectable", e && "tintora-card--selected", t)
81
+ });
82
+ }
83
+ //#endregion
68
84
  //#region src/Chip/Chip.tsx
69
- function p({ children: e, selected: t, className: n, "aria-pressed": r, ...i }) {
70
- return /* @__PURE__ */ o("button", {
85
+ function g({ children: e, selected: t, className: n, "aria-pressed": r, ...i }) {
86
+ return /* @__PURE__ */ s("button", {
71
87
  ...i,
72
88
  type: "button",
73
- className: l("tintora-chip", n),
89
+ className: u("tintora-chip", n),
74
90
  "aria-pressed": t ?? r,
75
91
  children: e
76
92
  });
77
93
  }
78
94
  //#endregion
79
95
  //#region src/Dot/Dot.tsx
80
- function m({ variant: e = "unread", label: t, className: n, ...r }) {
81
- return /* @__PURE__ */ o("span", {
96
+ function _({ variant: e = "unread", label: t, className: n, ...r }) {
97
+ return /* @__PURE__ */ s("span", {
82
98
  ...r,
83
- className: l("tintora-dot", `tintora-dot--${e}`, n),
99
+ className: u("tintora-dot", `tintora-dot--${e}`, n),
84
100
  role: t ? "img" : void 0,
85
101
  "aria-label": t,
86
102
  "aria-hidden": !t || void 0
@@ -88,20 +104,20 @@ function m({ variant: e = "unread", label: t, className: n, ...r }) {
88
104
  }
89
105
  //#endregion
90
106
  //#region src/IconButton/IconButton.tsx
91
- var h = {
107
+ var v = {
92
108
  round: "secondary",
93
109
  field: "secondary",
94
110
  nav: "ghost"
95
111
  };
96
- function g({ icon: e, variant: t = "round", size: n, selected: r, className: i, ...a }) {
97
- let s = t === "round" ? n ?? "large" : void 0;
98
- return /* @__PURE__ */ o(f, {
112
+ function y({ icon: e, variant: t = "round", size: n, selected: r, className: i, ...a }) {
113
+ let o = t === "round" ? n ?? "large" : void 0;
114
+ return /* @__PURE__ */ s(p, {
99
115
  ...a,
100
- variant: h[t],
116
+ variant: v[t],
101
117
  "aria-current": r ? "page" : void 0,
102
- className: l("tintora-icon-button", `tintora-icon-button--${t}`, s && `tintora-icon-button--${s}`, i),
103
- ...s && { size: s },
104
- children: /* @__PURE__ */ o("span", {
118
+ className: u("tintora-icon-button", `tintora-icon-button--${t}`, o && `tintora-icon-button--${o}`, i),
119
+ ...o && { size: o },
120
+ children: /* @__PURE__ */ s("span", {
105
121
  className: "tintora-icon-button__icon",
106
122
  "aria-hidden": "true",
107
123
  children: e
@@ -110,10 +126,10 @@ function g({ icon: e, variant: t = "round", size: n, selected: r, className: i,
110
126
  }
111
127
  //#endregion
112
128
  //#region src/SearchInput/SearchInput.tsx
113
- function _({ className: e, disabled: t, ...n }) {
114
- return /* @__PURE__ */ s("label", {
115
- className: l("tintora-search-input", t && "tintora-search-input--disabled", e),
116
- children: [/* @__PURE__ */ s("svg", {
129
+ function b({ className: e, disabled: t, ...n }) {
130
+ return /* @__PURE__ */ c("label", {
131
+ className: u("tintora-search-input", t && "tintora-search-input--disabled", e),
132
+ children: [/* @__PURE__ */ c("svg", {
117
133
  className: "tintora-search-input__icon",
118
134
  viewBox: "0 0 24 24",
119
135
  fill: "none",
@@ -121,12 +137,12 @@ function _({ className: e, disabled: t, ...n }) {
121
137
  strokeWidth: "2",
122
138
  strokeLinecap: "round",
123
139
  "aria-hidden": "true",
124
- children: [/* @__PURE__ */ o("circle", {
140
+ children: [/* @__PURE__ */ s("circle", {
125
141
  cx: "11",
126
142
  cy: "11",
127
143
  r: "7"
128
- }), /* @__PURE__ */ o("path", { d: "M20 20l-3.5-3.5" })]
129
- }), /* @__PURE__ */ o("input", {
144
+ }), /* @__PURE__ */ s("path", { d: "M20 20l-3.5-3.5" })]
145
+ }), /* @__PURE__ */ s("input", {
130
146
  ...n,
131
147
  type: "search",
132
148
  disabled: t,
@@ -135,37 +151,189 @@ function _({ className: e, disabled: t, ...n }) {
135
151
  });
136
152
  }
137
153
  //#endregion
154
+ //#region src/Select/SelectContext.ts
155
+ var x = e(null), S = () => {
156
+ let e = t(x);
157
+ if (!e) throw Error("SelectOption must be rendered inside a Select");
158
+ return e;
159
+ };
160
+ //#endregion
161
+ //#region src/Select/SelectOption.tsx
162
+ function C({ label: e, value: t, disabled: n }) {
163
+ let { select: r, activate: i, optionId: a, value: o, activeValue: c } = S();
164
+ return /* @__PURE__ */ s("div", {
165
+ id: a(t),
166
+ role: "option",
167
+ "aria-selected": o === t,
168
+ "aria-disabled": n || void 0,
169
+ className: u("tintora-select__option", c === t && "tintora-select__option--active"),
170
+ onClick: () => r(t),
171
+ onMouseMove: () => !n && i(t),
172
+ children: e
173
+ });
174
+ }
175
+ //#endregion
176
+ //#region src/Select/Select.tsx
177
+ var w = 4;
178
+ function T({ defaultValue: e, options: t, disabled: l, value: d, placeholder: f, onValueChange: p, name: m, className: h, onClick: g, onKeyDown: _, onKeyUp: v, "aria-label": y, ...b }) {
179
+ let S = r(), T = a(null), E = a(null), D = a(null), [O, k] = o(e ?? null), [A, j] = o(!1), [M, N] = o(-1), [P, F] = o({}), I = d !== void 0, L = I ? d : O, R = t.findIndex((e) => e.value === L), z = (e) => t[e]?.disabled !== !0, B = () => t.findIndex((e, t) => z(t)), V = (e, n) => {
180
+ for (let r = e + n; r >= 0 && r < t.length; r += n) if (z(r)) return r;
181
+ return e;
182
+ }, H = () => {
183
+ let e = V(t.length, -1);
184
+ return e === t.length ? -1 : e;
185
+ }, U = (e) => t.findIndex((t) => t.value === e), W = () => {
186
+ N(R >= 0 && z(R) ? R : B()), j(!0);
187
+ }, G = () => j(!1), K = (e) => {
188
+ let t = U(e);
189
+ t < 0 || !z(t) || (G(), e !== L && (I || k(e), p?.(e)));
190
+ }, q = (e) => {
191
+ if (_?.(e), e.defaultPrevented) return;
192
+ let { key: n } = e;
193
+ if (n === "Tab") return G();
194
+ if (!A) {
195
+ [
196
+ "Enter",
197
+ " ",
198
+ "ArrowDown",
199
+ "ArrowUp"
200
+ ].includes(n) && (e.preventDefault(), W());
201
+ return;
202
+ }
203
+ let r = {
204
+ ArrowDown: () => M < 0 ? B() : V(M, 1),
205
+ ArrowUp: () => M < 0 ? B() : V(M, -1),
206
+ Home: B,
207
+ End: H
208
+ };
209
+ n in r ? (e.preventDefault(), N(r[n]())) : n === "Enter" || n === " " ? (e.preventDefault(), M >= 0 ? K(t[M].value) : G()) : n === "Escape" && (e.preventDefault(), G());
210
+ }, J = (e) => {
211
+ v?.(e), e.key === " " && e.preventDefault();
212
+ }, Y = () => {
213
+ let e = D.current, t = E.current;
214
+ if (!e || !t) return;
215
+ let n = t.getBoundingClientRect(), r = e.offsetHeight, i = n.bottom + w + r <= window.innerHeight, a = n.top - w - r >= 0;
216
+ F({
217
+ top: i || !a ? n.bottom + w : n.top - w - r,
218
+ left: n.left,
219
+ minWidth: n.width
220
+ });
221
+ }, X = (e) => {
222
+ g?.(e), !e.defaultPrevented && (A ? G() : W());
223
+ };
224
+ i(() => {
225
+ A && (D.current?.showPopover(), Y());
226
+ }, [A]), n(() => {
227
+ if (!A) return;
228
+ let e = (e) => {
229
+ T.current?.contains(e.target) || G();
230
+ }, t = (e) => {
231
+ D.current?.contains(e.target) || Y();
232
+ };
233
+ return document.addEventListener("pointerdown", e), window.addEventListener("scroll", t, !0), window.addEventListener("resize", Y), () => {
234
+ document.removeEventListener("pointerdown", e), window.removeEventListener("scroll", t, !0), window.removeEventListener("resize", Y);
235
+ };
236
+ }, [A]), n(() => {
237
+ A && M >= 0 && D.current?.children.item(M)?.scrollIntoView?.({ block: "nearest" });
238
+ }, [A, M]);
239
+ let Z = (e) => `${S}-option-${U(e)}`, Q = A ? t[M]?.value ?? null : null, $ = t[R]?.label;
240
+ return /* @__PURE__ */ s(x.Provider, {
241
+ value: {
242
+ value: L,
243
+ activeValue: Q,
244
+ select: K,
245
+ optionId: Z,
246
+ activate: (e) => N(U(e))
247
+ },
248
+ children: /* @__PURE__ */ c("div", {
249
+ ref: T,
250
+ className: "tintora-select",
251
+ children: [
252
+ /* @__PURE__ */ c("button", {
253
+ ...b,
254
+ ref: E,
255
+ type: "button",
256
+ role: "combobox",
257
+ "aria-label": y,
258
+ "aria-haspopup": "listbox",
259
+ "aria-expanded": A,
260
+ "aria-controls": A ? S : void 0,
261
+ "aria-activedescendant": Q === null ? void 0 : Z(Q),
262
+ disabled: l,
263
+ className: u("tintora-select__trigger", h),
264
+ onClick: X,
265
+ onKeyDown: q,
266
+ onKeyUp: J,
267
+ children: [/* @__PURE__ */ s("span", {
268
+ className: u("tintora-select__value", $ === void 0 && "tintora-select__value--placeholder"),
269
+ children: $ ?? f
270
+ }), /* @__PURE__ */ s("svg", {
271
+ className: "tintora-select__chevron",
272
+ width: "10",
273
+ height: "10",
274
+ viewBox: "0 0 24 24",
275
+ fill: "none",
276
+ stroke: "currentColor",
277
+ strokeWidth: "3",
278
+ strokeLinecap: "round",
279
+ strokeLinejoin: "round",
280
+ "aria-hidden": "true",
281
+ children: /* @__PURE__ */ s("path", { d: "M6 9l6 6 6-6" })
282
+ })]
283
+ }),
284
+ A && /* @__PURE__ */ s("div", {
285
+ ref: D,
286
+ id: S,
287
+ role: "listbox",
288
+ "aria-label": y,
289
+ popover: "manual",
290
+ className: "tintora-select__menu",
291
+ style: P,
292
+ onMouseDown: (e) => e.preventDefault(),
293
+ children: t.map((e) => /* @__PURE__ */ s(C, { ...e }, e.value))
294
+ }),
295
+ m && /* @__PURE__ */ s("input", {
296
+ type: "hidden",
297
+ name: m,
298
+ value: L ?? "",
299
+ disabled: l
300
+ })
301
+ ]
302
+ })
303
+ });
304
+ }
305
+ //#endregion
138
306
  //#region src/Tag/Tag.tsx
139
- function v({ children: e, className: t, variant: n = "neutral", size: r = "medium", ...i }) {
140
- return /* @__PURE__ */ o("span", {
307
+ function E({ children: e, className: t, variant: n = "neutral", size: r = "medium", ...i }) {
308
+ return /* @__PURE__ */ s("span", {
141
309
  ...i,
142
- className: l("tintora-tag", `tintora-tag--${n}`, `tintora-tag--${r}`, t),
310
+ className: u("tintora-tag", `tintora-tag--${n}`, `tintora-tag--${r}`, t),
143
311
  children: e
144
312
  });
145
313
  }
146
314
  //#endregion
147
315
  //#region src/TextField/TextField.tsx
148
- function y({ label: e, hint: t, error: r, id: i, className: a, disabled: c, "aria-describedby": u, "aria-invalid": d, ...f }) {
149
- let p = n(), m = i ?? p, h = `${m}-message`, g = r ?? t;
150
- return /* @__PURE__ */ s("div", {
151
- className: l("tintora-textfield", c && "tintora-textfield--disabled", a),
316
+ function D({ label: e, hint: t, error: n, id: i, className: a, disabled: o, "aria-describedby": l, "aria-invalid": d, ...f }) {
317
+ let p = r(), m = i ?? p, h = `${m}-message`, g = n ?? t;
318
+ return /* @__PURE__ */ c("div", {
319
+ className: u("tintora-textfield", o && "tintora-textfield--disabled", a),
152
320
  children: [
153
- /* @__PURE__ */ o("label", {
321
+ /* @__PURE__ */ s("label", {
154
322
  htmlFor: m,
155
323
  className: "tintora-textfield__label",
156
324
  children: e
157
325
  }),
158
- /* @__PURE__ */ o("input", {
326
+ /* @__PURE__ */ s("input", {
159
327
  ...f,
160
328
  id: m,
161
- disabled: c,
329
+ disabled: o,
162
330
  className: "tintora-textfield__input",
163
- "aria-invalid": r ? !0 : d,
164
- "aria-describedby": l(g && h, u) || void 0
331
+ "aria-invalid": n ? !0 : d,
332
+ "aria-describedby": u(g && h, l) || void 0
165
333
  }),
166
- g && /* @__PURE__ */ o("span", {
334
+ g && /* @__PURE__ */ s("span", {
167
335
  id: h,
168
- className: l("tintora-textfield__hint", r && "tintora-textfield__hint--error"),
336
+ className: u("tintora-textfield__hint", n && "tintora-textfield__hint--error"),
169
337
  children: g
170
338
  })
171
339
  ]
@@ -173,20 +341,20 @@ function y({ label: e, hint: t, error: r, id: i, className: a, disabled: c, "ari
173
341
  }
174
342
  //#endregion
175
343
  //#region src/Toggle/ToggleContext.ts
176
- var b = e(null);
177
- function x() {
178
- let e = t(b);
344
+ var O = e(null);
345
+ function k() {
346
+ let e = t(O);
179
347
  if (!e) throw Error("ToggleItem must be rendered inside a Toggle");
180
348
  return e;
181
349
  }
182
350
  //#endregion
183
351
  //#region src/Toggle/Toggle.tsx
184
- function S({ children: e, value: t, defaultValue: n, onValueChange: c, disabled: u = !1, className: d, ...f }) {
185
- let [p, m] = a(n), h = t !== void 0, g = h ? t : p, _ = e.findIndex((e) => e.props.value === g), v = i(null), [y, x] = a({
352
+ function A({ children: e, value: t, defaultValue: n, onValueChange: r, disabled: l = !1, className: d, ...f }) {
353
+ let [p, m] = o(n), h = t !== void 0, g = h ? t : p, _ = e.findIndex((e) => e.props.value === g), v = a(null), [y, b] = o({
186
354
  x: 0,
187
355
  width: 0
188
356
  });
189
- r(() => {
357
+ i(() => {
190
358
  let e = v.current;
191
359
  if (!e) return;
192
360
  let t = () => {
@@ -196,7 +364,7 @@ function S({ children: e, value: t, defaultValue: n, onValueChange: c, disabled:
196
364
  x: t.offsetLeft,
197
365
  width: t.offsetWidth
198
366
  };
199
- x((e) => e.x === n.x && e.width === n.width ? e : n);
367
+ b((e) => e.x === n.x && e.width === n.width ? e : n);
200
368
  };
201
369
  t();
202
370
  let n = new ResizeObserver(t);
@@ -204,46 +372,46 @@ function S({ children: e, value: t, defaultValue: n, onValueChange: c, disabled:
204
372
  n.disconnect();
205
373
  };
206
374
  }, [_]);
207
- let S = {
375
+ let x = {
208
376
  "--tintora-toggle-thumb-x": `${y.x}px`,
209
377
  "--tintora-toggle-thumb-width": `${y.width}px`
210
378
  };
211
- return /* @__PURE__ */ o(b.Provider, {
379
+ return /* @__PURE__ */ s(O.Provider, {
212
380
  value: {
213
381
  value: g,
214
382
  select: (e) => {
215
- e !== g && (h || m(e), c?.(e));
383
+ e !== g && (h || m(e), r?.(e));
216
384
  },
217
- disabled: u
385
+ disabled: l
218
386
  },
219
- children: /* @__PURE__ */ s("div", {
387
+ children: /* @__PURE__ */ c("div", {
220
388
  ...f,
221
389
  role: "group",
222
390
  ref: v,
223
- className: l("tintora-toggle", u && "tintora-toggle--disabled", d),
224
- children: [e, /* @__PURE__ */ o("span", {
391
+ className: u("tintora-toggle", l && "tintora-toggle--disabled", d),
392
+ children: [e, /* @__PURE__ */ s("span", {
225
393
  "aria-hidden": "true",
226
394
  className: "tintora-toggle__thumb",
227
- style: S
395
+ style: x
228
396
  })]
229
397
  })
230
398
  });
231
399
  }
232
400
  //#endregion
233
401
  //#region src/Toggle/ToggleItem.tsx
234
- function C({ value: e, children: t, className: n, disabled: r, onClick: i, ...a }) {
235
- let s = x(), c = (t) => {
236
- i?.(t), t.defaultPrevented || s.select(e);
402
+ function j({ value: e, children: t, className: n, disabled: r, onClick: i, ...a }) {
403
+ let o = k(), c = (t) => {
404
+ i?.(t), t.defaultPrevented || o.select(e);
237
405
  };
238
- return /* @__PURE__ */ o("button", {
406
+ return /* @__PURE__ */ s("button", {
239
407
  ...a,
240
408
  type: "button",
241
- className: l("tintora-toggle__item", n),
242
- "aria-pressed": s.value === e,
243
- disabled: r || s.disabled,
409
+ className: u("tintora-toggle__item", n),
410
+ "aria-pressed": o.value === e,
411
+ disabled: r || o.disabled,
244
412
  onClick: c,
245
413
  children: t
246
414
  });
247
415
  }
248
416
  //#endregion
249
- export { d as Avatar, f as Button, p as Chip, m as Dot, g as IconButton, _ as SearchInput, v as Tag, y as TextField, S as Toggle, C as ToggleItem };
417
+ export { f as Avatar, p as Button, m as Card, g as Chip, _ as Dot, y as IconButton, b as SearchInput, T as Select, h as SelectableCard, E as Tag, D as TextField, A as Toggle, j as ToggleItem };
package/dist/tintora.css CHANGED
@@ -1,2 +1,2 @@
1
- :root{--tintora-color-accent:#ee6b25;--tintora-color-accent-deep:#c94e0c;--tintora-color-success:#4cc56b;--tintora-color-planned:#f2698c;--tintora-color-heart:#c42a56;--tintora-color-steps:#1f7a38;--tintora-color-sleep:#2f4fc4;--tintora-color-ink:#1d1c1c;--tintora-color-on-accent:#1d0e04;--tintora-color-on-accent-deep:#fff;--tintora-color-on-success:#0d200f;--tintora-color-on-planned:#260a13;--tintora-color-on-heart:#fff;--tintora-color-on-steps:#fff;--tintora-color-on-sleep:#fff;--tintora-text-on-card-muted:#55524f;--tintora-chip-fg:#3c3a38;--tintora-chip-bg:#efedeb;--tintora-chip-bg-hover:#e4e1de;--tintora-chip-selected-fg:#8f3604;--tintora-chip-selected-bg:#fff;--tintora-tint-accent:#fdeadd;--tintora-tint-heart:#fbe0e8;--tintora-tint-steps:#dcf3e1;--tintora-tint-sleep:#e0e7fb;--tintora-font-family:"Plus Jakarta Sans", system-ui, -apple-system, "Segoe UI", sans-serif;--tintora-font-weight-regular:400;--tintora-font-weight-medium:500;--tintora-font-weight-semibold:600;--tintora-font-weight-bold:700;--tintora-font-weight-extrabold:800;--tintora-line-height-tight:1.2;--tintora-font-display:700 1.625rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-title:700 1.125rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-heading:700 .9375rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-label:700 .78125rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-body:500 .75rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-caption:400 .6875rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-stat-value:800 1.5625rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-radius-8:8px;--tintora-radius-12:12px;--tintora-radius-14:14px;--tintora-radius-16:16px;--tintora-radius-18:18px;--tintora-radius-20:20px;--tintora-radius-26:26px;--tintora-radius-32:32px;--tintora-radius-40:40px;--tintora-radius-pill:9999px;--tintora-radius-card:var(--tintora-radius-20);--tintora-radius-panel:var(--tintora-radius-32);--tintora-shadow-selected:0 14px 30px #c94e0c73;--tintora-shadow-primary:0 8px 20px #c94e0c59;--tintora-shadow-accent:0 8px 20px #ee6b2566;--tintora-shadow-focus-ring:0 0 0 3px #ee6b2547;--tintora-opacity-disabled:.45}:root,[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--tintora-bg:linear-gradient(180deg, #3e3b3a, #222020);--tintora-surface-glass:linear-gradient(180deg, #3e3b3acc, #222020e6);--tintora-surface-card:#fbfaf9;--tintora-surface-row:#ffffff0f;--tintora-surface-field:#100f0f9e;--tintora-surface-menu:#1e1c1cf7;--tintora-text:#fff;--tintora-text-muted:#ffffffb8;--tintora-text-faint:#ffffffa6;--tintora-text-nav-idle:#ffffffc7;--tintora-text-day:#ffffffd1;--tintora-text-error:#ff9a8a;--tintora-border-glass:#ffffff14;--tintora-border-card:transparent;--tintora-border-row:#ffffff0f;--tintora-border-field:#ffffff14;--tintora-border-field-hover:#ffffff52;--tintora-line:#ffffff1a;--tintora-line-strong:#ffffff52;--tintora-fill-subtle:#ffffff1a;--tintora-fill-subtle-hover:#fff3;--tintora-fill-subtle-pressed:#ffffff47;--tintora-fill-ghost-hover:#ffffff1f;--tintora-fill-day-hover:#ffffff24;--tintora-tag-bg:#ffffff24;--tintora-tag-fg:#fff;--tintora-focus:#ee6b25;--tintora-ring:#fff;--tintora-shadow-glass:0 30px 60px #00000059;--tintora-shadow-card:0 10px 24px #0000002e;--tintora-shadow-card-hover:0 18px 36px #00000052}[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--tintora-bg:linear-gradient(180deg, #fcfaf7, #f2ebe4);--tintora-surface-glass:linear-gradient(180deg, #ffffffb3, #ffffff80);--tintora-surface-card:#fff;--tintora-surface-row:#ffffffd9;--tintora-surface-field:#ffffffd9;--tintora-surface-menu:#2a2827;--tintora-text:#1d1c1c;--tintora-text-muted:#5a5754;--tintora-text-faint:#5a5754;--tintora-text-nav-idle:#4a4745;--tintora-text-day:#2b2927;--tintora-text-error:#b3261e;--tintora-border-glass:#ffffffd9;--tintora-border-card:#1d1c1c0d;--tintora-border-row:#1d1c1c0f;--tintora-border-field:#1d1c1c14;--tintora-border-field-hover:#1d1c1c4d;--tintora-line:#1d1c1c1a;--tintora-line-strong:#1d1c1c4d;--tintora-fill-subtle:#1d1c1c12;--tintora-fill-subtle-hover:#1d1c1c24;--tintora-fill-subtle-pressed:#1d1c1c33;--tintora-fill-ghost-hover:#1d1c1c14;--tintora-fill-day-hover:#1d1c1c1a;--tintora-tag-bg:#1d1c1c12;--tintora-tag-fg:#1d1c1c;--tintora-focus:#c94e0c;--tintora-ring:#1d1c1c;--tintora-shadow-glass:0 30px 60px #60402024;--tintora-shadow-card:0 10px 24px #6040201a;--tintora-shadow-card-hover:0 18px 36px #60402033}@media (prefers-color-scheme:light){:root:not([data-theme]){--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--tintora-bg:linear-gradient(180deg, #fcfaf7, #f2ebe4);--tintora-surface-glass:linear-gradient(180deg, #ffffffb3, #ffffff80);--tintora-surface-card:#fff;--tintora-surface-row:#ffffffd9;--tintora-surface-field:#ffffffd9;--tintora-surface-menu:#2a2827;--tintora-text:#1d1c1c;--tintora-text-muted:#5a5754;--tintora-text-faint:#5a5754;--tintora-text-nav-idle:#4a4745;--tintora-text-day:#2b2927;--tintora-text-error:#b3261e;--tintora-border-glass:#ffffffd9;--tintora-border-card:#1d1c1c0d;--tintora-border-row:#1d1c1c0f;--tintora-border-field:#1d1c1c14;--tintora-border-field-hover:#1d1c1c4d;--tintora-line:#1d1c1c1a;--tintora-line-strong:#1d1c1c4d;--tintora-fill-subtle:#1d1c1c12;--tintora-fill-subtle-hover:#1d1c1c24;--tintora-fill-subtle-pressed:#1d1c1c33;--tintora-fill-ghost-hover:#1d1c1c14;--tintora-fill-day-hover:#1d1c1c1a;--tintora-tag-bg:#1d1c1c12;--tintora-tag-fg:#1d1c1c;--tintora-focus:#c94e0c;--tintora-ring:#1d1c1c;--tintora-shadow-glass:0 30px 60px #60402024;--tintora-shadow-card:0 10px 24px #6040201a;--tintora-shadow-card-hover:0 18px 36px #60402033}}.tintora-avatar{border-radius:var(--tintora-radius-pill);color:var(--tintora-color-ink);font:var(--tintora-font-body);font-size:var(--tintora-avatar-font-size);font-weight:var(--tintora-font-weight-bold);background:linear-gradient(135deg,#f1d9bf,#c9a07a);flex-shrink:0;justify-content:center;align-items:center;display:flex;overflow:hidden}.tintora-avatar>img{object-fit:cover;width:100%;height:100%}.tintora-avatar--small{--tintora-avatar-font-size:.6875rem;width:32px;height:32px;font-weight:var(--tintora-font-weight-bold)}.tintora-avatar--medium{--tintora-avatar-font-size:.8125rem;width:40px;height:40px;font-weight:var(--tintora-font-weight-bold)}.tintora-avatar--large{--tintora-avatar-font-size:.875rem;width:44px;height:44px;font-weight:var(--tintora-font-weight-bold)}.tintora-button{--tintora-button-border:1px solid transparent;box-sizing:border-box;cursor:pointer;outline-offset:2px;height:var(--tintora-button-height);padding:0 var(--tintora-button-padding-x);border:var(--tintora-button-border);border-radius:var(--tintora-button-border-radius);font-family:inherit;font-size:var(--tintora-button-font-size);font-weight:var(--tintora-button-font-weight);color:var(--tintora-button-fg);background-color:var(--tintora-button-bg);box-shadow:var(--tintora-button-shadow,none);outline:none;justify-content:center;align-items:center;gap:8px;display:inline-flex}.tintora-button--small{--tintora-button-height:32px;--tintora-button-padding-x:14px;--tintora-button-border-radius:16px;--tintora-button-font-size:12px;--tintora-button-font-weight:var(--tintora-font-weight-bold)}.tintora-button--medium{--tintora-button-height:40px;--tintora-button-padding-x:18px;--tintora-button-border-radius:20px;--tintora-button-font-size:13px;--tintora-button-font-weight:var(--tintora-font-weight-bold)}.tintora-button--large{--tintora-button-height:48px;--tintora-button-padding-x:24px;--tintora-button-border-radius:24px;--tintora-button-font-size:14px;--tintora-button-font-weight:var(--tintora-font-weight-bold)}.tintora-button__icon{flex-shrink:0;display:inline-flex}.tintora-button--leading-icon{padding-inline-start:calc(var(--tintora-button-padding-x) - 4px)}.tintora-button--trailing-icon{padding-inline-end:calc(var(--tintora-button-padding-x) - 4px)}.tintora-button--primary{--tintora-button-fg:var(--tintora-color-on-accent-deep);--tintora-button-bg:var(--tintora-color-accent-deep);--tintora-button-shadow:var(--tintora-shadow-primary);--tintora-button-filter-hover:brightness(1.14);--tintora-button-filter-pressed:brightness(.9)}.tintora-button--secondary{--tintora-button-fg:var(--tintora-text);--tintora-button-bg:var(--tintora-fill-subtle);--tintora-button-bg-hover:var(--tintora-fill-subtle-hover);--tintora-button-bg-pressed:var(--tintora-fill-subtle-pressed)}.tintora-button--outline{--tintora-button-border:1px solid var(--tintora-line-strong);--tintora-button-fg:var(--tintora-text);--tintora-button-bg:transparent;--tintora-button-bg-hover:var(--tintora-fill-ghost-hover);--tintora-button-bg-pressed:var(--tintora-fill-subtle)}.tintora-button--ghost{--tintora-button-fg:var(--tintora-text-muted);--tintora-button-fg-hover:var(--tintora-text);--tintora-button-fg-pressed:var(--tintora-text);--tintora-button-bg:transparent;--tintora-button-bg-hover:var(--tintora-fill-ghost-hover);--tintora-button-bg-pressed:var(--tintora-fill-subtle)}.tintora-button:enabled:hover{color:var(--tintora-button-fg-hover,var(--tintora-button-fg));background-color:var(--tintora-button-bg-hover,var(--tintora-button-bg));filter:var(--tintora-button-filter-hover,none)}.tintora-button:enabled:active{color:var(--tintora-button-fg-pressed,var(--tintora-button-fg));background-color:var(--tintora-button-bg-pressed,var(--tintora-button-bg));filter:var(--tintora-button-filter-pressed,none);transform:translateY(1px)}.tintora-button:focus-visible{outline:2px solid var(--tintora-focus)}.tintora-button:disabled{opacity:var(--tintora-opacity-disabled);cursor:not-allowed;box-shadow:none}.tintora-chip{border-radius:var(--tintora-radius-12);background-color:var(--tintora-chip-bg);color:var(--tintora-chip-fg);font:var(--tintora-font-caption);font-weight:var(--tintora-font-weight-semibold);cursor:pointer;outline-offset:2px;border:0;outline:none;align-items:center;padding:6px 12px;display:inline-flex}.tintora-chip:enabled:hover:not([aria-pressed=true]){background-color:var(--tintora-chip-bg-hover)}.tintora-chip[aria-pressed=true]{background-color:var(--tintora-chip-selected-bg);color:var(--tintora-chip-selected-fg);font-weight:var(--tintora-font-weight-bold)}.tintora-chip:focus-visible{outline:2px solid var(--tintora-focus)}.tintora-chip:disabled{opacity:var(--tintora-opacity-disabled);cursor:not-allowed}.tintora-dot{box-sizing:border-box;forced-color-adjust:none;flex-shrink:0;display:inline-block}.tintora-dot--unread{border-radius:var(--tintora-radius-pill);background-color:var(--tintora-color-accent);width:8px;height:8px}.tintora-dot--read{border-radius:var(--tintora-radius-pill);border:1.5px solid var(--tintora-text-faint);width:8px;height:8px}.tintora-dot--tick{background-color:var(--tintora-color-accent);border-radius:2px;width:3px;height:15px}.tintora-button.tintora-icon-button{--tintora-button-padding-x:0px}.tintora-icon-button{width:var(--tintora-button-height);flex-shrink:0}.tintora-icon-button__icon{display:inline-flex}.tintora-icon-button__icon svg{width:var(--tintora-icon-button-icon-size);height:var(--tintora-icon-button-icon-size)}.tintora-icon-button.tintora-icon-button--small{--tintora-button-height:32px;--tintora-icon-button-icon-size:14px}.tintora-icon-button.tintora-icon-button--medium{--tintora-button-height:36px;--tintora-icon-button-icon-size:15px}.tintora-icon-button.tintora-icon-button--large{--tintora-button-height:44px;--tintora-icon-button-icon-size:18px}.tintora-icon-button.tintora-icon-button--round{--tintora-button-border-radius:var(--tintora-radius-pill)}.tintora-icon-button.tintora-icon-button--field{--tintora-button-height:48px;--tintora-button-border-radius:var(--tintora-radius-pill);--tintora-button-border:1px solid var(--tintora-border-field);--tintora-button-fg:var(--tintora-text);--tintora-button-bg:var(--tintora-surface-field);--tintora-button-bg-hover:var(--tintora-surface-field);--tintora-button-bg-pressed:var(--tintora-fill-subtle);--tintora-icon-button-icon-size:18px}.tintora-icon-button--field:enabled:hover{border-color:var(--tintora-border-field-hover)}.tintora-icon-button--field:enabled:active{border-color:var(--tintora-border-field)}.tintora-icon-button.tintora-icon-button--nav{--tintora-button-height:44px;--tintora-button-border-radius:var(--tintora-radius-14);--tintora-button-fg:var(--tintora-text-nav-idle);--tintora-button-fg-hover:var(--tintora-text);--tintora-button-fg-pressed:var(--tintora-text);--tintora-button-bg:transparent;--tintora-button-bg-hover:var(--tintora-fill-ghost-hover);--tintora-button-bg-pressed:var(--tintora-fill-ghost-hover);--tintora-icon-button-icon-size:20px}.tintora-icon-button.tintora-icon-button--nav[aria-current=page]{--tintora-button-fg:#fff;--tintora-button-fg-hover:#fff;--tintora-button-fg-pressed:#fff;--tintora-button-bg:var(--tintora-color-accent);--tintora-button-bg-hover:var(--tintora-color-accent);--tintora-button-bg-pressed:var(--tintora-color-accent);--tintora-button-shadow:var(--tintora-shadow-accent)}.tintora-search-input{--tintora-search-input-font-size:.8125rem;--tintora-search-input-clear-icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E");box-sizing:border-box;border:1px solid var(--tintora-border-field);border-radius:var(--tintora-radius-pill);height:48px;color:var(--tintora-text-muted);background-color:var(--tintora-surface-field);align-items:center;gap:10px;padding:0 18px;display:flex}.tintora-search-input--disabled{opacity:var(--tintora-opacity-disabled);cursor:not-allowed}.tintora-search-input__icon{flex-shrink:0;width:16px;height:16px}.tintora-search-input__input{min-width:0;font-family:inherit;font-size:var(--tintora-search-input-font-size);color:var(--tintora-text);background:0 0;border:0;outline:0;flex:1;padding:0}.tintora-search-input__input::placeholder{color:var(--tintora-text-muted);opacity:1}.tintora-search-input__input:disabled{cursor:not-allowed}.tintora-search-input__input::-webkit-search-decoration{display:none}.tintora-search-input__input::-webkit-search-cancel-button{appearance:none;cursor:pointer;background-color:var(--tintora-text-muted);width:16px;height:16px;-webkit-mask:var(--tintora-search-input-clear-icon) center / contain no-repeat;-webkit-mask:var(--tintora-search-input-clear-icon) center / contain no-repeat;mask:var(--tintora-search-input-clear-icon) center / contain no-repeat}.tintora-search-input:not(.tintora-search-input--disabled):hover{border-color:var(--tintora-border-field-hover)}.tintora-search-input:focus-within{border-color:var(--tintora-focus);box-shadow:var(--tintora-shadow-focus-ring);outline-offset:2px;outline:2px solid #0000}.tintora-search-input__input::-webkit-search-cancel-button{appearance:none;cursor:pointer;background-color:var(--tintora-text-muted);width:16px;height:16px;-webkit-mask:var(--tintora-search-input-clear-icon) center / contain no-repeat;mask:var(--tintora-search-input-clear-icon) center / contain no-repeat}.tintora-search-input__input::-webkit-search-cancel-button:hover{background-color:var(--tintora-focus)}.tintora-tag{white-space:nowrap;font:var(--tintora-font-caption);font-weight:var(--tintora-font-weight-semibold);display:inline-block}.tintora-tag--neutral{background-color:var(--tintora-tag-bg);color:var(--tintora-tag-fg)}.tintora-tag--success{background-color:var(--tintora-color-success);color:var(--tintora-color-on-success)}.tintora-tag--accent{background-color:var(--tintora-color-accent-deep);color:var(--tintora-color-on-accent-deep);font-weight:var(--tintora-font-weight-bold)}.tintora-tag--card{background-color:var(--tintora-chip-bg);color:var(--tintora-chip-fg)}.tintora-tag--small{border-radius:var(--tintora-radius-8);padding:2px 8px}.tintora-tag--medium{border-radius:var(--tintora-radius-8);padding:3px 9px}.tintora-tag--large{border-radius:var(--tintora-radius-12);padding:5px 12px}.tintora-textfield{--tintora-textfield-font-size:.8125rem;flex-direction:column;gap:8px;display:inline-flex}.tintora-textfield--disabled{opacity:var(--tintora-opacity-disabled)}.tintora-textfield__label{font:var(--tintora-font-body);font-weight:var(--tintora-font-weight-semibold);color:var(--tintora-text)}.tintora-textfield__input{box-sizing:border-box;border:1px solid var(--tintora-border-field);border-radius:var(--tintora-radius-16);height:48px;font-family:inherit;font-size:var(--tintora-textfield-font-size);color:var(--tintora-text);background-color:var(--tintora-surface-field);padding:0 16px}.tintora-textfield__input::placeholder{color:var(--tintora-text-muted);opacity:1}.tintora-textfield__input:enabled:hover{border-color:var(--tintora-border-field-hover)}.tintora-textfield__input:focus-visible{border-color:var(--tintora-focus);box-shadow:var(--tintora-shadow-focus-ring);outline-offset:2px;outline:2px solid #0000}.tintora-textfield__input[aria-invalid=true]{border-color:var(--tintora-text-error)}.tintora-textfield__input:disabled{cursor:not-allowed}.tintora-textfield__hint{font:var(--tintora-font-caption);color:var(--tintora-text-faint)}.tintora-textfield__hint--error{color:var(--tintora-text-error)}.tintora-toggle{border-radius:var(--tintora-radius-pill);background-color:var(--tintora-fill-subtle);gap:4px;padding:5px;display:inline-flex;position:relative}.tintora-toggle--disabled{opacity:var(--tintora-opacity-disabled)}.tintora-toggle__item{box-sizing:border-box;border-radius:var(--tintora-radius-pill);min-width:34px;height:34px;color:var(--tintora-text-nav-idle);font:var(--tintora-font-label);cursor:pointer;outline-offset:2px;z-index:1;background:0 0;border:0;outline:none;justify-content:center;align-items:center;padding:0 8px;transition:color .2s;display:inline-flex}.tintora-toggle__item[aria-pressed=true]{color:#fff}.tintora-toggle__thumb{width:var(--tintora-toggle-thumb-width);border-radius:var(--tintora-radius-pill);background-color:var(--tintora-color-accent);transform:translateX(var(--tintora-toggle-thumb-x));pointer-events:none;transition:transform .2s;position:absolute;inset-block:5px;inset-inline-start:0}@media (prefers-reduced-motion:reduce){.tintora-toggle__thumb,.tintora-toggle__item{transition:none}}.tintora-toggle__item:focus-visible{outline:2px solid var(--tintora-focus)}.tintora-toggle__item:disabled{cursor:not-allowed}.tintora-toggle:not(.tintora-toggle--disabled) .tintora-toggle__item:disabled{opacity:var(--tintora-opacity-disabled)}
1
+ :root{--tintora-color-accent:#ee6b25;--tintora-color-accent-deep:#c94e0c;--tintora-color-success:#4cc56b;--tintora-color-planned:#f2698c;--tintora-color-heart:#c42a56;--tintora-color-steps:#1f7a38;--tintora-color-sleep:#2f4fc4;--tintora-color-ink:#1d1c1c;--tintora-color-on-accent:#1d0e04;--tintora-color-on-accent-deep:#fff;--tintora-color-on-success:#0d200f;--tintora-color-on-planned:#260a13;--tintora-color-on-heart:#fff;--tintora-color-on-steps:#fff;--tintora-color-on-sleep:#fff;--tintora-text-on-card-muted:#55524f;--tintora-chip-fg:#3c3a38;--tintora-chip-bg:#efedeb;--tintora-chip-bg-hover:#e4e1de;--tintora-chip-selected-fg:#8f3604;--tintora-chip-selected-bg:#fff;--tintora-tint-accent:#fdeadd;--tintora-tint-heart:#fbe0e8;--tintora-tint-steps:#dcf3e1;--tintora-tint-sleep:#e0e7fb;--tintora-menu-bg:#fff;--tintora-menu-border:#1d1c1c1a;--tintora-menu-shadow:0 16px 32px #00000038;--tintora-menu-item-hover:#1d1c1c12;--tintora-menu-item-destructive:#b3261e;--tintora-font-family:"Plus Jakarta Sans", system-ui, -apple-system, "Segoe UI", sans-serif;--tintora-font-weight-regular:400;--tintora-font-weight-medium:500;--tintora-font-weight-semibold:600;--tintora-font-weight-bold:700;--tintora-font-weight-extrabold:800;--tintora-line-height-tight:1.2;--tintora-font-display:700 1.625rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-title:700 1.125rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-heading:700 .9375rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-label:700 .78125rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-body:500 .75rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-caption:400 .6875rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-font-stat-value:800 1.5625rem/var(--tintora-line-height-tight) var(--tintora-font-family);--tintora-radius-8:8px;--tintora-radius-12:12px;--tintora-radius-14:14px;--tintora-radius-16:16px;--tintora-radius-18:18px;--tintora-radius-20:20px;--tintora-radius-26:26px;--tintora-radius-32:32px;--tintora-radius-40:40px;--tintora-radius-pill:9999px;--tintora-radius-card:var(--tintora-radius-20);--tintora-radius-panel:var(--tintora-radius-32);--tintora-shadow-selected:0 14px 30px #c94e0c73;--tintora-shadow-primary:0 8px 20px #c94e0c59;--tintora-shadow-accent:0 8px 20px #ee6b2566;--tintora-shadow-focus-ring:0 0 0 3px #ee6b2547;--tintora-opacity-disabled:.45}:root,[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--tintora-bg:linear-gradient(180deg, #3e3b3a, #222020);--tintora-surface-glass:linear-gradient(180deg, #3e3b3acc, #222020e6);--tintora-surface-card:#fbfaf9;--tintora-surface-row:#ffffff0f;--tintora-surface-field:#100f0f9e;--tintora-surface-menu:#1e1c1cf7;--tintora-text:#fff;--tintora-text-muted:#ffffffb8;--tintora-text-faint:#ffffffa6;--tintora-text-nav-idle:#ffffffc7;--tintora-text-day:#ffffffd1;--tintora-text-error:#ff9a8a;--tintora-border-glass:#ffffff14;--tintora-border-card:transparent;--tintora-border-row:#ffffff0f;--tintora-border-field:#ffffff14;--tintora-border-field-hover:#ffffff52;--tintora-line:#ffffff1a;--tintora-line-strong:#ffffff52;--tintora-fill-subtle:#ffffff1a;--tintora-fill-subtle-hover:#fff3;--tintora-fill-subtle-pressed:#ffffff47;--tintora-fill-ghost-hover:#ffffff1f;--tintora-fill-day-hover:#ffffff24;--tintora-tag-bg:#ffffff24;--tintora-tag-fg:#fff;--tintora-focus:#ee6b25;--tintora-ring:#fff;--tintora-shadow-glass:0 30px 60px #00000059;--tintora-shadow-card:0 10px 24px #0000002e;--tintora-shadow-card-hover:0 18px 36px #00000052}[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--tintora-bg:linear-gradient(180deg, #fcfaf7, #f2ebe4);--tintora-surface-glass:linear-gradient(180deg, #ffffffb3, #ffffff80);--tintora-surface-card:#fff;--tintora-surface-row:#ffffffd9;--tintora-surface-field:#ffffffd9;--tintora-surface-menu:#2a2827;--tintora-text:#1d1c1c;--tintora-text-muted:#5a5754;--tintora-text-faint:#5a5754;--tintora-text-nav-idle:#4a4745;--tintora-text-day:#2b2927;--tintora-text-error:#b3261e;--tintora-border-glass:#ffffffd9;--tintora-border-card:#1d1c1c0d;--tintora-border-row:#1d1c1c0f;--tintora-border-field:#1d1c1c14;--tintora-border-field-hover:#1d1c1c4d;--tintora-line:#1d1c1c1a;--tintora-line-strong:#1d1c1c4d;--tintora-fill-subtle:#1d1c1c12;--tintora-fill-subtle-hover:#1d1c1c24;--tintora-fill-subtle-pressed:#1d1c1c33;--tintora-fill-ghost-hover:#1d1c1c14;--tintora-fill-day-hover:#1d1c1c1a;--tintora-tag-bg:#1d1c1c12;--tintora-tag-fg:#1d1c1c;--tintora-focus:#c94e0c;--tintora-ring:#1d1c1c;--tintora-shadow-glass:0 30px 60px #60402024;--tintora-shadow-card:0 10px 24px #6040201a;--tintora-shadow-card-hover:0 18px 36px #60402033}@media (prefers-color-scheme:light){:root:not([data-theme]){--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--tintora-bg:linear-gradient(180deg, #fcfaf7, #f2ebe4);--tintora-surface-glass:linear-gradient(180deg, #ffffffb3, #ffffff80);--tintora-surface-card:#fff;--tintora-surface-row:#ffffffd9;--tintora-surface-field:#ffffffd9;--tintora-surface-menu:#2a2827;--tintora-text:#1d1c1c;--tintora-text-muted:#5a5754;--tintora-text-faint:#5a5754;--tintora-text-nav-idle:#4a4745;--tintora-text-day:#2b2927;--tintora-text-error:#b3261e;--tintora-border-glass:#ffffffd9;--tintora-border-card:#1d1c1c0d;--tintora-border-row:#1d1c1c0f;--tintora-border-field:#1d1c1c14;--tintora-border-field-hover:#1d1c1c4d;--tintora-line:#1d1c1c1a;--tintora-line-strong:#1d1c1c4d;--tintora-fill-subtle:#1d1c1c12;--tintora-fill-subtle-hover:#1d1c1c24;--tintora-fill-subtle-pressed:#1d1c1c33;--tintora-fill-ghost-hover:#1d1c1c14;--tintora-fill-day-hover:#1d1c1c1a;--tintora-tag-bg:#1d1c1c12;--tintora-tag-fg:#1d1c1c;--tintora-focus:#c94e0c;--tintora-ring:#1d1c1c;--tintora-shadow-glass:0 30px 60px #60402024;--tintora-shadow-card:0 10px 24px #6040201a;--tintora-shadow-card-hover:0 18px 36px #60402033}}.tintora-avatar{border-radius:var(--tintora-radius-pill);color:var(--tintora-color-ink);font:var(--tintora-font-body);font-size:var(--tintora-avatar-font-size);font-weight:var(--tintora-font-weight-bold);background:linear-gradient(135deg,#f1d9bf,#c9a07a);flex-shrink:0;justify-content:center;align-items:center;display:flex;overflow:hidden}.tintora-avatar>img{object-fit:cover;width:100%;height:100%}.tintora-avatar--small{--tintora-avatar-font-size:.6875rem;width:32px;height:32px;font-weight:var(--tintora-font-weight-bold)}.tintora-avatar--medium{--tintora-avatar-font-size:.8125rem;width:40px;height:40px;font-weight:var(--tintora-font-weight-bold)}.tintora-avatar--large{--tintora-avatar-font-size:.875rem;width:44px;height:44px;font-weight:var(--tintora-font-weight-bold)}.tintora-button{--tintora-button-border:1px solid transparent;box-sizing:border-box;cursor:pointer;outline-offset:2px;height:var(--tintora-button-height);padding:0 var(--tintora-button-padding-x);border:var(--tintora-button-border);border-radius:var(--tintora-button-border-radius);font-family:inherit;font-size:var(--tintora-button-font-size);font-weight:var(--tintora-button-font-weight);color:var(--tintora-button-fg);background-color:var(--tintora-button-bg);box-shadow:var(--tintora-button-shadow,none);outline:none;justify-content:center;align-items:center;gap:8px;display:inline-flex}.tintora-button--small{--tintora-button-height:32px;--tintora-button-padding-x:14px;--tintora-button-border-radius:16px;--tintora-button-font-size:12px;--tintora-button-font-weight:var(--tintora-font-weight-bold)}.tintora-button--medium{--tintora-button-height:40px;--tintora-button-padding-x:18px;--tintora-button-border-radius:20px;--tintora-button-font-size:13px;--tintora-button-font-weight:var(--tintora-font-weight-bold)}.tintora-button--large{--tintora-button-height:48px;--tintora-button-padding-x:24px;--tintora-button-border-radius:24px;--tintora-button-font-size:14px;--tintora-button-font-weight:var(--tintora-font-weight-bold)}.tintora-button__icon{flex-shrink:0;display:inline-flex}.tintora-button--leading-icon{padding-inline-start:calc(var(--tintora-button-padding-x) - 4px)}.tintora-button--trailing-icon{padding-inline-end:calc(var(--tintora-button-padding-x) - 4px)}.tintora-button--primary{--tintora-button-fg:var(--tintora-color-on-accent-deep);--tintora-button-bg:var(--tintora-color-accent-deep);--tintora-button-shadow:var(--tintora-shadow-primary);--tintora-button-filter-hover:brightness(1.14);--tintora-button-filter-pressed:brightness(.9)}.tintora-button--secondary{--tintora-button-fg:var(--tintora-text);--tintora-button-bg:var(--tintora-fill-subtle);--tintora-button-bg-hover:var(--tintora-fill-subtle-hover);--tintora-button-bg-pressed:var(--tintora-fill-subtle-pressed)}.tintora-button--outline{--tintora-button-border:1px solid var(--tintora-line-strong);--tintora-button-fg:var(--tintora-text);--tintora-button-bg:transparent;--tintora-button-bg-hover:var(--tintora-fill-ghost-hover);--tintora-button-bg-pressed:var(--tintora-fill-subtle)}.tintora-button--ghost{--tintora-button-fg:var(--tintora-text-muted);--tintora-button-fg-hover:var(--tintora-text);--tintora-button-fg-pressed:var(--tintora-text);--tintora-button-bg:transparent;--tintora-button-bg-hover:var(--tintora-fill-ghost-hover);--tintora-button-bg-pressed:var(--tintora-fill-subtle)}.tintora-button:enabled:hover{color:var(--tintora-button-fg-hover,var(--tintora-button-fg));background-color:var(--tintora-button-bg-hover,var(--tintora-button-bg));filter:var(--tintora-button-filter-hover,none)}.tintora-button:enabled:active{color:var(--tintora-button-fg-pressed,var(--tintora-button-fg));background-color:var(--tintora-button-bg-pressed,var(--tintora-button-bg));filter:var(--tintora-button-filter-pressed,none);transform:translateY(1px)}.tintora-button:focus-visible{outline:2px solid var(--tintora-focus)}.tintora-button:disabled{opacity:var(--tintora-opacity-disabled);cursor:not-allowed;box-shadow:none}.tintora-card{box-sizing:border-box;font:inherit;text-align:start;border:1px solid #0000;justify-content:space-between;align-items:center;gap:12px;margin:0;display:flex}.tintora-card--surface{border-color:var(--tintora-border-card);border-radius:var(--tintora-radius-card);background:var(--tintora-surface-card);box-shadow:var(--tintora-shadow-card);color:var(--tintora-color-ink);--tintora-card-text-muted:var(--tintora-text-on-card-muted);padding:18px 18px 18px 20px}.tintora-card--row{border-color:var(--tintora-border-row);border-radius:var(--tintora-radius-18);background:var(--tintora-surface-row);color:var(--tintora-text);--tintora-card-text-muted:var(--tintora-text-faint);justify-content:flex-start;padding:10px 6px 10px 10px}.tintora-card--selectable{cursor:pointer;width:100%}@media (prefers-reduced-motion:no-preference){.tintora-card--selectable{transition:transform .15s,box-shadow .15s,background-color .15s}}.tintora-card--selectable:not(.tintora-card--selected):hover{box-shadow:var(--tintora-shadow-card-hover);transform:translateY(-3px)}.tintora-card--selectable:focus-visible{outline:2px solid var(--tintora-focus);outline-offset:2px}.tintora-card--selectable:disabled{opacity:var(--tintora-opacity-disabled);cursor:not-allowed}.tintora-card--selected{background:var(--tintora-color-accent-deep);box-shadow:var(--tintora-shadow-selected);color:var(--tintora-color-on-accent-deep);--tintora-card-text-muted:var(--tintora-color-on-accent-deep);border-color:#0000}.tintora-card--selected .tintora-tag--card{background-color:var(--tintora-chip-selected-bg);color:var(--tintora-chip-selected-fg);font-weight:var(--tintora-font-weight-bold)}.tintora-chip{border-radius:var(--tintora-radius-12);background-color:var(--tintora-chip-bg);color:var(--tintora-chip-fg);font:var(--tintora-font-caption);font-weight:var(--tintora-font-weight-semibold);cursor:pointer;outline-offset:2px;border:0;outline:none;align-items:center;padding:6px 12px;display:inline-flex}.tintora-chip:enabled:hover:not([aria-pressed=true]){background-color:var(--tintora-chip-bg-hover)}.tintora-chip[aria-pressed=true]{background-color:var(--tintora-chip-selected-bg);color:var(--tintora-chip-selected-fg);font-weight:var(--tintora-font-weight-bold)}.tintora-chip:focus-visible{outline:2px solid var(--tintora-focus)}.tintora-chip:disabled{opacity:var(--tintora-opacity-disabled);cursor:not-allowed}.tintora-dot{box-sizing:border-box;forced-color-adjust:none;flex-shrink:0;display:inline-block}.tintora-dot--unread{border-radius:var(--tintora-radius-pill);background-color:var(--tintora-color-accent);width:8px;height:8px}.tintora-dot--read{border-radius:var(--tintora-radius-pill);border:1.5px solid var(--tintora-text-faint);width:8px;height:8px}.tintora-dot--tick{background-color:var(--tintora-color-accent);border-radius:2px;width:3px;height:15px}.tintora-button.tintora-icon-button{--tintora-button-padding-x:0px}.tintora-icon-button{width:var(--tintora-button-height);flex-shrink:0}.tintora-icon-button__icon{display:inline-flex}.tintora-icon-button__icon svg{width:var(--tintora-icon-button-icon-size);height:var(--tintora-icon-button-icon-size)}.tintora-icon-button.tintora-icon-button--small{--tintora-button-height:32px;--tintora-icon-button-icon-size:14px}.tintora-icon-button.tintora-icon-button--medium{--tintora-button-height:36px;--tintora-icon-button-icon-size:15px}.tintora-icon-button.tintora-icon-button--large{--tintora-button-height:44px;--tintora-icon-button-icon-size:18px}.tintora-icon-button.tintora-icon-button--round{--tintora-button-border-radius:var(--tintora-radius-pill)}.tintora-icon-button.tintora-icon-button--field{--tintora-button-height:48px;--tintora-button-border-radius:var(--tintora-radius-pill);--tintora-button-border:1px solid var(--tintora-border-field);--tintora-button-fg:var(--tintora-text);--tintora-button-bg:var(--tintora-surface-field);--tintora-button-bg-hover:var(--tintora-surface-field);--tintora-button-bg-pressed:var(--tintora-fill-subtle);--tintora-icon-button-icon-size:18px}.tintora-icon-button--field:enabled:hover{border-color:var(--tintora-border-field-hover)}.tintora-icon-button--field:enabled:active{border-color:var(--tintora-border-field)}.tintora-icon-button.tintora-icon-button--nav{--tintora-button-height:44px;--tintora-button-border-radius:var(--tintora-radius-14);--tintora-button-fg:var(--tintora-text-nav-idle);--tintora-button-fg-hover:var(--tintora-text);--tintora-button-fg-pressed:var(--tintora-text);--tintora-button-bg:transparent;--tintora-button-bg-hover:var(--tintora-fill-ghost-hover);--tintora-button-bg-pressed:var(--tintora-fill-ghost-hover);--tintora-icon-button-icon-size:20px}.tintora-icon-button.tintora-icon-button--nav[aria-current=page]{--tintora-button-fg:#fff;--tintora-button-fg-hover:#fff;--tintora-button-fg-pressed:#fff;--tintora-button-bg:var(--tintora-color-accent);--tintora-button-bg-hover:var(--tintora-color-accent);--tintora-button-bg-pressed:var(--tintora-color-accent);--tintora-button-shadow:var(--tintora-shadow-accent)}.tintora-search-input{--tintora-search-input-font-size:.8125rem;--tintora-search-input-clear-icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E");box-sizing:border-box;border:1px solid var(--tintora-border-field);border-radius:var(--tintora-radius-pill);height:48px;color:var(--tintora-text-muted);background-color:var(--tintora-surface-field);align-items:center;gap:10px;padding:0 18px;display:flex}.tintora-search-input--disabled{opacity:var(--tintora-opacity-disabled);cursor:not-allowed}.tintora-search-input__icon{flex-shrink:0;width:16px;height:16px}.tintora-search-input__input{min-width:0;font-family:inherit;font-size:var(--tintora-search-input-font-size);color:var(--tintora-text);background:0 0;border:0;outline:0;flex:1;padding:0}.tintora-search-input__input::placeholder{color:var(--tintora-text-muted);opacity:1}.tintora-search-input__input:disabled{cursor:not-allowed}.tintora-search-input__input::-webkit-search-decoration{display:none}.tintora-search-input__input::-webkit-search-cancel-button{appearance:none;cursor:pointer;background-color:var(--tintora-text-muted);width:16px;height:16px;-webkit-mask:var(--tintora-search-input-clear-icon) center / contain no-repeat;-webkit-mask:var(--tintora-search-input-clear-icon) center / contain no-repeat;mask:var(--tintora-search-input-clear-icon) center / contain no-repeat}.tintora-search-input:not(.tintora-search-input--disabled):hover{border-color:var(--tintora-border-field-hover)}.tintora-search-input:focus-within{border-color:var(--tintora-focus);box-shadow:var(--tintora-shadow-focus-ring);outline-offset:2px;outline:2px solid #0000}.tintora-search-input__input::-webkit-search-cancel-button{appearance:none;cursor:pointer;background-color:var(--tintora-text-muted);width:16px;height:16px;-webkit-mask:var(--tintora-search-input-clear-icon) center / contain no-repeat;mask:var(--tintora-search-input-clear-icon) center / contain no-repeat}.tintora-search-input__input::-webkit-search-cancel-button:hover{background-color:var(--tintora-focus)}.tintora-select{--tintora-select-font-size:.71875rem;display:inline-block;position:relative}.tintora-select__trigger{box-sizing:border-box;border-radius:var(--tintora-radius-14);height:28px;font-family:inherit;font-size:var(--tintora-select-font-size);font-weight:var(--tintora-font-weight-medium);color:var(--tintora-chip-fg);background-color:var(--tintora-chip-bg);cursor:pointer;border:0;align-items:center;gap:6px;padding:0 12px;display:inline-flex}.tintora-select__trigger:enabled:hover,.tintora-select__trigger[aria-expanded=true]{background-color:var(--tintora-chip-bg-hover)}.tintora-select__trigger:focus-visible{box-shadow:var(--tintora-shadow-focus-ring);outline-offset:2px;outline:2px solid #0000}.tintora-select__trigger:disabled{opacity:var(--tintora-opacity-disabled);cursor:not-allowed}.tintora-select__value--placeholder{color:var(--tintora-text-on-card-muted)}.tintora-select__chevron{flex-shrink:0}.tintora-select__trigger[aria-expanded=true] .tintora-select__chevron{transform:rotate(180deg)}.tintora-select__menu{box-sizing:border-box;border:1px solid var(--tintora-menu-border);border-radius:var(--tintora-radius-14);max-height:50vh;color:var(--tintora-color-ink);background:var(--tintora-menu-bg);box-shadow:var(--tintora-menu-shadow);flex-direction:column;gap:2px;margin:0;padding:6px;display:flex;inset:auto;overflow-y:auto}.tintora-select__option{box-sizing:border-box;border-radius:var(--tintora-radius-12);min-height:32px;font:var(--tintora-font-body);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;padding:0 10px;display:flex}.tintora-select__option--active{background:var(--tintora-menu-item-hover)}.tintora-select__option[aria-selected=true]{font-weight:var(--tintora-font-weight-bold);color:var(--tintora-color-accent-deep);background:var(--tintora-tint-accent)}.tintora-select__option[aria-disabled=true]{opacity:var(--tintora-opacity-disabled);cursor:not-allowed}@media (pointer:coarse){.tintora-select__option{min-height:44px}}@media (forced-colors:active){.tintora-select__option--active{outline-offset:-2px;outline:2px solid highlight}}.tintora-tag{white-space:nowrap;font:var(--tintora-font-caption);font-weight:var(--tintora-font-weight-semibold);display:inline-block}.tintora-tag--neutral{background-color:var(--tintora-tag-bg);color:var(--tintora-tag-fg)}.tintora-tag--success{background-color:var(--tintora-color-success);color:var(--tintora-color-on-success)}.tintora-tag--accent{background-color:var(--tintora-color-accent-deep);color:var(--tintora-color-on-accent-deep);font-weight:var(--tintora-font-weight-bold)}.tintora-tag--card{background-color:var(--tintora-chip-bg);color:var(--tintora-chip-fg)}.tintora-tag--small{border-radius:var(--tintora-radius-8);padding:2px 8px}.tintora-tag--medium{border-radius:var(--tintora-radius-8);padding:3px 9px}.tintora-tag--large{border-radius:var(--tintora-radius-12);padding:5px 12px}.tintora-textfield{--tintora-textfield-font-size:.8125rem;flex-direction:column;gap:8px;display:inline-flex}.tintora-textfield--disabled{opacity:var(--tintora-opacity-disabled)}.tintora-textfield__label{font:var(--tintora-font-body);font-weight:var(--tintora-font-weight-semibold);color:var(--tintora-text)}.tintora-textfield__input{box-sizing:border-box;border:1px solid var(--tintora-border-field);border-radius:var(--tintora-radius-16);height:48px;font-family:inherit;font-size:var(--tintora-textfield-font-size);color:var(--tintora-text);background-color:var(--tintora-surface-field);padding:0 16px}.tintora-textfield__input::placeholder{color:var(--tintora-text-muted);opacity:1}.tintora-textfield__input:enabled:hover{border-color:var(--tintora-border-field-hover)}.tintora-textfield__input:focus-visible{border-color:var(--tintora-focus);box-shadow:var(--tintora-shadow-focus-ring);outline-offset:2px;outline:2px solid #0000}.tintora-textfield__input[aria-invalid=true]{border-color:var(--tintora-text-error)}.tintora-textfield__input:disabled{cursor:not-allowed}.tintora-textfield__hint{font:var(--tintora-font-caption);color:var(--tintora-text-faint)}.tintora-textfield__hint--error{color:var(--tintora-text-error)}.tintora-toggle{border-radius:var(--tintora-radius-pill);background-color:var(--tintora-fill-subtle);gap:4px;padding:5px;display:inline-flex;position:relative}.tintora-toggle--disabled{opacity:var(--tintora-opacity-disabled)}.tintora-toggle__item{box-sizing:border-box;border-radius:var(--tintora-radius-pill);min-width:34px;height:34px;color:var(--tintora-text-nav-idle);font:var(--tintora-font-label);cursor:pointer;outline-offset:2px;z-index:1;background:0 0;border:0;outline:none;justify-content:center;align-items:center;padding:0 8px;transition:color .2s;display:inline-flex}.tintora-toggle__item[aria-pressed=true]{color:#fff}.tintora-toggle__thumb{width:var(--tintora-toggle-thumb-width);border-radius:var(--tintora-radius-pill);background-color:var(--tintora-color-accent);transform:translateX(var(--tintora-toggle-thumb-x));pointer-events:none;transition:transform .2s;position:absolute;inset-block:5px;inset-inline-start:0}@media (prefers-reduced-motion:reduce){.tintora-toggle__thumb,.tintora-toggle__item{transition:none}}.tintora-toggle__item:focus-visible{outline:2px solid var(--tintora-focus)}.tintora-toggle__item:disabled{cursor:not-allowed}.tintora-toggle:not(.tintora-toggle--disabled) .tintora-toggle__item:disabled{opacity:var(--tintora-opacity-disabled)}
2
2
  /*$vite$:1*/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tintora",
3
- "version": "0.11.0",
3
+ "version": "0.13.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "repository": {