@ssejal8/recipe-ui-kit 0.1.0 → 0.1.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/README.md +108 -277
- package/dist/cjs/index-BEr8BsSA.js +1712 -0
- package/dist/cjs/index-BEr8BsSA.js.map +1 -0
- package/dist/cjs/index.cjs.js +5 -0
- package/dist/cjs/index.cjs.js.map +1 -0
- package/dist/cjs/loader.cjs.js +15 -0
- package/dist/cjs/loader.cjs.js.map +1 -0
- package/dist/cjs/recipe-kit.cjs.js +27 -0
- package/dist/cjs/recipe-kit.cjs.js.map +1 -0
- package/dist/cjs/rk-badge_10.cjs.entry.js +638 -0
- package/dist/cjs/rk-badge_10.cjs.entry.js.map +1 -0
- package/dist/collection/collection-manifest.json +22 -0
- package/dist/collection/components/rk-badge/rk-badge.js +97 -0
- package/dist/collection/components/rk-badge/rk-badge.js.map +1 -0
- package/dist/collection/components/rk-chip/rk-chip.js +245 -0
- package/dist/collection/components/rk-chip/rk-chip.js.map +1 -0
- package/dist/collection/components/rk-empty-state/rk-empty-state.js +138 -0
- package/dist/collection/components/rk-empty-state/rk-empty-state.js.map +1 -0
- package/dist/collection/components/rk-meal-slot/rk-meal-slot.js +312 -0
- package/dist/collection/components/rk-meal-slot/rk-meal-slot.js.map +1 -0
- package/dist/collection/components/rk-modal/rk-modal.js +256 -0
- package/dist/collection/components/rk-modal/rk-modal.js.map +1 -0
- package/dist/collection/components/rk-rating/rk-rating.js +228 -0
- package/dist/collection/components/rk-rating/rk-rating.js.map +1 -0
- package/dist/collection/components/rk-recipe-card/rk-recipe-card.js +366 -0
- package/dist/collection/components/rk-recipe-card/rk-recipe-card.js.map +1 -0
- package/dist/collection/components/rk-search-bar/rk-search-bar.js +291 -0
- package/dist/collection/components/rk-search-bar/rk-search-bar.js.map +1 -0
- package/dist/collection/components/rk-segmented-control/rk-segmented-control.js +196 -0
- package/dist/collection/components/rk-segmented-control/rk-segmented-control.js.map +1 -0
- package/dist/collection/components/rk-tag-input/rk-tag-input.js +264 -0
- package/dist/collection/components/rk-tag-input/rk-tag-input.js.map +1 -0
- package/dist/collection/index.js +2 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/components/index.d.ts +35 -0
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/rk-badge.d.ts +11 -0
- package/dist/components/rk-badge.js +2 -0
- package/dist/components/rk-badge.js.map +1 -0
- package/dist/components/rk-chip.d.ts +11 -0
- package/dist/components/rk-chip.js +2 -0
- package/dist/components/rk-chip.js.map +1 -0
- package/dist/components/rk-empty-state.d.ts +11 -0
- package/dist/components/rk-empty-state.js +2 -0
- package/dist/components/rk-empty-state.js.map +1 -0
- package/dist/components/rk-meal-slot.d.ts +11 -0
- package/dist/components/rk-meal-slot.js +2 -0
- package/dist/components/rk-meal-slot.js.map +1 -0
- package/dist/components/rk-modal.d.ts +11 -0
- package/dist/components/rk-modal.js +2 -0
- package/dist/components/rk-modal.js.map +1 -0
- package/dist/components/rk-rating.d.ts +11 -0
- package/dist/components/rk-rating.js +2 -0
- package/dist/components/rk-rating.js.map +1 -0
- package/dist/components/rk-recipe-card.d.ts +11 -0
- package/dist/components/rk-recipe-card.js +2 -0
- package/dist/components/rk-recipe-card.js.map +1 -0
- package/dist/components/rk-search-bar.d.ts +11 -0
- package/dist/components/rk-search-bar.js +2 -0
- package/dist/components/rk-search-bar.js.map +1 -0
- package/dist/components/rk-segmented-control.d.ts +11 -0
- package/dist/components/rk-segmented-control.js +2 -0
- package/dist/components/rk-segmented-control.js.map +1 -0
- package/dist/components/rk-tag-input.d.ts +11 -0
- package/dist/components/rk-tag-input.js +2 -0
- package/dist/components/rk-tag-input.js.map +1 -0
- package/dist/esm/index-Bxo0C8lB.js +1684 -0
- package/dist/esm/index-Bxo0C8lB.js.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/loader.js +13 -0
- package/dist/esm/loader.js.map +1 -0
- package/dist/esm/recipe-kit.js +23 -0
- package/dist/esm/recipe-kit.js.map +1 -0
- package/dist/esm/rk-badge_10.entry.js +627 -0
- package/dist/esm/rk-badge_10.entry.js.map +1 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.js +1 -0
- package/dist/recipe-kit/index.esm.js +2 -0
- package/dist/recipe-kit/index.esm.js.map +1 -0
- package/dist/recipe-kit/p-Bxo0C8lB.js +3 -0
- package/dist/recipe-kit/p-Bxo0C8lB.js.map +1 -0
- package/dist/recipe-kit/p-fcb955c7.entry.js +2 -0
- package/dist/recipe-kit/p-fcb955c7.entry.js.map +1 -0
- package/dist/recipe-kit/recipe-kit.css +1 -0
- package/dist/recipe-kit/recipe-kit.esm.js +2 -0
- package/dist/recipe-kit/recipe-kit.esm.js.map +1 -0
- package/dist/recipe-kit/rk-global.css +104 -0
- package/dist/types/components/rk-badge/rk-badge.d.ts +15 -0
- package/dist/types/components/rk-chip/rk-chip.d.ts +37 -0
- package/dist/types/components/rk-empty-state/rk-empty-state.d.ts +19 -0
- package/dist/types/components/rk-meal-slot/rk-meal-slot.d.ts +53 -0
- package/dist/types/components/rk-modal/rk-modal.d.ts +41 -0
- package/dist/types/components/rk-rating/rk-rating.d.ts +26 -0
- package/dist/types/components/rk-recipe-card/rk-recipe-card.d.ts +67 -0
- package/dist/types/components/rk-search-bar/rk-search-bar.d.ts +39 -0
- package/dist/types/components/rk-segmented-control/rk-segmented-control.d.ts +37 -0
- package/dist/types/components/rk-tag-input/rk-tag-input.d.ts +35 -0
- package/{packages/recipe-kit-stencil/src → dist/types}/components.d.ts +1 -1
- package/{packages/recipe-kit-stencil/src/index.ts → dist/types/index.d.ts} +0 -2
- package/dist/types/stencil-public-runtime.d.ts +1873 -0
- package/loader/cdn.js +1 -0
- package/loader/index.cjs.js +1 -0
- package/loader/index.d.ts +24 -0
- package/loader/index.es2017.js +1 -0
- package/loader/index.js +2 -0
- package/package.json +84 -22
- package/.claude/settings.local.json +0 -10
- package/.npmr +0 -1
- package/apps/recipe-web/package.json +0 -31
- package/apps/recipe-web/src/app.css +0 -418
- package/apps/recipe-web/src/app.d.ts +0 -32
- package/apps/recipe-web/src/app.html +0 -25
- package/apps/recipe-web/src/lib/api/mealdb.ts +0 -240
- package/apps/recipe-web/src/lib/components/AppHeader.svelte +0 -290
- package/apps/recipe-web/src/lib/components/ConfirmDialog.svelte +0 -46
- package/apps/recipe-web/src/lib/components/Modal.svelte +0 -33
- package/apps/recipe-web/src/lib/components/RecipeCard.svelte +0 -100
- package/apps/recipe-web/src/lib/components/RecipeForm.svelte +0 -560
- package/apps/recipe-web/src/lib/components/RecipeGrid.svelte +0 -77
- package/apps/recipe-web/src/lib/components/RecipePickerDialog.svelte +0 -185
- package/apps/recipe-web/src/lib/components/Toaster.svelte +0 -111
- package/apps/recipe-web/src/lib/domain/recipe.ts +0 -130
- package/apps/recipe-web/src/lib/domain/validation.ts +0 -189
- package/apps/recipe-web/src/lib/stencil/WebComponent.svelte +0 -145
- package/apps/recipe-web/src/lib/stencil/register.ts +0 -28
- package/apps/recipe-web/src/lib/stores/favorites.svelte.ts +0 -81
- package/apps/recipe-web/src/lib/stores/myRecipes.svelte.ts +0 -98
- package/apps/recipe-web/src/lib/stores/persisted.svelte.ts +0 -73
- package/apps/recipe-web/src/lib/stores/planner.svelte.ts +0 -275
- package/apps/recipe-web/src/lib/stores/theme.svelte.ts +0 -67
- package/apps/recipe-web/src/lib/stores/toast.svelte.ts +0 -66
- package/apps/recipe-web/src/routes/+error.svelte +0 -36
- package/apps/recipe-web/src/routes/+layout.svelte +0 -62
- package/apps/recipe-web/src/routes/+page.svelte +0 -352
- package/apps/recipe-web/src/routes/+page.ts +0 -107
- package/apps/recipe-web/src/routes/favorites/+page.svelte +0 -170
- package/apps/recipe-web/src/routes/my-recipes/+layout.ts +0 -55
- package/apps/recipe-web/src/routes/my-recipes/+page.svelte +0 -180
- package/apps/recipe-web/src/routes/my-recipes/[id]/edit/+page.svelte +0 -104
- package/apps/recipe-web/src/routes/my-recipes/new/+page.svelte +0 -67
- package/apps/recipe-web/src/routes/planner/+page.svelte +0 -422
- package/apps/recipe-web/src/routes/recipes/[id]/+page.svelte +0 -538
- package/apps/recipe-web/src/routes/recipes/[id]/+page.ts +0 -24
- package/apps/recipe-web/static/favicon.svg +0 -8
- package/apps/recipe-web/static/robots.txt +0 -2
- package/apps/recipe-web/svelte.config.js +0 -35
- package/apps/recipe-web/tsconfig.json +0 -14
- package/apps/recipe-web/vite.config.ts +0 -23
- package/packages/recipe-kit-stencil/README.md +0 -185
- package/packages/recipe-kit-stencil/package-lock.json +0 -4772
- package/packages/recipe-kit-stencil/package.json +0 -91
- package/packages/recipe-kit-stencil/src/components/rk-badge/readme.md +0 -38
- package/packages/recipe-kit-stencil/src/components/rk-badge/rk-badge.tsx +0 -31
- package/packages/recipe-kit-stencil/src/components/rk-chip/readme.md +0 -52
- package/packages/recipe-kit-stencil/src/components/rk-chip/rk-chip.tsx +0 -105
- package/packages/recipe-kit-stencil/src/components/rk-empty-state/readme.md +0 -44
- package/packages/recipe-kit-stencil/src/components/rk-empty-state/rk-empty-state.tsx +0 -50
- package/packages/recipe-kit-stencil/src/components/rk-meal-slot/readme.md +0 -58
- package/packages/recipe-kit-stencil/src/components/rk-meal-slot/rk-meal-slot.tsx +0 -182
- package/packages/recipe-kit-stencil/src/components/rk-modal/readme.md +0 -57
- package/packages/recipe-kit-stencil/src/components/rk-modal/rk-modal.tsx +0 -176
- package/packages/recipe-kit-stencil/src/components/rk-rating/readme.md +0 -42
- package/packages/recipe-kit-stencil/src/components/rk-rating/rk-rating.tsx +0 -114
- package/packages/recipe-kit-stencil/src/components/rk-recipe-card/readme.md +0 -66
- package/packages/recipe-kit-stencil/src/components/rk-recipe-card/rk-recipe-card.tsx +0 -179
- package/packages/recipe-kit-stencil/src/components/rk-recipe-card/test/rk-recipe-card.spec.tsx +0 -70
- package/packages/recipe-kit-stencil/src/components/rk-search-bar/readme.md +0 -67
- package/packages/recipe-kit-stencil/src/components/rk-search-bar/rk-search-bar.tsx +0 -152
- package/packages/recipe-kit-stencil/src/components/rk-search-bar/test/rk-search-bar.spec.tsx +0 -93
- package/packages/recipe-kit-stencil/src/components/rk-segmented-control/readme.md +0 -41
- package/packages/recipe-kit-stencil/src/components/rk-segmented-control/rk-segmented-control.tsx +0 -115
- package/packages/recipe-kit-stencil/src/components/rk-tag-input/readme.md +0 -47
- package/packages/recipe-kit-stencil/src/components/rk-tag-input/rk-tag-input.tsx +0 -181
- package/packages/recipe-kit-stencil/src/components/rk-tag-input/test/rk-tag-input.spec.tsx +0 -76
- package/packages/recipe-kit-stencil/src/index.html +0 -259
- package/packages/recipe-kit-stencil/stencil.config.ts +0 -41
- package/packages/recipe-kit-stencil/tsconfig.json +0 -24
- /package/{packages/recipe-kit-stencil/LICENSE → LICENSE} +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-badge/rk-badge.css +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-chip/rk-chip.css +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-empty-state/rk-empty-state.css +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-meal-slot/rk-meal-slot.css +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-modal/rk-modal.css +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-rating/rk-rating.css +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-recipe-card/rk-recipe-card.css +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-search-bar/rk-search-bar.css +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-segmented-control/rk-segmented-control.css +0 -0
- /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-tag-input/rk-tag-input.css +0 -0
- /package/{packages/recipe-kit-stencil/src/global → dist/collection}/rk-global.css +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"file":"rk-badge_10.cjs.entry.js","mappings":"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","names":["h","Host","index"],"sources":["src/components/rk-badge/rk-badge.css?tag=rk-badge&encapsulation=shadow","src/components/rk-badge/rk-badge.tsx","src/components/rk-chip/rk-chip.css?tag=rk-chip&encapsulation=shadow","src/components/rk-chip/rk-chip.tsx","src/components/rk-empty-state/rk-empty-state.css?tag=rk-empty-state&encapsulation=shadow","src/components/rk-empty-state/rk-empty-state.tsx","src/components/rk-meal-slot/rk-meal-slot.css?tag=rk-meal-slot&encapsulation=shadow","src/components/rk-meal-slot/rk-meal-slot.tsx","src/components/rk-modal/rk-modal.css?tag=rk-modal&encapsulation=shadow","src/components/rk-modal/rk-modal.tsx","src/components/rk-rating/rk-rating.css?tag=rk-rating&encapsulation=shadow","src/components/rk-rating/rk-rating.tsx","src/components/rk-recipe-card/rk-recipe-card.css?tag=rk-recipe-card&encapsulation=shadow","src/components/rk-recipe-card/rk-recipe-card.tsx","src/components/rk-search-bar/rk-search-bar.css?tag=rk-search-bar&encapsulation=shadow","src/components/rk-search-bar/rk-search-bar.tsx","src/components/rk-segmented-control/rk-segmented-control.css?tag=rk-segmented-control&encapsulation=shadow","src/components/rk-segmented-control/rk-segmented-control.tsx","src/components/rk-tag-input/rk-tag-input.css?tag=rk-tag-input&encapsulation=shadow","src/components/rk-tag-input/rk-tag-input.tsx"],"sourcesContent":[":host {\n display: inline-flex;\n font-family: var(--rk-font);\n vertical-align: middle;\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: var(--rk-radius-pill, 999px);\n border: 1px solid transparent;\n font-size: 0.76em;\n font-weight: 650;\n line-height: 1.35;\n letter-spacing: 0.01em;\n white-space: nowrap;\n}\n\n.badge.is-small {\n padding: 2px 8px;\n font-size: 0.7em;\n}\n\n/* --- soft (default) --- */\n.variant-soft.tone-neutral {\n background: var(--rk-surface-2, #fdf5ef);\n color: var(--rk-ink-2, #52443c);\n}\n.variant-soft.tone-primary {\n background: var(--rk-primary-soft, #fdeee6);\n color: var(--rk-primary-strong, #b23c11);\n}\n.variant-soft.tone-accent {\n background: var(--rk-accent-soft, #e2f3f1);\n color: var(--rk-accent, #0f766e);\n}\n.variant-soft.tone-success {\n background: var(--rk-success-soft, #e6f5eb);\n color: var(--rk-success, #15803d);\n}\n.variant-soft.tone-warning {\n background: var(--rk-warning-soft, #fdf3d8);\n color: var(--rk-warning, #a16207);\n}\n.variant-soft.tone-danger {\n background: var(--rk-danger-soft, #fdeae1);\n color: var(--rk-danger, #c2410c);\n}\n\n/* --- solid --- */\n.variant-solid {\n color: #fff;\n}\n.variant-solid.tone-neutral {\n background: var(--rk-ink, #211a16);\n}\n.variant-solid.tone-primary {\n background: var(--rk-primary, #d94f1b);\n}\n.variant-solid.tone-accent {\n background: var(--rk-accent, #0f766e);\n}\n.variant-solid.tone-success {\n background: var(--rk-success, #15803d);\n}\n.variant-solid.tone-warning {\n background: var(--rk-warning, #a16207);\n}\n.variant-solid.tone-danger {\n background: var(--rk-danger, #c2410c);\n}\n\n/* --- outline --- */\n.variant-outline {\n background: transparent;\n}\n.variant-outline.tone-neutral {\n border-color: var(--rk-border-strong, #d9c6b8);\n color: var(--rk-ink-2, #52443c);\n}\n.variant-outline.tone-primary {\n border-color: var(--rk-primary, #d94f1b);\n color: var(--rk-primary, #d94f1b);\n}\n.variant-outline.tone-accent {\n border-color: var(--rk-accent, #0f766e);\n color: var(--rk-accent, #0f766e);\n}\n.variant-outline.tone-success {\n border-color: var(--rk-success, #15803d);\n color: var(--rk-success, #15803d);\n}\n.variant-outline.tone-warning {\n border-color: var(--rk-warning, #a16207);\n color: var(--rk-warning, #a16207);\n}\n.variant-outline.tone-danger {\n border-color: var(--rk-danger, #c2410c);\n color: var(--rk-danger, #c2410c);\n}\n","import { Component, h, Prop } from '@stencil/core';\n\n/**\n * A small, non-interactive label. Purely slot-driven so hosts can put icons,\n * text or counts inside it.\n *\n * @slot - Badge content.\n */\n@Component({\n tag: 'rk-badge',\n styleUrl: 'rk-badge.css',\n shadow: true,\n})\nexport class RkBadge {\n /** Color treatment. */\n @Prop() tone: 'neutral' | 'primary' | 'accent' | 'success' | 'warning' | 'danger' = 'neutral';\n\n /** `soft` is tinted, `solid` is filled, `outline` is bordered only. */\n @Prop() variant: 'soft' | 'solid' | 'outline' = 'soft';\n\n /** Compact sizing for dense layouts. */\n @Prop() small = false;\n\n render() {\n return (\n <span class={{ badge: true, [`tone-${this.tone}`]: true, [`variant-${this.variant}`]: true, 'is-small': this.small }} part=\"badge\">\n <slot />\n </span>\n );\n }\n}\n",":host {\n display: inline-flex;\n font-family: var(--rk-font);\n vertical-align: middle;\n}\n\n.chip,\n.body {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font: inherit;\n font-size: 0.88em;\n font-weight: 550;\n line-height: 1;\n color: var(--rk-ink-2, #52443c);\n background: var(--rk-surface, #fff);\n border: 1px solid var(--rk-border, #ecdfd4);\n border-radius: var(--rk-radius-pill, 999px);\n padding: 9px 15px;\n cursor: pointer;\n white-space: nowrap;\n transition: background var(--rk-transition), border-color var(--rk-transition), color var(--rk-transition), transform var(--rk-transition);\n}\n\n.chip:hover:not(:disabled),\n.body:hover:not(:disabled) {\n border-color: var(--rk-border-strong, #d9c6b8);\n background: var(--rk-surface-2, #fdf5ef);\n}\n\n.chip:active:not(:disabled) {\n transform: translateY(1px);\n}\n\n.chip:focus-visible,\n.body:focus-visible,\n.dismiss:focus-visible {\n outline: none;\n box-shadow: var(--rk-focus-ring);\n}\n\n.chip:disabled,\n.body:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Selected states, per tone */\n.chip.is-selected.tone-neutral {\n background: var(--rk-ink, #211a16);\n border-color: var(--rk-ink, #211a16);\n color: var(--rk-surface, #fff);\n}\n\n.chip.is-selected.tone-primary {\n background: var(--rk-primary, #d94f1b);\n border-color: var(--rk-primary, #d94f1b);\n color: #fff;\n}\n\n.chip.is-selected.tone-accent {\n background: var(--rk-accent, #0f766e);\n border-color: var(--rk-accent, #0f766e);\n color: #fff;\n}\n\n.chip.is-selected:hover:not(:disabled) {\n filter: brightness(1.08);\n}\n\n.count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: var(--rk-radius-pill, 999px);\n background: var(--rk-surface-2, #fdf5ef);\n color: var(--rk-muted, #857166);\n font-size: 0.78em;\n font-weight: 650;\n}\n\n.chip.is-selected .count {\n background: rgba(255, 255, 255, 0.22);\n color: inherit;\n}\n\n/*\n * `display: contents` lets slotted nodes become direct flex items of the chip,\n * so an *empty* leading slot contributes no box and therefore no stray gap.\n */\n.lead {\n display: contents;\n}\n\n.lead ::slotted(*) {\n font-size: 1.05em;\n line-height: 1;\n}\n\n/* Dismissible layout: shell holds two buttons that read as one pill. */\n.chip.is-dismissible {\n padding: 0;\n background: transparent;\n border: 0;\n border-radius: var(--rk-radius-pill, 999px);\n gap: 0;\n}\n\n.chip.is-dismissible .body {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-right: 0;\n}\n\n.dismiss {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n padding: 0;\n border: 1px solid var(--rk-border, #ecdfd4);\n border-left: 0;\n border-radius: 0 var(--rk-radius-pill, 999px) var(--rk-radius-pill, 999px) 0;\n background: var(--rk-surface, #fff);\n color: var(--rk-muted, #857166);\n cursor: pointer;\n transition: background var(--rk-transition), color var(--rk-transition);\n}\n\n.dismiss:hover:not(:disabled) {\n background: var(--rk-danger-soft, #fdeae1);\n color: var(--rk-danger, #c2410c);\n}\n\n.dismiss:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.dismiss svg {\n width: 12px;\n height: 12px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .chip,\n .body,\n .dismiss {\n transition: none;\n }\n}\n","import { Component, Event, EventEmitter, h, Prop } from '@stencil/core';\n\n/**\n * A selectable / dismissible filter chip.\n *\n * @slot - Optional leading content (icon, emoji, avatar) rendered before the label.\n */\n@Component({\n tag: 'rk-chip',\n styleUrl: 'rk-chip.css',\n shadow: true,\n})\nexport class RkChip {\n /** Visible text. */\n @Prop() label = '';\n\n /** Value reported back to the host application in event payloads. */\n @Prop() value?: string;\n\n /** Whether the chip is currently active. */\n @Prop() selected = false;\n\n /** Optional trailing count badge (e.g. number of matching recipes). */\n @Prop() count?: number;\n\n /** Renders an \"x\" button that emits `rkChipDismiss` instead of toggling. */\n @Prop() dismissible = false;\n\n /** Disables interaction. */\n @Prop() disabled = false;\n\n /** Visual treatment. */\n @Prop() tone: 'neutral' | 'primary' | 'accent' = 'neutral';\n\n /** Emitted when the chip is toggled. */\n @Event({ eventName: 'rkChipToggle' }) rkChipToggle!: EventEmitter<{ value: string; label: string; selected: boolean }>;\n\n /** Emitted when a dismissible chip's remove button is pressed. */\n @Event({ eventName: 'rkChipDismiss' }) rkChipDismiss!: EventEmitter<{ value: string; label: string }>;\n\n private get resolvedValue() {\n return this.value ?? this.label;\n }\n\n private handleClick = () => {\n if (this.disabled) return;\n this.rkChipToggle.emit({\n value: this.resolvedValue,\n label: this.label,\n selected: !this.selected,\n });\n };\n\n private handleDismiss = (event: MouseEvent) => {\n event.stopPropagation();\n if (this.disabled) return;\n this.rkChipDismiss.emit({ value: this.resolvedValue, label: this.label });\n };\n\n render() {\n const body = [\n <span class=\"lead\">\n <slot />\n </span>,\n <span class=\"label\" part=\"label\">\n {this.label}\n </span>,\n typeof this.count === 'number' && (\n <span class=\"count\" part=\"count\">\n {this.count}\n </span>\n ),\n ];\n\n const classes = {\n chip: true,\n 'is-selected': this.selected,\n 'is-dismissible': this.dismissible,\n [`tone-${this.tone}`]: true,\n };\n\n // A dismissible chip needs two independent controls, so the shell becomes a\n // plain element to avoid nesting buttons inside a button.\n if (this.dismissible) {\n return (\n <span class={classes} part=\"chip\">\n <button class=\"body\" type=\"button\" disabled={this.disabled} onClick={this.handleClick}>\n {body}\n </button>\n <button class=\"dismiss\" part=\"dismiss\" type=\"button\" disabled={this.disabled} aria-label={`Remove ${this.label}`} onClick={this.handleDismiss}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M18 6 6 18\" />\n </svg>\n </button>\n </span>\n );\n }\n\n return (\n <button class={classes} part=\"chip\" type=\"button\" aria-pressed={String(this.selected)} disabled={this.disabled} onClick={this.handleClick}>\n {body}\n </button>\n );\n }\n}\n",":host {\n display: block;\n font-family: var(--rk-font);\n font-size: var(--rk-font-size, 15px);\n}\n\n.empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 8px;\n padding: 52px 28px;\n border: 1.5px dashed var(--rk-border-strong, #d9c6b8);\n border-radius: var(--rk-radius-lg, 20px);\n background: var(--rk-surface-2, #fdf5ef);\n color: var(--rk-ink, #211a16);\n}\n\n.empty.is-bare {\n border: 0;\n background: transparent;\n padding: 28px 16px;\n}\n\n.empty.tone-error {\n border-color: var(--rk-danger, #c2410c);\n background: var(--rk-danger-soft, #fdeae1);\n}\n\n.icon {\n font-size: 2.5rem;\n line-height: 1;\n margin-bottom: 4px;\n}\n\n.heading {\n margin: 0;\n font-family: var(--rk-font-display, serif);\n font-size: 1.25em;\n font-weight: 650;\n letter-spacing: -0.01em;\n}\n\n.message {\n margin: 0;\n max-width: 46ch;\n color: var(--rk-muted, #857166);\n line-height: 1.55;\n font-size: 0.94em;\n}\n\n.empty.tone-error .message {\n color: var(--rk-danger, #c2410c);\n}\n\n/* `display: contents` keeps an unused actions slot from adding vertical space. */\n.actions {\n display: contents;\n}\n\n.actions ::slotted(*) {\n margin-top: 12px;\n}\n","import { Component, h, Prop } from '@stencil/core';\n\n/**\n * Placeholder shown when a list has no items, a search returns nothing, or a\n * request fails.\n *\n * @slot - Call-to-action content rendered under the message (buttons, links).\n */\n@Component({\n tag: 'rk-empty-state',\n styleUrl: 'rk-empty-state.css',\n shadow: true,\n})\nexport class RkEmptyState {\n /** Emoji or short glyph shown above the heading. */\n @Prop() icon = '🍳';\n\n /** Bold headline. */\n @Prop() heading = 'Nothing here yet';\n\n /** Supporting sentence. */\n @Prop() message?: string;\n\n /** `error` swaps to a warning treatment. */\n @Prop() tone: 'neutral' | 'error' = 'neutral';\n\n /** Removes the dashed border and reduces padding, for inline use. */\n @Prop() bare = false;\n\n render() {\n return (\n <div class={{ empty: true, [`tone-${this.tone}`]: true, 'is-bare': this.bare }} part=\"container\" role={this.tone === 'error' ? 'alert' : null}>\n <span class=\"icon\" part=\"icon\" aria-hidden=\"true\">\n {this.icon}\n </span>\n <h3 class=\"heading\" part=\"heading\">\n {this.heading}\n </h3>\n {this.message && (\n <p class=\"message\" part=\"message\">\n {this.message}\n </p>\n )}\n <div class=\"actions\" part=\"actions\">\n <slot />\n </div>\n </div>\n );\n }\n}\n",":host {\n display: block;\n font-family: var(--rk-font);\n font-size: var(--rk-font-size, 15px);\n color: var(--rk-ink, #211a16);\n}\n\n.slot {\n position: relative;\n width: 100%;\n box-sizing: border-box;\n border-radius: var(--rk-radius, 14px);\n transition: border-color var(--rk-transition), background var(--rk-transition), box-shadow var(--rk-transition);\n}\n\n/* ---------- empty ---------- */\n\n.slot.is-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 3px;\n min-height: 86px;\n padding: 12px 10px;\n border: 1.5px dashed var(--rk-border-strong, #d9c6b8);\n background: transparent;\n color: var(--rk-muted, #857166);\n font: inherit;\n cursor: pointer;\n}\n\n.slot.is-empty:hover:not(:disabled) {\n border-color: var(--rk-primary, #d94f1b);\n background: var(--rk-primary-soft, #fdeee6);\n color: var(--rk-primary-strong, #b23c11);\n}\n\n.slot.is-empty:focus-visible {\n outline: none;\n box-shadow: var(--rk-focus-ring);\n}\n\n.slot.is-empty:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.plus {\n font-size: 1.3rem;\n line-height: 1;\n font-weight: 300;\n}\n\n.empty-label {\n font-size: 0.76em;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n/* ---------- filled ---------- */\n\n.slot.is-filled {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-height: 86px;\n padding: 10px;\n border: 1px solid var(--rk-border, #ecdfd4);\n background: var(--rk-surface, #fff);\n box-shadow: var(--rk-shadow-sm);\n}\n\n.caption {\n font-size: 0.7em;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.07em;\n color: var(--rk-muted, #857166);\n}\n\n.main {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n text-align: left;\n font: inherit;\n color: inherit;\n cursor: pointer;\n border-radius: var(--rk-radius-sm, 8px);\n}\n\n.main:hover:not(:disabled) .name {\n color: var(--rk-primary, #d94f1b);\n}\n\n.main:focus-visible {\n outline: none;\n box-shadow: var(--rk-focus-ring);\n}\n\n.main:disabled {\n cursor: not-allowed;\n}\n\n.thumb {\n flex: 0 0 auto;\n width: 38px;\n height: 38px;\n border-radius: var(--rk-radius-sm, 8px);\n object-fit: cover;\n background: var(--rk-surface-2, #fdf5ef);\n}\n\n.thumb-fallback {\n display: grid;\n place-items: center;\n font-size: 1.1rem;\n}\n\n.name {\n font-size: 0.87em;\n font-weight: 600;\n line-height: 1.3;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n transition: color var(--rk-transition);\n}\n\n.extra {\n display: contents;\n}\n\n.extra ::slotted(*) {\n font-size: 0.8em;\n color: var(--rk-muted, #857166);\n}\n\n.controls {\n position: absolute;\n top: 6px;\n right: 6px;\n display: flex;\n gap: 3px;\n opacity: 0;\n transition: opacity var(--rk-transition);\n}\n\n.slot.is-filled:hover .controls,\n.slot.is-filled:focus-within .controls {\n opacity: 1;\n}\n\n.ctrl {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 1px solid var(--rk-border, #ecdfd4);\n border-radius: 50%;\n background: var(--rk-surface, #fff);\n color: var(--rk-ink-2, #52443c);\n cursor: pointer;\n box-shadow: var(--rk-shadow-sm);\n transition: background var(--rk-transition), color var(--rk-transition);\n}\n\n.ctrl:hover:not(:disabled) {\n background: var(--rk-surface-2, #fdf5ef);\n color: var(--rk-primary, #d94f1b);\n}\n\n.ctrl.is-danger:hover:not(:disabled) {\n background: var(--rk-danger-soft, #fdeae1);\n color: var(--rk-danger, #c2410c);\n}\n\n.ctrl:focus-visible {\n outline: none;\n box-shadow: var(--rk-focus-ring);\n}\n\n.ctrl:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ctrl svg {\n width: 12px;\n height: 12px;\n}\n\n/* ---------- drag & drop ---------- */\n\n.slot.is-drag-over {\n border-color: var(--rk-accent, #0f766e) !important;\n border-style: solid;\n background: var(--rk-accent-soft, #e2f3f1) !important;\n box-shadow: 0 0 0 3px rgba(15, 118, 110, 0.2);\n}\n\n/* Touch devices have no hover, so the controls stay visible. */\n@media (hover: none) {\n .controls {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .slot,\n .controls,\n .ctrl,\n .name {\n transition: none;\n }\n}\n","import { Component, Event, EventEmitter, h, Prop, State } from '@stencil/core';\n\nexport interface RkMealSlotDetail {\n day: string;\n mealType: string;\n}\n\nexport interface RkMealRecipeDetail extends RkMealSlotDetail {\n recipeId: string;\n recipeName: string;\n}\n\nexport interface RkMealDropDetail extends RkMealSlotDetail {\n /** Raw `text/plain` payload from the drag operation. */\n payload: string;\n}\n\n/**\n * One cell of the weekly planner grid: either an empty \"add\" target or a filled\n * slot showing the planned recipe. Doubles as a drop zone for drag-and-drop\n * planning.\n *\n * @slot - Extra content rendered under the recipe name (e.g. serving notes).\n */\n@Component({\n tag: 'rk-meal-slot',\n styleUrl: 'rk-meal-slot.css',\n shadow: true,\n})\nexport class RkMealSlot {\n /** Day key this slot belongs to, e.g. `monday`. Echoed in event payloads. */\n @Prop() day!: string;\n\n /** Meal type key, e.g. `breakfast`. Echoed in event payloads. */\n @Prop() mealType!: string;\n\n /** Human-readable meal label shown as the slot caption. */\n @Prop() mealLabel?: string;\n\n /** Id of the planned recipe. Empty means the slot is free. */\n @Prop() recipeId?: string;\n\n /** Title of the planned recipe. */\n @Prop() recipeName?: string;\n\n /** Thumbnail of the planned recipe. */\n @Prop() recipeImage?: string;\n\n /** Disables interaction. */\n @Prop() disabled = false;\n\n /** Emitted when an empty slot is activated — the host opens a recipe picker. */\n @Event({ eventName: 'rkMealAdd' }) rkMealAdd!: EventEmitter<RkMealSlotDetail>;\n\n /** Emitted when the planned recipe should be replaced. */\n @Event({ eventName: 'rkMealSwap' }) rkMealSwap!: EventEmitter<RkMealRecipeDetail>;\n\n /** Emitted when the planned recipe should be cleared. */\n @Event({ eventName: 'rkMealRemove' }) rkMealRemove!: EventEmitter<RkMealRecipeDetail>;\n\n /** Emitted when the planned recipe is activated — the host navigates. */\n @Event({ eventName: 'rkMealOpen' }) rkMealOpen!: EventEmitter<RkMealRecipeDetail>;\n\n /** Emitted when a recipe is dropped onto this slot. */\n @Event({ eventName: 'rkMealDrop' }) rkMealDrop!: EventEmitter<RkMealDropDetail>;\n\n @State() private dragOver = false;\n\n private get filled() {\n return !!this.recipeId;\n }\n\n private get slotDetail(): RkMealSlotDetail {\n return { day: this.day, mealType: this.mealType };\n }\n\n private get recipeDetail(): RkMealRecipeDetail {\n return { ...this.slotDetail, recipeId: this.recipeId ?? '', recipeName: this.recipeName ?? '' };\n }\n\n private handleDragOver = (event: DragEvent) => {\n if (this.disabled) return;\n // Preventing default is what marks this element as a valid drop target.\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n this.dragOver = true;\n };\n\n private handleDrop = (event: DragEvent) => {\n event.preventDefault();\n this.dragOver = false;\n if (this.disabled) return;\n const payload = event.dataTransfer?.getData('text/plain') ?? '';\n if (payload) this.rkMealDrop.emit({ ...this.slotDetail, payload });\n };\n\n render() {\n if (!this.filled) {\n return (\n <button\n class={{ slot: true, 'is-empty': true, 'is-drag-over': this.dragOver }}\n part=\"slot\"\n type=\"button\"\n disabled={this.disabled}\n aria-label={`Add a recipe for ${this.mealLabel ?? this.mealType} on ${this.day}`}\n onClick={() => this.rkMealAdd.emit(this.slotDetail)}\n onDragOver={this.handleDragOver}\n onDragLeave={() => (this.dragOver = false)}\n onDrop={this.handleDrop}\n >\n <span class=\"plus\" aria-hidden=\"true\">\n +\n </span>\n <span class=\"empty-label\">{this.mealLabel ?? this.mealType}</span>\n </button>\n );\n }\n\n return (\n <div\n class={{ slot: true, 'is-filled': true, 'is-drag-over': this.dragOver }}\n part=\"slot\"\n onDragOver={this.handleDragOver}\n onDragLeave={() => (this.dragOver = false)}\n onDrop={this.handleDrop}\n >\n {this.mealLabel && (\n <span class=\"caption\" part=\"caption\">\n {this.mealLabel}\n </span>\n )}\n\n <button\n class=\"main\"\n part=\"main\"\n type=\"button\"\n disabled={this.disabled}\n title={this.recipeName}\n onClick={() => this.rkMealOpen.emit(this.recipeDetail)}\n >\n {this.recipeImage ? (\n <img class=\"thumb\" src={this.recipeImage} alt=\"\" loading=\"lazy\" decoding=\"async\" />\n ) : (\n <span class=\"thumb thumb-fallback\" aria-hidden=\"true\">\n 🍽️\n </span>\n )}\n <span class=\"name\" part=\"name\">\n {this.recipeName}\n </span>\n </button>\n\n <div class=\"extra\">\n <slot />\n </div>\n\n <div class=\"controls\" part=\"controls\">\n <button class=\"ctrl\" type=\"button\" disabled={this.disabled} aria-label={`Replace ${this.recipeName}`} title=\"Replace\" onClick={() => this.rkMealSwap.emit(this.recipeDetail)}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 12a9 9 0 0 1 15.3-6.4L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-15.3 6.4L3 16\" />\n <path d=\"M3 21v-5h5\" />\n </svg>\n </button>\n <button\n class=\"ctrl is-danger\"\n type=\"button\"\n disabled={this.disabled}\n aria-label={`Remove ${this.recipeName} from ${this.mealLabel ?? this.mealType}`}\n title=\"Remove\"\n onClick={() => this.rkMealRemove.emit(this.recipeDetail)}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M18 6 6 18\" />\n </svg>\n </button>\n </div>\n </div>\n );\n }\n}\n",":host {\n font-family: var(--rk-font);\n font-size: var(--rk-font-size, 15px);\n color: var(--rk-ink, #211a16);\n}\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: var(--rk-z-modal, 1000);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n background: rgba(24, 17, 13, 0.5);\n backdrop-filter: blur(3px);\n animation: rk-fade-in 140ms ease-out;\n overflow-y: auto;\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n width: 100%;\n max-height: calc(100vh - 40px);\n background: var(--rk-surface, #fff);\n border-radius: var(--rk-radius-lg, 20px);\n box-shadow: var(--rk-shadow-lg);\n overflow: hidden;\n animation: rk-pop-in 180ms cubic-bezier(0.2, 0, 0.2, 1);\n}\n\n.panel:focus {\n outline: none;\n}\n\n.size-sm {\n max-width: 420px;\n}\n\n.size-md {\n max-width: 620px;\n}\n\n.size-lg {\n max-width: 880px;\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 22px 24px 16px;\n border-bottom: 1px solid var(--rk-border, #ecdfd4);\n flex: 0 0 auto;\n}\n\n.titles {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.heading {\n margin: 0;\n font-family: var(--rk-font-display, serif);\n font-size: 1.32em;\n font-weight: 650;\n letter-spacing: -0.015em;\n line-height: 1.25;\n}\n\n.subheading {\n margin: 5px 0 0;\n font-size: 0.9em;\n color: var(--rk-muted, #857166);\n line-height: 1.5;\n}\n\n.close {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: var(--rk-surface-2, #fdf5ef);\n color: var(--rk-ink-2, #52443c);\n cursor: pointer;\n transition: background var(--rk-transition), color var(--rk-transition);\n}\n\n.close:hover {\n background: var(--rk-danger-soft, #fdeae1);\n color: var(--rk-danger, #c2410c);\n}\n\n.close:focus-visible {\n outline: none;\n box-shadow: var(--rk-focus-ring);\n}\n\n.close svg {\n width: 16px;\n height: 16px;\n}\n\n.body {\n padding: 20px 24px;\n overflow-y: auto;\n flex: 1 1 auto;\n line-height: 1.6;\n}\n\n.footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n padding: 16px 24px;\n border-top: 1px solid var(--rk-border, #ecdfd4);\n background: var(--rk-surface-2, #fdf5ef);\n flex: 0 0 auto;\n}\n\n.footer.is-empty {\n display: none;\n}\n\n@keyframes rk-fade-in {\n from {\n opacity: 0;\n }\n}\n\n@keyframes rk-pop-in {\n from {\n opacity: 0;\n transform: translateY(12px) scale(0.98);\n }\n}\n\n@media (max-width: 560px) {\n .backdrop {\n padding: 0;\n align-items: flex-end;\n }\n\n .panel {\n border-radius: var(--rk-radius-lg, 20px) var(--rk-radius-lg, 20px) 0 0;\n max-height: 92vh;\n max-width: none;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .backdrop,\n .panel {\n animation: none;\n }\n}\n","import { Component, Element, Event, EventEmitter, h, Host, Prop, State, Watch } from '@stencil/core';\n\n/**\n * An accessible dialog with a backdrop, Escape handling and focus restoration.\n *\n * The component is presentational: it emits `rkModalClose` and lets the host\n * application own the `open` state.\n *\n * @slot - Dialog body.\n * @slot header - Replaces the default heading row entirely.\n * @slot footer - Action row pinned to the bottom of the dialog.\n */\n@Component({\n tag: 'rk-modal',\n styleUrl: 'rk-modal.css',\n shadow: true,\n})\nexport class RkModal {\n @Element() host!: HTMLElement;\n\n /** Controls visibility. */\n @Prop() open = false;\n\n /** Heading text for the default header. */\n @Prop() heading = '';\n\n /** Optional supporting line under the heading. */\n @Prop() subheading?: string;\n\n /** Dialog width preset. */\n @Prop() size: 'sm' | 'md' | 'lg' = 'md';\n\n /** Set to false to require an explicit action to dismiss. */\n @Prop() dismissible = true;\n\n /** Emitted when the user requests dismissal (X, backdrop or Escape). */\n @Event({ eventName: 'rkModalClose' }) rkModalClose!: EventEmitter<void>;\n\n @State() private hasFooter = false;\n\n private previouslyFocused?: HTMLElement;\n private panelEl?: HTMLElement;\n\n /** Collapses the footer region when no action row was projected into it. */\n private syncFooterSlot = () => {\n this.hasFooter = Array.from(this.host.children).some(node => node.getAttribute('slot') === 'footer');\n };\n\n @Watch('open')\n protected onOpenChange(isOpen: boolean, wasOpen: boolean) {\n if (isOpen === wasOpen) return;\n\n if (isOpen) {\n this.previouslyFocused = document.activeElement as HTMLElement;\n document.addEventListener('keydown', this.handleGlobalKeyDown);\n this.lockScroll(true);\n // Wait a frame so the panel exists before moving focus into it.\n requestAnimationFrame(() => this.focusFirst());\n } else {\n document.removeEventListener('keydown', this.handleGlobalKeyDown);\n this.lockScroll(false);\n this.previouslyFocused?.focus?.();\n this.previouslyFocused = undefined;\n }\n }\n\n componentWillLoad() {\n this.syncFooterSlot();\n }\n\n componentDidLoad() {\n if (this.open) this.onOpenChange(true, false);\n }\n\n disconnectedCallback() {\n document.removeEventListener('keydown', this.handleGlobalKeyDown);\n this.lockScroll(false);\n }\n\n private lockScroll(locked: boolean) {\n if (typeof document === 'undefined') return;\n document.documentElement.style.overflow = locked ? 'hidden' : '';\n }\n\n private focusableElements(): HTMLElement[] {\n if (!this.panelEl) return [];\n const selector = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n // Slotted content lives in the light DOM, so both trees have to be queried.\n const inShadow = Array.from(this.panelEl.querySelectorAll<HTMLElement>(selector));\n const inLight = Array.from(this.host.querySelectorAll<HTMLElement>(selector));\n return [...inShadow, ...inLight].filter(el => el.offsetParent !== null || el === document.activeElement);\n }\n\n private focusFirst() {\n const [first] = this.focusableElements();\n (first ?? this.panelEl)?.focus?.();\n }\n\n private handleGlobalKeyDown = (event: KeyboardEvent) => {\n if (!this.open) return;\n\n if (event.key === 'Escape' && this.dismissible) {\n event.preventDefault();\n this.rkModalClose.emit();\n return;\n }\n\n if (event.key === 'Tab') {\n const focusable = this.focusableElements();\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = (this.host.shadowRoot?.activeElement ?? document.activeElement) as HTMLElement;\n\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n };\n\n private handleBackdrop = (event: MouseEvent) => {\n if (!this.dismissible) return;\n if (event.target === event.currentTarget) this.rkModalClose.emit();\n };\n\n render() {\n if (!this.open) return <Host aria-hidden=\"true\" />;\n\n return (\n <Host>\n <div class=\"backdrop\" part=\"backdrop\" onClick={this.handleBackdrop}>\n <div\n class={{ panel: true, [`size-${this.size}`]: true }}\n part=\"panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={this.heading || 'Dialog'}\n tabindex={-1}\n ref={el => (this.panelEl = el)}\n >\n <header class=\"header\" part=\"header\">\n <slot name=\"header\">\n <div class=\"titles\">\n <h2 class=\"heading\" part=\"heading\">\n {this.heading}\n </h2>\n {this.subheading && <p class=\"subheading\">{this.subheading}</p>}\n </div>\n </slot>\n\n {this.dismissible && (\n <button class=\"close\" part=\"close\" type=\"button\" aria-label=\"Close dialog\" onClick={() => this.rkModalClose.emit()}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M18 6 6 18\" />\n </svg>\n </button>\n )}\n </header>\n\n <div class=\"body\" part=\"body\">\n <slot />\n </div>\n\n <footer class={{ footer: true, 'is-empty': !this.hasFooter }} part=\"footer\">\n <slot name=\"footer\" onSlotchange={this.syncFooterSlot} />\n </footer>\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n font-family: var(--rk-font);\n --rk-star-size: 18px;\n}\n\n.stars {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n border-radius: var(--rk-radius-sm, 8px);\n}\n\n.stars:not(.is-readonly) {\n cursor: pointer;\n}\n\n.stars:focus-visible {\n outline: none;\n box-shadow: var(--rk-focus-ring);\n}\n\n.star-wrap {\n display: inline-flex;\n padding: 1px;\n transition: transform var(--rk-transition);\n}\n\n.stars:not(.is-readonly) .star-wrap:hover {\n transform: scale(1.15);\n}\n\n.star {\n width: var(--rk-star-size);\n height: var(--rk-star-size);\n display: block;\n}\n\n.star-bg {\n fill: none;\n stroke: var(--rk-border-strong, #d9c6b8);\n stroke-width: 1.6;\n}\n\n.star-fg {\n fill: var(--rk-warning, #a16207);\n stroke: var(--rk-warning, #a16207);\n stroke-width: 1.2;\n}\n\n.value {\n margin-left: 7px;\n font-size: 0.85em;\n font-weight: 600;\n color: var(--rk-ink-2, #52443c);\n font-variant-numeric: tabular-nums;\n}\n\n.count {\n margin-left: 4px;\n font-weight: 500;\n color: var(--rk-muted, #857166);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .star-wrap,\n .stars:not(.is-readonly) .star-wrap:hover {\n transition: none;\n transform: none;\n }\n}\n","import { Component, Event, EventEmitter, h, Host, Prop, State } from '@stencil/core';\n\n/**\n * A star rating that works as a read-only display or an interactive input.\n */\n@Component({\n tag: 'rk-rating',\n styleUrl: 'rk-rating.css',\n shadow: true,\n})\nexport class RkRating {\n /** Current rating. Supports halves when `readonly`. */\n @Prop({ mutable: true }) value = 0;\n\n /** Number of stars. */\n @Prop() max = 5;\n\n /** When true the stars are display-only and not focusable. */\n @Prop() readonly = false;\n\n /** Star size in pixels. */\n @Prop() size = 18;\n\n /** Accessible label for the group. */\n @Prop() label = 'Rating';\n\n /** Renders the numeric value next to the stars. */\n @Prop() showValue = false;\n\n /** Optional count of ratings, rendered as \"(24)\". */\n @Prop() count?: number;\n\n /** Emitted when the user picks a new rating. */\n @Event({ eventName: 'rkRatingChange' }) rkRatingChange!: EventEmitter<number>;\n\n @State() private hovered = 0;\n\n private select(next: number) {\n if (this.readonly) return;\n // Clicking the active star clears the rating, which is the usual affordance.\n const resolved = next === this.value ? 0 : next;\n this.value = resolved;\n this.rkRatingChange.emit(resolved);\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (this.readonly) return;\n const step = event.key === 'ArrowRight' || event.key === 'ArrowUp' ? 1 : event.key === 'ArrowLeft' || event.key === 'ArrowDown' ? -1 : 0;\n if (step === 0) return;\n event.preventDefault();\n const next = Math.min(this.max, Math.max(0, Math.round(this.value) + step));\n this.value = next;\n this.rkRatingChange.emit(next);\n };\n\n render() {\n const active = this.hovered || this.value;\n const stars = Array.from({ length: Math.max(1, Math.round(this.max)) }, (_, index) => index + 1);\n\n return (\n <Host style={{ '--rk-star-size': `${this.size}px` }}>\n <div\n class={{ stars: true, 'is-readonly': this.readonly }}\n part=\"stars\"\n role={this.readonly ? 'img' : 'slider'}\n aria-label={`${this.label}: ${this.value} out of ${this.max}`}\n aria-valuenow={this.readonly ? null : String(this.value)}\n aria-valuemin={this.readonly ? null : '0'}\n aria-valuemax={this.readonly ? null : String(this.max)}\n tabindex={this.readonly ? null : 0}\n onKeyDown={this.handleKeyDown}\n onMouseLeave={() => (this.hovered = 0)}\n >\n {stars.map(star => {\n // Fractional fill only matters in read-only display mode.\n const fill = this.readonly ? Math.min(1, Math.max(0, this.value - (star - 1))) : star <= active ? 1 : 0;\n\n return (\n <span\n class=\"star-wrap\"\n key={star}\n onMouseEnter={() => !this.readonly && (this.hovered = star)}\n onClick={() => this.select(star)}\n aria-hidden=\"true\"\n >\n <svg class=\"star\" viewBox=\"0 0 24 24\">\n <path\n class=\"star-bg\"\n d=\"M12 2.6l2.86 5.98 6.54.87-4.8 4.5 1.2 6.45L12 17.3l-5.8 3.1 1.2-6.45-4.8-4.5 6.54-.87z\"\n />\n <clipPath id={`clip-${star}`}>\n <rect x=\"0\" y=\"0\" width={24 * fill} height=\"24\" />\n </clipPath>\n <path\n class=\"star-fg\"\n clip-path={`url(#clip-${star})`}\n d=\"M12 2.6l2.86 5.98 6.54.87-4.8 4.5 1.2 6.45L12 17.3l-5.8 3.1 1.2-6.45-4.8-4.5 6.54-.87z\"\n />\n </svg>\n </span>\n );\n })}\n\n {this.showValue && (\n <span class=\"value\" part=\"value\">\n {this.value ? this.value.toFixed(1) : '—'}\n {typeof this.count === 'number' && <span class=\"count\">({this.count})</span>}\n </span>\n )}\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n font-family: var(--rk-font);\n font-size: var(--rk-font-size, 15px);\n color: var(--rk-ink, #211a16);\n height: 100%;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--rk-surface, #fff);\n border: 1px solid var(--rk-border, #ecdfd4);\n border-radius: var(--rk-radius-lg, 20px);\n overflow: hidden;\n box-shadow: var(--rk-shadow-sm);\n transition: transform var(--rk-transition), box-shadow var(--rk-transition), border-color var(--rk-transition);\n}\n\n.card:hover {\n transform: translateY(-3px);\n box-shadow: var(--rk-shadow);\n border-color: var(--rk-border-strong, #d9c6b8);\n}\n\n/* ---------- media ---------- */\n\n.media {\n position: relative;\n display: block;\n aspect-ratio: 4 / 3;\n background: var(--rk-surface-2, #fdf5ef);\n overflow: hidden;\n text-decoration: none;\n}\n\n.media img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n transition: transform 420ms cubic-bezier(0.2, 0, 0.2, 1);\n}\n\n.card:hover .media img {\n transform: scale(1.045);\n}\n\n.media-fallback {\n position: absolute;\n inset: 0;\n display: grid;\n place-items: center;\n font-size: 2.6rem;\n opacity: 0.5;\n}\n\n.owned {\n position: absolute;\n left: 10px;\n bottom: 10px;\n padding: 4px 10px;\n border-radius: var(--rk-radius-pill, 999px);\n background: var(--rk-accent, #0f766e);\n color: #fff;\n font-size: 0.72em;\n font-weight: 700;\n letter-spacing: 0.03em;\n text-transform: uppercase;\n}\n\n/* ---------- favorite ---------- */\n\n.fav {\n position: absolute;\n top: 10px;\n right: 10px;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 38px;\n height: 38px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.9);\n backdrop-filter: blur(6px);\n color: var(--rk-ink-2, #52443c);\n cursor: pointer;\n box-shadow: var(--rk-shadow-sm);\n transition: background var(--rk-transition), color var(--rk-transition), transform var(--rk-transition);\n}\n\n.fav svg {\n width: 20px;\n height: 20px;\n fill: none;\n transition: fill var(--rk-transition);\n}\n\n.fav:hover {\n transform: scale(1.08);\n color: var(--rk-primary, #d94f1b);\n}\n\n.fav:focus-visible {\n outline: none;\n box-shadow: var(--rk-focus-ring);\n}\n\n.fav.is-on {\n color: var(--rk-primary, #d94f1b);\n}\n\n.fav.is-on svg {\n fill: currentColor;\n}\n\n/* ---------- body ---------- */\n\n.body {\n display: flex;\n flex-direction: column;\n gap: 7px;\n padding: 15px 16px 0;\n flex: 1 1 auto;\n}\n\n.title {\n margin: 0;\n font-family: var(--rk-font-display, serif);\n font-size: 1.12em;\n font-weight: 650;\n line-height: 1.28;\n letter-spacing: -0.01em;\n}\n\n.title a {\n color: inherit;\n text-decoration: none;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.title a:hover {\n color: var(--rk-primary, #d94f1b);\n}\n\n.title a:focus-visible {\n outline: none;\n border-radius: 4px;\n box-shadow: var(--rk-focus-ring);\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px 14px;\n margin: 0;\n font-size: 0.83em;\n color: var(--rk-muted, #857166);\n}\n\n.meta-item {\n position: relative;\n white-space: nowrap;\n}\n\n.meta-item + .meta-item::before {\n content: '';\n position: absolute;\n left: -8px;\n top: 50%;\n width: 3px;\n height: 3px;\n border-radius: 50%;\n background: currentColor;\n opacity: 0.55;\n transform: translateY(-50%);\n}\n\n.extra {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 3px;\n}\n\n/* ---------- footer ---------- */\n\n.footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 16px;\n margin-top: 12px;\n border-top: 1px solid var(--rk-border, #ecdfd4);\n}\n\n.footer ::slotted(*) {\n flex: 1 1 auto;\n}\n\n.extra.is-empty,\n.footer.is-empty {\n display: none;\n}\n\n/* Without a footer the body has to supply its own bottom padding. */\n.card:has(.footer.is-empty) .body {\n padding-bottom: 16px;\n}\n\n/* ---------- compact variant ---------- */\n\n.card.is-compact {\n flex-direction: row;\n align-items: stretch;\n border-radius: var(--rk-radius, 14px);\n}\n\n.card.is-compact:hover {\n transform: none;\n}\n\n.card.is-compact .media {\n flex: 0 0 96px;\n aspect-ratio: 1 / 1;\n}\n\n.card.is-compact .body {\n padding: 12px 14px;\n gap: 4px;\n justify-content: center;\n}\n\n.card.is-compact .title {\n font-size: 1em;\n}\n\n.card.is-compact .fav {\n width: 32px;\n height: 32px;\n top: 8px;\n right: 8px;\n}\n\n.card.is-compact .fav svg {\n width: 17px;\n height: 17px;\n}\n\n.card.is-compact .footer {\n margin-top: 0;\n border-top: 0;\n border-left: 1px solid var(--rk-border, #ecdfd4);\n padding: 12px;\n}\n\n.card.is-compact .owned {\n display: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .card,\n .card:hover,\n .media img,\n .card:hover .media img,\n .fav {\n transition: none;\n transform: none;\n }\n}\n","import { Component, Element, Event, EventEmitter, h, Prop, State } from '@stencil/core';\n\nexport interface RkRecipeCardSelectDetail {\n recipeId: string;\n name: string;\n origin: 'api' | 'custom';\n}\n\nexport interface RkFavoriteToggleDetail {\n recipeId: string;\n name: string;\n origin: 'api' | 'custom';\n /** The state the host app should move *to*. */\n favorite: boolean;\n}\n\n/**\n * The primary recipe tile used across discovery, favorites and search results.\n *\n * All data arrives as individual primitive properties rather than one object\n * prop, so the component works with plain HTML attributes in any framework.\n *\n * @slot - Extra metadata rendered under the title (badges, tags, ratings).\n * @slot actions - Buttons rendered in the card footer (e.g. \"Add to plan\").\n */\n@Component({\n tag: 'rk-recipe-card',\n styleUrl: 'rk-recipe-card.css',\n shadow: true,\n})\nexport class RkRecipeCard {\n @Element() host!: HTMLElement;\n\n /** Stable identifier echoed back in every event payload. */\n @Prop() recipeId!: string;\n\n /** Recipe title. */\n @Prop() name = '';\n\n /** Thumbnail URL. */\n @Prop() image?: string;\n\n /** Category, e.g. \"Dessert\". */\n @Prop() category?: string;\n\n /** Cuisine / region, e.g. \"Italian\". */\n @Prop() area?: string;\n\n /** Total time in minutes. Hidden when omitted. */\n @Prop() minutes?: number;\n\n /** Number of servings. Hidden when omitted. */\n @Prop() servings?: number;\n\n /** Whether this recipe is currently favorited. */\n @Prop() favorite = false;\n\n /** `custom` recipes are user-authored and get an \"Owned\" badge. */\n @Prop() origin: 'api' | 'custom' = 'api';\n\n /** Real href used for accessibility, SEO and middle-click / open-in-new-tab. */\n @Prop() href?: string;\n\n /** Renders a compact horizontal layout, for dense lists and the planner. */\n @Prop() compact = false;\n\n /** Hides the favorite button entirely (e.g. inside the planner). */\n @Prop() hideFavorite = false;\n\n /** Emitted on primary activation. The host app performs the navigation. */\n @Event({ eventName: 'rkCardSelect' }) rkCardSelect!: EventEmitter<RkRecipeCardSelectDetail>;\n\n /** Emitted when the favorite button is pressed. */\n @Event({ eventName: 'rkFavoriteToggle' }) rkFavoriteToggle!: EventEmitter<RkFavoriteToggleDetail>;\n\n @State() private imageFailed = false;\n @State() private hasExtra = false;\n @State() private hasActions = false;\n\n componentWillLoad() {\n this.syncSlots();\n }\n\n /**\n * Slot content is optional, and an empty wrapper would still paint padding and\n * a border. Tracking what was actually projected lets the card collapse those\n * regions instead. Re-run on `slotchange` so framework-driven updates count.\n */\n private syncSlots = () => {\n const elements = Array.from(this.host.children);\n this.hasActions = elements.some(node => node.getAttribute('slot') === 'actions');\n this.hasExtra =\n elements.some(node => !node.hasAttribute('slot')) ||\n Array.from(this.host.childNodes).some(node => node.nodeType === Node.TEXT_NODE && (node.textContent ?? '').trim() !== '');\n };\n\n private get detail(): RkRecipeCardSelectDetail {\n return { recipeId: this.recipeId, name: this.name, origin: this.origin };\n }\n\n private handleSelect = (event: MouseEvent) => {\n // Let the browser handle modified clicks so \"open in new tab\" keeps working.\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0) {\n return;\n }\n event.preventDefault();\n this.rkCardSelect.emit(this.detail);\n };\n\n private handleFavorite = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.rkFavoriteToggle.emit({ ...this.detail, favorite: !this.favorite });\n };\n\n render() {\n const showImage = this.image && !this.imageFailed;\n const href = this.href ?? `#${this.recipeId}`;\n\n return (\n <article class={{ card: true, 'is-compact': this.compact }} part=\"card\">\n <a class=\"media\" part=\"media\" href={href} tabindex={-1} aria-hidden=\"true\" onClick={this.handleSelect}>\n {showImage ? (\n <img src={this.image} alt=\"\" loading=\"lazy\" decoding=\"async\" onError={() => (this.imageFailed = true)} />\n ) : (\n <span class=\"media-fallback\" aria-hidden=\"true\">\n 🍲\n </span>\n )}\n\n {this.origin === 'custom' && (\n <span class=\"owned\" part=\"owned-badge\">\n Yours\n </span>\n )}\n </a>\n\n {!this.hideFavorite && (\n <button\n class={{ fav: true, 'is-on': this.favorite }}\n part=\"favorite-button\"\n type=\"button\"\n onClick={this.handleFavorite}\n aria-pressed={String(this.favorite)}\n aria-label={this.favorite ? `Remove ${this.name} from favorites` : `Add ${this.name} to favorites`}\n title={this.favorite ? 'Remove from favorites' : 'Add to favorites'}\n >\n <svg viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 20.5 4.6 13.3a4.7 4.7 0 0 1 0-6.7 4.7 4.7 0 0 1 6.7 0l.7.7.7-.7a4.7 4.7 0 0 1 6.7 0 4.7 4.7 0 0 1 0 6.7Z\" />\n </svg>\n </button>\n )}\n\n <div class=\"body\" part=\"body\">\n <h3 class=\"title\" part=\"title\">\n <a href={href} onClick={this.handleSelect}>\n {this.name}\n </a>\n </h3>\n\n <p class=\"meta\" part=\"meta\">\n {this.category && <span class=\"meta-item\">{this.category}</span>}\n {this.area && <span class=\"meta-item\">{this.area}</span>}\n {this.minutes > 0 && <span class=\"meta-item\">{this.minutes} min</span>}\n {this.servings > 0 && <span class=\"meta-item\">Serves {this.servings}</span>}\n </p>\n\n <div class={{ extra: true, 'is-empty': !this.hasExtra }} part=\"extra\">\n <slot onSlotchange={this.syncSlots} />\n </div>\n </div>\n\n <footer class={{ footer: true, 'is-empty': !this.hasActions }} part=\"footer\">\n <slot name=\"actions\" onSlotchange={this.syncSlots} />\n </footer>\n </article>\n );\n }\n}\n",":host {\n display: block;\n font-family: var(--rk-font);\n font-size: var(--rk-font-size, 15px);\n color: var(--rk-ink, #211a16);\n}\n\n.shell {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 0 10px 0 14px;\n min-height: 52px;\n background: var(--rk-surface, #fff);\n border: 1px solid var(--rk-border, #ecdfd4);\n border-radius: var(--rk-radius-pill, 999px);\n box-shadow: var(--rk-shadow-sm);\n transition: border-color var(--rk-transition), box-shadow var(--rk-transition);\n}\n\n.shell.is-focused {\n border-color: var(--rk-primary, #d94f1b);\n box-shadow: var(--rk-focus-ring);\n}\n\n.shell.is-disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.icon {\n display: inline-flex;\n flex: 0 0 auto;\n color: var(--rk-muted, #857166);\n}\n\n.icon svg {\n width: 20px;\n height: 20px;\n}\n\n.input {\n flex: 1 1 auto;\n min-width: 0;\n border: 0;\n outline: none;\n background: transparent;\n font: inherit;\n color: inherit;\n padding: 14px 0;\n appearance: none;\n}\n\n.input::placeholder {\n color: var(--rk-muted, #857166);\n opacity: 0.9;\n}\n\n/* Hide the native WebKit clear affordance — we render our own. */\n.input::-webkit-search-cancel-button,\n.input::-webkit-search-decoration {\n appearance: none;\n display: none;\n}\n\n.clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 30px;\n height: 30px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: var(--rk-surface-2, #fdf5ef);\n color: var(--rk-ink-2, #52443c);\n cursor: pointer;\n transition: background var(--rk-transition), color var(--rk-transition);\n}\n\n.clear:hover {\n background: var(--rk-primary-soft, #fdeee6);\n color: var(--rk-primary, #d94f1b);\n}\n\n.clear:focus-visible {\n outline: none;\n box-shadow: var(--rk-focus-ring);\n}\n\n.clear svg {\n width: 15px;\n height: 15px;\n}\n\n.spinner {\n flex: 0 0 auto;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 2px solid var(--rk-border-strong, #d9c6b8);\n border-top-color: var(--rk-primary, #d94f1b);\n animation: rk-spin 700ms linear infinite;\n}\n\n@keyframes rk-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/*\n * `display: contents` promotes slotted controls to flex items of `.shell`, so an\n * empty `actions` slot leaves no stray box (and no stray gap) behind.\n */\n.actions {\n display: contents;\n}\n\n.actions ::slotted(*) {\n flex: 0 0 auto;\n}\n\n.hint {\n margin: 8px 0 0;\n padding-left: 16px;\n font-size: 0.82em;\n color: var(--rk-muted, #857166);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner {\n animation-duration: 2s;\n }\n\n .shell,\n .clear {\n transition: none;\n }\n}\n","import { Component, Event, EventEmitter, h, Host, Method, Prop, State, Watch } from '@stencil/core';\n\n/**\n * A debounced search input with a clear affordance and a slot for extra controls.\n *\n * @slot actions - Rendered to the right of the input, inside the field shell.\n * Useful for a \"filters\" toggle or a sort control.\n */\n@Component({\n tag: 'rk-search-bar',\n styleUrl: 'rk-search-bar.css',\n shadow: true,\n})\nexport class RkSearchBar {\n /** Current text in the field. Two-way: updated as the user types. */\n @Prop({ mutable: true }) value = '';\n\n /** Placeholder shown when the field is empty. */\n @Prop() placeholder = 'Search recipes, ingredients, cuisines…';\n\n /** Accessible label for the input. */\n @Prop() label = 'Search recipes';\n\n /** Milliseconds to wait after the last keystroke before emitting `rkSearch`. */\n @Prop() debounce = 350;\n\n /** Disables the whole control. */\n @Prop() disabled = false;\n\n /** Shows a busy indicator (e.g. while the app is fetching results). */\n @Prop() loading = false;\n\n /** Optional helper text rendered under the field. */\n @Prop() hint?: string;\n\n /** Emitted with the (trimmed) query after the debounce window, or on submit. */\n @Event({ eventName: 'rkSearch' }) rkSearch!: EventEmitter<string>;\n\n /** Emitted when the user clears the field with the clear button or Escape. */\n @Event({ eventName: 'rkClear' }) rkClear!: EventEmitter<void>;\n\n @State() private focused = false;\n\n private inputEl?: HTMLInputElement;\n private timer?: ReturnType<typeof setTimeout>;\n\n @Watch('value')\n protected onValueChange(next: string, prev: string) {\n // Keep the DOM input in sync when the value is driven from the outside.\n if (this.inputEl && this.inputEl.value !== next && next !== prev) {\n this.inputEl.value = next ?? '';\n }\n }\n\n disconnectedCallback() {\n clearTimeout(this.timer);\n }\n\n /** Programmatically focus the input. */\n @Method()\n async setFocus() {\n this.inputEl?.focus();\n }\n\n private emit(query: string) {\n clearTimeout(this.timer);\n this.rkSearch.emit(query.trim());\n }\n\n private handleInput = (event: Event) => {\n const next = (event.target as HTMLInputElement).value;\n this.value = next;\n clearTimeout(this.timer);\n this.timer = setTimeout(() => this.emit(next), Math.max(0, this.debounce));\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.emit(this.value);\n } else if (event.key === 'Escape' && this.value) {\n event.preventDefault();\n this.handleClear();\n }\n };\n\n private handleClear = () => {\n clearTimeout(this.timer);\n this.value = '';\n if (this.inputEl) this.inputEl.value = '';\n this.rkClear.emit();\n this.rkSearch.emit('');\n this.inputEl?.focus();\n };\n\n render() {\n const hasValue = (this.value ?? '').length > 0;\n\n return (\n <Host>\n <div class={{ shell: true, 'is-focused': this.focused, 'is-disabled': this.disabled }} part=\"shell\">\n <span class=\"icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m20 20-3.5-3.5\" />\n </svg>\n </span>\n\n <input\n ref={el => (this.inputEl = el)}\n class=\"input\"\n part=\"input\"\n type=\"search\"\n value={this.value}\n placeholder={this.placeholder}\n aria-label={this.label}\n aria-busy={this.loading ? 'true' : 'false'}\n disabled={this.disabled}\n autocomplete=\"off\"\n autocapitalize=\"off\"\n spellcheck={false}\n enterkeyhint=\"search\"\n onInput={this.handleInput}\n onKeyDown={this.handleKeyDown}\n onFocus={() => (this.focused = true)}\n onBlur={() => (this.focused = false)}\n />\n\n {this.loading && <span class=\"spinner\" part=\"spinner\" aria-hidden=\"true\" />}\n\n {hasValue && !this.loading && (\n <button class=\"clear\" part=\"clear\" type=\"button\" onClick={this.handleClear} aria-label=\"Clear search\" disabled={this.disabled}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M18 6 6 18\" />\n </svg>\n </button>\n )}\n\n <span class=\"actions\" part=\"actions\">\n <slot name=\"actions\" />\n </span>\n </div>\n\n {this.hint && (\n <p class=\"hint\" part=\"hint\">\n {this.hint}\n </p>\n )}\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n font-family: var(--rk-font);\n font-size: var(--rk-font-size, 15px);\n max-width: 100%;\n}\n\n.group {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 3px;\n background: var(--rk-surface-2, #fdf5ef);\n border: 1px solid var(--rk-border, #ecdfd4);\n border-radius: var(--rk-radius-pill, 999px);\n max-width: 100%;\n overflow-x: auto;\n scrollbar-width: none;\n}\n\n.group::-webkit-scrollbar {\n display: none;\n}\n\n.group.is-stretch {\n display: flex;\n width: 100%;\n}\n\n.segment {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex: 0 0 auto;\n padding: 8px 16px;\n border: 0;\n border-radius: var(--rk-radius-pill, 999px);\n background: transparent;\n color: var(--rk-ink-2, #52443c);\n font: inherit;\n font-size: 0.88em;\n font-weight: 550;\n line-height: 1;\n white-space: nowrap;\n cursor: pointer;\n transition: background var(--rk-transition), color var(--rk-transition), box-shadow var(--rk-transition);\n}\n\n.group.is-stretch .segment {\n flex: 1 1 0;\n justify-content: center;\n}\n\n.segment:hover:not(:disabled):not(.is-selected) {\n background: rgba(0, 0, 0, 0.04);\n color: var(--rk-ink, #211a16);\n}\n\n.segment:focus-visible {\n outline: none;\n box-shadow: var(--rk-focus-ring);\n}\n\n.segment.is-selected {\n background: var(--rk-surface, #fff);\n color: var(--rk-ink, #211a16);\n box-shadow: var(--rk-shadow-sm);\n font-weight: 650;\n}\n\n.segment:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.count {\n font-size: 0.85em;\n font-weight: 650;\n color: var(--rk-muted, #857166);\n font-variant-numeric: tabular-nums;\n}\n\n.segment.is-selected .count {\n color: var(--rk-primary, #d94f1b);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .segment {\n transition: none;\n }\n}\n","import { Component, Event, EventEmitter, h, Prop, Watch } from '@stencil/core';\n\nexport interface RkSegmentOption {\n label: string;\n value: string;\n /** Optional trailing count, e.g. number of items in that segment. */\n count?: number;\n disabled?: boolean;\n}\n\n/**\n * A single-select segmented control, used for sorting and view switching.\n *\n * `options` is a complex property. Frameworks should assign it as a DOM\n * property; for plain HTML it also accepts a JSON string attribute.\n */\n@Component({\n tag: 'rk-segmented-control',\n styleUrl: 'rk-segmented-control.css',\n shadow: true,\n})\nexport class RkSegmentedControl {\n /** The available segments. Accepts an array or a JSON-encoded string. */\n @Prop() options: RkSegmentOption[] | string = [];\n\n /** The value of the selected segment. */\n @Prop({ mutable: true }) value?: string;\n\n /** Accessible label for the group. */\n @Prop() label = 'View options';\n\n /** Stretches the control to fill its container. */\n @Prop() stretch = false;\n\n /** Emitted with the newly selected value. */\n @Event({ eventName: 'rkSegmentChange' }) rkSegmentChange!: EventEmitter<string>;\n\n private parsed: RkSegmentOption[] = [];\n\n @Watch('options')\n protected onOptionsChange() {\n this.parseOptions();\n }\n\n componentWillLoad() {\n this.parseOptions();\n }\n\n /**\n * Attributes can only carry strings, so a JSON payload is accepted as a\n * fallback for consumers that cannot set DOM properties.\n */\n private parseOptions() {\n if (Array.isArray(this.options)) {\n this.parsed = this.options;\n return;\n }\n if (typeof this.options === 'string' && this.options.trim()) {\n try {\n const decoded = JSON.parse(this.options);\n this.parsed = Array.isArray(decoded) ? decoded : [];\n } catch {\n console.warn('[rk-segmented-control] `options` is not valid JSON:', this.options);\n this.parsed = [];\n }\n return;\n }\n this.parsed = [];\n }\n\n private select(option: RkSegmentOption) {\n if (option.disabled || option.value === this.value) return;\n this.value = option.value;\n this.rkSegmentChange.emit(option.value);\n }\n\n private handleKeyDown = (event: KeyboardEvent, index: number) => {\n const step = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0;\n if (step === 0) return;\n event.preventDefault();\n\n const items = this.parsed.filter(option => !option.disabled);\n if (items.length === 0) return;\n const currentIndex = items.indexOf(this.parsed[index]);\n const next = items[(currentIndex + step + items.length) % items.length];\n this.select(next);\n };\n\n render() {\n return (\n <div class={{ group: true, 'is-stretch': this.stretch }} part=\"group\" role=\"tablist\" aria-label={this.label}>\n {this.parsed.map((option, index) => {\n const selected = option.value === this.value;\n return (\n <button\n key={option.value}\n class={{ segment: true, 'is-selected': selected }}\n part={selected ? 'segment segment-selected' : 'segment'}\n type=\"button\"\n role=\"tab\"\n aria-selected={String(selected)}\n disabled={option.disabled}\n tabindex={selected ? 0 : -1}\n onClick={() => this.select(option)}\n onKeyDown={event => this.handleKeyDown(event, index)}\n >\n {option.label}\n {typeof option.count === 'number' && <span class=\"count\">{option.count}</span>}\n </button>\n );\n })}\n </div>\n );\n }\n}\n",":host {\n display: block;\n font-family: var(--rk-font);\n font-size: var(--rk-font-size, 15px);\n color: var(--rk-ink, #211a16);\n}\n\n.label {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n margin-bottom: 7px;\n font-size: 0.88em;\n font-weight: 600;\n color: var(--rk-ink-2, #52443c);\n cursor: text;\n}\n\n.counter {\n font-size: 0.88em;\n font-weight: 500;\n color: var(--rk-muted, #857166);\n font-variant-numeric: tabular-nums;\n}\n\n.shell {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n padding: 8px 10px;\n min-height: 46px;\n background: var(--rk-surface, #fff);\n border: 1px solid var(--rk-border, #ecdfd4);\n border-radius: var(--rk-radius, 14px);\n cursor: text;\n transition: border-color var(--rk-transition), box-shadow var(--rk-transition);\n}\n\n.shell:focus-within {\n border-color: var(--rk-primary, #d94f1b);\n box-shadow: var(--rk-focus-ring);\n}\n\n.shell.has-error {\n border-color: var(--rk-danger, #c2410c);\n}\n\n.shell.has-error:focus-within {\n box-shadow: 0 0 0 3px rgba(194, 65, 12, 0.24);\n}\n\n.shell.is-disabled {\n opacity: 0.6;\n cursor: not-allowed;\n background: var(--rk-surface-2, #fdf5ef);\n}\n\n.tag {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 4px 4px 4px 11px;\n border-radius: var(--rk-radius-pill, 999px);\n background: var(--rk-primary-soft, #fdeee6);\n color: var(--rk-primary-strong, #b23c11);\n font-size: 0.85em;\n font-weight: 600;\n max-width: 100%;\n}\n\n.tag-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tag-remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 19px;\n height: 19px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: transparent;\n color: inherit;\n cursor: pointer;\n opacity: 0.7;\n transition: background var(--rk-transition), opacity var(--rk-transition);\n}\n\n.tag-remove:hover:not(:disabled) {\n opacity: 1;\n background: rgba(178, 60, 17, 0.16);\n}\n\n.tag-remove:focus-visible {\n outline: none;\n opacity: 1;\n box-shadow: var(--rk-focus-ring);\n}\n\n.tag-remove:disabled {\n cursor: not-allowed;\n}\n\n.tag-remove svg {\n width: 10px;\n height: 10px;\n}\n\n.entry {\n flex: 1 1 120px;\n min-width: 110px;\n border: 0;\n outline: none;\n background: transparent;\n font: inherit;\n color: inherit;\n padding: 5px 2px;\n}\n\n.entry::placeholder {\n color: var(--rk-muted, #857166);\n}\n\n.entry:disabled {\n cursor: not-allowed;\n}\n\n.error {\n margin: 7px 0 0;\n font-size: 0.84em;\n color: var(--rk-danger, #c2410c);\n font-weight: 550;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .shell,\n .tag-remove {\n transition: none;\n }\n}\n","import { Component, Event, EventEmitter, h, Host, Prop, State, Watch } from '@stencil/core';\n\n/**\n * A tag / token editor used for recipe tags and free-form ingredient lists.\n *\n * `values` is an array property — the SvelteKit app assigns it as a DOM\n * property. A JSON-encoded or comma-separated string attribute also works.\n */\n@Component({\n tag: 'rk-tag-input',\n styleUrl: 'rk-tag-input.css',\n shadow: true,\n})\nexport class RkTagInput {\n /** Current tags. Array, JSON string, or comma-separated string. */\n @Prop() values: string[] | string = [];\n\n /** Placeholder for the entry field. */\n @Prop() placeholder = 'Add a tag and press Enter';\n\n /** Visible field label. */\n @Prop() label?: string;\n\n /** Maximum number of tags. `0` means unlimited. */\n @Prop() maxTags = 0;\n\n /** Prevent editing. */\n @Prop() disabled = false;\n\n /** Validation message rendered under the field. */\n @Prop() error?: string;\n\n /** Emitted with the full, updated list whenever tags change. */\n @Event({ eventName: 'rkTagsChange' }) rkTagsChange!: EventEmitter<string[]>;\n\n @State() private draft = '';\n @State() private tags: string[] = [];\n\n private inputEl?: HTMLInputElement;\n\n @Watch('values')\n protected onValuesChange() {\n this.syncTags();\n }\n\n componentWillLoad() {\n this.syncTags();\n }\n\n private syncTags() {\n const incoming = this.values;\n if (Array.isArray(incoming)) {\n this.tags = incoming.filter(tag => typeof tag === 'string');\n return;\n }\n if (typeof incoming === 'string' && incoming.trim()) {\n const trimmed = incoming.trim();\n if (trimmed.startsWith('[')) {\n try {\n const decoded = JSON.parse(trimmed);\n this.tags = Array.isArray(decoded) ? decoded.map(String) : [];\n return;\n } catch {\n /* fall through to comma parsing */\n }\n }\n this.tags = trimmed\n .split(',')\n .map(tag => tag.trim())\n .filter(Boolean);\n return;\n }\n this.tags = [];\n }\n\n private get atCapacity() {\n return this.maxTags > 0 && this.tags.length >= this.maxTags;\n }\n\n private commit(next: string[]) {\n this.tags = next;\n this.rkTagsChange.emit([...next]);\n }\n\n private addDraft() {\n const candidates = this.draft\n .split(',')\n .map(tag => tag.trim())\n .filter(Boolean);\n if (candidates.length === 0) return;\n\n const next = [...this.tags];\n for (const candidate of candidates) {\n if (this.maxTags > 0 && next.length >= this.maxTags) break;\n // Case-insensitive de-duplication keeps \"Vegan\" and \"vegan\" from coexisting.\n if (next.some(tag => tag.toLowerCase() === candidate.toLowerCase())) continue;\n next.push(candidate);\n }\n\n this.draft = '';\n if (next.length !== this.tags.length) this.commit(next);\n }\n\n private removeAt(index: number) {\n this.commit(this.tags.filter((_, position) => position !== index));\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault();\n this.addDraft();\n } else if (event.key === 'Backspace' && this.draft === '' && this.tags.length > 0) {\n event.preventDefault();\n this.removeAt(this.tags.length - 1);\n }\n };\n\n render() {\n return (\n <Host>\n {this.label && (\n <label class=\"label\" part=\"label\" onClick={() => this.inputEl?.focus()}>\n {this.label}\n {this.maxTags > 0 && (\n <span class=\"counter\">\n {this.tags.length}/{this.maxTags}\n </span>\n )}\n </label>\n )}\n\n <div\n class={{ shell: true, 'is-disabled': this.disabled, 'has-error': !!this.error }}\n part=\"shell\"\n onClick={() => !this.disabled && this.inputEl?.focus()}\n >\n {this.tags.map((tag, index) => (\n <span class=\"tag\" part=\"tag\" key={`${tag}-${index}`}>\n <span class=\"tag-text\">{tag}</span>\n <button\n class=\"tag-remove\"\n type=\"button\"\n aria-label={`Remove ${tag}`}\n disabled={this.disabled}\n onClick={event => {\n event.stopPropagation();\n this.removeAt(index);\n }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M18 6 6 18\" />\n </svg>\n </button>\n </span>\n ))}\n\n <input\n ref={el => (this.inputEl = el)}\n class=\"entry\"\n part=\"input\"\n type=\"text\"\n value={this.draft}\n placeholder={this.tags.length === 0 ? this.placeholder : this.atCapacity ? '' : 'Add another…'}\n aria-label={this.label ?? 'Add a tag'}\n disabled={this.disabled || this.atCapacity}\n autocomplete=\"off\"\n onInput={event => (this.draft = (event.target as HTMLInputElement).value)}\n onKeyDown={this.handleKeyDown}\n onBlur={() => this.addDraft()}\n />\n </div>\n\n {this.error && (\n <p class=\"error\" part=\"error\" role=\"alert\">\n {this.error}\n </p>\n )}\n </Host>\n );\n }\n}\n"],"version":3}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"entries": [
|
|
3
|
+
"components/rk-meal-slot/rk-meal-slot.js",
|
|
4
|
+
"components/rk-recipe-card/rk-recipe-card.js",
|
|
5
|
+
"components/rk-segmented-control/rk-segmented-control.js",
|
|
6
|
+
"components/rk-badge/rk-badge.js",
|
|
7
|
+
"components/rk-chip/rk-chip.js",
|
|
8
|
+
"components/rk-empty-state/rk-empty-state.js",
|
|
9
|
+
"components/rk-modal/rk-modal.js",
|
|
10
|
+
"components/rk-rating/rk-rating.js",
|
|
11
|
+
"components/rk-search-bar/rk-search-bar.js",
|
|
12
|
+
"components/rk-tag-input/rk-tag-input.js"
|
|
13
|
+
],
|
|
14
|
+
"mixins": [],
|
|
15
|
+
"compiler": {
|
|
16
|
+
"name": "@stencil/core",
|
|
17
|
+
"version": "4.44.1",
|
|
18
|
+
"typescriptVersion": "5.8.3"
|
|
19
|
+
},
|
|
20
|
+
"collections": [],
|
|
21
|
+
"bundles": []
|
|
22
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { h } from "@stencil/core";
|
|
2
|
+
/**
|
|
3
|
+
* A small, non-interactive label. Purely slot-driven so hosts can put icons,
|
|
4
|
+
* text or counts inside it.
|
|
5
|
+
*
|
|
6
|
+
* @slot - Badge content.
|
|
7
|
+
*/
|
|
8
|
+
export class RkBadge {
|
|
9
|
+
constructor() {
|
|
10
|
+
/** Color treatment. */
|
|
11
|
+
this.tone = 'neutral';
|
|
12
|
+
/** `soft` is tinted, `solid` is filled, `outline` is bordered only. */
|
|
13
|
+
this.variant = 'soft';
|
|
14
|
+
/** Compact sizing for dense layouts. */
|
|
15
|
+
this.small = false;
|
|
16
|
+
}
|
|
17
|
+
render() {
|
|
18
|
+
return (h("span", { key: '874569517e9ef5f7eeeac3435437d7c9671f3017', class: { badge: true, [`tone-${this.tone}`]: true, [`variant-${this.variant}`]: true, 'is-small': this.small }, part: "badge" }, h("slot", { key: '8dbd64b3916c73bc377c3e4153daaf88f339e5d1' })));
|
|
19
|
+
}
|
|
20
|
+
static get is() { return "rk-badge"; }
|
|
21
|
+
static get encapsulation() { return "shadow"; }
|
|
22
|
+
static get originalStyleUrls() {
|
|
23
|
+
return {
|
|
24
|
+
"$": ["rk-badge.css"]
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
static get styleUrls() {
|
|
28
|
+
return {
|
|
29
|
+
"$": ["rk-badge.css"]
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
static get properties() {
|
|
33
|
+
return {
|
|
34
|
+
"tone": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"mutable": false,
|
|
37
|
+
"complexType": {
|
|
38
|
+
"original": "'neutral' | 'primary' | 'accent' | 'success' | 'warning' | 'danger'",
|
|
39
|
+
"resolved": "\"accent\" | \"danger\" | \"neutral\" | \"primary\" | \"success\" | \"warning\"",
|
|
40
|
+
"references": {}
|
|
41
|
+
},
|
|
42
|
+
"required": false,
|
|
43
|
+
"optional": false,
|
|
44
|
+
"docs": {
|
|
45
|
+
"tags": [],
|
|
46
|
+
"text": "Color treatment."
|
|
47
|
+
},
|
|
48
|
+
"getter": false,
|
|
49
|
+
"setter": false,
|
|
50
|
+
"reflect": false,
|
|
51
|
+
"attribute": "tone",
|
|
52
|
+
"defaultValue": "'neutral'"
|
|
53
|
+
},
|
|
54
|
+
"variant": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"mutable": false,
|
|
57
|
+
"complexType": {
|
|
58
|
+
"original": "'soft' | 'solid' | 'outline'",
|
|
59
|
+
"resolved": "\"outline\" | \"soft\" | \"solid\"",
|
|
60
|
+
"references": {}
|
|
61
|
+
},
|
|
62
|
+
"required": false,
|
|
63
|
+
"optional": false,
|
|
64
|
+
"docs": {
|
|
65
|
+
"tags": [],
|
|
66
|
+
"text": "`soft` is tinted, `solid` is filled, `outline` is bordered only."
|
|
67
|
+
},
|
|
68
|
+
"getter": false,
|
|
69
|
+
"setter": false,
|
|
70
|
+
"reflect": false,
|
|
71
|
+
"attribute": "variant",
|
|
72
|
+
"defaultValue": "'soft'"
|
|
73
|
+
},
|
|
74
|
+
"small": {
|
|
75
|
+
"type": "boolean",
|
|
76
|
+
"mutable": false,
|
|
77
|
+
"complexType": {
|
|
78
|
+
"original": "boolean",
|
|
79
|
+
"resolved": "boolean",
|
|
80
|
+
"references": {}
|
|
81
|
+
},
|
|
82
|
+
"required": false,
|
|
83
|
+
"optional": false,
|
|
84
|
+
"docs": {
|
|
85
|
+
"tags": [],
|
|
86
|
+
"text": "Compact sizing for dense layouts."
|
|
87
|
+
},
|
|
88
|
+
"getter": false,
|
|
89
|
+
"setter": false,
|
|
90
|
+
"reflect": false,
|
|
91
|
+
"attribute": "small",
|
|
92
|
+
"defaultValue": "false"
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=rk-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rk-badge.js","sourceRoot":"","sources":["../../../src/components/rk-badge/rk-badge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;GAKG;AAMH,MAAM,OAAO,OAAO;IALpB;QAME,uBAAuB;QACf,SAAI,GAAwE,SAAS,CAAC;QAE9F,uEAAuE;QAC/D,YAAO,GAAiC,MAAM,CAAC;QAEvD,wCAAwC;QAChC,UAAK,GAAG,KAAK,CAAC;KASvB;IAPC,MAAM;QACJ,OAAO,CACL,6DAAM,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAC,OAAO;YAChI,8DAAQ,CACH,CACR,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, h, Prop } from '@stencil/core';\n\n/**\n * A small, non-interactive label. Purely slot-driven so hosts can put icons,\n * text or counts inside it.\n *\n * @slot - Badge content.\n */\n@Component({\n tag: 'rk-badge',\n styleUrl: 'rk-badge.css',\n shadow: true,\n})\nexport class RkBadge {\n /** Color treatment. */\n @Prop() tone: 'neutral' | 'primary' | 'accent' | 'success' | 'warning' | 'danger' = 'neutral';\n\n /** `soft` is tinted, `solid` is filled, `outline` is bordered only. */\n @Prop() variant: 'soft' | 'solid' | 'outline' = 'soft';\n\n /** Compact sizing for dense layouts. */\n @Prop() small = false;\n\n render() {\n return (\n <span class={{ badge: true, [`tone-${this.tone}`]: true, [`variant-${this.variant}`]: true, 'is-small': this.small }} part=\"badge\">\n <slot />\n </span>\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { h } from "@stencil/core";
|
|
2
|
+
/**
|
|
3
|
+
* A selectable / dismissible filter chip.
|
|
4
|
+
*
|
|
5
|
+
* @slot - Optional leading content (icon, emoji, avatar) rendered before the label.
|
|
6
|
+
*/
|
|
7
|
+
export class RkChip {
|
|
8
|
+
constructor() {
|
|
9
|
+
/** Visible text. */
|
|
10
|
+
this.label = '';
|
|
11
|
+
/** Whether the chip is currently active. */
|
|
12
|
+
this.selected = false;
|
|
13
|
+
/** Renders an "x" button that emits `rkChipDismiss` instead of toggling. */
|
|
14
|
+
this.dismissible = false;
|
|
15
|
+
/** Disables interaction. */
|
|
16
|
+
this.disabled = false;
|
|
17
|
+
/** Visual treatment. */
|
|
18
|
+
this.tone = 'neutral';
|
|
19
|
+
this.handleClick = () => {
|
|
20
|
+
if (this.disabled)
|
|
21
|
+
return;
|
|
22
|
+
this.rkChipToggle.emit({
|
|
23
|
+
value: this.resolvedValue,
|
|
24
|
+
label: this.label,
|
|
25
|
+
selected: !this.selected,
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
this.handleDismiss = (event) => {
|
|
29
|
+
event.stopPropagation();
|
|
30
|
+
if (this.disabled)
|
|
31
|
+
return;
|
|
32
|
+
this.rkChipDismiss.emit({ value: this.resolvedValue, label: this.label });
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
get resolvedValue() {
|
|
36
|
+
return this.value ?? this.label;
|
|
37
|
+
}
|
|
38
|
+
render() {
|
|
39
|
+
const body = [
|
|
40
|
+
h("span", { class: "lead" }, h("slot", null)),
|
|
41
|
+
h("span", { class: "label", part: "label" }, this.label),
|
|
42
|
+
typeof this.count === 'number' && (h("span", { class: "count", part: "count" }, this.count)),
|
|
43
|
+
];
|
|
44
|
+
const classes = {
|
|
45
|
+
chip: true,
|
|
46
|
+
'is-selected': this.selected,
|
|
47
|
+
'is-dismissible': this.dismissible,
|
|
48
|
+
[`tone-${this.tone}`]: true,
|
|
49
|
+
};
|
|
50
|
+
// A dismissible chip needs two independent controls, so the shell becomes a
|
|
51
|
+
// plain element to avoid nesting buttons inside a button.
|
|
52
|
+
if (this.dismissible) {
|
|
53
|
+
return (h("span", { class: classes, part: "chip" }, h("button", { class: "body", type: "button", disabled: this.disabled, onClick: this.handleClick }, body), h("button", { class: "dismiss", part: "dismiss", type: "button", disabled: this.disabled, "aria-label": `Remove ${this.label}`, onClick: this.handleDismiss }, h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2.4", "stroke-linecap": "round", "aria-hidden": "true" }, h("path", { d: "M6 6l12 12M18 6 6 18" })))));
|
|
54
|
+
}
|
|
55
|
+
return (h("button", { class: classes, part: "chip", type: "button", "aria-pressed": String(this.selected), disabled: this.disabled, onClick: this.handleClick }, body));
|
|
56
|
+
}
|
|
57
|
+
static get is() { return "rk-chip"; }
|
|
58
|
+
static get encapsulation() { return "shadow"; }
|
|
59
|
+
static get originalStyleUrls() {
|
|
60
|
+
return {
|
|
61
|
+
"$": ["rk-chip.css"]
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
static get styleUrls() {
|
|
65
|
+
return {
|
|
66
|
+
"$": ["rk-chip.css"]
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
static get properties() {
|
|
70
|
+
return {
|
|
71
|
+
"label": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"mutable": false,
|
|
74
|
+
"complexType": {
|
|
75
|
+
"original": "string",
|
|
76
|
+
"resolved": "string",
|
|
77
|
+
"references": {}
|
|
78
|
+
},
|
|
79
|
+
"required": false,
|
|
80
|
+
"optional": false,
|
|
81
|
+
"docs": {
|
|
82
|
+
"tags": [],
|
|
83
|
+
"text": "Visible text."
|
|
84
|
+
},
|
|
85
|
+
"getter": false,
|
|
86
|
+
"setter": false,
|
|
87
|
+
"reflect": false,
|
|
88
|
+
"attribute": "label",
|
|
89
|
+
"defaultValue": "''"
|
|
90
|
+
},
|
|
91
|
+
"value": {
|
|
92
|
+
"type": "string",
|
|
93
|
+
"mutable": false,
|
|
94
|
+
"complexType": {
|
|
95
|
+
"original": "string",
|
|
96
|
+
"resolved": "string",
|
|
97
|
+
"references": {}
|
|
98
|
+
},
|
|
99
|
+
"required": false,
|
|
100
|
+
"optional": true,
|
|
101
|
+
"docs": {
|
|
102
|
+
"tags": [],
|
|
103
|
+
"text": "Value reported back to the host application in event payloads."
|
|
104
|
+
},
|
|
105
|
+
"getter": false,
|
|
106
|
+
"setter": false,
|
|
107
|
+
"reflect": false,
|
|
108
|
+
"attribute": "value"
|
|
109
|
+
},
|
|
110
|
+
"selected": {
|
|
111
|
+
"type": "boolean",
|
|
112
|
+
"mutable": false,
|
|
113
|
+
"complexType": {
|
|
114
|
+
"original": "boolean",
|
|
115
|
+
"resolved": "boolean",
|
|
116
|
+
"references": {}
|
|
117
|
+
},
|
|
118
|
+
"required": false,
|
|
119
|
+
"optional": false,
|
|
120
|
+
"docs": {
|
|
121
|
+
"tags": [],
|
|
122
|
+
"text": "Whether the chip is currently active."
|
|
123
|
+
},
|
|
124
|
+
"getter": false,
|
|
125
|
+
"setter": false,
|
|
126
|
+
"reflect": false,
|
|
127
|
+
"attribute": "selected",
|
|
128
|
+
"defaultValue": "false"
|
|
129
|
+
},
|
|
130
|
+
"count": {
|
|
131
|
+
"type": "number",
|
|
132
|
+
"mutable": false,
|
|
133
|
+
"complexType": {
|
|
134
|
+
"original": "number",
|
|
135
|
+
"resolved": "number",
|
|
136
|
+
"references": {}
|
|
137
|
+
},
|
|
138
|
+
"required": false,
|
|
139
|
+
"optional": true,
|
|
140
|
+
"docs": {
|
|
141
|
+
"tags": [],
|
|
142
|
+
"text": "Optional trailing count badge (e.g. number of matching recipes)."
|
|
143
|
+
},
|
|
144
|
+
"getter": false,
|
|
145
|
+
"setter": false,
|
|
146
|
+
"reflect": false,
|
|
147
|
+
"attribute": "count"
|
|
148
|
+
},
|
|
149
|
+
"dismissible": {
|
|
150
|
+
"type": "boolean",
|
|
151
|
+
"mutable": false,
|
|
152
|
+
"complexType": {
|
|
153
|
+
"original": "boolean",
|
|
154
|
+
"resolved": "boolean",
|
|
155
|
+
"references": {}
|
|
156
|
+
},
|
|
157
|
+
"required": false,
|
|
158
|
+
"optional": false,
|
|
159
|
+
"docs": {
|
|
160
|
+
"tags": [],
|
|
161
|
+
"text": "Renders an \"x\" button that emits `rkChipDismiss` instead of toggling."
|
|
162
|
+
},
|
|
163
|
+
"getter": false,
|
|
164
|
+
"setter": false,
|
|
165
|
+
"reflect": false,
|
|
166
|
+
"attribute": "dismissible",
|
|
167
|
+
"defaultValue": "false"
|
|
168
|
+
},
|
|
169
|
+
"disabled": {
|
|
170
|
+
"type": "boolean",
|
|
171
|
+
"mutable": false,
|
|
172
|
+
"complexType": {
|
|
173
|
+
"original": "boolean",
|
|
174
|
+
"resolved": "boolean",
|
|
175
|
+
"references": {}
|
|
176
|
+
},
|
|
177
|
+
"required": false,
|
|
178
|
+
"optional": false,
|
|
179
|
+
"docs": {
|
|
180
|
+
"tags": [],
|
|
181
|
+
"text": "Disables interaction."
|
|
182
|
+
},
|
|
183
|
+
"getter": false,
|
|
184
|
+
"setter": false,
|
|
185
|
+
"reflect": false,
|
|
186
|
+
"attribute": "disabled",
|
|
187
|
+
"defaultValue": "false"
|
|
188
|
+
},
|
|
189
|
+
"tone": {
|
|
190
|
+
"type": "string",
|
|
191
|
+
"mutable": false,
|
|
192
|
+
"complexType": {
|
|
193
|
+
"original": "'neutral' | 'primary' | 'accent'",
|
|
194
|
+
"resolved": "\"accent\" | \"neutral\" | \"primary\"",
|
|
195
|
+
"references": {}
|
|
196
|
+
},
|
|
197
|
+
"required": false,
|
|
198
|
+
"optional": false,
|
|
199
|
+
"docs": {
|
|
200
|
+
"tags": [],
|
|
201
|
+
"text": "Visual treatment."
|
|
202
|
+
},
|
|
203
|
+
"getter": false,
|
|
204
|
+
"setter": false,
|
|
205
|
+
"reflect": false,
|
|
206
|
+
"attribute": "tone",
|
|
207
|
+
"defaultValue": "'neutral'"
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
static get events() {
|
|
212
|
+
return [{
|
|
213
|
+
"method": "rkChipToggle",
|
|
214
|
+
"name": "rkChipToggle",
|
|
215
|
+
"bubbles": true,
|
|
216
|
+
"cancelable": true,
|
|
217
|
+
"composed": true,
|
|
218
|
+
"docs": {
|
|
219
|
+
"tags": [],
|
|
220
|
+
"text": "Emitted when the chip is toggled."
|
|
221
|
+
},
|
|
222
|
+
"complexType": {
|
|
223
|
+
"original": "{ value: string; label: string; selected: boolean }",
|
|
224
|
+
"resolved": "{ value: string; label: string; selected: boolean; }",
|
|
225
|
+
"references": {}
|
|
226
|
+
}
|
|
227
|
+
}, {
|
|
228
|
+
"method": "rkChipDismiss",
|
|
229
|
+
"name": "rkChipDismiss",
|
|
230
|
+
"bubbles": true,
|
|
231
|
+
"cancelable": true,
|
|
232
|
+
"composed": true,
|
|
233
|
+
"docs": {
|
|
234
|
+
"tags": [],
|
|
235
|
+
"text": "Emitted when a dismissible chip's remove button is pressed."
|
|
236
|
+
},
|
|
237
|
+
"complexType": {
|
|
238
|
+
"original": "{ value: string; label: string }",
|
|
239
|
+
"resolved": "{ value: string; label: string; }",
|
|
240
|
+
"references": {}
|
|
241
|
+
}
|
|
242
|
+
}];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=rk-chip.js.map
|