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.
Files changed (129) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +166 -0
  4. package/dist/actual.css +4929 -0
  5. package/dist/actual.js +3 -0
  6. package/dist/actual.js.map +31 -0
  7. package/dist/actual.min.css +1 -0
  8. package/docs/README.md +26 -0
  9. package/docs/components.md +860 -0
  10. package/docs/design-notes/accessibility-decisions.md +32 -0
  11. package/docs/design-notes/browser-support.md +93 -0
  12. package/docs/design-notes/cascade-layer.md +52 -0
  13. package/docs/design-notes/css-anchor.md +33 -0
  14. package/docs/design-notes/naming.md +37 -0
  15. package/docs/design-notes/previous-work.md +5 -0
  16. package/docs/design-notes/references.md +324 -0
  17. package/docs/forms.md +1265 -0
  18. package/docs/javascript.md +426 -0
  19. package/docs/layout.md +480 -0
  20. package/docs/mental-model.md +73 -0
  21. package/docs/patterns.md +415 -0
  22. package/docs/reserved.md +7 -0
  23. package/docs/tokens.md +455 -0
  24. package/docs/typography.md +159 -0
  25. package/docs/ui.md +937 -0
  26. package/docs/utilities.md +384 -0
  27. package/llms.txt +17 -0
  28. package/package.json +101 -0
  29. package/src/css/actual.css +17 -0
  30. package/src/css/actual.full.css +2 -0
  31. package/src/css/actual.layer.css +3 -0
  32. package/src/css/base.css +70 -0
  33. package/src/css/components/accordion.css +97 -0
  34. package/src/css/components/actions.css +21 -0
  35. package/src/css/components/alert.css +137 -0
  36. package/src/css/components/avatar.css +199 -0
  37. package/src/css/components/badge.css +143 -0
  38. package/src/css/components/breadcrumb.css +56 -0
  39. package/src/css/components/busy.css +44 -0
  40. package/src/css/components/button.css +216 -0
  41. package/src/css/components/card.css +140 -0
  42. package/src/css/components/drawer.css +122 -0
  43. package/src/css/components/flyout.css +243 -0
  44. package/src/css/components/index.css +41 -0
  45. package/src/css/components/join.css +106 -0
  46. package/src/css/components/key.css +25 -0
  47. package/src/css/components/meter.css +81 -0
  48. package/src/css/components/modal.css +162 -0
  49. package/src/css/components/navbar.css +98 -0
  50. package/src/css/components/overline.css +49 -0
  51. package/src/css/components/pagination.css +30 -0
  52. package/src/css/components/progress.css +126 -0
  53. package/src/css/components/scrollspy.css +27 -0
  54. package/src/css/components/skeleton.css +67 -0
  55. package/src/css/components/spinner.css +60 -0
  56. package/src/css/components/status-bar.css +82 -0
  57. package/src/css/components/surface.css +48 -0
  58. package/src/css/components/tab.css +128 -0
  59. package/src/css/components/table.css +64 -0
  60. package/src/css/components/tooltip.css +107 -0
  61. package/src/css/dialog-fallback.css +56 -0
  62. package/src/css/focus.css +13 -0
  63. package/src/css/forms/choice-card.css +158 -0
  64. package/src/css/forms/choice.css +196 -0
  65. package/src/css/forms/control.css +106 -0
  66. package/src/css/forms/custom-select.css +93 -0
  67. package/src/css/forms/form-actions.css +43 -0
  68. package/src/css/forms/form.css +57 -0
  69. package/src/css/forms/index.css +15 -0
  70. package/src/css/forms/input-icon.css +36 -0
  71. package/src/css/forms/native.css +68 -0
  72. package/src/css/forms/select.css +36 -0
  73. package/src/css/forms/switch.css +127 -0
  74. package/src/css/forms/validation.css +63 -0
  75. package/src/css/grid.css +95 -0
  76. package/src/css/intents.css +33 -0
  77. package/src/css/layout.css +80 -0
  78. package/src/css/optional/index.css +5 -0
  79. package/src/css/optional/layout-extra.css +55 -0
  80. package/src/css/optional/scroll-snap.css +51 -0
  81. package/src/css/optional/scroller.css +51 -0
  82. package/src/css/optional/typography-fluid.css +48 -0
  83. package/src/css/optional/utilities-extra.css +289 -0
  84. package/src/css/print.css +47 -0
  85. package/src/css/prose.css +187 -0
  86. package/src/css/reset.css +56 -0
  87. package/src/css/theme.css +186 -0
  88. package/src/css/themes/corporate.css +60 -0
  89. package/src/css/themes/cyberpunk.css +60 -0
  90. package/src/css/themes/dark.css +32 -0
  91. package/src/css/themes/dim.css +33 -0
  92. package/src/css/themes/edge.css +143 -0
  93. package/src/css/themes/forest.css +65 -0
  94. package/src/css/themes/gradient.css +97 -0
  95. package/src/css/themes/index.css +43 -0
  96. package/src/css/themes/lavender.css +66 -0
  97. package/src/css/themes/mono.css +60 -0
  98. package/src/css/themes/neon.css +66 -0
  99. package/src/css/themes/ocean.css +60 -0
  100. package/src/css/themes/petrol.css +64 -0
  101. package/src/css/themes/spruce.css +64 -0
  102. package/src/css/themes/square.css +68 -0
  103. package/src/css/themes/sunset.css +66 -0
  104. package/src/css/tokens.css +122 -0
  105. package/src/css/utilities.css +162 -0
  106. package/src/css/variants.css +118 -0
  107. package/src/js/command.js +165 -0
  108. package/src/js/context-menu.js +291 -0
  109. package/src/js/dialog-fallback.js +163 -0
  110. package/src/js/dialog.js +503 -0
  111. package/src/js/enhance.js +208 -0
  112. package/src/js/events.js +22 -0
  113. package/src/js/filter.js +122 -0
  114. package/src/js/floating.js +462 -0
  115. package/src/js/flyout.js +187 -0
  116. package/src/js/focus.js +35 -0
  117. package/src/js/index.js +26 -0
  118. package/src/js/input.js +47 -0
  119. package/src/js/keys.js +30 -0
  120. package/src/js/mask.js +184 -0
  121. package/src/js/menu.js +88 -0
  122. package/src/js/password.js +98 -0
  123. package/src/js/scrollspy.js +121 -0
  124. package/src/js/selectors.js +59 -0
  125. package/src/js/status.js +158 -0
  126. package/src/js/surface.js +358 -0
  127. package/src/js/tab.js +173 -0
  128. package/src/js/tooltip.js +374 -0
  129. 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,5 @@
1
+ # Previous work
2
+
3
+ https://github.com/lekoala/liveinit
4
+ https://github.com/lekoala/modern-now
5
+ unpublished css library
@@ -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/