@auldrant/ui 0.7.0 → 0.8.1

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/CHANGELOG.md ADDED
@@ -0,0 +1,116 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/).
7
+
8
+ ## [0.8.0] - 2026-02-27
9
+
10
+ ### Added
11
+
12
+ - feat(deps): add lucide-preact icon library ([#44](https://github.com/coloneljade/auldrant-ui/pull/44))
13
+ - feat(password-input): replace text toggle with icon overlay ([#44](https://github.com/coloneljade/auldrant-ui/pull/44))
14
+ - chore(dev): add missing error variants to test page ([#44](https://github.com/coloneljade/auldrant-ui/pull/44))
15
+
16
+ ## [0.7.0] - 2026-02-27
17
+
18
+ ### Added
19
+
20
+ - Change default primary from blue to green (hue 160) ([#40](https://github.com/coloneljade/auldrant-ui/pull/40))
21
+ - Ship 6 AAA-verified preset CSS classes (aui-blue, aui-purple, aui-teal, aui-red, aui-orange, aui-yellow) ([#40](https://github.com/coloneljade/auldrant-ui/pull/40))
22
+ - Expand contrast test coverage to all hues × all recommended pairs × both modes × raw + hover states ([#40](https://github.com/coloneljade/auldrant-ui/pull/40))
23
+ - Update README with green default and pre-built palette reference ([#40](https://github.com/coloneljade/auldrant-ui/pull/40))
24
+
25
+ ## [0.6.0] - 2026-02-26
26
+
27
+ ### Changed
28
+
29
+ - feat(a11y): theme contrast system with color-mix() derivation ([#34](https://github.com/coloneljade/auldrant-ui/pull/34))
30
+ - test: automated WCAG contrast validation ([#34](https://github.com/coloneljade/auldrant-ui/pull/34))
31
+ - feat: dev test page for visual testing (#19) ([#34](https://github.com/coloneljade/auldrant-ui/pull/34))
32
+ - docs: rewrite theming section with contrast guidance ([#34](https://github.com/coloneljade/auldrant-ui/pull/34))
33
+ - chore: align PR template with /pr skill format ([#34](https://github.com/coloneljade/auldrant-ui/pull/34))
34
+ - docs: rewrite CONTRIBUTING.md with DCO, dev test page, and merge bot workflow ([#34](https://github.com/coloneljade/auldrant-ui/pull/34))
35
+
36
+ ## [0.5.2] - 2026-02-26
37
+
38
+ ### Fixed
39
+
40
+ - Add `homepage` and `bugs` fields to `package.json` ([#31](https://github.com/coloneljade/auldrant-ui/pull/31))
41
+ - npm renders these as links on the public package page ([#31](https://github.com/coloneljade/auldrant-ui/pull/31))
42
+
43
+ ## [0.5.1] - 2026-02-26
44
+
45
+ ### Fixed
46
+
47
+ - Add `repository` field to `package.json` with the GitHub repo URL ([#30](https://github.com/coloneljade/auldrant-ui/pull/30))
48
+ - Required by Sigstore provenance verification during `npm publish --provenance` ([#30](https://github.com/coloneljade/auldrant-ui/pull/30))
49
+ - Without it, publish fails with E422: `repository.url is "", expected to match` ([#30](https://github.com/coloneljade/auldrant-ui/pull/30))
50
+
51
+ ## [0.5.0] - 2026-02-26
52
+
53
+ ### Added
54
+
55
+ - Add `error` prop to all form field components with `aria-invalid`, `aria-describedby`, and `role="alert"` error messages ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
56
+ - Add required `caption` prop to Table for accessible name via `<caption>` ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
57
+ - Add `status` prop to Form rendered as `<output>` for submission feedback ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
58
+ - Add `aria-live` character limit announcements to Textarea at threshold breakpoints ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
59
+ - Add `describeBy()` utility and shared `field-error` CSS class ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
60
+ - Remove 11 duplicate behavioral tests already covered by a11y tests with better query patterns ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
61
+ - Replace `querySelector` calls with accessible queries (`getByRole`, `getByLabelText`) in behavioral tests ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
62
+ - Add AAA section comments (`// Arrange`, `// Act`, `// Assert`) to all behavioral tests ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
63
+ - Configure coverage to exclude test infrastructure (`coverageSkipTestFiles`, `coveragePathIgnorePatterns`) ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
64
+ - Fix publishing config: correct CHANGELOG format, remove CHANGELOG from package files ([#28](https://github.com/coloneljade/auldrant-ui/pull/28))
65
+
66
+ ## [0.4.0] - 2026-02-26
67
+
68
+ ### Added
69
+
70
+ - **feat(test)**: add axe-core a11y test suite (19 files, setup helpers, 18 test files) ([#20](https://github.com/coloneljade/auldrant-ui/pull/20))
71
+ - **refactor(test)**: migrate a11y assertions out of behavioral tests (cleanup + deletions) ([#20](https://github.com/coloneljade/auldrant-ui/pull/20))
72
+ - **docs(rules)**: mandate AAA comments and WCAG SC references in tests ([#20](https://github.com/coloneljade/auldrant-ui/pull/20))
73
+
74
+ ## [0.3.0] - 2026-02-25
75
+
76
+ ### Added
77
+
78
+ - Configure Vite, TypeScript, Biome, devcontainer, and test setup ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
79
+ - Add routing and title signals for SPA navigation ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
80
+ - Shared types, utilities, and composable CSS classes ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
81
+ - Semantic HTML-first — native elements before ARIA ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
82
+ - CSS Grid layout, em-based spacing, CSS modules ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
83
+ - Accessible form field management (`FormField` wrapper) ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
84
+ - SkipLink and Nav for keyboard navigation ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
85
+ - Type-safe component props (TypeScript strict mode) ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
86
+ - Comprehensive test coverage (114 tests) ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
87
+ - Pit of success design principle for component APIs ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
88
+ - Binary tools principle (Biome fixes, not manual edits) ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
89
+ - Mandatory skills workflow (staging, pushing, PRs) ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
90
+ - Import aliases (`@components`, `@scripts`, `@signals`, `@styles`) ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
91
+ - **Head component** — meta/document head management (issue #18) ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
92
+ - **Form data typing** — generic type parameter for typed onSubmit (issue #8) ([#7](https://github.com/coloneljade/auldrant-ui/pull/7))
93
+
94
+ ## [0.2.0] - 2026-02-24
95
+
96
+ ### Added
97
+
98
+ - Remove CJS output and UMD name — ESM-only library ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
99
+ - Fix CI publish failure by skipping lefthook in CI environment ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
100
+ - Add `@components` and `@styles` import path aliases (tsconfig + vite) ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
101
+ - Add GitHub CLI feature and YAML extension to devcontainer ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
102
+ - Create VSCode tasks for all project scripts (test, build, check, typecheck, storybook) ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
103
+ - Add component base types (BaseProps, FieldProps) and cx() class utility ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
104
+
105
+ ## [0.1.0] - 2026-02-24
106
+
107
+ ### Added
108
+
109
+ - Remove CJS output and UMD name — ESM-only library ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
110
+ - Fix CI publish failure by skipping lefthook in CI environment ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
111
+ - Add `@components` and `@styles` import path aliases (tsconfig + vite) ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
112
+ - Add GitHub CLI feature and YAML extension to devcontainer ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
113
+ - Create VSCode tasks for all project scripts (test, build, check, typecheck, storybook) ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
114
+ - Add component base types (BaseProps, FieldProps) and cx() class utility ([#6](https://github.com/coloneljade/auldrant-ui/pull/6))
115
+
116
+ ## [0.0.0]
package/NOTICES ADDED
@@ -0,0 +1,49 @@
1
+ This project includes third-party software. Their licenses and copyright
2
+ notices are reproduced below.
3
+
4
+ ================================================================================
5
+
6
+ lucide-preact — https://github.com/lucide-icons/lucide
7
+ Icons used in component library UI.
8
+
9
+ ISC License
10
+
11
+ Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2026 as part
12
+ of Feather (MIT). All other copyright (c) for Lucide are held by Lucide
13
+ Contributors 2026.
14
+
15
+ Permission to use, copy, modify, and/or distribute this software for any
16
+ purpose with or without fee is hereby granted, provided that the above
17
+ copyright notice and this permission notice appear in all copies.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
20
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
21
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
22
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
23
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
24
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
25
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26
+
27
+ ---
28
+
29
+ The MIT License (MIT) (for portions derived from Feather)
30
+
31
+ Copyright (c) 2013-2026 Cole Bemis
32
+
33
+ Permission is hereby granted, free of charge, to any person obtaining a copy
34
+ of this software and associated documentation files (the "Software"), to deal
35
+ in the Software without restriction, including without limitation the rights
36
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
37
+ copies of the Software, and to permit persons to whom the Software is
38
+ furnished to do so, subject to the following conditions:
39
+
40
+ The above copyright notice and this permission notice shall be included in all
41
+ copies or substantial portions of the Software.
42
+
43
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
48
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
49
+ SOFTWARE.
@@ -1 +1 @@
1
- :root{--aui-base-primary: oklch(.78 .18 160);--aui-base-white: #f5f5f5;--aui-base-black: #1a1a1a;--aui-base-error: oklch(.78 .22 27);--aui-base-success: oklch(.78 .18 145);--_aui-fg: var(--aui-base-white);--_aui-bg: var(--aui-base-black);--aui-color-text: var(--_aui-fg);--aui-color-text-muted: color-mix(in oklch, var(--_aui-fg) 82%, var(--_aui-bg));--aui-color-background: var(--_aui-bg);--aui-color-background-hover: color-mix(in oklch, var(--_aui-bg) 92%, var(--_aui-fg));--aui-color-surface: color-mix(in oklch, var(--_aui-bg) 97%, var(--_aui-fg));--aui-color-border: color-mix(in oklch, var(--_aui-bg) 50%, var(--_aui-fg));--aui-color-primary: var(--aui-base-primary);--aui-color-primary-hover: color-mix(in oklch, var(--aui-base-primary) 85%, var(--_aui-fg));--aui-color-focus-ring: var(--aui-base-primary);--aui-color-error: var(--aui-base-error);--aui-color-success: var(--aui-base-success)}@media(prefers-color-scheme:light){:root{--_aui-fg: var(--aui-base-black);--_aui-bg: var(--aui-base-white);--aui-color-primary: color-mix(in oklch, var(--aui-base-primary) 33%, var(--_aui-fg));--aui-color-primary-hover: color-mix(in oklch, var(--aui-base-primary) 25%, var(--_aui-fg));--aui-color-focus-ring: color-mix(in oklch, var(--aui-base-primary) 33%, var(--_aui-fg));--aui-color-error: color-mix(in oklch, var(--aui-base-error) 33%, var(--_aui-fg));--aui-color-success: color-mix(in oklch, var(--aui-base-success) 33%, var(--_aui-fg))}}.aui-blue{--aui-base-primary: oklch(.78 .18 260)}.aui-purple{--aui-base-primary: oklch(.78 .18 300)}.aui-teal{--aui-base-primary: oklch(.78 .15 195)}.aui-red{--aui-base-primary: oklch(.78 .22 27)}.aui-orange{--aui-base-primary: oklch(.78 .18 55)}.aui-yellow{--aui-base-primary: oklch(.78 .18 95)}._button_4gn7y_1{padding:.5em 1em;border:1px solid var(--aui-color-border);border-radius:.25em;background:var(--aui-color-primary);color:var(--aui-color-background);font:inherit;cursor:pointer}._button_4gn7y_1:hover{background:var(--aui-color-primary-hover)}._card_awzw5_1{display:grid;gap:.5em;padding:1em;border:1px solid var(--aui-color-border);border-radius:.25em;background:var(--aui-color-surface)}._field_17xwz_1{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:.5em}._error_17xwz_12{grid-column:2}._form_jr324_1{display:grid;gap:1em}._actions_jr324_6{display:grid;grid-auto-flow:column;justify-content:start;gap:.5em}._status_jr324_13{margin:0;font-size:.875em;color:var(--aui-color-text-muted)}._field_7l9ux_1{display:grid;grid-template-columns:auto 1fr;align-items:start;gap:.5em}._label_7l9ux_8{padding-top:.25em}._required_7l9ux_12{color:var(--aui-color-error)}._error_7l9ux_16{grid-column:2}._nav_778nl_1{display:grid;gap:.5em}._title_778nl_6{font-weight:700}._wrapper_1mu6v_1{display:grid;grid-template-columns:1fr auto}._input_1mu6v_6{border-top-right-radius:0;border-bottom-right-radius:0;border-right:none}._toggle_1mu6v_13{padding:.375em .75em;border:1px solid var(--aui-color-border);border-top-right-radius:.25em;border-bottom-right-radius:.25em;background:var(--aui-color-background);color:var(--aui-color-text);font:inherit;font-size:.875em;cursor:pointer}._toggle_1mu6v_13:hover:not(:disabled){background:var(--aui-color-background-hover, var(--aui-color-background))}._fieldset_lymkd_1{border:none;padding:0}._legend_lymkd_6{font-weight:700;margin-bottom:.5em}._option_lymkd_11{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:.5em;margin-bottom:.25em}._section_4nogy_1{display:grid;gap:1em}._skip_xbsul_1{position:absolute;top:-100%;left:0;padding:.5em 1em;background:var(--aui-color-background);color:var(--aui-color-primary);z-index:1000}._skip_xbsul_1:focus{top:0}._table_dls60_1{width:100%;border-collapse:collapse}._caption_dls60_6{text-align:left;padding:.5em 0;font-weight:700}._table_dls60_1 th,._table_dls60_1 td{padding:.5em;text-align:left;border-bottom:1px solid var(--aui-color-border)}._table_dls60_1 th{font-weight:700;color:var(--aui-color-text)}._table_dls60_1 td{color:var(--aui-color-text)}._focus-ring_4u8pk_3:focus-visible{outline:2px solid var(--aui-color-focus-ring);outline-offset:2px}._disabled_4u8pk_8:disabled{opacity:.5;cursor:not-allowed}._text-input_4u8pk_13{padding:.375em .5em;border:1px solid var(--aui-color-border);border-radius:.25em;background:var(--aui-color-background);color:var(--aui-color-text);font:inherit}._link_4u8pk_22{color:var(--aui-color-primary);text-decoration:underline;cursor:pointer}._link_4u8pk_22:hover{color:var(--aui-color-primary-hover)}._check-input_4u8pk_32{accent-color:var(--aui-color-primary)}._field-error_4u8pk_36{margin:0;font-size:.875em;color:var(--aui-color-error)}._visually-hidden_4u8pk_42{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._wrapper_1kyv1_1{display:grid;gap:.25em}._textarea_1kyv1_6{resize:vertical}._counter_1kyv1_11{justify-self:end;font-size:.875em;color:var(--aui-color-text-muted)}._theme_1x47p_11{display:contents;--aui-color-text: var(--_aui-fg);--aui-color-text-muted: color-mix(in oklch, var(--_aui-fg) 82%, var(--_aui-bg));--aui-color-background: var(--_aui-bg);--aui-color-background-hover: color-mix(in oklch, var(--_aui-bg) 92%, var(--_aui-fg));--aui-color-surface: color-mix(in oklch, var(--_aui-bg) 97%, var(--_aui-fg));--aui-color-border: color-mix(in oklch, var(--_aui-bg) 50%, var(--_aui-fg));--aui-color-primary: var(--aui-base-primary);--aui-color-primary-hover: color-mix(in oklch, var(--aui-base-primary) 85%, var(--_aui-fg));--aui-color-focus-ring: var(--aui-base-primary);--aui-color-error: var(--aui-base-error);--aui-color-success: var(--aui-base-success)}
1
+ :root{--aui-base-primary: oklch(.78 .18 160);--aui-base-white: #f5f5f5;--aui-base-black: #1a1a1a;--aui-base-error: oklch(.78 .22 27);--aui-base-success: oklch(.78 .18 145);--_aui-fg: var(--aui-base-white);--_aui-bg: var(--aui-base-black);--aui-color-text: var(--_aui-fg);--aui-color-text-muted: color-mix(in oklch, var(--_aui-fg) 82%, var(--_aui-bg));--aui-color-background: var(--_aui-bg);--aui-color-background-hover: color-mix(in oklch, var(--_aui-bg) 92%, var(--_aui-fg));--aui-color-surface: color-mix(in oklch, var(--_aui-bg) 97%, var(--_aui-fg));--aui-color-border: color-mix(in oklch, var(--_aui-bg) 50%, var(--_aui-fg));--aui-color-primary: var(--aui-base-primary);--aui-color-primary-hover: color-mix(in oklch, var(--aui-base-primary) 85%, var(--_aui-fg));--aui-color-focus-ring: var(--aui-base-primary);--aui-color-error: var(--aui-base-error);--aui-color-success: var(--aui-base-success)}@media(prefers-color-scheme:light){:root{--_aui-fg: var(--aui-base-black);--_aui-bg: var(--aui-base-white);--aui-color-primary: color-mix(in oklch, var(--aui-base-primary) 33%, var(--_aui-fg));--aui-color-primary-hover: color-mix(in oklch, var(--aui-base-primary) 25%, var(--_aui-fg));--aui-color-focus-ring: color-mix(in oklch, var(--aui-base-primary) 33%, var(--_aui-fg));--aui-color-error: color-mix(in oklch, var(--aui-base-error) 33%, var(--_aui-fg));--aui-color-success: color-mix(in oklch, var(--aui-base-success) 33%, var(--_aui-fg))}}.aui-blue{--aui-base-primary: oklch(.78 .18 260)}.aui-purple{--aui-base-primary: oklch(.78 .18 300)}.aui-teal{--aui-base-primary: oklch(.78 .15 195)}.aui-red{--aui-base-primary: oklch(.78 .22 27)}.aui-orange{--aui-base-primary: oklch(.78 .18 55)}.aui-yellow{--aui-base-primary: oklch(.78 .18 95)}._button_4gn7y_1{padding:.5em 1em;border:1px solid var(--aui-color-border);border-radius:.25em;background:var(--aui-color-primary);color:var(--aui-color-background);font:inherit;cursor:pointer}._button_4gn7y_1:hover{background:var(--aui-color-primary-hover)}._card_awzw5_1{display:grid;gap:.5em;padding:1em;border:1px solid var(--aui-color-border);border-radius:.25em;background:var(--aui-color-surface)}._field_17xwz_1{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:.5em}._error_17xwz_12{grid-column:2}._form_jr324_1{display:grid;gap:1em}._actions_jr324_6{display:grid;grid-auto-flow:column;justify-content:start;gap:.5em}._status_jr324_13{margin:0;font-size:.875em;color:var(--aui-color-text-muted)}._field_7l9ux_1{display:grid;grid-template-columns:auto 1fr;align-items:start;gap:.5em}._label_7l9ux_8{padding-top:.25em}._required_7l9ux_12{color:var(--aui-color-error)}._error_7l9ux_16{grid-column:2}._nav_778nl_1{display:grid;gap:.5em}._title_778nl_6{font-weight:700}._wrapper_16zfv_1{position:relative}._input_16zfv_5{width:100%;padding-right:2.5em}._toggle_16zfv_11{position:absolute;right:.5em;top:50%;transform:translateY(-50%);display:grid;place-items:center;padding:.25em;border:none;background:none;color:var(--aui-color-text);cursor:pointer}._fieldset_lymkd_1{border:none;padding:0}._legend_lymkd_6{font-weight:700;margin-bottom:.5em}._option_lymkd_11{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:.5em;margin-bottom:.25em}._section_4nogy_1{display:grid;gap:1em}._skip_xbsul_1{position:absolute;top:-100%;left:0;padding:.5em 1em;background:var(--aui-color-background);color:var(--aui-color-primary);z-index:1000}._skip_xbsul_1:focus{top:0}._table_dls60_1{width:100%;border-collapse:collapse}._caption_dls60_6{text-align:left;padding:.5em 0;font-weight:700}._table_dls60_1 th,._table_dls60_1 td{padding:.5em;text-align:left;border-bottom:1px solid var(--aui-color-border)}._table_dls60_1 th{font-weight:700;color:var(--aui-color-text)}._table_dls60_1 td{color:var(--aui-color-text)}._focus-ring_4u8pk_3:focus-visible{outline:2px solid var(--aui-color-focus-ring);outline-offset:2px}._disabled_4u8pk_8:disabled{opacity:.5;cursor:not-allowed}._text-input_4u8pk_13{padding:.375em .5em;border:1px solid var(--aui-color-border);border-radius:.25em;background:var(--aui-color-background);color:var(--aui-color-text);font:inherit}._link_4u8pk_22{color:var(--aui-color-primary);text-decoration:underline;cursor:pointer}._link_4u8pk_22:hover{color:var(--aui-color-primary-hover)}._check-input_4u8pk_32{accent-color:var(--aui-color-primary)}._field-error_4u8pk_36{margin:0;font-size:.875em;color:var(--aui-color-error)}._visually-hidden_4u8pk_42{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._wrapper_1kyv1_1{display:grid;gap:.25em}._textarea_1kyv1_6{resize:vertical}._counter_1kyv1_11{justify-self:end;font-size:.875em;color:var(--aui-color-text-muted)}._theme_1x47p_11{display:contents;--aui-color-text: var(--_aui-fg);--aui-color-text-muted: color-mix(in oklch, var(--_aui-fg) 82%, var(--_aui-bg));--aui-color-background: var(--_aui-bg);--aui-color-background-hover: color-mix(in oklch, var(--_aui-bg) 92%, var(--_aui-fg));--aui-color-surface: color-mix(in oklch, var(--_aui-bg) 97%, var(--_aui-fg));--aui-color-border: color-mix(in oklch, var(--_aui-bg) 50%, var(--_aui-fg));--aui-color-primary: var(--aui-base-primary);--aui-color-primary-hover: color-mix(in oklch, var(--aui-base-primary) 85%, var(--_aui-fg));--aui-color-focus-ring: var(--aui-base-primary);--aui-color-error: var(--aui-base-error);--aui-color-success: var(--aui-base-success)}
@@ -1,545 +1,642 @@
1
- import { jsx as r, jsxs as b, Fragment as W } from "preact/jsx-runtime";
2
- import { useId as f } from "preact/hooks";
3
- import { signal as j, useSignal as x, effect as M } from "@preact/signals";
4
- function m(...t) {
1
+ import { jsx as l, jsxs as m, Fragment as V } from "preact/jsx-runtime";
2
+ import { useId as v } from "preact/hooks";
3
+ import { signal as A, useSignal as $, effect as J } from "@preact/signals";
4
+ import { h as T, toChildArray as Q } from "preact";
5
+ function b(...t) {
5
6
  return t.filter(Boolean).join(" ");
6
7
  }
7
8
  function g(...t) {
8
9
  return t.filter(Boolean).join(" ") || void 0;
9
10
  }
10
- const V = "_button_4gn7y_1 _focus-ring_4u8pk_3 _disabled_4u8pk_8", J = {
11
- button: V
12
- }, D = (t) => {
13
- const { label: e, onClick: n, type: s = "button", disabled: l, class: c } = t;
14
- return /* @__PURE__ */ r("button", { type: s, class: m(J.button, c), onClick: n, disabled: l, children: e });
15
- }, K = "_card_awzw5_1", Q = {
16
- card: K
17
- }, Ye = (t) => {
18
- const { children: e, class: n } = t;
19
- return /* @__PURE__ */ r("div", { class: m(Q.card, n), children: e });
20
- }, X = "_field_17xwz_1", Y = "_input_17xwz_8 _check-input_4u8pk_32 _focus-ring_4u8pk_3 _disabled_4u8pk_8", Z = "_error_17xwz_12 _field-error_4u8pk_36", q = {
21
- field: X,
22
- input: Y,
23
- error: Z
24
- }, Ze = (t) => {
25
- const { label: e, name: n, checked: s, required: l, disabled: c, error: a, onChange: d, class: i } = t, h = f(), p = `${h}-error`;
26
- return /* @__PURE__ */ b("div", { class: m(q.field, i), children: [
27
- /* @__PURE__ */ r(
11
+ const X = "_button_4gn7y_1 _focus-ring_4u8pk_3 _disabled_4u8pk_8", Y = {
12
+ button: X
13
+ }, O = (t) => {
14
+ const { label: e, onClick: s, type: n = "button", disabled: r, class: o } = t;
15
+ return /* @__PURE__ */ l("button", { type: n, class: b(Y.button, o), onClick: s, disabled: r, children: e });
16
+ }, ee = "_card_awzw5_1", te = {
17
+ card: ee
18
+ }, ut = (t) => {
19
+ const { children: e, class: s } = t;
20
+ return /* @__PURE__ */ l("div", { class: b(te.card, s), children: e });
21
+ }, se = "_field_17xwz_1", ne = "_input_17xwz_8 _check-input_4u8pk_32 _focus-ring_4u8pk_3 _disabled_4u8pk_8", re = "_error_17xwz_12 _field-error_4u8pk_36", L = {
22
+ field: se,
23
+ input: ne,
24
+ error: re
25
+ }, _t = (t) => {
26
+ const { label: e, name: s, checked: n, required: r, disabled: o, error: a, onChange: c, class: i } = t, p = v(), h = `${p}-error`;
27
+ return /* @__PURE__ */ m("div", { class: b(L.field, i), children: [
28
+ /* @__PURE__ */ l(
28
29
  "input",
29
30
  {
30
- id: h,
31
- class: q.input,
31
+ id: p,
32
+ class: L.input,
32
33
  type: "checkbox",
33
- name: n,
34
- checked: s,
35
- required: l,
36
- disabled: c,
34
+ name: s,
35
+ checked: n,
36
+ required: r,
37
+ disabled: o,
37
38
  "aria-invalid": !!a || void 0,
38
- "aria-describedby": g(a && p),
39
- onChange: d && ((u) => d(u.target.checked))
39
+ "aria-describedby": g(a && h),
40
+ onChange: c && ((u) => c(u.target.checked))
40
41
  }
41
42
  ),
42
- /* @__PURE__ */ r("label", { for: h, children: e }),
43
- a && /* @__PURE__ */ r("p", { id: p, class: q.error, role: "alert", children: a })
43
+ /* @__PURE__ */ l("label", { for: p, children: e }),
44
+ a && /* @__PURE__ */ l("p", { id: h, class: L.error, role: "alert", children: a })
44
45
  ] });
45
- }, ee = "_link_7wgic_1 _link_4u8pk_22 _focus-ring_4u8pk_3", te = {
46
- link: ee
47
- }, et = (t) => {
48
- const { href: e, fileName: n, label: s, class: l } = t;
49
- return /* @__PURE__ */ r("a", { href: e, download: n, class: m(te.link, l), children: s });
50
- }, ne = "_form_jr324_1", se = "_actions_jr324_6", le = "_status_jr324_13", L = {
51
- form: ne,
52
- actions: se,
53
- status: le
54
- }, tt = (t) => {
46
+ }, le = "_link_7wgic_1 _link_4u8pk_22 _focus-ring_4u8pk_3", ae = {
47
+ link: le
48
+ }, pt = (t) => {
49
+ const { href: e, fileName: s, label: n, class: r } = t;
50
+ return /* @__PURE__ */ l("a", { href: e, download: s, class: b(ae.link, r), children: n });
51
+ }, oe = "_form_jr324_1", ce = "_actions_jr324_6", ie = "_status_jr324_13", j = {
52
+ form: oe,
53
+ actions: ce,
54
+ status: ie
55
+ }, ht = (t) => {
55
56
  const {
56
57
  onSubmit: e,
57
- submitLabel: n = "Submit",
58
- resetLabel: s,
59
- status: l,
60
- children: c,
58
+ submitLabel: s = "Submit",
59
+ resetLabel: n,
60
+ status: r,
61
+ children: o,
61
62
  class: a
62
63
  } = t;
63
- return /* @__PURE__ */ b(
64
+ return /* @__PURE__ */ m(
64
65
  "form",
65
66
  {
66
- class: m(L.form, a),
67
- onSubmit: (d) => {
68
- d.preventDefault();
69
- const i = new FormData(d.currentTarget);
67
+ class: b(j.form, a),
68
+ onSubmit: (c) => {
69
+ c.preventDefault();
70
+ const i = new FormData(c.currentTarget);
70
71
  e(i);
71
72
  },
72
73
  children: [
73
- c,
74
- /* @__PURE__ */ b("div", { class: L.actions, children: [
75
- /* @__PURE__ */ r(D, { type: "submit", label: n }),
76
- s && /* @__PURE__ */ r(D, { type: "reset", label: s })
74
+ o,
75
+ /* @__PURE__ */ m("div", { class: j.actions, children: [
76
+ /* @__PURE__ */ l(O, { type: "submit", label: s }),
77
+ n && /* @__PURE__ */ l(O, { type: "reset", label: n })
77
78
  ] }),
78
- l && /* @__PURE__ */ r("output", { class: L.status, children: l })
79
+ r && /* @__PURE__ */ l("output", { class: j.status, children: r })
79
80
  ]
80
81
  }
81
82
  );
82
- }, re = "_field_7l9ux_1", ae = "_label_7l9ux_8", ce = "_required_7l9ux_12", oe = "_error_7l9ux_16 _field-error_4u8pk_36", S = {
83
- field: re,
84
- label: ae,
85
- required: ce,
86
- error: oe
87
- }, w = (t) => {
88
- const { for: e, label: n, required: s, error: l, errorId: c, children: a, class: d } = t;
89
- return /* @__PURE__ */ b("div", { class: m(S.field, d), children: [
90
- /* @__PURE__ */ b("label", { class: S.label, for: e, children: [
91
- n,
83
+ }, de = "_field_7l9ux_1", ue = "_label_7l9ux_8", _e = "_required_7l9ux_12", pe = "_error_7l9ux_16 _field-error_4u8pk_36", S = {
84
+ field: de,
85
+ label: ue,
86
+ required: _e,
87
+ error: pe
88
+ }, x = (t) => {
89
+ const { for: e, label: s, required: n, error: r, errorId: o, children: a, class: c } = t;
90
+ return /* @__PURE__ */ m("div", { class: b(S.field, c), children: [
91
+ /* @__PURE__ */ m("label", { class: S.label, for: e, children: [
92
+ s,
92
93
  ":",
93
- s && /* @__PURE__ */ b("span", { class: S.required, "aria-hidden": "true", children: [
94
+ n && /* @__PURE__ */ m("span", { class: S.required, "aria-hidden": "true", children: [
94
95
  " ",
95
96
  "*"
96
97
  ] })
97
98
  ] }),
98
99
  a,
99
- l && /* @__PURE__ */ r("p", { id: c, class: S.error, role: "alert", children: l })
100
+ r && /* @__PURE__ */ l("p", { id: o, class: S.error, role: "alert", children: r })
100
101
  ] });
101
- }, ie = "_input_1j10x_1 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", de = {
102
- input: ie
103
- }, ue = {
102
+ }, he = "_input_1j10x_1 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", me = {
103
+ input: he
104
+ }, be = {
104
105
  email: "email",
105
106
  tel: "tel",
106
107
  url: "url"
107
- }, nt = (t) => {
108
+ }, mt = (t) => {
108
109
  const {
109
110
  label: e,
110
- name: n,
111
- type: s = "text",
112
- value: l,
113
- placeholder: c,
111
+ name: s,
112
+ type: n = "text",
113
+ value: r,
114
+ placeholder: o,
114
115
  maxLength: a,
115
- autocomplete: d,
116
+ autocomplete: c,
116
117
  readOnly: i,
117
- pattern: h,
118
- required: p,
118
+ pattern: p,
119
+ required: h,
119
120
  disabled: u,
120
121
  error: _,
121
- onInput: o,
122
- class: v
123
- } = t, k = f(), y = `${k}-error`;
124
- return /* @__PURE__ */ r(
125
- w,
122
+ onInput: d,
123
+ class: f
124
+ } = t, k = v(), y = `${k}-error`;
125
+ return /* @__PURE__ */ l(
126
+ x,
126
127
  {
127
128
  label: e,
128
129
  for: k,
129
- required: p,
130
+ required: h,
130
131
  error: _,
131
132
  errorId: y,
132
- class: v,
133
- children: /* @__PURE__ */ r(
133
+ class: f,
134
+ children: /* @__PURE__ */ l(
134
135
  "input",
135
136
  {
136
137
  id: k,
137
- class: de.input,
138
- type: s,
139
- name: n,
140
- value: l,
141
- placeholder: c,
138
+ class: me.input,
139
+ type: n,
140
+ name: s,
141
+ value: r,
142
+ placeholder: o,
142
143
  maxLength: a,
143
- autoComplete: d ?? ue[s],
144
+ autoComplete: c ?? be[n],
144
145
  readOnly: i,
145
- pattern: h,
146
- required: p,
146
+ pattern: p,
147
+ required: h,
147
148
  disabled: u,
148
149
  "aria-invalid": !!_ || void 0,
149
150
  "aria-describedby": g(_ && y),
150
- onInput: o && ((I) => o(I.target.value))
151
+ onInput: d && ((C) => d(C.target.value))
151
152
  }
152
153
  )
153
154
  }
154
155
  );
155
- }, P = j(window.location.pathname), A = j(window.location.hash.slice(1));
156
- function _e(t) {
156
+ }, P = A(window.location.pathname), G = A(window.location.hash.slice(1));
157
+ function fe(t) {
157
158
  const e = t.indexOf("#");
158
- let n = "", s = t;
159
- e >= 0 && (n = t.slice(e + 1), s = t.slice(0, e));
160
- const l = s.indexOf("?");
161
- let c = "", a = s;
162
- return l >= 0 && (c = s.slice(l), a = s.slice(0, l)), { pathname: a || "/", search: c, hash: n };
159
+ let s = "", n = t;
160
+ e >= 0 && (s = t.slice(e + 1), n = t.slice(0, e));
161
+ const r = n.indexOf("?");
162
+ let o = "", a = n;
163
+ return r >= 0 && (o = n.slice(r), a = n.slice(0, r)), { pathname: a || "/", search: o, hash: s };
163
164
  }
164
- function pe(t, e) {
165
- const { pathname: n, search: s, hash: l } = _e(t), c = n + s + (l ? `#${l}` : "");
166
- e?.replace ? history.replaceState(null, "", c) : history.pushState(null, "", c), P.value = n, A.value = l;
165
+ function ve(t, e) {
166
+ const { pathname: s, search: n, hash: r } = fe(t), o = s + n + (r ? `#${r}` : "");
167
+ e?.replace ? history.replaceState(null, "", o) : history.pushState(null, "", o), P.value = s, G.value = r;
167
168
  }
168
169
  window.addEventListener("popstate", () => {
169
- P.value = window.location.pathname, A.value = window.location.hash.slice(1);
170
+ P.value = window.location.pathname, G.value = window.location.hash.slice(1);
170
171
  });
171
- const he = "_link_7wgic_1 _link_4u8pk_22 _focus-ring_4u8pk_3", F = {
172
- link: he
172
+ const ke = "_link_7wgic_1 _link_4u8pk_22 _focus-ring_4u8pk_3", H = {
173
+ link: ke
173
174
  };
174
- function be(t) {
175
+ function ge(t) {
175
176
  try {
176
177
  return new URL(t, window.location.href).origin !== window.location.origin;
177
178
  } catch {
178
179
  return !1;
179
180
  }
180
181
  }
181
- const st = (t) => {
182
- const { href: e, children: n, external: s, class: l } = t;
183
- return s ?? be(e) ? /* @__PURE__ */ r("a", { href: e, class: m(F.link, l), rel: "noopener noreferrer", children: n }) : /* @__PURE__ */ r(
182
+ const bt = (t) => {
183
+ const { href: e, children: s, external: n, class: r } = t;
184
+ return n ?? ge(e) ? /* @__PURE__ */ l("a", { href: e, class: b(H.link, r), rel: "noopener noreferrer", children: s }) : /* @__PURE__ */ l(
184
185
  "a",
185
186
  {
186
187
  href: e,
187
- class: m(F.link, l),
188
+ class: b(H.link, r),
188
189
  onClick: (a) => {
189
- a.preventDefault(), pe(e);
190
+ a.preventDefault(), ve(e);
190
191
  },
191
- children: n
192
+ children: s
192
193
  }
193
194
  );
194
- }, me = "_nav_778nl_1", ve = "_title_778nl_6", O = {
195
- nav: me,
196
- title: ve
197
- }, lt = (t) => {
198
- const { title: e, children: n, class: s } = t, l = f();
199
- return /* @__PURE__ */ b("nav", { class: m(O.nav, s), "aria-labelledby": e ? l : void 0, children: [
200
- e && /* @__PURE__ */ r("h2", { id: l, class: O.title, children: e }),
201
- n
195
+ }, ye = "_nav_778nl_1", we = "_title_778nl_6", D = {
196
+ nav: ye,
197
+ title: we
198
+ }, ft = (t) => {
199
+ const { title: e, children: s, class: n } = t, r = v();
200
+ return /* @__PURE__ */ m("nav", { class: b(D.nav, n), "aria-labelledby": e ? r : void 0, children: [
201
+ e && /* @__PURE__ */ l("h2", { id: r, class: D.title, children: e }),
202
+ s
202
203
  ] });
203
- }, fe = "_input_1j10x_1 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", ke = {
204
- input: fe
205
- }, rt = (t) => {
204
+ }, $e = "_input_1j10x_1 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", xe = {
205
+ input: $e
206
+ }, vt = (t) => {
206
207
  const {
207
208
  label: e,
208
- name: n,
209
- min: s,
210
- max: l,
211
- step: c,
209
+ name: s,
210
+ min: n,
211
+ max: r,
212
+ step: o,
212
213
  value: a,
213
- placeholder: d,
214
+ placeholder: c,
214
215
  required: i,
215
- disabled: h,
216
- error: p,
216
+ disabled: p,
217
+ error: h,
217
218
  onInput: u,
218
219
  class: _
219
- } = t, o = f(), v = `${o}-error`;
220
- return /* @__PURE__ */ r(
221
- w,
220
+ } = t, d = v(), f = `${d}-error`;
221
+ return /* @__PURE__ */ l(
222
+ x,
222
223
  {
223
224
  label: e,
224
- for: o,
225
+ for: d,
225
226
  required: i,
226
- error: p,
227
- errorId: v,
227
+ error: h,
228
+ errorId: f,
228
229
  class: _,
229
- children: /* @__PURE__ */ r(
230
+ children: /* @__PURE__ */ l(
230
231
  "input",
231
232
  {
232
- id: o,
233
- class: ke.input,
233
+ id: d,
234
+ class: xe.input,
234
235
  type: "number",
235
- name: n,
236
- min: s,
237
- max: l,
238
- step: c,
236
+ name: s,
237
+ min: n,
238
+ max: r,
239
+ step: o,
239
240
  value: a,
240
- placeholder: d,
241
+ placeholder: c,
241
242
  required: i,
242
- disabled: h,
243
- "aria-invalid": !!p || void 0,
244
- "aria-describedby": g(p && v),
243
+ disabled: p,
244
+ "aria-invalid": !!h || void 0,
245
+ "aria-describedby": g(h && f),
245
246
  onInput: u && ((k) => u(k.target.valueAsNumber))
246
247
  }
247
248
  )
248
249
  }
249
250
  );
250
- }, ge = "_wrapper_1mu6v_1", ye = "_input_1mu6v_6 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", $e = "_toggle_1mu6v_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", T = {
251
- wrapper: ge,
252
- input: ye,
253
- toggle: $e
254
- }, xe = {
251
+ }, Ce = "_wrapper_16zfv_1", Ie = "_input_16zfv_5 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", Ne = "_toggle_16zfv_11 _focus-ring_4u8pk_3 _disabled_4u8pk_8", q = {
252
+ wrapper: Ce,
253
+ input: Ie,
254
+ toggle: Ne
255
+ };
256
+ const Se = (...t) => t.filter((e, s, n) => !!e && e.trim() !== "" && n.indexOf(e) === s).join(" ").trim();
257
+ const F = (t) => t.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
258
+ const Le = (t) => t.replace(
259
+ /^([A-Z])|[\s-_]+(\w)/g,
260
+ (e, s, n) => n ? n.toUpperCase() : s.toLowerCase()
261
+ );
262
+ const R = (t) => {
263
+ const e = Le(t);
264
+ return e.charAt(0).toUpperCase() + e.slice(1);
265
+ };
266
+ var je = {
267
+ xmlns: "http://www.w3.org/2000/svg",
268
+ width: 24,
269
+ height: 24,
270
+ viewBox: "0 0 24 24",
271
+ fill: "none",
272
+ stroke: "currentColor",
273
+ "stroke-width": "2",
274
+ "stroke-linecap": "round",
275
+ "stroke-linejoin": "round"
276
+ };
277
+ const qe = (t) => {
278
+ for (const e in t)
279
+ if (e.startsWith("aria-") || e === "role" || e === "title")
280
+ return !0;
281
+ return !1;
282
+ };
283
+ const Ee = ({
284
+ color: t = "currentColor",
285
+ size: e = 24,
286
+ strokeWidth: s = 2,
287
+ absoluteStrokeWidth: n,
288
+ children: r,
289
+ iconNode: o,
290
+ class: a = "",
291
+ ...c
292
+ }) => T(
293
+ "svg",
294
+ {
295
+ ...je,
296
+ width: String(e),
297
+ height: e,
298
+ stroke: t,
299
+ "stroke-width": n ? Number(s) * 24 / Number(e) : s,
300
+ class: ["lucide", a].join(" "),
301
+ ...!r && !qe(c) && { "aria-hidden": "true" },
302
+ ...c
303
+ },
304
+ [...o.map(([i, p]) => T(i, p)), ...Q(r)]
305
+ );
306
+ const W = (t, e) => {
307
+ const s = ({ class: n = "", className: r = "", children: o, ...a }) => T(
308
+ Ee,
309
+ {
310
+ ...a,
311
+ iconNode: e,
312
+ class: Se(
313
+ `lucide-${F(R(t))}`,
314
+ `lucide-${F(t)}`,
315
+ n,
316
+ r
317
+ )
318
+ },
319
+ o
320
+ );
321
+ return s.displayName = R(t), s;
322
+ };
323
+ const Te = W("eye-off", [
324
+ [
325
+ "path",
326
+ {
327
+ d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
328
+ key: "ct8e1f"
329
+ }
330
+ ],
331
+ ["path", { d: "M14.084 14.158a3 3 0 0 1-4.242-4.242", key: "151rxh" }],
332
+ [
333
+ "path",
334
+ {
335
+ d: "M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",
336
+ key: "13bj9a"
337
+ }
338
+ ],
339
+ ["path", { d: "m2 2 20 20", key: "1ooewy" }]
340
+ ]);
341
+ const Ae = W("eye", [
342
+ [
343
+ "path",
344
+ {
345
+ d: "M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",
346
+ key: "1nclc0"
347
+ }
348
+ ],
349
+ ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
350
+ ]), Pe = {
255
351
  current: "current-password",
256
352
  new: "new-password"
257
- }, at = (t) => {
353
+ }, kt = (t) => {
258
354
  const {
259
355
  label: e,
260
- name: n,
261
- purpose: s,
262
- value: l,
263
- placeholder: c,
356
+ name: s,
357
+ purpose: n,
358
+ value: r,
359
+ placeholder: o,
264
360
  required: a,
265
- disabled: d,
361
+ disabled: c,
266
362
  error: i,
267
- onInput: h,
268
- class: p
269
- } = t, u = f(), _ = `${u}-error`, o = x(!1);
270
- return /* @__PURE__ */ r(
271
- w,
363
+ onInput: p,
364
+ class: h
365
+ } = t, u = v(), _ = `${u}-error`, d = $(!1);
366
+ return /* @__PURE__ */ l(
367
+ x,
272
368
  {
273
369
  label: e,
274
370
  for: u,
275
371
  required: a,
276
372
  error: i,
277
373
  errorId: _,
278
- class: p,
279
- children: /* @__PURE__ */ b("div", { class: T.wrapper, children: [
280
- /* @__PURE__ */ r(
374
+ class: h,
375
+ children: /* @__PURE__ */ m("div", { class: q.wrapper, children: [
376
+ /* @__PURE__ */ l(
281
377
  "input",
282
378
  {
283
379
  id: u,
284
- class: T.input,
285
- type: o.value ? "text" : "password",
286
- name: n,
287
- value: l,
288
- placeholder: c,
289
- autoComplete: xe[s],
380
+ class: q.input,
381
+ type: d.value ? "text" : "password",
382
+ name: s,
383
+ value: r,
384
+ placeholder: o,
385
+ autoComplete: Pe[n],
290
386
  required: a,
291
- disabled: d,
387
+ disabled: c,
292
388
  "aria-invalid": !!i || void 0,
293
389
  "aria-describedby": g(i && _),
294
- onInput: h && ((v) => h(v.target.value))
390
+ onInput: p && ((f) => p(f.target.value))
295
391
  }
296
392
  ),
297
- /* @__PURE__ */ r(
393
+ /* @__PURE__ */ l(
298
394
  "button",
299
395
  {
300
396
  type: "button",
301
- class: T.toggle,
302
- disabled: d,
397
+ class: q.toggle,
398
+ disabled: c,
399
+ "aria-label": d.value ? "Hide password" : "Show password",
303
400
  onClick: () => {
304
- o.value = !o.value;
401
+ d.value = !d.value;
305
402
  },
306
- children: o.value ? "Hide password" : "Show password"
403
+ children: d.value ? /* @__PURE__ */ l(Te, { size: "1em" }) : /* @__PURE__ */ l(Ae, { size: "1em" })
307
404
  }
308
405
  )
309
406
  ] })
310
407
  }
311
408
  );
312
- }, we = "_fieldset_lymkd_1", Ie = "_legend_lymkd_6", Ne = "_option_lymkd_11", Ce = "_input_lymkd_19 _check-input_4u8pk_32 _focus-ring_4u8pk_3", Se = "_error_lymkd_23 _field-error_4u8pk_36", $ = {
313
- fieldset: we,
314
- legend: Ie,
315
- option: Ne,
316
- input: Ce,
317
- error: Se
318
- }, ct = (t) => {
409
+ }, ze = "_fieldset_lymkd_1", Be = "_legend_lymkd_6", Oe = "_option_lymkd_11", He = "_input_lymkd_19 _check-input_4u8pk_32 _focus-ring_4u8pk_3", De = "_error_lymkd_23 _field-error_4u8pk_36", w = {
410
+ fieldset: ze,
411
+ legend: Be,
412
+ option: Oe,
413
+ input: He,
414
+ error: De
415
+ }, gt = (t) => {
319
416
  const {
320
417
  legend: e,
321
- name: n,
322
- options: s,
323
- value: l,
324
- required: c,
418
+ name: s,
419
+ options: n,
420
+ value: r,
421
+ required: o,
325
422
  disabled: a,
326
- error: d,
423
+ error: c,
327
424
  onChange: i,
328
- class: h
329
- } = t, p = f(), u = `${p}-error`;
330
- return /* @__PURE__ */ b(
425
+ class: p
426
+ } = t, h = v(), u = `${h}-error`;
427
+ return /* @__PURE__ */ m(
331
428
  "fieldset",
332
429
  {
333
- class: m($.fieldset, h),
334
- "aria-invalid": !!d || void 0,
335
- "aria-describedby": g(d && u),
430
+ class: b(w.fieldset, p),
431
+ "aria-invalid": !!c || void 0,
432
+ "aria-describedby": g(c && u),
336
433
  children: [
337
- /* @__PURE__ */ r("legend", { class: $.legend, children: e }),
338
- s.map((_) => {
339
- const o = `${p}-${_.value}`;
340
- return /* @__PURE__ */ b("div", { class: $.option, children: [
341
- /* @__PURE__ */ r(
434
+ /* @__PURE__ */ l("legend", { class: w.legend, children: e }),
435
+ n.map((_) => {
436
+ const d = `${h}-${_.value}`;
437
+ return /* @__PURE__ */ m("div", { class: w.option, children: [
438
+ /* @__PURE__ */ l(
342
439
  "input",
343
440
  {
344
- id: o,
345
- class: $.input,
441
+ id: d,
442
+ class: w.input,
346
443
  type: "radio",
347
- name: n,
444
+ name: s,
348
445
  value: _.value,
349
- checked: l === _.value,
350
- required: c,
446
+ checked: r === _.value,
447
+ required: o,
351
448
  disabled: a,
352
449
  onChange: i && (() => i(_.value))
353
450
  }
354
451
  ),
355
- /* @__PURE__ */ r("label", { for: o, children: _.label })
452
+ /* @__PURE__ */ l("label", { for: d, children: _.label })
356
453
  ] }, _.value);
357
454
  }),
358
- d && /* @__PURE__ */ r("p", { id: u, class: $.error, role: "alert", children: d })
455
+ c && /* @__PURE__ */ l("p", { id: u, class: w.error, role: "alert", children: c })
359
456
  ]
360
457
  }
361
458
  );
362
- }, ot = (t) => {
363
- const { path: e, children: n } = t, s = P.value;
459
+ }, yt = (t) => {
460
+ const { path: e, children: s } = t, n = P.value;
364
461
  if (e.endsWith("/*")) {
365
- const l = e.slice(0, -1);
366
- if (!s.startsWith(l) && s !== l.slice(0, -1))
462
+ const r = e.slice(0, -1);
463
+ if (!n.startsWith(r) && n !== r.slice(0, -1))
367
464
  return null;
368
- } else if (s !== e)
465
+ } else if (n !== e)
369
466
  return null;
370
- return /* @__PURE__ */ r(W, { children: n });
371
- }, qe = "_section_4nogy_1", Le = {
372
- section: qe
373
- }, it = (t) => {
374
- const { title: e, level: n = 2, children: s, class: l } = t, c = f(), a = `h${n}`;
375
- return /* @__PURE__ */ b("section", { class: m(Le.section, l), "aria-labelledby": c, children: [
376
- /* @__PURE__ */ r(a, { id: c, children: e }),
377
- s
467
+ return /* @__PURE__ */ l(V, { children: s });
468
+ }, Fe = "_section_4nogy_1", Re = {
469
+ section: Fe
470
+ }, wt = (t) => {
471
+ const { title: e, level: s = 2, children: n, class: r } = t, o = v(), a = `h${s}`;
472
+ return /* @__PURE__ */ m("section", { class: b(Re.section, r), "aria-labelledby": o, children: [
473
+ /* @__PURE__ */ l(a, { id: o, children: e }),
474
+ n
378
475
  ] });
379
- }, Te = "_select_1cxnx_1 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", Ee = {
380
- select: Te
381
- }, je = (t) => "options" in t, dt = (t) => {
476
+ }, Me = "_select_1cxnx_1 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", Ue = {
477
+ select: Me
478
+ }, Ge = (t) => "options" in t, $t = (t) => {
382
479
  const {
383
480
  label: e,
384
- name: n,
385
- value: s,
386
- placeholder: l,
387
- options: c,
481
+ name: s,
482
+ value: n,
483
+ placeholder: r,
484
+ options: o,
388
485
  required: a,
389
- disabled: d,
486
+ disabled: c,
390
487
  error: i,
391
- onChange: h,
392
- class: p
393
- } = t, u = f(), _ = `${u}-error`;
394
- return /* @__PURE__ */ r(
395
- w,
488
+ onChange: p,
489
+ class: h
490
+ } = t, u = v(), _ = `${u}-error`;
491
+ return /* @__PURE__ */ l(
492
+ x,
396
493
  {
397
494
  label: e,
398
495
  for: u,
399
496
  required: a,
400
497
  error: i,
401
498
  errorId: _,
402
- class: p,
403
- children: /* @__PURE__ */ b(
499
+ class: h,
500
+ children: /* @__PURE__ */ m(
404
501
  "select",
405
502
  {
406
503
  id: u,
407
- class: Ee.select,
408
- name: n,
409
- value: s,
504
+ class: Ue.select,
505
+ name: s,
506
+ value: n,
410
507
  required: a,
411
- disabled: d,
508
+ disabled: c,
412
509
  "aria-invalid": !!i || void 0,
413
510
  "aria-describedby": g(i && _),
414
- onChange: h && ((o) => h(o.target.value)),
511
+ onChange: p && ((d) => p(d.target.value)),
415
512
  children: [
416
- l && /* @__PURE__ */ r("option", { value: "", disabled: !0, children: l }),
417
- c.map(
418
- (o) => je(o) ? /* @__PURE__ */ r("optgroup", { label: o.label, children: o.options.map((v) => /* @__PURE__ */ r("option", { value: v.value, children: v.label }, v.value)) }, o.label) : /* @__PURE__ */ r("option", { value: o.value, children: o.label }, o.value)
513
+ r && /* @__PURE__ */ l("option", { value: "", disabled: !0, children: r }),
514
+ o.map(
515
+ (d) => Ge(d) ? /* @__PURE__ */ l("optgroup", { label: d.label, children: d.options.map((f) => /* @__PURE__ */ l("option", { value: f.value, children: f.label }, f.value)) }, d.label) : /* @__PURE__ */ l("option", { value: d.value, children: d.label }, d.value)
419
516
  )
420
517
  ]
421
518
  }
422
519
  )
423
520
  }
424
521
  );
425
- }, Pe = "_skip_xbsul_1 _focus-ring_4u8pk_3", He = {
426
- skip: Pe
427
- }, ut = (t) => {
428
- const { target: e = "#main", label: n = "Skip to main content", class: s } = t;
429
- return /* @__PURE__ */ r("a", { href: e, class: m(He.skip, s), children: n });
430
- }, Be = "_table_dls60_1", De = "_caption_dls60_6", R = {
431
- table: Be,
432
- caption: De
433
- }, _t = (t) => {
434
- const { caption: e, headers: n, data: s, class: l } = t;
435
- return /* @__PURE__ */ b("table", { class: m(R.table, l), children: [
436
- /* @__PURE__ */ r("caption", { class: R.caption, children: e }),
437
- /* @__PURE__ */ r("thead", { children: /* @__PURE__ */ r("tr", { children: n.map((c, a) => /* @__PURE__ */ r("th", { scope: "col", children: c }, `${c}-${a}`)) }) }),
438
- /* @__PURE__ */ r("tbody", { children: s.map((c, a) => /* @__PURE__ */ r("tr", { children: c.map((d, i) => /* @__PURE__ */ r("td", { children: d }, `${n[i]}-${a}-${i}`)) }, a)) })
522
+ }, We = "_skip_xbsul_1 _focus-ring_4u8pk_3", Ze = {
523
+ skip: We
524
+ }, xt = (t) => {
525
+ const { target: e = "#main", label: s = "Skip to main content", class: n } = t;
526
+ return /* @__PURE__ */ l("a", { href: e, class: b(Ze.skip, n), children: s });
527
+ }, Ke = "_table_dls60_1", Ve = "_caption_dls60_6", M = {
528
+ table: Ke,
529
+ caption: Ve
530
+ }, Ct = (t) => {
531
+ const { caption: e, headers: s, data: n, class: r } = t;
532
+ return /* @__PURE__ */ m("table", { class: b(M.table, r), children: [
533
+ /* @__PURE__ */ l("caption", { class: M.caption, children: e }),
534
+ /* @__PURE__ */ l("thead", { children: /* @__PURE__ */ l("tr", { children: s.map((o, a) => /* @__PURE__ */ l("th", { scope: "col", children: o }, `${o}-${a}`)) }) }),
535
+ /* @__PURE__ */ l("tbody", { children: n.map((o, a) => /* @__PURE__ */ l("tr", { children: o.map((c, i) => /* @__PURE__ */ l("td", { children: c }, `${s[i]}-${a}-${i}`)) }, a)) })
439
536
  ] });
440
- }, Fe = "_hidden_19nib_1 _visually-hidden_4u8pk_42", Oe = {
441
- hidden: Fe
442
- }, Re = (t) => {
537
+ }, Je = "_hidden_19nib_1 _visually-hidden_4u8pk_42", Qe = {
538
+ hidden: Je
539
+ }, Xe = (t) => {
443
540
  const { children: e } = t;
444
- return /* @__PURE__ */ r("span", { class: Oe.hidden, children: e });
445
- }, ze = "_wrapper_1kyv1_1", Ae = "_textarea_1kyv1_6 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", Ue = "_counter_1kyv1_11", E = {
446
- wrapper: ze,
447
- textarea: Ae,
448
- counter: Ue
449
- }, z = [75, 90, 100], Ge = 10;
450
- function We(t) {
451
- for (let e = z.length - 1; e >= 0; e--) {
452
- const n = z[e];
453
- if (n !== void 0 && t >= n)
454
- return n;
541
+ return /* @__PURE__ */ l("span", { class: Qe.hidden, children: e });
542
+ }, Ye = "_wrapper_1kyv1_1", et = "_textarea_1kyv1_6 _text-input_4u8pk_13 _focus-ring_4u8pk_3 _disabled_4u8pk_8", tt = "_counter_1kyv1_11", E = {
543
+ wrapper: Ye,
544
+ textarea: et,
545
+ counter: tt
546
+ }, U = [75, 90, 100], st = 10;
547
+ function nt(t) {
548
+ for (let e = U.length - 1; e >= 0; e--) {
549
+ const s = U[e];
550
+ if (s !== void 0 && t >= s)
551
+ return s;
455
552
  }
456
553
  return 0;
457
554
  }
458
- const pt = (t) => {
555
+ const It = (t) => {
459
556
  const {
460
557
  label: e,
461
- name: n,
462
- maxChars: s,
463
- value: l,
464
- placeholder: c,
558
+ name: s,
559
+ maxChars: n,
560
+ value: r,
561
+ placeholder: o,
465
562
  required: a,
466
- disabled: d,
563
+ disabled: c,
467
564
  error: i,
468
- onInput: h,
469
- class: p
470
- } = t, u = f(), _ = `${u}-error`, o = `${u}-counter`, v = x(l?.length ?? 0), k = x(""), y = x(0), I = x(!1);
471
- return /* @__PURE__ */ r(
472
- w,
565
+ onInput: p,
566
+ class: h
567
+ } = t, u = v(), _ = `${u}-error`, d = `${u}-counter`, f = $(r?.length ?? 0), k = $(""), y = $(0), C = $(!1);
568
+ return /* @__PURE__ */ l(
569
+ x,
473
570
  {
474
571
  label: e,
475
572
  for: u,
476
573
  required: a,
477
574
  error: i,
478
575
  errorId: _,
479
- class: p,
480
- children: /* @__PURE__ */ b("div", { class: E.wrapper, children: [
481
- /* @__PURE__ */ r(
576
+ class: h,
577
+ children: /* @__PURE__ */ m("div", { class: E.wrapper, children: [
578
+ /* @__PURE__ */ l(
482
579
  "textarea",
483
580
  {
484
581
  id: u,
485
582
  class: E.textarea,
486
- name: n,
487
- maxLength: s,
488
- placeholder: c,
583
+ name: s,
584
+ maxLength: n,
585
+ placeholder: o,
489
586
  required: a,
490
- disabled: d,
587
+ disabled: c,
491
588
  "aria-invalid": !!i || void 0,
492
- "aria-describedby": g(i && _, o),
493
- onInput: (U) => {
494
- const N = U.target.value;
495
- v.value = N.length;
496
- const C = s - N.length, G = N.length / s * 100, H = We(G), B = !I.value && C <= Ge && C > 0;
497
- (H > y.value || B) && (k.value = `${C} character${C === 1 ? "" : "s"} remaining`, y.value = H, B && (I.value = !0)), h?.(N);
589
+ "aria-describedby": g(i && _, d),
590
+ onInput: (Z) => {
591
+ const I = Z.target.value;
592
+ f.value = I.length;
593
+ const N = n - I.length, K = I.length / n * 100, z = nt(K), B = !C.value && N <= st && N > 0;
594
+ (z > y.value || B) && (k.value = `${N} character${N === 1 ? "" : "s"} remaining`, y.value = z, B && (C.value = !0)), p?.(I);
498
595
  },
499
- children: l
596
+ children: r
500
597
  }
501
598
  ),
502
- /* @__PURE__ */ b("span", { id: o, class: E.counter, children: [
503
- v,
599
+ /* @__PURE__ */ m("span", { id: d, class: E.counter, children: [
600
+ f,
504
601
  " / ",
505
- s
602
+ n
506
603
  ] }),
507
- /* @__PURE__ */ r(Re, { children: /* @__PURE__ */ r("span", { "aria-live": "polite", children: k }) })
604
+ /* @__PURE__ */ l(Xe, { children: /* @__PURE__ */ l("span", { "aria-live": "polite", children: k }) })
508
605
  ] })
509
606
  }
510
607
  );
511
- }, Me = "_theme_1x47p_11", Ve = {
512
- theme: Me
513
- }, ht = (t) => {
514
- const { children: e, class: n } = t;
515
- return /* @__PURE__ */ r("div", { class: m(Ve.theme, n), children: e });
516
- }, Je = j(document.title);
517
- M(() => {
518
- document.title = Je.value;
608
+ }, rt = "_theme_1x47p_11", lt = {
609
+ theme: rt
610
+ }, Nt = (t) => {
611
+ const { children: e, class: s } = t;
612
+ return /* @__PURE__ */ l("div", { class: b(lt.theme, s), children: e });
613
+ }, at = A(document.title);
614
+ J(() => {
615
+ document.title = at.value;
519
616
  });
520
617
  export {
521
- D as Button,
522
- Ye as Card,
523
- Ze as Checkbox,
524
- et as DownloadLink,
525
- tt as Form,
526
- nt as Input,
527
- st as Link,
528
- lt as Nav,
529
- rt as NumberInput,
530
- at as PasswordInput,
531
- ct as RadioGroup,
532
- ot as Route,
533
- it as Section,
534
- dt as Select,
535
- ut as SkipLink,
536
- _t as Table,
537
- pt as Textarea,
538
- ht as Theme,
539
- Re as VisuallyHidden,
540
- m as cx,
541
- A as hash,
618
+ O as Button,
619
+ ut as Card,
620
+ _t as Checkbox,
621
+ pt as DownloadLink,
622
+ ht as Form,
623
+ mt as Input,
624
+ bt as Link,
625
+ ft as Nav,
626
+ vt as NumberInput,
627
+ kt as PasswordInput,
628
+ gt as RadioGroup,
629
+ yt as Route,
630
+ wt as Section,
631
+ $t as Select,
632
+ xt as SkipLink,
633
+ Ct as Table,
634
+ It as Textarea,
635
+ Nt as Theme,
636
+ Xe as VisuallyHidden,
637
+ b as cx,
638
+ G as hash,
542
639
  P as location,
543
- pe as navigate,
544
- Je as title
640
+ ve as navigate,
641
+ at as title
545
642
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@auldrant/ui",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "type": "module",
5
5
  "description": "Accessible Preact component library with design tokens and CSS modules",
6
6
  "author": "Colonel Jade",
@@ -37,7 +37,9 @@
37
37
  "files": [
38
38
  "dist",
39
39
  "README.md",
40
- "LICENSE"
40
+ "LICENSE",
41
+ "NOTICES",
42
+ "CHANGELOG.md"
41
43
  ],
42
44
  "sideEffects": [
43
45
  "**/*.css"
@@ -53,7 +55,7 @@
53
55
  "test:watch": "bun test --watch",
54
56
  "typecheck": "tsc --noEmit",
55
57
  "prepublishOnly": "bun run build",
56
- "dev": "vite",
58
+ "dev": "vite --host",
57
59
  "storybook": "storybook dev -p 6006",
58
60
  "build-storybook": "storybook build",
59
61
  "prepare": "test -n \"$CI\" || lefthook install"
@@ -78,5 +80,8 @@
78
80
  "peerDependencies": {
79
81
  "@preact/signals": "^2.8.1",
80
82
  "preact": "^10.28.4"
83
+ },
84
+ "dependencies": {
85
+ "lucide-preact": "^0.575.0"
81
86
  }
82
87
  }