actual-css 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/actual.css +4929 -0
- package/dist/actual.js +3 -0
- package/dist/actual.js.map +31 -0
- package/dist/actual.min.css +1 -0
- package/docs/README.md +26 -0
- package/docs/components.md +860 -0
- package/docs/design-notes/accessibility-decisions.md +32 -0
- package/docs/design-notes/browser-support.md +93 -0
- package/docs/design-notes/cascade-layer.md +52 -0
- package/docs/design-notes/css-anchor.md +33 -0
- package/docs/design-notes/naming.md +37 -0
- package/docs/design-notes/previous-work.md +5 -0
- package/docs/design-notes/references.md +324 -0
- package/docs/forms.md +1265 -0
- package/docs/javascript.md +426 -0
- package/docs/layout.md +480 -0
- package/docs/mental-model.md +73 -0
- package/docs/patterns.md +415 -0
- package/docs/reserved.md +7 -0
- package/docs/tokens.md +455 -0
- package/docs/typography.md +159 -0
- package/docs/ui.md +937 -0
- package/docs/utilities.md +384 -0
- package/llms.txt +17 -0
- package/package.json +101 -0
- package/src/css/actual.css +17 -0
- package/src/css/actual.full.css +2 -0
- package/src/css/actual.layer.css +3 -0
- package/src/css/base.css +70 -0
- package/src/css/components/accordion.css +97 -0
- package/src/css/components/actions.css +21 -0
- package/src/css/components/alert.css +137 -0
- package/src/css/components/avatar.css +199 -0
- package/src/css/components/badge.css +143 -0
- package/src/css/components/breadcrumb.css +56 -0
- package/src/css/components/busy.css +44 -0
- package/src/css/components/button.css +216 -0
- package/src/css/components/card.css +140 -0
- package/src/css/components/drawer.css +122 -0
- package/src/css/components/flyout.css +243 -0
- package/src/css/components/index.css +41 -0
- package/src/css/components/join.css +106 -0
- package/src/css/components/key.css +25 -0
- package/src/css/components/meter.css +81 -0
- package/src/css/components/modal.css +162 -0
- package/src/css/components/navbar.css +98 -0
- package/src/css/components/overline.css +49 -0
- package/src/css/components/pagination.css +30 -0
- package/src/css/components/progress.css +126 -0
- package/src/css/components/scrollspy.css +27 -0
- package/src/css/components/skeleton.css +67 -0
- package/src/css/components/spinner.css +60 -0
- package/src/css/components/status-bar.css +82 -0
- package/src/css/components/surface.css +48 -0
- package/src/css/components/tab.css +128 -0
- package/src/css/components/table.css +64 -0
- package/src/css/components/tooltip.css +107 -0
- package/src/css/dialog-fallback.css +56 -0
- package/src/css/focus.css +13 -0
- package/src/css/forms/choice-card.css +158 -0
- package/src/css/forms/choice.css +196 -0
- package/src/css/forms/control.css +106 -0
- package/src/css/forms/custom-select.css +93 -0
- package/src/css/forms/form-actions.css +43 -0
- package/src/css/forms/form.css +57 -0
- package/src/css/forms/index.css +15 -0
- package/src/css/forms/input-icon.css +36 -0
- package/src/css/forms/native.css +68 -0
- package/src/css/forms/select.css +36 -0
- package/src/css/forms/switch.css +127 -0
- package/src/css/forms/validation.css +63 -0
- package/src/css/grid.css +95 -0
- package/src/css/intents.css +33 -0
- package/src/css/layout.css +80 -0
- package/src/css/optional/index.css +5 -0
- package/src/css/optional/layout-extra.css +55 -0
- package/src/css/optional/scroll-snap.css +51 -0
- package/src/css/optional/scroller.css +51 -0
- package/src/css/optional/typography-fluid.css +48 -0
- package/src/css/optional/utilities-extra.css +289 -0
- package/src/css/print.css +47 -0
- package/src/css/prose.css +187 -0
- package/src/css/reset.css +56 -0
- package/src/css/theme.css +186 -0
- package/src/css/themes/corporate.css +60 -0
- package/src/css/themes/cyberpunk.css +60 -0
- package/src/css/themes/dark.css +32 -0
- package/src/css/themes/dim.css +33 -0
- package/src/css/themes/edge.css +143 -0
- package/src/css/themes/forest.css +65 -0
- package/src/css/themes/gradient.css +97 -0
- package/src/css/themes/index.css +43 -0
- package/src/css/themes/lavender.css +66 -0
- package/src/css/themes/mono.css +60 -0
- package/src/css/themes/neon.css +66 -0
- package/src/css/themes/ocean.css +60 -0
- package/src/css/themes/petrol.css +64 -0
- package/src/css/themes/spruce.css +64 -0
- package/src/css/themes/square.css +68 -0
- package/src/css/themes/sunset.css +66 -0
- package/src/css/tokens.css +122 -0
- package/src/css/utilities.css +162 -0
- package/src/css/variants.css +118 -0
- package/src/js/command.js +165 -0
- package/src/js/context-menu.js +291 -0
- package/src/js/dialog-fallback.js +163 -0
- package/src/js/dialog.js +503 -0
- package/src/js/enhance.js +208 -0
- package/src/js/events.js +22 -0
- package/src/js/filter.js +122 -0
- package/src/js/floating.js +462 -0
- package/src/js/flyout.js +187 -0
- package/src/js/focus.js +35 -0
- package/src/js/index.js +26 -0
- package/src/js/input.js +47 -0
- package/src/js/keys.js +30 -0
- package/src/js/mask.js +184 -0
- package/src/js/menu.js +88 -0
- package/src/js/password.js +98 -0
- package/src/js/scrollspy.js +121 -0
- package/src/js/selectors.js +59 -0
- package/src/js/status.js +158 -0
- package/src/js/surface.js +358 -0
- package/src/js/tab.js +173 -0
- package/src/js/tooltip.js +374 -0
- package/src/js/validation.js +419 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Accessibility decisions
|
|
2
|
+
|
|
3
|
+
## Guarantees
|
|
4
|
+
|
|
5
|
+
Actual CSS makes the accessible path the default where CSS and small runtime enhancers can help.
|
|
6
|
+
|
|
7
|
+
- Visible `:focus-visible` styles on interactive components.
|
|
8
|
+
- Native elements first: `button`, `a`, `details`, `dialog`, form controls.
|
|
9
|
+
- Reduced motion support through shared duration tokens and the reset.
|
|
10
|
+
- Forced-colors support on controls and visual state indicators.
|
|
11
|
+
- DOM tests for enhancer lifecycle, focus, attributes, and keyboard behavior.
|
|
12
|
+
|
|
13
|
+
## Author Responsibilities
|
|
14
|
+
|
|
15
|
+
- Name icon-only buttons.
|
|
16
|
+
- Use the ARIA attributes shown in examples.
|
|
17
|
+
- Keep form errors inline and connected with `aria-describedby`.
|
|
18
|
+
- Do not put critical information only in a transient notification.
|
|
19
|
+
|
|
20
|
+
## Interactive states
|
|
21
|
+
|
|
22
|
+
- Interactive controls must be identifiable at rest, either by their own styling or by clear surrounding context.
|
|
23
|
+
- Interactive states are: rest, hover, active / pressed, focus-visible, disabled, selected / current / expanded (when applicable).
|
|
24
|
+
- Do not rely on hover alone to reveal interactivity.
|
|
25
|
+
- Do not use color alone to communicate state.
|
|
26
|
+
- Use structure, border, background, iconography, and spacing consistently.
|
|
27
|
+
- Select controls stay quieter than text inputs: hover uses a subtle surface change, while focus-visible and open states use a soft ring in normal color modes.
|
|
28
|
+
- Forced-colors keeps strong outlines for select focus/open states, high-contrast option hover/focus states, and a selected checkmark that inherits the option text color unless the option is highlighted.
|
|
29
|
+
- Global Escape handlers only prevent default when Actual has a visible managed surface to close.
|
|
30
|
+
- Prefer explicit `data-filter` values in examples and docs. Empty `data-filter`
|
|
31
|
+
does not infer behavior from `inputmode`: keyboard hints and destructive value
|
|
32
|
+
filtering remain separate contracts.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Browser support strategy
|
|
2
|
+
|
|
3
|
+
## Philosophy
|
|
4
|
+
|
|
5
|
+
Works everywhere, works best on modern browsers. Wide browser support (even older browsers, not IE 11).
|
|
6
|
+
|
|
7
|
+
- No compile or build step (just CSS).
|
|
8
|
+
- No post-processing — use only necessary browser-specific prefixes and engine hooks.
|
|
9
|
+
- CSS nesting is not used — code must be findable in the inspector. Rules are organized as if nesting were used, grouped together without nesting syntax. Exception: see [CSS nesting inside @supports](#css-nesting-inside-supports).
|
|
10
|
+
|
|
11
|
+
## Baseline
|
|
12
|
+
|
|
13
|
+
| Feature area | Baseline | Progressive enhancement |
|
|
14
|
+
|------------------|-------------|-------------------------------|
|
|
15
|
+
| Layout (flex, grid, position) | Baseline 2023 | — |
|
|
16
|
+
| CSS custom properties | Baseline 2023 | — |
|
|
17
|
+
| `:has()` | Baseline 2023 | — |
|
|
18
|
+
| `<dialog>` element | Baseline 2023 | Below that: rudimentary shim (`dialog-fallback.js` + `dialog-fallback.css`, both standalone and omittable in custom builds), no top layer or focus trap |
|
|
19
|
+
| `color-mix()` | Baseline 2023 | Fallback flat color |
|
|
20
|
+
| `light-dark()` | 2024+ | Manual theme override |
|
|
21
|
+
| `:user-invalid` | 2024+ | `[aria-invalid]` attribute |
|
|
22
|
+
| `transition-behavior: allow-discrete` | 2024+ | Native dialog open/close |
|
|
23
|
+
| `appearance: base-select` | 2024+ | Native `<select>` |
|
|
24
|
+
| `@starting-style` | 2024+ | Instant appearance |
|
|
25
|
+
| View Transition API | 2024+ | Dialog open/close transition |
|
|
26
|
+
| CSS Anchor Positioning | Future | JS positioning (`floating.js`) |
|
|
27
|
+
|
|
28
|
+
Core layout and visual tokens work on all Baseline 2023 browsers. Features marked
|
|
29
|
+
2024+ are gated with `@supports` or degrade gracefully through fallback values.
|
|
30
|
+
|
|
31
|
+
## Dark mode
|
|
32
|
+
|
|
33
|
+
Dark mode is for modern browsers only (light mode is the fallback otherwise).
|
|
34
|
+
Use `color-scheme: light dark` plus `light-dark()` for theme tokens so the
|
|
35
|
+
default theme follows the OS without `data-theme`. Explicit themes pin
|
|
36
|
+
`color-scheme` to light or dark.
|
|
37
|
+
|
|
38
|
+
## Progressive enhancement
|
|
39
|
+
|
|
40
|
+
Modern features are gated with `@supports`; unsupported browsers keep the core layout and controls.
|
|
41
|
+
|
|
42
|
+
- `color-mix(in oklch, ...)` — enhanced variant surfaces and hover states
|
|
43
|
+
- `appearance: base-select` — enhanced select picker on fine-pointer devices
|
|
44
|
+
- `backdrop-filter` — enhanced sticky form actions
|
|
45
|
+
- `transition-behavior: allow-discrete` — smooth dialog open/close
|
|
46
|
+
- `:has()` — button groups, alert icons, disabled choice labels
|
|
47
|
+
|
|
48
|
+
### @supports usage
|
|
49
|
+
|
|
50
|
+
Use `@supports` positively (no `@supports not`) only when it protects a dependent group of rules or a real fallback/modern branch. Do not gate a single progressive declaration whose unsupported value is simply ignored by the browser, such as `text-wrap: balance`.
|
|
51
|
+
|
|
52
|
+
When a baseline declaration is already a valid fallback, prefer the normal cascade to an `@supports` wrapper. For example, older browsers keep the opaque surface here, while newer ones replace it with the translucent value:
|
|
53
|
+
|
|
54
|
+
```css
|
|
55
|
+
background: var(--surface);
|
|
56
|
+
background: color-mix(in oklch, var(--surface) 88%, transparent);
|
|
57
|
+
backdrop-filter: blur(1rem);
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### CSS nesting inside @supports
|
|
61
|
+
|
|
62
|
+
The no-nesting rule protects browsers that predate CSS nesting (Chrome 112, Firefox 117, Safari 16.5). A block already gated behind a later feature can't be reached by any browser that lacks nesting, so the inspector-friendliness argument no longer applies — nest freely inside it. `appearance: base-select` (Chrome 133+) is the current example: everything inside that `@supports` block in `custom-select.css` uses `&`-nesting instead of repeating the `.select:not(...)` selector.
|
|
63
|
+
|
|
64
|
+
Check the gating feature's baseline against nesting's before relying on this: if a future gate ships on a browser older than nesting's baseline, flatten that block back out.
|
|
65
|
+
|
|
66
|
+
### Vendor prefixes and engine hooks
|
|
67
|
+
|
|
68
|
+
Keep a browser-specific prefix only when it reaches a still-relevant engine behavior that the standard property does not cover, or when it targets a browser-only native part. Examples include `-webkit-mask-*` where needed and pseudo-elements such as `::-webkit-scrollbar` or `::-webkit-progress-value`.
|
|
69
|
+
|
|
70
|
+
Do not retain a prefixed duplicate merely to preserve an optional visual enhancement on older browsers. If the unprefixed declaration or an earlier fallback keeps the component functional and legible, prefer the smaller rule set.
|
|
71
|
+
|
|
72
|
+
### color-mix fallbacks
|
|
73
|
+
|
|
74
|
+
Every `color-mix()` declaration needs a flat fallback outside `@supports` (older browsers drop the whole property, not just the function).
|
|
75
|
+
|
|
76
|
+
### Hover rules
|
|
77
|
+
|
|
78
|
+
Hover rules that change surface colors go inside `@media (hover: hover)`. `:active` feedback stays unguarded.
|
|
79
|
+
|
|
80
|
+
### forced-colors
|
|
81
|
+
|
|
82
|
+
The default theme maps public color, focus, and shadow tokens to system colors
|
|
83
|
+
inside `forced-colors: active`. Components should rely on those tokens first.
|
|
84
|
+
Use local forced-color rules only for shapes or states the token layer cannot
|
|
85
|
+
infer, such as custom checkbox/switch geometry, native progress/meter parts,
|
|
86
|
+
disabled affordances, tooltip arrows, or selected states otherwise expressed
|
|
87
|
+
only through background color.
|
|
88
|
+
|
|
89
|
+
### :has()
|
|
90
|
+
|
|
91
|
+
- Grouping works with `role="group"` and `:has()`: it is a progressive enhancement; UI should still be functional without it.
|
|
92
|
+
- Keep `:has()` out of selector lists that also contain legacy-safe selectors. Put the `:has()` branch in `@supports selector(...)` if necessary.
|
|
93
|
+
- Use `:has()` to improve simple structure, but do not turn it into a monolithic selector.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Cascade layer strategy
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Actual CSS is designed for new projects where its bare class names don't
|
|
6
|
+
conflict. For existing projects that need coexistence, `actual.layer.css`
|
|
7
|
+
wraps the entire framework in a single `@layer actual` so its specificity
|
|
8
|
+
is lower than unlayered author styles.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
Replace `actual.css` with `actual.layer.css`:
|
|
13
|
+
|
|
14
|
+
```css
|
|
15
|
+
/* Before — classes may override existing project styles */
|
|
16
|
+
@import "actual-css";
|
|
17
|
+
|
|
18
|
+
/* After — all Actual rules are scoped to the `actual` layer */
|
|
19
|
+
@import "actual-css/css/layer";
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Author styles outside any layer will win over layer styles with equal specificity.
|
|
23
|
+
|
|
24
|
+
## Layer structure (v0.1)
|
|
25
|
+
|
|
26
|
+
A single `actual` layer. The internal import order is a contract: later imports
|
|
27
|
+
can override earlier ones within the layer. Sublayers (`actual.reset`,
|
|
28
|
+
`actual.components`, etc.) are reserved for future use if the single layer
|
|
29
|
+
causes real-world override issues.
|
|
30
|
+
|
|
31
|
+
## Import order contract
|
|
32
|
+
|
|
33
|
+
Within `actual.css` the order is:
|
|
34
|
+
|
|
35
|
+
1. Reset and base
|
|
36
|
+
2. Tokens and theme
|
|
37
|
+
3. Layout (container, layout, grid)
|
|
38
|
+
4. Variants and prose
|
|
39
|
+
5. Components
|
|
40
|
+
6. Forms and utilities
|
|
41
|
+
7. Print
|
|
42
|
+
|
|
43
|
+
This order is stable. If a future version introduces sublayers, the relative
|
|
44
|
+
order will be preserved.
|
|
45
|
+
|
|
46
|
+
## Limitations
|
|
47
|
+
|
|
48
|
+
- `actual.layer.css` cannot protect against conflicts with other layered
|
|
49
|
+
frameworks that also use `@layer actual`. If both projects use the same
|
|
50
|
+
layer name, the later `@layer` declaration wins.
|
|
51
|
+
- The layer applies only when importing from `actual.layer.css`. Direct
|
|
52
|
+
imports of individual files bypass the layer.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Future Transition: CSS Anchor Positioning
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
Currently, the positioning logic for tooltips, flyouts, and context menus is handled by a custom JavaScript engine (in `floating.js`). This engine computes absolute coordinates, handles viewport boundaries, and applies "flip" and "shift" heuristics to prevent overflow.
|
|
6
|
+
|
|
7
|
+
As of mid-2024, modern browsers started supporting the **CSS Anchor Positioning API**, which delegates this heavy mathematical lifting directly to the browser's layout engine.
|
|
8
|
+
|
|
9
|
+
## Migration Path
|
|
10
|
+
|
|
11
|
+
When global browser support for CSS Anchor Positioning reaches a safe threshold (~95%), the JS positioning engine should be deprecated in favor of a CSS-only approach.
|
|
12
|
+
|
|
13
|
+
### 1. Element-to-Element Anchoring (Tooltips & Flyouts)
|
|
14
|
+
|
|
15
|
+
For elements anchored to physical DOM nodes (like a button triggering a flyout), the JS calculation can be fully replaced by CSS:
|
|
16
|
+
|
|
17
|
+
```css
|
|
18
|
+
.flyout {
|
|
19
|
+
position: absolute;
|
|
20
|
+
position-anchor: --trigger-element;
|
|
21
|
+
top: anchor(bottom);
|
|
22
|
+
left: anchor(start);
|
|
23
|
+
|
|
24
|
+
/* Replaces the JS flip/shift logic natively */
|
|
25
|
+
position-try-fallbacks: flip-block, flip-inline;
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 2. The Pointer Coordinates Exception (Context Menus)
|
|
30
|
+
|
|
31
|
+
CSS Anchor Positioning does not cover 100% of our use cases. Context menus (repositionAt) open at dynamic pointer coordinates (clientX/clientY), not relative to a DOM element.
|
|
32
|
+
|
|
33
|
+
Therefore, the JS engine cannot be entirely deleted. A lightweight JavaScript layer will still be required to capture the pointer event and pass the coordinates to the DOM (either by updating CSS variables --x/--y, or using the upcoming JS Virtual Anchor API).
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Naming conventions
|
|
2
|
+
|
|
3
|
+
## Sources
|
|
4
|
+
|
|
5
|
+
- Stick to [uiterms.com](https://uiterms.com/) naming when choosing component and pattern names.
|
|
6
|
+
- Reference [Open UI](https://open-ui.org/) research when designing new primitives.
|
|
7
|
+
|
|
8
|
+
## Public class grammar
|
|
9
|
+
|
|
10
|
+
Actual CSS uses bare global class names as its public CSS API. The grammar is:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
.component [intent] [variant] [size] [modifier]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<button class="btn primary outline lg">Publish</button>
|
|
20
|
+
<span class="badge success soft">Online</span>
|
|
21
|
+
<section class="card raised stack">...</section>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Documented classes are the public API. Treat them like package exports: adding one is an API decision, renaming or removing one is breaking, and `is-*` classes belong to runtime internals rather than the author API.
|
|
25
|
+
|
|
26
|
+
Actual CSS is intended for new projects. Existing projects with class collisions should use `actual.layer.css`, import order, or their own prefix transform as a pipeline output. The primary API remains unprefixed.
|
|
27
|
+
|
|
28
|
+
### Rules
|
|
29
|
+
|
|
30
|
+
- Classes name components, not markup. Prefer the established UI term even when it matches the element (`.select`, `.table`); do not invent synonyms just to avoid repetition.
|
|
31
|
+
- When one element can host multiple components, use the component role instead of the element name (`.modal` / `.drawer` on `dialog`, `.check` / `.radio` / `.switch` on `input`).
|
|
32
|
+
- Do not merely restate the element when a more precise or canonical component name exists (`.key`, not `.kbd`; `.modal` / `.drawer`, not `.dialog`).
|
|
33
|
+
- Prefer the shortest established term when it improves searchability without drifting from the component vocabulary (`.btn`, not `.button`).
|
|
34
|
+
- Classes name roles and boolean modifiers; `data-*` carries configurable values.
|
|
35
|
+
- `is-*` classes are runtime internals, not author API.
|
|
36
|
+
- Public JS data attributes are namespaced by feature (`data-flyout-*`, `data-context-menu-*`, `data-dialog-*`, `data-tooltip-*`; `data-toast-*` is reserved). Do not expose shared implementation names such as `surface` unless they are meant as a stable author concept.
|
|
37
|
+
- Custom events use the `actual:*` namespace.
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# References
|
|
2
|
+
|
|
3
|
+
## Positioning
|
|
4
|
+
|
|
5
|
+
Actual CSS is for new projects that want semantic HTML, small class APIs, theme tokens, and progressive enhancement without a build step.
|
|
6
|
+
|
|
7
|
+
It claims a small public grammar: `.component [intent] [variant] [size] [modifier]`. For existing projects with collisions, use cascade layers, import order, or an application-side prefix transform.
|
|
8
|
+
|
|
9
|
+
### Non-goals
|
|
10
|
+
|
|
11
|
+
- No legacy drop-in promise.
|
|
12
|
+
- No large utility surface.
|
|
13
|
+
- No compatibility build that rewrites the product.
|
|
14
|
+
- No complex widgets.
|
|
15
|
+
|
|
16
|
+
## Research links
|
|
17
|
+
|
|
18
|
+
### Forms
|
|
19
|
+
|
|
20
|
+
- https://oat.ink/components/#form
|
|
21
|
+
- https://picocss.com/docs/forms
|
|
22
|
+
- https://picocss.com/docs/group
|
|
23
|
+
- https://getbootstrap.com/docs/5.3/forms/overview/
|
|
24
|
+
- https://developer.chrome.com/blog/a-customizable-select
|
|
25
|
+
- https://modern-css.com/customizable-selects-without-a-javascript-library/
|
|
26
|
+
- https://smolcss.dev/#smol-focus-styles
|
|
27
|
+
- https://daisyui.com/components/checkbox/
|
|
28
|
+
- https://daisyui.com/components/fieldset/
|
|
29
|
+
- https://daisyui.com/components/label/
|
|
30
|
+
- https://daisyui.com/components/radio/
|
|
31
|
+
- https://daisyui.com/components/range/
|
|
32
|
+
- https://daisyui.com/components/select/
|
|
33
|
+
- https://daisyui.com/components/textarea/
|
|
34
|
+
- https://daisyui.com/components/toggle/
|
|
35
|
+
- https://uiterms.com/slider/
|
|
36
|
+
- https://uiterms.com/switch/
|
|
37
|
+
- https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/label
|
|
38
|
+
- https://open-ui.org/components/checkbox.research/
|
|
39
|
+
- https://open-ui.org/components/radio-button.research/
|
|
40
|
+
- https://open-ui.org/components/select.research/
|
|
41
|
+
- https://open-ui.org/components/slider.research/
|
|
42
|
+
- https://open-ui.org/components/switch/
|
|
43
|
+
- https://daisyui.com/components/validator/
|
|
44
|
+
- https://getbootstrap.com/docs/5.3/forms/validation/
|
|
45
|
+
- https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/switch_role
|
|
46
|
+
|
|
47
|
+
### Components: Accordion
|
|
48
|
+
|
|
49
|
+
- https://picocss.com/docs/accordion
|
|
50
|
+
- https://oat.ink/components/#accordion
|
|
51
|
+
- https://daisyui.com/components/accordion/
|
|
52
|
+
- https://getbootstrap.com/docs/5.3/components/accordion/
|
|
53
|
+
- https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/details
|
|
54
|
+
- https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/summary
|
|
55
|
+
- https://semantic-ui.com/modules/accordion.html
|
|
56
|
+
- https://modern-css.com/accordion-without-javascript/
|
|
57
|
+
- https://modern-css.com/exclusive-accordions-without-javascript/
|
|
58
|
+
- https://uiterms.com/accordion/
|
|
59
|
+
- https://basecoatui.com/components/accordion/
|
|
60
|
+
- https://open-ui.org/components/accordion.explainer/
|
|
61
|
+
|
|
62
|
+
### Components: Alert
|
|
63
|
+
|
|
64
|
+
- https://oat.ink/components/#alert
|
|
65
|
+
- https://getbootstrap.com/docs/5.3/components/alerts/
|
|
66
|
+
- https://playground.halfaccessible.com/aria-reference/alert-role
|
|
67
|
+
- https://www.a11y-collective.com/blog/aria-alert/
|
|
68
|
+
- https://primer.style/accessibility/patterns/accessible-notifications-and-messages/
|
|
69
|
+
- https://uiterms.com/alert/
|
|
70
|
+
- https://open-ui.org/components/alert.research/
|
|
71
|
+
- https://kelpui.com/docs/components/callouts/
|
|
72
|
+
|
|
73
|
+
### Components: Avatar
|
|
74
|
+
|
|
75
|
+
- https://oat.ink/components/#avatar
|
|
76
|
+
- https://daisyui.com/components/avatar/
|
|
77
|
+
- https://smolcss.dev/#smol-avatar-list
|
|
78
|
+
- https://open-ui.org/components/avatar.research/
|
|
79
|
+
|
|
80
|
+
### Components: Badge
|
|
81
|
+
|
|
82
|
+
- https://oat.ink/components/#badge
|
|
83
|
+
- https://daisyui.com/components/badge/
|
|
84
|
+
- https://semantic-ui.com/elements/label.html
|
|
85
|
+
- https://getbootstrap.com/docs/5.3/components/badge/
|
|
86
|
+
- https://uiterms.com/badge/
|
|
87
|
+
- https://m3.material.io/components/badges/overview
|
|
88
|
+
- https://daisyui.com/components/indicator/
|
|
89
|
+
- https://open-ui.org/components/badge.research/
|
|
90
|
+
- https://kelpui.com/docs/components/badges/
|
|
91
|
+
|
|
92
|
+
### Components: Breadcrumb
|
|
93
|
+
|
|
94
|
+
- https://oat.ink/components/#breadcrumb
|
|
95
|
+
- https://daisyui.com/components/breadcrumbs/
|
|
96
|
+
- https://getbootstrap.com/docs/5.3/components/breadcrumb/
|
|
97
|
+
- https://gomakethings.com/articles/creating-unstyled-lists/
|
|
98
|
+
- https://uiterms.com/breadcrumbs/
|
|
99
|
+
- https://open-ui.org/components/breadcrumb.research/
|
|
100
|
+
|
|
101
|
+
### Components: Button
|
|
102
|
+
|
|
103
|
+
- https://picocss.com/docs/button
|
|
104
|
+
- https://daisyui.com/components/button/
|
|
105
|
+
- https://semantic-ui.com/elements/button.html
|
|
106
|
+
- https://bulma.io/documentation/elements/button/
|
|
107
|
+
- https://oat.ink/components/#button
|
|
108
|
+
- https://getbootstrap.com/docs/5.3/components/buttons/
|
|
109
|
+
- https://moderncss.dev/icon-button-css-styling-guide/
|
|
110
|
+
- https://moderncss.dev/css-button-styling-guide/
|
|
111
|
+
- https://codepen.io/lekoalabe/pen/RNaXBBP
|
|
112
|
+
- https://codepen.io/lekoalabe/pen/oNORPZP
|
|
113
|
+
- https://piccalil.li/blog/how-i-build-a-button-component/
|
|
114
|
+
- https://open-ui.org/components/button/
|
|
115
|
+
- https://kelpui.com/docs/components/buttons/
|
|
116
|
+
|
|
117
|
+
### Components: Card
|
|
118
|
+
|
|
119
|
+
- https://oat.ink/components/#card
|
|
120
|
+
- https://daisyui.com/components/card/
|
|
121
|
+
- https://picocss.com/docs/card
|
|
122
|
+
- https://getbootstrap.com/docs/5.3/components/card/
|
|
123
|
+
- https://semantic-ui.com/views/card.html
|
|
124
|
+
- https://smolcss.dev/#smol-card-component
|
|
125
|
+
- https://uiterms.com/card/
|
|
126
|
+
- https://open-ui.org/components/card.research/
|
|
127
|
+
|
|
128
|
+
### UI: Drawer
|
|
129
|
+
|
|
130
|
+
- https://oat.ink/components/#sidebar
|
|
131
|
+
- https://daisyui.com/components/drawer/
|
|
132
|
+
- https://mac81.github.io/pure-drawer/
|
|
133
|
+
- https://codepen.io/nwest88/pen/PwwZpv
|
|
134
|
+
- https://uiterms.com/drawer/
|
|
135
|
+
- https://v6-dev--twbs-bootstrap.netlify.app/docs/6.0/components/drawer/
|
|
136
|
+
|
|
137
|
+
### Components: Meter
|
|
138
|
+
|
|
139
|
+
- https://oat.ink/components/#meter
|
|
140
|
+
|
|
141
|
+
### UI: Modal / Dialog
|
|
142
|
+
|
|
143
|
+
- https://oat.ink/components/#dialog
|
|
144
|
+
- https://picocss.com/docs/modal
|
|
145
|
+
- https://daisyui.com/components/modal/
|
|
146
|
+
- https://getbootstrap.com/docs/5.3/components/modal/
|
|
147
|
+
- https://modern-css.com/modal-dialogs-without-a-javascript-library/
|
|
148
|
+
- https://modern-css.com/full-width-without-horizontal-scrollbar-overflow/
|
|
149
|
+
- https://modern-css.com/modal-controls-without-onclick-handlers/
|
|
150
|
+
- https://modern-css.com/dialog-light-dismiss-without-click-outside-listeners/
|
|
151
|
+
- https://uiterms.com/alert-dialog/
|
|
152
|
+
- https://uiterms.com/dialog/
|
|
153
|
+
- https://codepen.io/lekoalabe/pen/GgKOKOE
|
|
154
|
+
- https://pqina.nl/blog/animating-the-dialog-element-using-view-transitions/
|
|
155
|
+
- https://basecoatui.com/components/alert-dialog/
|
|
156
|
+
- https://v6-dev--twbs-bootstrap.netlify.app/docs/6.0/components/dialog/
|
|
157
|
+
- https://open-ui.org/components/invokers.explainer/
|
|
158
|
+
- https://open-ui.org/components/dialog.research/
|
|
159
|
+
- https://kelpui.com/docs/components/dialog/
|
|
160
|
+
|
|
161
|
+
### Components: Pagination
|
|
162
|
+
|
|
163
|
+
- https://oat.ink/components/#pagination
|
|
164
|
+
- https://daisyui.com/components/pagination/
|
|
165
|
+
- https://uiterms.com/pagination/
|
|
166
|
+
|
|
167
|
+
### Components: Progress
|
|
168
|
+
|
|
169
|
+
- https://oat.ink/components/#progress
|
|
170
|
+
- https://daisyui.com/components/progress/
|
|
171
|
+
- https://picocss.com/docs/progress
|
|
172
|
+
- https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/progress
|
|
173
|
+
- https://getbootstrap.com/docs/5.3/components/progress/
|
|
174
|
+
- https://codepen.io/lekoalabe/pen/NWEzXMO
|
|
175
|
+
|
|
176
|
+
### Components: Spinner
|
|
177
|
+
|
|
178
|
+
- https://oat.ink/components/#spinner
|
|
179
|
+
- https://picocss.com/docs/loading
|
|
180
|
+
- https://daisyui.com/components/loading/
|
|
181
|
+
- https://kelpui.com/docs/components/spinner/
|
|
182
|
+
|
|
183
|
+
### Components: Skeleton
|
|
184
|
+
|
|
185
|
+
- https://oat.ink/components/#skeleton
|
|
186
|
+
- https://daisyui.com/components/skeleton/
|
|
187
|
+
- https://github.com/Aejkatappaja/phantom-ui
|
|
188
|
+
- https://kelpui.com/docs/components/skeleton/
|
|
189
|
+
|
|
190
|
+
### Components: Table
|
|
191
|
+
|
|
192
|
+
- https://picocss.com/docs/table
|
|
193
|
+
- https://oat.ink/components/#table
|
|
194
|
+
- https://getbootstrap.com/docs/5.3/content/tables/
|
|
195
|
+
- https://piccalil.li/blog/styling-tables-the-modern-css-way/
|
|
196
|
+
- https://open-ui.org/components/table.research/
|
|
197
|
+
|
|
198
|
+
### Layout: Stack
|
|
199
|
+
|
|
200
|
+
- https://github.com/knadh/oat/blob/master/src/css/utilities.css
|
|
201
|
+
- https://every-layout.dev/layouts/stack/
|
|
202
|
+
- https://kelpui.com/docs/layout/stack/
|
|
203
|
+
|
|
204
|
+
### Layout: Cluster
|
|
205
|
+
|
|
206
|
+
- https://modern-css.com/spacing-elements-without-margin-hacks/
|
|
207
|
+
- https://every-layout.dev/layouts/cluster/
|
|
208
|
+
- https://kelpui.com/docs/layout/cluster/
|
|
209
|
+
|
|
210
|
+
### Layout: Center
|
|
211
|
+
|
|
212
|
+
- https://picocss.com/docs/container
|
|
213
|
+
- https://smolcss.dev/#smol-container
|
|
214
|
+
- https://every-layout.dev/layouts/center/
|
|
215
|
+
|
|
216
|
+
### Layout: List
|
|
217
|
+
|
|
218
|
+
- https://daisyui.com/components/list/
|
|
219
|
+
- https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element
|
|
220
|
+
- https://open-ui.org/components/list.research/
|
|
221
|
+
|
|
222
|
+
### Layout: Grid
|
|
223
|
+
|
|
224
|
+
- https://picocss.com/docs/grid
|
|
225
|
+
- https://oat.ink/components/#grid
|
|
226
|
+
- https://modern-css.com/grid-layout-without-extra-wrappers/
|
|
227
|
+
- https://moderncss.dev/3-css-grid-techniques-to-make-you-a-grid-convert/
|
|
228
|
+
- https://smolcss.dev/#smol-css-grid
|
|
229
|
+
- https://kelpui.com/docs/layout/grid/
|
|
230
|
+
|
|
231
|
+
### Layout: Sidebar
|
|
232
|
+
|
|
233
|
+
- https://every-layout.dev/layouts/sidebar/
|
|
234
|
+
- https://kelpui.com/docs/layout/sidecar/
|
|
235
|
+
|
|
236
|
+
### Layout: Switcher
|
|
237
|
+
|
|
238
|
+
- https://every-layout.dev/layouts/switcher/
|
|
239
|
+
|
|
240
|
+
### Layout: Frame
|
|
241
|
+
|
|
242
|
+
- https://every-layout.dev/layouts/frame/
|
|
243
|
+
|
|
244
|
+
### Layout: Header and Footer
|
|
245
|
+
|
|
246
|
+
- https://uiterms.com/sticky-header/
|
|
247
|
+
- https://developer.mozilla.org/en-US/docs/Web/CSS/How_to/Layout_cookbook/Sticky_footers
|
|
248
|
+
- https://crinkles.dev/writing/enhanced-sticky-footer/
|
|
249
|
+
- https://prismic.io/blog/css-sticky-footers
|
|
250
|
+
- https://modern-css.com/sticky-headers-without-javascript-scroll-listeners/
|
|
251
|
+
- https://picocss.com/docs/landmarks-section
|
|
252
|
+
|
|
253
|
+
### Utilities
|
|
254
|
+
|
|
255
|
+
- https://piccalil.li/blog/a-modern-css-reset/
|
|
256
|
+
- https://www.a11yproject.com/posts/how-to-hide-content/
|
|
257
|
+
- https://getbootstrap.com/docs/5.3/content/tables/#responsive-tables
|
|
258
|
+
- https://picocss.com/docs/overflow-auto
|
|
259
|
+
- https://github.com/knadh/oat/blob/master/src/css/utilities.css
|
|
260
|
+
|
|
261
|
+
### Tokens
|
|
262
|
+
|
|
263
|
+
- https://primer.style/product/primitives/
|
|
264
|
+
- https://picocss.com/docs/css-variables
|
|
265
|
+
- https://nordhealth.design/tokens
|
|
266
|
+
- https://oat.ink/customizing/
|
|
267
|
+
- https://modern-css.com/theme-variables-without-a-preprocessor/
|
|
268
|
+
|
|
269
|
+
### Typography
|
|
270
|
+
|
|
271
|
+
- https://daisyui.com/docs/layout-and-typography/
|
|
272
|
+
- https://nordhealth.design/typography
|
|
273
|
+
- https://primer.style/product/primitives/typography/
|
|
274
|
+
- https://picocss.com/docs/typography
|
|
275
|
+
- https://piccalil.li/blog/a-more-modern-css-reset/
|
|
276
|
+
- https://moderncss.dev/generating-font-size-css-rules-and-creating-a-fluid-type-scale/
|
|
277
|
+
|
|
278
|
+
### Patterns
|
|
279
|
+
|
|
280
|
+
- https://picocss.com/docs/nav
|
|
281
|
+
- https://daisyui.com/components/navbar/
|
|
282
|
+
- https://kelpui.com/docs/components/navbar/
|
|
283
|
+
|
|
284
|
+
### UI: Flyout / Menu
|
|
285
|
+
|
|
286
|
+
- https://oat.ink/components/#menu
|
|
287
|
+
- https://daisyui.com/components/menu/
|
|
288
|
+
- https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/
|
|
289
|
+
- https://github.com/lekoala/pure-context-menu
|
|
290
|
+
- https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/popover
|
|
291
|
+
- https://v6-dev--twbs-bootstrap.netlify.app/docs/6.0/components/menu/
|
|
292
|
+
- https://getbootstrap.com/docs/5.3/components/popovers/#overview
|
|
293
|
+
- https://open-ui.org/components/menu.research/
|
|
294
|
+
|
|
295
|
+
### UI: Tabs
|
|
296
|
+
|
|
297
|
+
- https://www.makethingsaccessible.com/guides/responsive-and-accessible-tabbed-interfaces/
|
|
298
|
+
- https://www.w3.org/WAI/ARIA/apg/patterns/tabs/
|
|
299
|
+
- https://uiterms.com/tabs/
|
|
300
|
+
- https://m3.material.io/components/tabs/accessibility
|
|
301
|
+
- https://css-tricks.com/pure-css-tabs-with-details-grid-and-subgrid/
|
|
302
|
+
- https://basecoatui.com/components/tabs/
|
|
303
|
+
- https://daisyui.com/components/tab/
|
|
304
|
+
- https://inclusive-components.design/tabbed-interfaces/
|
|
305
|
+
- https://open-ui.org/components/tabs.research/
|
|
306
|
+
- https://kelpui.com/docs/components/tabs/
|
|
307
|
+
|
|
308
|
+
### UI: Tooltip
|
|
309
|
+
|
|
310
|
+
- https://oat.ink/components/#tooltip
|
|
311
|
+
- https://picocss.com/docs/tooltip
|
|
312
|
+
- https://uiterms.com/tooltip/
|
|
313
|
+
- https://vispero.com/resources/using-the-html-title-attribute-updated/
|
|
314
|
+
- https://codepen.io/lekoalabe/pen/JoPNWpX
|
|
315
|
+
- https://m3.material.io/components/tooltips/overview
|
|
316
|
+
- https://basecoatui.com/components/tooltip/
|
|
317
|
+
- https://daisyui.com/components/tooltip/
|
|
318
|
+
- https://open-ui.org/components/tooltip.research/
|
|
319
|
+
|
|
320
|
+
### UI: Scrollspy
|
|
321
|
+
|
|
322
|
+
- https://getbootstrap.com/docs/5.3/components/scrollspy/
|
|
323
|
+
- https://una.im/scroll-target-group/
|
|
324
|
+
- https://www.sarasoueidan.com/blog/css-scrollspy/
|